diff --git a/app/components/pool/base/index.ts b/app/components/pool/base/index.ts new file mode 100644 index 0000000000..a4b5b1fae0 --- /dev/null +++ b/app/components/pool/base/index.ts @@ -0,0 +1 @@ +export * from "./pool-nodes-preview.component"; diff --git a/app/components/pool/base/pool-nodes-preview.component.ts b/app/components/pool/base/pool-nodes-preview.component.ts index 5600091ecb..cebc154dd4 100644 --- a/app/components/pool/base/pool-nodes-preview.component.ts +++ b/app/components/pool/base/pool-nodes-preview.component.ts @@ -1,12 +1,14 @@ -import { Component, Input } from "@angular/core"; +import { Component, HostBinding, Input, OnChanges } from "@angular/core"; import { Pool } from "app/models"; +import "./pool-nodes-preview.scss"; + @Component({ selector: "bl-pool-nodes-preview", templateUrl: "pool-nodes-preview.html", }) -export class PoolNodesPreviewComponent { +export class PoolNodesPreviewComponent implements OnChanges { @Input() public pool: Pool; @@ -14,15 +16,27 @@ export class PoolNodesPreviewComponent { public tooltipPosition: string = "below"; @Input() - public largeIcon: boolean = false; + @HostBinding("class") + public size: ComponentSize = "normal"; + public tooltipMessage: string; + + @HostBinding("class.resize-error") + public hasResizeError: boolean = false; + public ngOnChanges(inputs) { + if (inputs.pool) { + this.tooltipMessage = this._getTooltipMessage(); + this.hasResizeError = Boolean(this.pool.resizeError); + } + } - public get tooltipMessage() { - if (this.pool.resizeError) { + private _getTooltipMessage() { + const pool = this.pool; + if (pool.resizeError) { return "There was a resize error"; - } else if (this.pool.currentDedicated !== this.pool.targetDedicated) { - return `Pool is resizing from ${this.pool.currentDedicated} to ${this.pool.targetDedicated} nodes`; + } else if (pool.currentDedicated !== pool.targetDedicated) { + return `Pool is resizing from ${pool.currentDedicated} to ${pool.targetDedicated} nodes`; } else { - return `Pool has ${this.pool.currentDedicated} nodes`; + return `Pool has ${pool.currentDedicated} nodes`; } } } diff --git a/app/components/pool/base/pool-nodes-preview.html b/app/components/pool/base/pool-nodes-preview.html index 2327b34936..6862f91f62 100644 --- a/app/components/pool/base/pool-nodes-preview.html +++ b/app/components/pool/base/pool-nodes-preview.html @@ -1,4 +1,4 @@ -
+
{{pool.currentDedicated}} diff --git a/app/components/pool/base/pool-nodes-preview.scss b/app/components/pool/base/pool-nodes-preview.scss new file mode 100644 index 0000000000..bdb6ec8acc --- /dev/null +++ b/app/components/pool/base/pool-nodes-preview.scss @@ -0,0 +1,17 @@ +@import "app/styles/variables"; + +bl-pool-nodes-preview { + + &.small { + font-size: 10px; + } + + &.large { + font-size: 24px; + } + + &.resize-error { + color: $red; + font-weight: bold; + } +} diff --git a/app/components/pool/details/pool-details.html b/app/components/pool/details/pool-details.html index 43b4fe9e26..f801a98d83 100644 --- a/app/components/pool/details/pool-details.html +++ b/app/components/pool/details/pool-details.html @@ -10,7 +10,7 @@ {{pool.vmSize}}, {{pool.allocationState}}
- +
diff --git a/app/styles/pool/base.scss b/app/styles/pool/base.scss index 8d22befc9c..fab13c4b94 100644 --- a/app/styles/pool/base.scss +++ b/app/styles/pool/base.scss @@ -1,16 +1,3 @@ -bl-pool-nodes-preview { - > div.large { - span { - font-size: 1.5em; - } - } - - .resize-error { - color: $red; - font-weight: bold; - } -} - bl-pool-advanced-filter { display: block; } diff --git a/definitions/index.d.ts b/definitions/index.d.ts index ce54d77ece..b3c81b5d12 100644 --- a/definitions/index.d.ts +++ b/definitions/index.d.ts @@ -32,3 +32,5 @@ type StringMap = { [key: string]: V }; type AttrOf = { [P in keyof T]: T[P]; }; + +type ComponentSize = "small" | "normal" | "large"; diff --git a/test/app/components/pool/base/pool-nodes-preview.component.spec.ts b/test/app/components/pool/base/pool-nodes-preview.component.spec.ts new file mode 100644 index 0000000000..e4650d1811 --- /dev/null +++ b/test/app/components/pool/base/pool-nodes-preview.component.spec.ts @@ -0,0 +1,94 @@ +import { Component, DebugElement, NO_ERRORS_SCHEMA } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; + +import { PoolNodesPreviewComponent } from "app/components/pool/base"; +import { Pool } from "app/models"; + +@Component({ + template: ``, +}) +class TestComponent { + public pool: Pool = new Pool({}); +} + +describe("PoolNodesPreviewComponent", () => { + let fixture: ComponentFixture; + let testComponent: TestComponent; + let component: PoolNodesPreviewComponent; + let de: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + declarations: [PoolNodesPreviewComponent, TestComponent], + schemas: [NO_ERRORS_SCHEMA], + }); + fixture = TestBed.createComponent(TestComponent); + testComponent = fixture.componentInstance; + de = fixture.debugElement.query(By.css("bl-pool-nodes-preview")); + component = de.componentInstance; + fixture.detectChanges(); + }); + + describe("when pool is steady", () => { + beforeEach(() => { + testComponent.pool = new Pool({ state: "steady", currentDedicated: 4, targetDedicated: 4 }); + fixture.detectChanges(); + }); + + it("should just show the current dedicated", () => { + const text = de.nativeElement.textContent; + expect(text).toContain("4"); + expect((text.match(/4/g) || []).length).toBe(1, "Should only have one 4 in the content"); + }); + + it("should not show the arrow", () => { + const text = de.nativeElement.textContent; + expect(text).not.toContain("⇾"); + }); + }); + + describe("when pool is resizing", () => { + beforeEach(() => { + testComponent.pool = new Pool({ state: "resizing", currentDedicated: 2, targetDedicated: 8 }); + fixture.detectChanges(); + }); + + it("should just show the current dedicated", () => { + const text = de.nativeElement.textContent; + expect(text).toContain("2"); + expect(text).toContain("8"); + }); + + it("should show the arrow", () => { + const text = de.nativeElement.textContent; + expect(text).toContain("⇾"); + }); + }); + + describe("when there is a resize error", () => { + beforeEach(() => { + testComponent.pool = new Pool({ + state: "steady", currentDedicated: 2, targetDedicated: 8, + resizeError: { code: "StoppedResize" } as any, + }); + fixture.detectChanges(); + }); + + it("should just show the current dedicated", () => { + const text = de.nativeElement.textContent; + expect(text).toContain("2"); + expect(text).toContain("8"); + }); + + it("should show the arrow", () => { + const text = de.nativeElement.textContent; + expect(text).toContain("⇾"); + }); + + it("Should have the resize error class", () => { + expect(de.classes["resize-error"]).toBe(true); + }); + }); +});