Skip to content

Commit ff4e4c1

Browse files
authored
Merge branch 'master' into ng15
2 parents 956895e + 0f019df commit ff4e4c1

File tree

8 files changed

+95
-51
lines changed

8 files changed

+95
-51
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/datepicker-input/datepicker-input.component.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,15 @@ import { NG_VALUE_ACCESSOR } from "@angular/forms";
6767
class="bx--date-picker__icon bx--date-picker__icon--warn">
6868
</svg>
6969
</div>
70+
<div
71+
*ngIf="helperText && !invalid && !warn"
72+
class="bx--form__helper-text"
73+
[ngClass]="{'bx--form__helper-text--disabled': disabled}">
74+
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
75+
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
76+
</div>
7077
<div *ngIf="!warn && invalid" class="bx--form-requirement">
71-
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
78+
<ng-container *ngIf="!isTemplate(invalidText)">{{invalidText}}</ng-container>
7279
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
7380
</div>
7481
<div *ngIf="!invalid && warn" class="bx--form-requirement">
@@ -127,6 +134,11 @@ export class DatePickerInput {
127134
*/
128135
@Input() warnText: string | TemplateRef<any>;
129136

137+
/**
138+
* Sets the optional helper text.
139+
*/
140+
@Input() helperText: string | TemplateRef<any>;
141+
130142
@Input() skeleton = false;
131143

132144
@Input() value = "";
@@ -136,7 +148,7 @@ export class DatePickerInput {
136148
// @ts-ignore
137149
@ViewChild("input", { static: false }) input: ElementRef;
138150

139-
constructor(protected elementRef: ElementRef) {}
151+
constructor(protected elementRef: ElementRef) { }
140152

141153
onChange(event) {
142154
this.value = event.target.value;
@@ -157,9 +169,9 @@ export class DatePickerInput {
157169
this.onTouched = fn;
158170
}
159171

160-
onTouched: () => any = () => {};
172+
onTouched: () => any = () => { };
161173

162-
propagateChange = (_: any) => {};
174+
propagateChange = (_: any) => { };
163175

164176
public isTemplate(value) {
165177
return value instanceof TemplateRef;

src/datepicker/datepicker.component.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import { I18n } from "carbon-components-angular/i18n";
5959
[warn]="warn"
6060
[warnText]="warnText"
6161
[skeleton]="skeleton"
62+
[helperText]="helperText"
6263
(valueChange)="onValueChange($event)"
6364
(click)="openCalendar(input)">
6465
</ibm-date-picker-input>
@@ -80,6 +81,7 @@ import { I18n } from "carbon-components-angular/i18n";
8081
[warn]="rangeWarn"
8182
[warnText]="rangeWarnText"
8283
[skeleton]="skeleton"
84+
[helperText]="rangeHelperText"
8385
(valueChange)="onRangeValueChange($event)"
8486
(click)="openCalendar(rangeInput)">
8587
</ibm-date-picker-input>
@@ -130,8 +132,9 @@ export class DatePicker implements
130132
*/
131133
@Input() language = "en";
132134

133-
@Input() label: string | TemplateRef<any>;
134-
135+
@Input() label: string | TemplateRef<any>;
136+
@Input() helperText: string | TemplateRef<any>;
137+
@Input() rangeHelperText: string | TemplateRef<any>;
135138
@Input() rangeLabel: string;
136139

137140
@Input() placeholder = "mm/dd/yyyy";
@@ -220,7 +223,7 @@ export class DatePicker implements
220223
get flatpickrOptions() {
221224
const plugins = [...this.plugins, carbonFlatpickrMonthSelectPlugin];
222225
if (this.range) {
223-
plugins.push(rangePlugin({ input: `#${this.id}-rangeInput`, position: "left"}));
226+
plugins.push(rangePlugin({ input: `#${this.id}-rangeInput`, position: "left" }));
224227
}
225228
return Object.assign({}, this._flatpickrOptions, this.flatpickrBaseOptions, {
226229
mode: this.range ? "range" : "single",
@@ -407,9 +410,9 @@ export class DatePicker implements
407410
this.onTouched = fn;
408411
}
409412

410-
onTouched: () => any = () => {};
413+
onTouched: () => any = () => { };
411414

412-
propagateChange = (_: any) => {};
415+
propagateChange = (_: any) => { };
413416

414417
/**
415418
* Cleans up our flatpickr instance

src/datepicker/datepicker.stories.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ storiesOf("Components|Date Picker", module)
194194
[warn]="warn"
195195
[warnText]="warnText"
196196
[dateFormat]="dateFormat"
197-
(valueChange)="valueChange($event)">
197+
(valueChange)="valueChange($event)"
198+
[helperText]="helperText">
198199
</ibm-date-picker>
199200
<p style="margin-top: 20px;">Without initial value</p>
200201
<ibm-date-picker
@@ -209,7 +210,8 @@ storiesOf("Components|Date Picker", module)
209210
[warn]="warn"
210211
[warnText]="warnText"
211212
[dateFormat]="dateFormat"
212-
(valueChange)="valueChange($event)">
213+
(valueChange)="valueChange($event)"
214+
[helperText]="helperText">
213215
</ibm-date-picker>
214216
`,
215217
props: {
@@ -222,6 +224,7 @@ storiesOf("Components|Date Picker", module)
222224
invalidText: text("Form validation content", "Invalid date format"),
223225
warn: boolean("Show the warning state", false),
224226
warnText: text("Text for the warning", "This is a warning"),
227+
helperText: text("Helper text", ""),
225228
invalid: boolean("Show form validation", false),
226229
disabled: boolean("Disabled", false),
227230
dateFormat: text("Date format", "m/d/Y"),
@@ -249,7 +252,8 @@ storiesOf("Components|Date Picker", module)
249252
[rangeInvalidText]="invalidText"
250253
[dateFormat]="dateFormat"
251254
[value]="value"
252-
(valueChange)="valueChange($event)">
255+
(valueChange)="valueChange($event)"
256+
[helperText]="helperText">
253257
</ibm-date-picker>
254258
<p style="margin-top: 20px;">Without initial value</p>
255259
<ibm-date-picker
@@ -268,7 +272,8 @@ storiesOf("Components|Date Picker", module)
268272
[rangeWarn]="warn"
269273
[rangeWarnText]="warnText"
270274
[dateFormat]="dateFormat"
271-
(valueChange)="valueChange($event)">
275+
(valueChange)="valueChange($event)"
276+
[helperText]="helperText">
272277
</ibm-date-picker>
273278
`,
274279
props: {
@@ -281,6 +286,7 @@ storiesOf("Components|Date Picker", module)
281286
invalidText: text("Form validation content", "Invalid date format"),
282287
warn: boolean("Show the warning state", false),
283288
warnText: text("Text for the warning", "This is a warning"),
289+
helperText: text("Helper text", ""),
284290
invalid: boolean("Show form validation", false),
285291
disabled: boolean("Disabled", false),
286292
dateFormat: text("Date format", "m/d/Y"),

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)