Skip to content

Commit 0a01e4b

Browse files
feat(#2609): add data-grid component
1 parent ed95740 commit 0a01e4b

File tree

106 files changed

+3965
-671
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

+3965
-671
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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+
template: `
8+
<goab-data-grid [keyboardIcon]="keyboardIcon" [keyboardNav]="keyboardNav">
9+
<div>Test content</div>
10+
</goab-data-grid>
11+
`
12+
})
13+
class TestDataGridComponent {
14+
keyboardIcon = true;
15+
keyboardNav: "layout" | "table" = "table";
16+
}
17+
18+
describe("GoabDataGrid", () => {
19+
let fixture: ComponentFixture<TestDataGridComponent>;
20+
let component: TestDataGridComponent;
21+
22+
beforeEach(async () => {
23+
await TestBed.configureTestingModule({
24+
imports: [GoabDataGrid],
25+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
26+
declarations: [TestDataGridComponent]
27+
}).compileComponents();
28+
29+
fixture = TestBed.createComponent(TestDataGridComponent);
30+
component = fixture.componentInstance;
31+
});
32+
33+
it("should create component and render goa-data-grid with projected content", fakeAsync(() => {
34+
fixture.detectChanges();
35+
tick();
36+
fixture.detectChanges();
37+
38+
expect(component).toBeTruthy();
39+
40+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
41+
expect(dataGridElement).toBeTruthy();
42+
expect(dataGridElement.textContent).toContain("Test content");
43+
expect(dataGridElement.hasAttribute("keyboard-icon")).toBe(true);
44+
expect(dataGridElement.getAttribute("keyboard-icon")).toBe("");
45+
}));
46+
47+
it("should remove keyboard-icon attribute when set to false", fakeAsync(() => {
48+
component.keyboardIcon = false;
49+
fixture.detectChanges();
50+
tick();
51+
fixture.detectChanges();
52+
53+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
54+
expect(dataGridElement).toBeTruthy();
55+
expect(dataGridElement.hasAttribute("keyboard-icon")).toBe(false);
56+
expect(dataGridElement.getAttribute("keyboard-icon")).toBeNull();
57+
}));
58+
59+
it("should set keyboardNav to table mode", fakeAsync(() => {
60+
component.keyboardNav = "table";
61+
fixture.detectChanges();
62+
tick();
63+
fixture.detectChanges();
64+
65+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
66+
expect(dataGridElement).toBeTruthy();
67+
expect(dataGridElement.getAttribute("keyboard-nav")).toBe("table");
68+
}));
69+
70+
it("should set keyboardNav to layout mode", fakeAsync(() => {
71+
component.keyboardNav = "layout";
72+
fixture.detectChanges();
73+
tick();
74+
fixture.detectChanges();
75+
76+
const dataGridElement = fixture.debugElement.query(By.css("goa-data-grid"))?.nativeElement;
77+
expect(dataGridElement).toBeTruthy();
78+
expect(dataGridElement.getAttribute("keyboard-nav")).toBe("layout");
79+
}));
80+
});
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)