Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions public/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:application",
"builder": "@angular/build:application",
"options": {
"outputPath": {
"base": "dist/public",
Expand Down Expand Up @@ -71,7 +71,7 @@
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular/build:dev-server",
"options": {
"buildTarget": "public:build"
},
Expand All @@ -85,13 +85,13 @@
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"builder": "@angular/build:extract-i18n",
"options": {
"buildTarget": "public:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"builder": "@angular/build:karma",
"options": {
"main": "src/test.ts",
"polyfills": [
Expand Down
31,003 changes: 11,447 additions & 19,556 deletions public/package-lock.json

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions public/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^20.3.15",
"@angular/common": "^20.3.15",
"@angular/compiler": "^20.3.15",
"@angular/core": "^20.3.15",
"@angular/forms": "^20.3.15",
"@angular/platform-browser": "^20.3.15",
"@angular/platform-browser-dynamic": "^20.3.15",
"@angular/router": "^20.3.15",
"@sentry/angular": "^10.7.0",
"@angular/animations": "^21.1.1",
"@angular/common": "^21.1.1",
"@angular/compiler": "^21.1.1",
"@angular/core": "^21.1.1",
"@angular/forms": "^21.1.1",
"@angular/platform-browser": "^21.1.1",
"@angular/platform-browser-dynamic": "^21.1.1",
"@angular/router": "^21.1.1",
"@sentry/angular": "^10.36.0",
"@sentry/tracing": "^6.2.3",
"bootstrap": "^5.3.8",
"compare-versions": "^3.6.0",
Expand All @@ -31,10 +31,10 @@
"zone.js": "~0.15.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "^20.2.1",
"@angular/cli": "^20.2.0",
"@angular/compiler-cli": "^20.3.15",
"@angular/language-service": "^20.3.15",
"@angular/build": "^21.1.1",
"@angular/cli": "^21.1.1",
"@angular/compiler-cli": "^21.1.1",
"@angular/language-service": "^21.1.1",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "^2.0.8",
"@types/node": "^12.11.1",
Expand All @@ -48,7 +48,7 @@
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "^2.1.0",
"ts-node": "~7.0.0",
"typescript": "~5.8.3",
"typescript": "~5.9.3",
"typescript-eslint": "8.40.0"
}
}
31 changes: 17 additions & 14 deletions public/src/app/agent-detail/agent-detail.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
</span>

<div class="agent-detail {{pinned ? 'pinned':''}} gravity-left gravity-bottom" #wrapper>
<ng-container *ngIf="pinned || (isVisible | async)">
@if (pinned || (isVisible | async)) {
<div class="summary">
<span class="summary-label">{{agent.name}}</span>
<span class="pin" (click)="pin()">📌</span>
Expand All @@ -16,15 +16,19 @@
<th class="">Status</th>
<td>{{agentStatus(agent).title}}</td>
</tr>
<ng-container *ngIf="agent.build">
<tr *ngIf="pullRequest">
<th class="">Pull Request</th>
<td><a href="https://github.com/keymanapp/keyman/pull/{{pullRequest}}" target="_blank"><b>#{{pullRequest.number}}:</b> {{pullRequest.title}}</a></td>
</tr>
<tr *ngIf="branch">
<th class="">Branch</th>
<td>{{branch}}</td>
</tr>
@if (agent.build) {
@if (pullRequest) {
<tr>
<th class="">Pull Request</th>
<td><a href="https://github.com/keymanapp/keyman/pull/{{pullRequest}}" target="_blank"><b>#{{pullRequest.number}}:</b> {{pullRequest.title}}</a></td>
</tr>
}
@if (branch) {
<tr>
<th class="">Branch</th>
<td>{{branch}}</td>
</tr>
}
<tr>
<th class="">Version String</th>
<td>{{agent.build.number}}</td>
Expand All @@ -45,9 +49,8 @@
<th>Progress</th>
<td>{{agent.build.percentageComplete}}% complete</td>
</tr>
</ng-container>
}
</tbody></table>

</ng-container>
}
</div>
</span>
</span>
34 changes: 23 additions & 11 deletions public/src/app/assigned-issues/assigned-issues.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,35 @@
<div class="summary">
<span><app-clipboard [text]="getIssueListText()" title="Copy list of issues to clipboard"></app-clipboard></span>
<span>
<span *ngIf="user.login != ''" class="summary-label">Issues <a href="https://github.com/search?q=org%3Akeymanapp+assignee%3A{{user.login}}+milestone%3A{{status.currentSprint?.title}}+is%3Aopen&type=issues" target="_blank">assigned</a> to <a href="https://github.com/{{user.login}}" target="_blank">&#64;{{user.login}}</a> in {{status.currentSprint?.title}}</span>
<span *ngIf="user.login == ''" class="summary-label">Unassigned issues in {{status.currentSprint?.title}}</span>
@if (user.login != '') {
<span class="summary-label">Issues <a href="https://github.com/search?q=org%3Akeymanapp+assignee%3A{{user.login}}+milestone%3A{{status.currentSprint?.title}}+is%3Aopen&type=issues" target="_blank">assigned</a> to <a href="https://github.com/{{user.login}}" target="_blank">&#64;{{user.login}}</a> in {{status.currentSprint?.title}}</span>
}
@if (user.login == '') {
<span class="summary-label">Unassigned issues in {{status.currentSprint?.title}}</span>
}
</span>
<div class='clear'></div>
</div>
<ul >
<li *ngFor="let issue of issues">
<div *ngIf="issueIsDifferentRepo(issue)" class="repo {{issueIsFirst(issue) ? 'repo-first' : ''}}">{{issue.repository.name}}</div>
@for (issue of issues; track issue) {
<li>
@if (issueIsDifferentRepo(issue)) {
<div class="repo {{issueIsFirst(issue) ? 'repo-first' : ''}}">{{issue.repository.name}}</div>
}
<span class="label">
<a class="author" title="{{issue.author.login}}" target="_blank" href="{{issue.author.url}}"><img class="avatar-22" src="{{getAuthorAvatar(issue.author, 22)}}"></a>
<a class="issue" title="{{issue.title}}" target="_blank" href="{{issue.url}}">{{issueHasLinkedPR(issue) ? '✔ ': ''}}<b>{{issue.number}}</b> {{issue.title}}</a>
<span class="related-pr" *ngFor="let pr of issue.timelineItems?.nodes">
<a href="{{pr.subject.url}}" class="{{pr.willCloseTarget ? 'will-close' : ''}}" target="_blank">{{pr.subject.url && pr.subject.url.includes('/pull/') ? '🔗' : '🔵'}}#{{pr.subject.number}}</a>
<a class="author" title="{{issue.author.login}}" target="_blank" href="{{issue.author.url}}"><img class="avatar-22" src="{{getAuthorAvatar(issue.author, 22)}}"></a>
<a class="issue" title="{{issue.title}}" target="_blank" href="{{issue.url}}">{{issueHasLinkedPR(issue) ? '✔ ': ''}}<b>{{issue.number}}</b> {{issue.title}}</a>
@for (pr of issue.timelineItems?.nodes; track pr) {
<span class="related-pr">
<a href="{{pr.subject.url}}" class="{{pr.willCloseTarget ? 'will-close' : ''}}" target="_blank">{{pr.subject.url && pr.subject.url.includes('/pull/') ? '🔗' : '🔵'}}#{{pr.subject.number}}</a>
</span>
}
@for (label of issue.labels?.nodes; track label) {
<span><span class="issue-label" [style]="labelColor(label)">{{labelName(label.name)}}</span></span>
}
</span>
<span *ngFor="let label of issue.labels?.nodes"><span class="issue-label" [style]="labelColor(label)">{{labelName(label.name)}}</span></span>
</span>
</li>
</li>
}
</ul>
</div>

Expand Down
30 changes: 19 additions & 11 deletions public/src/app/box-pr-author/box-pr-author.component.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
<table><tbody>
<tr *ngFor="let author of pullsByAuthor | keyvalue">
<td>
<a *ngIf="!author.value[0].pull.node.headRefName.startsWith('epic')" class="author" title="{{author.value[0].pull.node.author.login}}" target="_blank" href="{{author.value[0].pull.node.author.url}}"><img class="avatar-48" src="{{getAuthorAvatar(author.value[0].pull.node.author, 48)}}"></a>
<a *ngIf="author.value[0].pull.node.headRefName.startsWith('epic')" class="author" title="epics" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+head%3Aepic"><img class="avatar-48" src="/assets/artifacts/keyman.png"></a>
</td>
<td>
<span *ngFor="let pull of author.value">
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
</td>
</tr>
@for (author of pullsByAuthor | keyvalue; track author) {
<tr>
<td>
@if (!author.value[0].pull.node.headRefName.startsWith('epic')) {
<a class="author" title="{{author.value[0].pull.node.author.login}}" target="_blank" href="{{author.value[0].pull.node.author.url}}"><img class="avatar-48" src="{{getAuthorAvatar(author.value[0].pull.node.author, 48)}}"></a>
}
@if (author.value[0].pull.node.headRefName.startsWith('epic')) {
<a class="author" title="epics" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+head%3Aepic"><img class="avatar-48" src="/assets/artifacts/keyman.png"></a>
}
</td>
<td>
@for (pull of author.value; track pull) {
<span>
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
}
</td>
</tr>
}
</tbody></table>
20 changes: 12 additions & 8 deletions public/src/app/box-pr-base/box-pr-base.component.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
<table><tbody>
<tr *ngFor="let base of pullsByBase | keyvalue">
<td class='base'>{{base.key == 'other' ? '⬜' : base.key}}</td>
<td>
<span *ngFor="let pull of base.value">
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
</td>
</tr>
@for (base of pullsByBase | keyvalue; track base) {
<tr>
<td class='base'>{{base.key == 'other' ? '⬜' : base.key}}</td>
<td>
@for (pull of base.value; track pull) {
<span>
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
}
</td>
</tr>
}
</tbody></table>
18 changes: 12 additions & 6 deletions public/src/app/box-pr-platform/box-pr-platform.component.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
<div [class]="'emoji-group' + (emoji.key == '' ? '' : ' emoji-group-border')" *ngFor="let emoji of platform.value.pullsByEmoji | keyvalue">
<span *ngIf="emoji.key != ''" class="emoji">{{emoji.key}}</span>
<span *ngFor="let pull of emoji.value">
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="platform.value.id" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
</div>
@for (emoji of platform.pullsByEmoji | keyvalue; track emoji.key) {
<div [class]="'emoji-group' + (emoji.key == '' ? '' : ' emoji-group-border')">
@if (emoji.key != '') {
<span class="emoji">{{emoji.key}}</span>
}
@for (pull of emoji.value; track pull) {
<span>
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="platform.id" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
}
</div>
}
20 changes: 12 additions & 8 deletions public/src/app/box-pr-project/box-pr-project.component.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
<table><tbody>
<tr *ngFor="let project of pullsByProject | keyvalue">
<td class='emoji'>{{project.key == 'other' ? '⬜' : project.key}}</td>
<td>
<span *ngFor="let pull of project.value">
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
</td>
</tr>
@for (project of pullsByProject | keyvalue; track project) {
<tr>
<td class='emoji'>{{project.key == 'other' ? '⬜' : project.key}}</td>
<td>
@for (pull of project.value; track pull) {
<span>
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
}
</td>
</tr>
}
</tbody></table>
84 changes: 55 additions & 29 deletions public/src/app/box-pr-status/box-pr-status.component.html
Original file line number Diff line number Diff line change
@@ -1,31 +1,57 @@
<table><tbody>
<tr *ngFor="let pullStatus of pullsByStatus | keyvalue">
<td>
<a *ngIf="pullStatus.key == 'draft'" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+is%3Adraft">{{pullStatusName[pullStatus.key]}}</a>
<a *ngIf="pullStatus.key == 'epics'" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+head%3Aepic%2F">{{pullStatusName[pullStatus.key]}}</a>
<a *ngIf="pullStatus.key == 'waitingTest'" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+label%3Auser-test-required">{{pullStatusName[pullStatus.key]}}</a>
<a *ngIf="pullStatus.key == 'waitingReview'" target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+review%3Arequired+-is%3Adraft">{{pullStatusName[pullStatus.key]}}</a>
<span *ngIf="pullStatus.key != 'waitingReview' && pullStatus.key != 'draft' && pullStatus.key != 'epics' && pullStatus.key != 'waitingTest'">{{pullStatusName[pullStatus.key]}}</span>
</td>
<td>
<span *ngFor="let pull of pullStatus.value">
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
<span *ngIf="pullStatus.key =='readyToMerge'">
<span *ngFor="let issue of userTestIssuesPassed">
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
</span>
<span *ngIf="pullStatus.key =='waitingTest'">
<span *ngFor="let issue of userTestIssues | filterIssueByLabel: 'user-test-required'">
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
</span>
<span *ngIf="pullStatus.key =='waitingResponse'">
<span *ngFor="let issue of userTestIssues | filterIssueByLabel: 'user-test-failed'">
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
</span>
</td>
</tr>
@for (pullStatus of pullsByStatus | keyvalue; track pullStatus) {
<tr>
<td>
@if (pullStatus.key == 'draft') {
<a target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+is%3Adraft">{{pullStatusName[pullStatus.key]}}</a>
}
@if (pullStatus.key == 'epics') {
<a target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+head%3Aepic%2F">{{pullStatusName[pullStatus.key]}}</a>
}
@if (pullStatus.key == 'waitingTest') {
<a target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+label%3Auser-test-required">{{pullStatusName[pullStatus.key]}}</a>
}
@if (pullStatus.key == 'waitingReview') {
<a target="_blank" href="https://github.com/keymanapp/keyman/pulls?q=is%3Apr+is%3Aopen+review%3Arequired+-is%3Adraft">{{pullStatusName[pullStatus.key]}}</a>
}
@if (pullStatus.key != 'waitingReview' && pullStatus.key != 'draft' && pullStatus.key != 'epics' && pullStatus.key != 'waitingTest') {
<span>{{pullStatusName[pullStatus.key]}}</span>
}
</td>
<td>
@for (pull of pullStatus.value; track pull) {
<span>
<app-pull-request [status]="status" [changeCounter]="changeCounter" [teamCity]="status.teamCity" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [pull]="pull"></app-pull-request>
</span>
}
@if (pullStatus.key =='readyToMerge') {
<span>
@for (issue of userTestIssuesPassed; track issue) {
<span>
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
}
</span>
}
@if (pullStatus.key =='waitingTest') {
<span>
@for (issue of userTestIssues | filterIssueByLabel: 'user-test-required'; track issue) {
<span>
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
}
</span>
}
@if (pullStatus.key =='waitingResponse') {
<span>
@for (issue of userTestIssues | filterIssueByLabel: 'user-test-failed'; track issue) {
<span>
<app-issue [changeCounter]="changeCounter" [scope]="'platform'" [scopeValue]="''" [gravityX]="'left'" [gravityY]="'bottom'" [issue]="issue"></app-issue>
</span>
}
</span>
}
</td>
</tr>
}
</tbody></table>
Loading