Skip to content

Commit 102c225

Browse files
feat(#2609): add data-grid component
1 parent b2eece7 commit 102c225

File tree

106 files changed

+4004
-674
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+4004
-674
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing";
2+
import { GoabDataGrid } from "./data-grid";
3+
import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
4+
import { By } from "@angular/platform-browser";
5+
6+
@Component({
7+
standalone: true,
8+
imports: [GoabDataGrid],
9+
template: `
10+
<goab-data-grid [keyboardIcon]="keyboardIcon" [keyboardNav]="keyboardNav">
11+
<div>Test content</div>
12+
</goab-data-grid>
13+
`
14+
})
15+
class TestDataGridComponent {
16+
keyboardIcon = true;
17+
keyboardNav: "layout" | "table" = "table";
18+
}
19+
20+
describe("GoabDataGrid", () => {
21+
let fixture: ComponentFixture<TestDataGridComponent>;
22+
let component: TestDataGridComponent;
23+
24+
beforeEach(async () => {
25+
await TestBed.configureTestingModule({
26+
imports: [GoabDataGrid, TestDataGridComponent],
27+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
28+
}).compileComponents();
29+
30+
fixture = TestBed.createComponent(TestDataGridComponent);
31+
component = fixture.componentInstance;
32+
});
33+
34+
it("should create component and render goa-data-grid with projected content", fakeAsync(() => {
35+
fixture.detectChanges();
36+
tick();
37+
fixture.detectChanges();
38+
39+
expect(component).toBeTruthy();
40+
41+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
42+
expect(dataGridElement).toBeTruthy();
43+
expect(dataGridElement.textContent).toContain("Test content");
44+
expect(dataGridElement.hasAttribute("keyboard-icon")).toBe(true);
45+
expect(dataGridElement.getAttribute("keyboard-icon")).toBe("");
46+
}));
47+
48+
it("should remove keyboard-icon attribute when set to false", fakeAsync(() => {
49+
component.keyboardIcon = false;
50+
fixture.detectChanges();
51+
tick();
52+
fixture.detectChanges();
53+
54+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
55+
expect(dataGridElement).toBeTruthy();
56+
expect(dataGridElement.hasAttribute("keyboard-icon")).toBe(false);
57+
expect(dataGridElement.getAttribute("keyboard-icon")).toBeNull();
58+
}));
59+
60+
it("should set keyboardNav to table mode", fakeAsync(() => {
61+
component.keyboardNav = "table";
62+
fixture.detectChanges();
63+
tick();
64+
fixture.detectChanges();
65+
66+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
67+
expect(dataGridElement).toBeTruthy();
68+
expect(dataGridElement.getAttribute("keyboard-nav")).toBe("table");
69+
}));
70+
71+
it("should set keyboardNav to layout mode", fakeAsync(() => {
72+
component.keyboardNav = "layout";
73+
fixture.detectChanges();
74+
tick();
75+
fixture.detectChanges();
76+
77+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
78+
expect(dataGridElement).toBeTruthy();
79+
expect(dataGridElement.getAttribute("keyboard-nav")).toBe("layout");
80+
}));
81+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { CUSTOM_ELEMENTS_SCHEMA, Component, Input, booleanAttribute, ChangeDetectorRef, OnInit } from "@angular/core";
2+
import { CommonModule } from "@angular/common";
3+
4+
@Component({
5+
standalone: true,
6+
selector: "goab-data-grid",
7+
imports: [CommonModule],
8+
template: `
9+
<goa-data-grid
10+
*ngIf="isReady"
11+
[attr.keyboard-icon]="keyboardIcon ? '' : null"
12+
[attr.keyboard-nav]="keyboardNav"
13+
>
14+
<ng-content></ng-content>
15+
</goa-data-grid>
16+
`,
17+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
18+
})
19+
export class GoabDataGrid implements OnInit {
20+
@Input({ transform: booleanAttribute }) keyboardIcon = true;
21+
@Input({ required: true }) keyboardNav!: "layout" | "table";
22+
23+
isReady = false;
24+
25+
constructor(private cdr: ChangeDetectorRef) {}
26+
27+
ngOnInit(): void {
28+
// For Angular, we need to delay rendering the web component
29+
// to ensure all attributes are properly bound before the component initializes
30+
setTimeout(() => {
31+
this.isReady = true;
32+
this.cdr.detectChanges();
33+
}, 0);
34+
}
35+
}

libs/angular-components/src/lib/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export * from "./chip/chip";
1515
export * from "./circular-progress/circular-progress";
1616
export * from "./column-layout/column-layout";
1717
export * from "./container/container";
18+
export * from "./data-grid/data-grid";
1819
export * from "./date-picker/date-picker";
1920
export * from "./details/details";
2021
export * from "./divider/divider";

0 commit comments

Comments
 (0)