Skip to content

Commit d1a3112

Browse files
Liz Baldoclaude
authored andcommitted
CTM-436 Upgrade Angular 19 → 20 and remove Clarity Design System
- Bump all @angular/* and @angular-devkit/* packages to ^20.0.0 - Remove @clr/angular, @cds/core, @clr/icons (incompatible with Angular 20) - Replace clr-icon/clr-tooltip with mat-icon/matTooltip throughout all templates - Update JobStatusIcon enum to use Material icon names (e.g. check_circle, error, sync) - Remove Clarity CSS/JS from angular.json build config; add Material tooltip styles to styles.scss - Export MatIconModule and MatTooltipModule from SharedModule for test modules - Replace TestBed.get() with TestBed.inject() (Angular 20 breaking change) - Update all spec files to use mat-icon selectors and textContent assertions - All 103 tests pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 05636bd commit d1a3112

33 files changed

+2530
-2126
lines changed

ui/angular.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@
2626
"src/assets"
2727
],
2828
"styles": [
29-
"src/styles.scss",
30-
"node_modules/@clr/icons/clr-icons.min.css"
29+
"src/styles.scss"
3130
],
3231
"scripts": [
33-
"node_modules/@clr/icons/clr-icons.min.js",
3432
"node_modules/@webcomponents/custom-elements/custom-elements.min.js"
3533
],
3634
"browser": "src/main.ts"

ui/package.json

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,28 @@
1414
},
1515
"private": true,
1616
"dependencies": {
17-
"@angular/animations": "^19.2.19",
18-
"@angular/cdk": "^19.2.19",
19-
"@angular/common": "^19.2.19",
20-
"@angular/compiler": "^19.2.19",
21-
"@angular/core": "^19.2.19",
22-
"@angular/forms": "^19.2.19",
23-
"@angular/material": "^19.2.19",
24-
"@angular/platform-browser": "^19.2.19",
25-
"@angular/platform-browser-dynamic": "^19.2.19",
26-
"@angular/router": "^19.2.19",
27-
"@cds/core": "^6.17.0",
28-
"@clr/angular": "^17.12.2",
29-
"@clr/icons": "^13.0.2",
17+
"@angular/animations": "^20.0.0",
18+
"@angular/cdk": "^20.0.0",
19+
"@angular/common": "^20.0.0",
20+
"@angular/compiler": "^20.0.0",
21+
"@angular/core": "^20.0.0",
22+
"@angular/forms": "^20.0.0",
23+
"@angular/material": "^20.0.0",
24+
"@angular/platform-browser": "^20.0.0",
25+
"@angular/platform-browser-dynamic": "^20.0.0",
26+
"@angular/router": "^20.0.0",
3027
"@webcomponents/custom-elements": "^1.5.0",
31-
"angular-oauth2-oidc": "^14.0.1",
28+
"angular-oauth2-oidc": "^20.0.0",
3229
"core-js": "^3.25.0",
3330
"rxjs": "^7.5.6",
3431
"zone.js": "^0.15.1"
3532
},
3633
"devDependencies": {
37-
"@angular-devkit/build-angular": "^19.2.1",
38-
"@angular-eslint/schematics": "^19.8.1",
39-
"@angular/cli": "^19.2.1",
40-
"@angular/compiler-cli": "^19.2.19",
41-
"@angular/language-service": "^19.2.19",
34+
"@angular-devkit/build-angular": "^20.0.0",
35+
"@angular-eslint/schematics": "^20.0.0",
36+
"@angular/cli": "^20.0.0",
37+
"@angular/compiler-cli": "^20.0.0",
38+
"@angular/language-service": "^20.0.0",
4239
"@eslint/eslintrc": "^3.3.5",
4340
"@eslint/js": "^9.39.4",
4441
"@types/angular": "^1.8.4",

ui/src/app/app.component.spec.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {RouterTestingModule} from '@angular/router/testing';
55
import {Injectable} from '@angular/core';
66
import {Location} from '@angular/common';
77
import {flush, TestBed, fakeAsync, tick, ComponentFixture, waitForAsync} from '@angular/core/testing';
8-
import {ClrIconModule} from '@clr/angular';
8+
99

1010
import {AppComponent} from './app.component';
1111
import {CoreModule} from './core/core.module';
@@ -35,7 +35,6 @@ describe('AppComponent', () => {
3535
],
3636
imports: [
3737
BrowserAnimationsModule,
38-
ClrIconModule,
3938
CoreModule,
4039
JobListModule,
4140
JobDetailsModule,
@@ -59,7 +58,7 @@ describe('AppComponent', () => {
5958
}));
6059

6160
beforeEach(() => {
62-
customIconService = TestBed.get(CustomIconService);
61+
customIconService = TestBed.inject(CustomIconService);
6362
fixture = TestBed.createComponent(AppComponent);
6463
testComponent = fixture.componentInstance;
6564
});
@@ -70,9 +69,9 @@ describe('AppComponent', () => {
7069
}));
7170

7271
it('should show an error on initial nav failure', waitForAsync(() => {
73-
const location = TestBed.get(Location);
72+
const location = TestBed.inject(Location);
7473
location.replaceState('error');
75-
const router: Router = TestBed.get(Router);
74+
const router: Router = TestBed.inject(Router);
7675

7776
// Mock the zone to catch unhandled rejections
7877
spyOn(Zone.current, 'runGuarded').and.callFake((fn: Function) => {

ui/src/app/app.module.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { FormsModule } from '@angular/forms';
44
import { MatIconModule } from "@angular/material/icon";
55
import { BrowserModule } from '@angular/platform-browser';
66
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
7-
import { ClrIconModule, ClrTooltipModule } from '@clr/angular';
87
import { Ng2GoogleChartsModule } from 'ng2-google-charts';
98
import { NgxJsonViewerModule } from 'ngx-json-viewer';
109
import { AppRoutingModule } from './app-routing.module';
@@ -24,8 +23,6 @@ import { PagenotfoundComponent } from './pagenotfound/pagenotfound.component';
2423
bootstrap: [AppComponent], imports: [AppRoutingModule,
2524
BrowserAnimationsModule,
2625
BrowserModule,
27-
ClrIconModule,
28-
ClrTooltipModule,
2926
CoreModule,
3027
FormsModule,
3128
JobDetailsModule,

ui/src/app/dashboard/dashboard.component.spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {CapabilitiesResponse} from "../shared/model/CapabilitiesResponse";
2626
import {CapabilitiesService} from "../core/capabilities.service";
2727
import {FakeCapabilitiesService} from "../testing/fake-capabilities.service";
2828
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
29-
import {ClrIconModule, ClrTooltipModule} from "@clr/angular";
29+
3030
import {SettingsService} from "../core/settings.service";
3131
import {AuthService} from "../core/auth.service";
3232

@@ -152,8 +152,6 @@ describe('DashboardComponent', () => {
152152
TestJobListComponent,
153153
],
154154
imports: [
155-
ClrIconModule,
156-
ClrTooltipModule,
157155
CommonModule,
158156
BrowserAnimationsModule,
159157
MatCardModule,
@@ -181,7 +179,7 @@ describe('DashboardComponent', () => {
181179
beforeEach(fakeAsync(() => {
182180
fixture = TestBed.createComponent(AppComponent);
183181
de = fixture.debugElement;
184-
const router: Router = TestBed.get(Router);
182+
const router: Router = TestBed.inject(Router);
185183
router.initialNavigation();
186184

187185
router.navigate(['dashboard'], {

ui/src/app/dashboard/dashboard.module.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import {MatButtonModule} from "@angular/material/button";
99
import {MatCardModule} from "@angular/material/card";
1010
import {MatSelectModule} from "@angular/material/select";
1111
import {MatSortModule} from "@angular/material/sort";
12+
import {MatIconModule} from "@angular/material/icon";
1213
import {MatTableModule} from "@angular/material/table";
14+
import {MatTooltipModule} from "@angular/material/tooltip";
1315
import {GroupedSummaryComponent} from './grouped-summary/grouped-summary.component';
1416
import {SharedModule} from "../shared/shared.module";
15-
import {ClrIconModule, ClrTooltipModule} from "@clr/angular";
1617

1718

1819
@NgModule({
@@ -22,14 +23,14 @@ import {ClrIconModule, ClrTooltipModule} from "@clr/angular";
2223
GroupedSummaryComponent
2324
],
2425
imports: [
25-
ClrIconModule,
26-
ClrTooltipModule,
2726
CommonModule,
28-
MatCardModule,
29-
MatTableModule,
30-
MatSortModule,
3127
MatButtonModule,
28+
MatCardModule,
29+
MatIconModule,
3230
MatSelectModule,
31+
MatSortModule,
32+
MatTableModule,
33+
MatTooltipModule,
3334
RouterModule,
3435
SharedModule,
3536
],

ui/src/app/dashboard/grouped-summary/grouped-summary.component.html

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@
88
</span></th>
99
<ng-container *ngFor="let status of statusArray">
1010
<th [mat-sort-header]=status>
11-
<clr-tooltip>
12-
<clr-icon clrTooltipTrigger [attr.shape]="getStatusIcon(status)" class="status-icon"></clr-icon>
13-
<clr-tooltip-content clrPosition="left" clrSize="xs" *clrIfOpen>
14-
<span>{{ status }}</span>
15-
</clr-tooltip-content>
16-
</clr-tooltip>
11+
<mat-icon class="status-icon" [ngClass]="getStatusIcon(status)" [matTooltip]="status" matTooltipPosition="left">{{getStatusIcon(status)}}</mat-icon>
1712
</th>
1813
</ng-container>
1914
</tr>
@@ -39,7 +34,7 @@
3934
</mat-card-content>
4035
<div class="button-container" *ngIf="displayCollapseArrow()">
4136
<button mat-icon-button (click)="onArrowClick()">
42-
<clr-icon [attr.shape]="'angle'" class="arrow"></clr-icon>
37+
<mat-icon class="arrow">expand_more</mat-icon>
4338
</button>
4439
</div>
4540
</mat-card>

ui/src/app/dashboard/grouped-summary/grouped-summary.component.spec.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {JobStatus} from "../../shared/model/JobStatus";
1313
import {Aggregation} from "../../shared/model/Aggregation";
1414
import {ActivatedRoute} from "@angular/router";
1515
import {RouterTestingModule} from "@angular/router/testing";
16-
import {ClrIconModule, ClrTooltipModule} from "@clr/angular";
16+
1717
import {SharedModule} from "../../shared/shared.module";
1818
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
1919

@@ -126,8 +126,6 @@ describe('GroupedSummaryComponent', () => {
126126
TestHostComponent
127127
],
128128
imports: [
129-
ClrIconModule,
130-
ClrTooltipModule,
131129
CommonModule,
132130
BrowserAnimationsModule,
133131
MatCardModule,

ui/src/app/dashboard/total-summary/total-summary.component.html

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
<div class="content">
88
<!-- Add commas to numbers for better UX -->
99
{{ statusCountsMap.get(status).toLocaleString('en') }}
10-
<clr-tooltip>
11-
<clr-icon clrTooltipTrigger [attr.shape]="getStatusIcon(status)" class="icon"></clr-icon>
12-
</clr-tooltip>
10+
<mat-icon class="icon" [ngClass]="getStatusIcon(status)">{{getStatusIcon(status)}}</mat-icon>
1311
</div>
1412
</a>
1513
</mat-card>

ui/src/app/dashboard/total-summary/total-summary.component.spec.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {JobStatus} from "../../shared/model/JobStatus";
1010
import {StatusCounts} from "../../shared/model/StatusCounts";
1111
import {ActivatedRoute} from "@angular/router";
1212
import {RouterTestingModule} from "@angular/router/testing";
13-
import {ClrIconModule, ClrTooltipModule} from "@clr/angular";
13+
1414

1515
const testSummary: StatusCounts = {
1616
counts: [
@@ -39,8 +39,6 @@ describe('TotalSummaryComponent', () => {
3939
TestHostComponent
4040
],
4141
imports: [
42-
ClrIconModule,
43-
ClrTooltipModule,
4442
CommonModule,
4543
MatCardModule,
4644
MatTableModule,

0 commit comments

Comments
 (0)