Skip to content

Commit b4588fc

Browse files
sei-rkemererrkcert1sei-aschlackmansei-tspencerclaude
authored
Add caster classification banner (#636)
* Added classification header * added localNPM config * fix vlan partition alignment * layout fixes * Added settings.shared.json to gitignore * Add classification banner 2 (#635) * fix displaying duplicate plan output in some error cases (#624) * labels added (#625) * Support MaxConcurrentRuns queue status display (#626) ## Summary This PR introduces real-time queue positioning and status updates for concurrent runs. **Key Changes:** * **Real-time Queue Position:** Displays the current position for runs waiting in the concurrency queue (e.g., *"Queued (Position 1)"*). * **Non-breaking Status Updates:** Adds a `displayStatus` property to runs via declaration merging. The actual `status` field remains unchanged to prevent breaking existing logic. * **SignalR Event Listeners:** Listens for `RunCreated` and `RunQueuePositionUpdated` events so queued runs appear immediately without requiring a page refresh. * **New `ApplyQueued` Status:** Recognizes the new `ApplyQueued` `RunStatus`. When active, this disables the Plan/Apply buttons, shows the run in the active list, skips terminal streaming, and fetches the queue position. * **Cancellation Support:** Allows users to cancel runs that are currently in the queue (supports both `Queued` and `ApplyQueued` statuses). * **Table UI Updates:** Adds a `columnLabels` input to `cwd-table` so the `displayStatus` column renders correctly with the header label **"Status"**. * **API Client Update:** Regenerated the API client to include the new `QueuePosition` model and queue position endpoints. * Chore/auto version update (#629) * chore: configure automatic version updates via reusable workflow Migrate to the cmu-sei/Crucible-Github-Actions docker-build reusable workflow @docker-v1 and add versionMode/versionFiles inputs to enable automatic version bumping on release. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * migrate to cmu-sei/Crucible-Github-Actions/.github/workflows/docker-build.yaml@docker-v1.1.2 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * Use v1 tag for docker-build action (#630) * merged main and version 0.6.0 --------- Co-authored-by: Andrew Schlackman <72105194+sei-aschlackman@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Jarrett Booz <89405171+sei-jbooz@users.noreply.github.com> --------- Co-authored-by: Robert Kemerer <rkemerer@cert.org> Co-authored-by: Andrew Schlackman <72105194+sei-aschlackman@users.noreply.github.com> Co-authored-by: Tim Spencer <72101647+sei-tspencer@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Jarrett Booz <89405171+sei-jbooz@users.noreply.github.com>
1 parent e8ec216 commit b4588fc

27 files changed

+254
-163
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Thumbs.db
4747
/swagger.json
4848
/terraform/
4949
src/assets/config/settings.[Ee]nv.json
50+
src/assets/config/settings.shared.json
5051

5152
# Terraform
5253
/terraform-working
@@ -62,3 +63,4 @@ src/assets/config/settings.[Ee]nv.json
6263
/docker/docker-compose
6364

6465
.angular/cache
66+
tsconfig.local-npm.json

angular.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"includePaths": ["src/styles", "./node_modules/bootstrap/scss"]
4949
},
5050
"scripts": [],
51+
"preserveSymlinks": true,
5152
"extractLicenses": false,
5253
"sourceMap": true,
5354
"optimization": false,
@@ -78,6 +79,19 @@
7879
"maximumWarning": "6kb"
7980
}
8081
]
82+
},
83+
"development": {
84+
"optimization": false,
85+
"extractLicenses": false,
86+
"sourceMap": {
87+
"scripts": true,
88+
"styles": true,
89+
"vendor": true
90+
},
91+
"namedChunks": true
92+
},
93+
"localNPM": {
94+
"tsConfig": "tsconfig.local-npm.json"
8195
}
8296
}
8397
},
@@ -86,9 +100,16 @@
86100
"options": {
87101
"buildTarget": "caster-ui:build"
88102
},
103+
"defaultConfiguration": "development",
89104
"configurations": {
90105
"production": {
91106
"buildTarget": "caster-ui:build:production"
107+
},
108+
"development": {
109+
"buildTarget": "caster-ui:build:development"
110+
},
111+
"localNPM": {
112+
"buildTarget": "caster-ui:build:development,localNPM"
92113
}
93114
}
94115
},

package-lock.json

Lines changed: 14 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,17 @@
3939
"@angular/platform-browser": "^21.2.1",
4040
"@angular/platform-browser-dynamic": "^21.2.1",
4141
"@angular/router": "^21.2.1",
42-
"@cmusei/crucible-common": "0.4.3",
42+
"@cmusei/crucible-common": "0.6.0",
4343
"@datorama/akita": "^8.0.1",
4444
"@datorama/akita-ng-router-store": "^8.0.0",
4545
"@datorama/akita-ngdevtools": "^7.0.0",
46-
"ngx-monaco-editor-v2": "^21.0.0",
46+
"@material/material-color-utilities": "^0.4.0",
4747
"@mdi/font": "^7.4.47",
4848
"@microsoft/signalr": "^10.0.0",
4949
"@ng-bootstrap/ng-bootstrap": "^20.0.0",
5050
"@ngneat/hotkeys": "^1.3.0",
51+
"@xterm/addon-fit": "^0.11.0",
52+
"@xterm/xterm": "^6.0.0",
5153
"angular-resizable-element": "^8.0.1",
5254
"autoprefixer": "^10.4.13",
5355
"bootstrap": "^5.3.3",
@@ -57,11 +59,10 @@
5759
"monaco-editor": "^0.55.1",
5860
"ng-for-track-by-property": "^21.0.1",
5961
"ngx-clipboard": "^16.0.0",
62+
"ngx-monaco-editor-v2": "^21.0.0",
6063
"oidc-client-ts": "^3.4.1",
6164
"rxjs": "^7.8.2",
6265
"tslib": "^2.8.1",
63-
"@xterm/xterm": "^6.0.0",
64-
"@xterm/addon-fit": "^0.11.0",
6566
"zone.js": "~0.15.1"
6667
},
6768
"devDependencies": {

src/app/admin-app/component/admin-container/admin-container.component.html

Lines changed: 62 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -97,66 +97,68 @@ <h2 class="icon-text">Administration</h2>
9797
/>
9898
</mat-sidenav>
9999
<mat-sidenav-content>
100-
<cas-topbar
101-
[title]="showStatus"
102-
[topbarColor]="topbarColor"
103-
[topbarTextColor]="topbarTextColor"
104-
[topbarView]="TopbarView.CASTER_ADMIN"
105-
[sidenav]="sidenav"
106-
(sidenavToggle)="sidenav.toggle()"
107-
></cas-topbar>
108-
@if (permissions$ | async; as permissions) {
109-
<span>
110-
@if (
111-
showStatus === usersText &&
112-
permissions.includes(SystemPermission.ViewUsers)
113-
) {
114-
<cas-users
115-
></cas-users>
116-
}
117-
@if (
118-
showStatus === modulesText &&
119-
permissions.includes(SystemPermission.ViewModules)
120-
) {
121-
<cas-admin-modules
122-
></cas-admin-modules>
123-
}
124-
@if (
125-
showStatus === workspacesText &&
126-
permissions.includes(SystemPermission.ViewWorkspaces)
127-
) {
128-
<cas-admin-workspaces
129-
></cas-admin-workspaces>
130-
}
131-
@if (
132-
showStatus === vlansText &&
133-
permissions.includes(SystemPermission.ViewVlans)
134-
) {
135-
<cas-vlans
136-
></cas-vlans>
100+
<div class="sidenav-layout">
101+
<cas-topbar
102+
[title]="showStatus"
103+
[topbarColor]="topbarColor"
104+
[topbarTextColor]="topbarTextColor"
105+
[topbarView]="TopbarView.CASTER_ADMIN"
106+
[sidenav]="sidenav"
107+
(sidenavToggle)="sidenav.toggle()"
108+
></cas-topbar>
109+
<div class="admin-content">
110+
@if (permissions$ | async; as permissions) {
111+
@if (
112+
showStatus === usersText &&
113+
permissions.includes(SystemPermission.ViewUsers)
114+
) {
115+
<cas-users
116+
></cas-users>
117+
}
118+
@if (
119+
showStatus === modulesText &&
120+
permissions.includes(SystemPermission.ViewModules)
121+
) {
122+
<cas-admin-modules
123+
></cas-admin-modules>
124+
}
125+
@if (
126+
showStatus === workspacesText &&
127+
permissions.includes(SystemPermission.ViewWorkspaces)
128+
) {
129+
<cas-admin-workspaces
130+
></cas-admin-workspaces>
131+
}
132+
@if (
133+
showStatus === vlansText &&
134+
permissions.includes(SystemPermission.ViewVlans)
135+
) {
136+
<cas-vlans
137+
></cas-vlans>
138+
}
139+
@if (
140+
showStatus === rolesText &&
141+
permissions.includes(SystemPermission.ViewRoles)
142+
) {
143+
<cas-admin-roles
144+
></cas-admin-roles>
145+
}
146+
@if (
147+
showStatus === groupsText &&
148+
permissions.includes(SystemPermission.ViewGroups)
149+
) {
150+
<cas-admin-groups
151+
></cas-admin-groups>
152+
}
153+
@if (
154+
showStatus === projectsText &&
155+
permissions.includes(SystemPermission.ManageProjects)
156+
) {
157+
<cas-admin-projects
158+
></cas-admin-projects>
159+
}
137160
}
138-
@if (
139-
showStatus === rolesText &&
140-
permissions.includes(SystemPermission.ViewRoles)
141-
) {
142-
<cas-admin-roles
143-
></cas-admin-roles>
144-
}
145-
@if (
146-
showStatus === groupsText &&
147-
permissions.includes(SystemPermission.ViewGroups)
148-
) {
149-
<cas-admin-groups
150-
></cas-admin-groups>
151-
}
152-
@if (
153-
showStatus === projectsText &&
154-
permissions.includes(SystemPermission.ManageProjects)
155-
) {
156-
<cas-admin-projects
157-
></cas-admin-projects>
158-
}
159-
</span>
160-
}
161+
</div>
162+
</div>
161163
</mat-sidenav-content>
162164
</mat-sidenav-container>

src/app/admin-app/component/admin-container/admin-container.component.scss

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
// Copyright 2021 Carnegie Mellon University. All Rights Reserved.
22
// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information.
33

4+
:host {
5+
display: block;
6+
height: 100%;
7+
}
8+
49
.cas-project-container {
510
text-align: center;
611
width: 80%;
712
min-width: 1000px;
813
max-width: 1400px;
9-
height: calc(100vh - 100px);
1014
}
1115

1216
.title-text {
@@ -37,15 +41,12 @@
3741
}
3842

3943
.appcontent-container {
40-
position: absolute;
41-
top: 0;
42-
bottom: 0;
43-
left: 0;
44-
right: 0;
45-
46-
::ng-deep .mat-sidenav-content {
47-
overflow: hidden;
48-
}
44+
width: 100%;
45+
overflow: hidden;
46+
flex: 1;
47+
height: 100%;
48+
display: flex;
49+
flex-direction: column;
4950
}
5051

5152
.appbarmenu-container {
@@ -93,11 +94,6 @@
9394
margin-top: 10px;
9495
}
9596

96-
.nolink {
97-
text-decoration: none;
98-
}
99-
100-
10197
.crucible-logo {
10298
position: absolute;
10399
bottom: 0;
@@ -134,3 +130,15 @@
134130
justify-content: flex-start;
135131
align-items: center;
136132
}
133+
134+
.sidenav-layout {
135+
display: grid;
136+
grid-template-rows: auto 1fr;
137+
height: 100%;
138+
overflow: hidden;
139+
}
140+
141+
.admin-content {
142+
overflow: auto;
143+
min-height: 0;
144+
}

src/app/admin-app/component/admin-groups/admin-groups.component.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Copyright 2021 Carnegie Mellon University. All Rights Reserved.
66
:host {
77
display: flex;
88
flex-direction: column;
9-
height: calc(100vh - 46px);
9+
height: 100%;
1010
}
1111

1212
.cssLayoutColumnCenterStart {

src/app/admin-app/component/admin-modules/modules.component.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ Released under a MIT (SEI)-style license. See LICENSE.md in the project root for
66
:host {
77
display: flex;
88
flex-direction: column;
9-
height: calc(100vh - 46px);
9+
height: 100%;
1010
}

src/app/admin-app/component/admin-projects/admin-projects.component.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ Copyright 2021 Carnegie Mellon University. All Rights Reserved.
66
:host {
77
display: flex;
88
flex-direction: column;
9-
height: calc(100vh - 46px);
9+
height: 100%;
1010
width: 100%;
1111
}

src/app/admin-app/component/admin-roles/admin-roles.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information.
44
-->
55

6-
<mat-tab-group>
6+
<mat-tab-group class="scrollable-tabs">
77
<mat-tab label="Roles">
88
<ng-template matTabContent>
99
<cas-system-roles></cas-system-roles>

0 commit comments

Comments
 (0)