Skip to content

Commit b50f0c7

Browse files
authored
Merge branch 'master' into fix-file-uploader-valueChanges
2 parents 0f30a33 + a8c842f commit b50f0c7

File tree

5 files changed

+79
-58
lines changed

5 files changed

+79
-58
lines changed

src/dialog/dialog.directive.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,9 @@ export class DialogDirective implements OnInit, OnDestroy, OnChanges {
286286
* Helper method to close the dialogRef.
287287
*/
288288
close(meta: CloseMeta = { reason: CloseReasons.interaction }) {
289-
setTimeout(() => {
290-
if (this.dialogRef) {
291-
this.dialogRef.instance.doClose(meta);
292-
}
293-
});
289+
if (this.dialogRef) {
290+
this.dialogRef.instance.doClose(meta);
291+
}
294292
}
295293

296294
/**

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

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
121121
/**
122122
* The list items belonging to the `DropdownList`.
123123
*/
124-
@Input() set items (value: Array<ListItem> | Observable<Array<ListItem>>) {
124+
@Input() set items(value: Array<ListItem> | Observable<Array<ListItem>>) {
125125
if (isObservable(value)) {
126126
if (this._itemsSubscription) {
127127
this._itemsSubscription.unsubscribe();
@@ -286,6 +286,11 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
286286
filterBy(query = "") {
287287
if (query) {
288288
this.displayItems = this.getListItems().filter(item => item.content.toLowerCase().includes(query.toLowerCase()));
289+
// Reset index if items were found
290+
// Prevent selecting index in list that are undefined.
291+
if (this.displayItems) {
292+
this.index = 0;
293+
}
289294
} else {
290295
this.displayItems = this.getListItems();
291296
}
@@ -331,23 +336,26 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
331336
* Returns the `HTMLElement` for the item that is subsequent to the selected item.
332337
*/
333338
getNextElement(): HTMLElement {
334-
if (this.index < this.displayItems.length - 1) {
335-
this.index++;
336-
}
337-
let item = this.displayItems[this.index];
338-
if (item.disabled) {
339-
return this.getNextElement();
339+
// Only return native elements if they are rendered
340+
const elemList = this.listElementList ? this.listElementList.toArray() : [];
341+
if (!elemList.length) {
342+
return null;
340343
}
341344

342-
let elemList = this.listElementList ? this.listElementList.toArray() : [];
343-
344-
// TODO: update to optional chaining after upgrading typescript
345-
// to v3.7+
346-
if (elemList[this.index] && elemList[this.index].nativeElement) {
347-
return elemList[this.index].nativeElement;
348-
} else {
349-
return null;
345+
/**
346+
* Start checking from next index
347+
* Continue looping through the list until a non disabeled element is found or
348+
* end of list is reached
349+
*/
350+
for (let i = this.index + 1; i < elemList.length; i++) {
351+
// If the values in the list are not disabled
352+
if (!this.displayItems[i].disabled) {
353+
this.index = i;
354+
return elemList[i].nativeElement;
355+
}
350356
}
357+
358+
return elemList[this.index].nativeElement;
351359
}
352360

353361
/**
@@ -371,23 +379,26 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
371379
* Returns the `HTMLElement` for the item that precedes the selected item.
372380
*/
373381
getPrevElement(): HTMLElement {
374-
if (this.index > 0) {
375-
this.index--;
376-
}
377-
let item = this.displayItems[this.index];
378-
if (item.disabled) {
379-
return this.getPrevElement();
382+
// Only return native elements if they are rendered
383+
const elemList = this.listElementList ? this.listElementList.toArray() : [];
384+
if (!elemList.length) {
385+
return null;
380386
}
381387

382-
let elemList = this.listElementList ? this.listElementList.toArray() : [];
383-
384-
// TODO: update to optional chaining after upgrading typescript
385-
// to v3.7+
386-
if (elemList[this.index] && elemList[this.index].nativeElement) {
387-
return elemList[this.index].nativeElement;
388-
} else {
389-
return null;
388+
/**
389+
* Start checking from next index
390+
* Continue looping through the list until a non disabeled element is found or
391+
* end of list is reached
392+
*/
393+
for (let i = this.index - 1; i < this.index && i >= 0; i--) {
394+
// If the values in the list are not disabled
395+
if (!this.displayItems[i].disabled) {
396+
this.index = i;
397+
return elemList[i].nativeElement;
398+
}
390399
}
400+
401+
return elemList[this.index].nativeElement;
391402
}
392403

393404
/**
@@ -497,12 +508,12 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
497508
doKeyDown(event: KeyboardEvent, item: ListItem) {
498509
// "Spacebar", "Down", and "Up" are IE specific values
499510
if (event.key === "Enter" || event.key === " " || event.key === "Spacebar") {
500-
if (this.listElementList.some(option => option.nativeElement === event.target)) {
501-
event.preventDefault();
502-
}
503-
if (event.key === "Enter") {
504-
this.doClick(event, item);
505-
}
511+
if (this.listElementList.some(option => option.nativeElement === event.target)) {
512+
event.preventDefault();
513+
}
514+
if (event.key === "Enter") {
515+
this.doClick(event, item);
516+
}
506517
} else if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "Down" || event.key === "Up") {
507518
event.preventDefault();
508519
if (event.key === "ArrowDown" || event.key === "Down") {
@@ -539,7 +550,7 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
539550
event.preventDefault();
540551
if (event.key === "ArrowDown" || event.key === "Down") {
541552
if (this.hasNextElement()) {
542-
this.getNextElement().scrollIntoView({block: "end"});
553+
this.getNextElement().scrollIntoView({ block: "end" });
543554
} else {
544555
this.blurIntent.emit("bottom");
545556
}
@@ -561,7 +572,7 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
561572
*/
562573
doClick(event, item) {
563574
event.preventDefault();
564-
if (!item.disabled) {
575+
if (item && !item.disabled) {
565576
this.list.nativeElement.focus();
566577
if (this.type === "single") {
567578
item.selected = true;

src/tiles/selection-tile.component.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,30 @@ import {
77
HostListener,
88
AfterViewInit
99
} from "@angular/core";
10-
import { NG_VALUE_ACCESSOR } from "@angular/forms";
1110
import { I18n } from "carbon-components-angular/i18n";
1211

1312
@Component({
1413
selector: "ibm-selection-tile",
1514
template: `
15+
<input
16+
#input
17+
[tabindex]="disabled ? null : 0"
18+
class="bx--tile-input"
19+
[id]="id"
20+
[disabled]="disabled"
21+
[type]="(multiple ? 'checkbox': 'radio')"
22+
[value]="value"
23+
[name]="name"
24+
(change)="onChange($event)"/>
1625
<label
1726
class="bx--tile bx--tile--selectable"
18-
tabindex="disabled ? null : 0"
1927
[for]="id"
2028
[ngClass]="{
2129
'bx--tile--is-selected' : selected,
2230
'bx--tile--light': theme === 'light',
2331
'bx--tile--disabled' : disabled
2432
}"
2533
[attr.aria-label]="i18n.get('TILES.TILE') | async">
26-
<input
27-
#input
28-
tabindex="-1"
29-
class="bx--tile-input"
30-
[id]="id"
31-
[disabled]="disabled"
32-
[type]="(multiple ? 'checkbox': 'radio')"
33-
[value]="value"
34-
[name]="name"
35-
(change)="onChange($event)"/>
3634
<div class="bx--tile__checkmark">
3735
<svg width="16" height="16" viewBox="0 0 16 16">
3836
<path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm3.646-10.854L6.75 10.043 4.354 7.646l-.708.708 3.104 3.103 5.604-5.603-.708-.708z"

src/tiles/tile-group.component.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
HostBinding,
88
ContentChildren,
99
QueryList,
10-
OnDestroy
10+
OnDestroy,
11+
TemplateRef
1112
} from "@angular/core";
1213
import { SelectionTile } from "./selection-tile.component";
1314
import { NG_VALUE_ACCESSOR } from "@angular/forms";
@@ -17,7 +18,14 @@ import { takeUntil } from "rxjs/operators";
1718

1819
@Component({
1920
selector: "ibm-tile-group",
20-
template: `<ng-content select="ibm-selection-tile"></ng-content>`,
21+
template: `
22+
<fieldset>
23+
<legend *ngIf="legend" class="bx--label">
24+
<ng-template *ngIf="isTemplate(legend); else legendLabel;" [ngTemplateOutlet]="legend"></ng-template>
25+
<ng-template #legendLabel>{{legend}}</ng-template>
26+
</legend>
27+
<ng-content select="ibm-selection-tile"></ng-content>
28+
</fieldset>`,
2129
providers: [
2230
{
2331
provide: NG_VALUE_ACCESSOR,
@@ -37,6 +45,8 @@ export class TileGroup implements AfterContentInit, OnDestroy {
3745
*/
3846
@Input() multiple = false;
3947

48+
@Input() legend: string | TemplateRef<any>;
49+
4050
/**
4151
* Emits an event when the tile selection changes.
4252
*
@@ -124,4 +134,8 @@ export class TileGroup implements AfterContentInit, OnDestroy {
124134
registerOnTouched(fn: any) {
125135
this.onTouched = fn;
126136
}
137+
138+
public isTemplate(value) {
139+
return value instanceof TemplateRef;
140+
}
127141
}

src/tiles/tiles.stories.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ storiesOf("Components|Tiles", module)
136136
Edit on Carbon UI Builder
137137
</a>
138138
<br><br>
139-
<ibm-tile-group (selected)="selected($event)" [multiple]="false">
139+
<ibm-tile-group (selected)="selected($event)" [multiple]="false" legend="Radio tile group">
140140
<ibm-selection-tile value="tile1" [disabled]="disabled" [selected]="true" [theme]="theme">Selectable Tile</ibm-selection-tile>
141141
<ibm-selection-tile value="tile2" [disabled]="disabled" [theme]="theme">Selectable Tile</ibm-selection-tile>
142142
<ibm-selection-tile value="tile3" [disabled]="disabled" [theme]="theme">Selectable Tile</ibm-selection-tile>
@@ -174,7 +174,7 @@ storiesOf("Components|Tiles", module)
174174
Edit on Carbon UI Builder
175175
</a>
176176
<br><br>
177-
<ibm-tile-group (selected)="selected($event)" [multiple]="true">
177+
<ibm-tile-group (selected)="selected($event)" [multiple]="true" legend="Multi-select tile group">
178178
<ibm-selection-tile value="tile1" [selected]="true" [theme]="theme" [disabled]="disabled">Selectable Tile</ibm-selection-tile>
179179
<ibm-selection-tile value="tile2" [theme]="theme" [disabled]="disabled">Selectable Tile</ibm-selection-tile>
180180
<ibm-selection-tile value="tile3" [theme]="theme" [disabled]="disabled">Selectable Tile</ibm-selection-tile>

0 commit comments

Comments
 (0)