Skip to content

Commit 798411f

Browse files
authored
Merge pull request #351 from youda97/skeleton-structured-list
feat(structured-list): Add skeleton state
2 parents 40bb9c3 + b4a46ab commit 798411f

File tree

4 files changed

+96
-3
lines changed

4 files changed

+96
-3
lines changed

src/structured-list/list-column.component.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@ import { Component, HostBinding, Input } from "@angular/core";
1212
*/
1313
@Component({
1414
selector: "ibm-list-column",
15-
template: `<ng-content></ng-content>`
15+
template: `
16+
<span *ngIf="skeleton"></span>
17+
<ng-content></ng-content>
18+
`
1619
})
1720
export class ListColumn {
21+
@Input() skeleton = false;
22+
1823
@HostBinding("class.bx--structured-list-th") isHeaderColumn = true;
1924
@HostBinding("class.bx--structured-list-td") isBodyColumn = true;
2025
/**

src/structured-list/list-header.component.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {
33
HostBinding,
44
ContentChildren,
55
QueryList,
6-
AfterContentInit
6+
AfterContentInit,
7+
Input
78
} from "@angular/core";
89
import { ListColumn } from "./list-column.component";
910

@@ -31,17 +32,36 @@ import { ListColumn } from "./list-column.component";
3132
export class ListHeader implements AfterContentInit {
3233
@HostBinding("class.bx--structured-list-thead") wrapper = true;
3334

35+
@Input()
36+
set skeleton(value: any) {
37+
this._skeleton = value;
38+
this.updateChildren();
39+
}
40+
41+
get skeleton(): any {
42+
return this._skeleton;
43+
}
44+
3445
@ContentChildren(ListColumn) columns: QueryList<ListColumn>;
3546

3647
/**
3748
* Set by the containing `StructuredList`. Adds a dummy header for the selection column when set to true.
3849
*/
3950
selection = false;
4051

52+
protected _skeleton = false;
53+
4154
ngAfterContentInit() {
4255
this.columns.forEach(column => {
4356
column.isBodyColumn = false;
4457
column.isHeaderColumn = true;
4558
});
59+
this.updateChildren();
60+
}
61+
62+
protected updateChildren() {
63+
if (this.columns) {
64+
this.columns.toArray().forEach(child => child.skeleton = this.skeleton);
65+
}
4666
}
4767
}

src/structured-list/structured-list.component.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ import { NG_VALUE_ACCESSOR, ControlValueAccessor } from "@angular/forms";
5858
'bx--structured-list--border': border,
5959
'bx--structured-list--selection': selection,
6060
'bx--structured-list--condensed': condensed,
61-
'bx--structured-list-content--nowrap': nowrap
61+
'bx--structured-list-content--nowrap': nowrap,
62+
'bx--skeleton': skeleton
6263
}">
6364
<ng-content select="ibm-list-header"></ng-content>
6465
<div class="bx--structured-list-tbody">
@@ -99,6 +100,23 @@ export class StructuredList implements AfterContentInit, ControlValueAccessor {
99100
* Used when `selection = true` as the row radio group `name`
100101
*/
101102
@Input() name = `structured-list-${StructuredList.listCount++}`;
103+
104+
/**
105+
* Sets the skeleton value for all `ListHeader` to the skeleton value of `StructuredList`.
106+
*/
107+
@Input()
108+
set skeleton(value: any) {
109+
this._skeleton = value;
110+
this.updateChildren();
111+
}
112+
113+
/**
114+
* Returns the skeleton value in the `StructuredList` if there is one.
115+
*/
116+
get skeleton(): any {
117+
return this._skeleton;
118+
}
119+
102120
/**
103121
* Emits an event when the row selection changes.
104122
*
@@ -116,6 +134,8 @@ export class StructuredList implements AfterContentInit, ControlValueAccessor {
116134
@ContentChildren(ListRow) rows: QueryList<ListRow>;
117135
@ContentChildren(ListHeader) headers: QueryList<ListHeader>;
118136

137+
protected _skeleton = false;
138+
119139
onChange = (_: any) => { };
120140

121141
onTouched = () => { };
@@ -138,6 +158,7 @@ export class StructuredList implements AfterContentInit, ControlValueAccessor {
138158
this.onChange(row.value);
139159
});
140160
});
161+
this.updateChildren();
141162
}
142163

143164
writeValue(value: any) {
@@ -158,4 +179,10 @@ export class StructuredList implements AfterContentInit, ControlValueAccessor {
158179
registerOnTouched(fn: any) {
159180
this.onTouched = fn;
160181
}
182+
183+
protected updateChildren() {
184+
if (this.headers) {
185+
this.headers.toArray().forEach(child => child.skeleton = this.skeleton);
186+
}
187+
}
161188
}

src/structured-list/structured-list.stories.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,46 @@ storiesOf("Structured List", module).addDecorator(
134134
condensed: boolean("condensed", false),
135135
nowrap: boolean("nowrap", false)
136136
}
137+
}))
138+
.add("Skeleton", () => ({
139+
template: `
140+
<div style="width: 800px">
141+
<ibm-structured-list skeleton="true">
142+
<ibm-list-header>
143+
<ibm-list-column></ibm-list-column>
144+
<ibm-list-column></ibm-list-column>
145+
<ibm-list-column></ibm-list-column>
146+
</ibm-list-header>
147+
<ibm-list-row>
148+
<ibm-list-column></ibm-list-column>
149+
<ibm-list-column></ibm-list-column>
150+
<ibm-list-column></ibm-list-column>
151+
</ibm-list-row>
152+
<ibm-list-row>
153+
<ibm-list-column></ibm-list-column>
154+
<ibm-list-column></ibm-list-column>
155+
<ibm-list-column></ibm-list-column>
156+
</ibm-list-row>
157+
</ibm-structured-list>
158+
159+
<ibm-structured-list skeleton="true" border="true">
160+
<ibm-list-header>
161+
<ibm-list-column></ibm-list-column>
162+
<ibm-list-column></ibm-list-column>
163+
<ibm-list-column></ibm-list-column>
164+
</ibm-list-header>
165+
<ibm-list-row>
166+
<ibm-list-column></ibm-list-column>
167+
<ibm-list-column></ibm-list-column>
168+
<ibm-list-column></ibm-list-column>
169+
</ibm-list-row>
170+
<ibm-list-row>
171+
<ibm-list-column></ibm-list-column>
172+
<ibm-list-column></ibm-list-column>
173+
<ibm-list-column></ibm-list-column>
174+
</ibm-list-row>
175+
</ibm-structured-list>
176+
</div>
177+
`
137178
}));
138179

0 commit comments

Comments
 (0)