Skip to content

Commit 081f0c6

Browse files
authored
render the projects
1 parent d88f7eb commit 081f0c6

File tree

7 files changed

+267
-154
lines changed

7 files changed

+267
-154
lines changed

.eslintrc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@typescript-eslint/promise-function-async": "error",
4242
"@typescript-eslint/require-array-sort-compare": "error",
4343
"@typescript-eslint/restrict-plus-operands": "error",
44-
"semi": "off",
44+
"semi": 2,
4545
"@typescript-eslint/semi": ["error", "never"],
4646
"@typescript-eslint/type-annotation-spacing": "error",
4747
"@typescript-eslint/unbound-method": "error"

.prettierrc.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
"printWidth": 80,
33
"tabWidth": 2,
44
"useTabs": false,
5-
"semi": false,
5+
"semi": true,
66
"singleQuote": true,
7-
"trailingComma": "none",
8-
"bracketSpacing": false,
9-
"arrowParens": "avoid"
7+
"trailingComma": "all",
8+
"bracketSpacing": true,
9+
"arrowParens": "always"
1010
}

src/interfaces/TColumnTypes.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
export enum TColumnTypes {
22
Backlog = 'Backlog',
33
Committed = 'Committed',
4+
Blocked = 'Blocked',
45
InProgress = 'In progress',
5-
Done = 'Done'
6-
}
7-
;
6+
InReview = 'In review',
7+
WaitingToDeploy = 'Waiting to deploy',
8+
Done = 'Done',
9+
};

src/main.ts

+123-78
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,123 @@
1-
import * as core from '@actions/core'
2-
import {env} from './utils/env'
1+
import * as core from '@actions/core';
2+
import { env } from './utils/env';
33

44
// add .env file support for dev purposes
5-
require('dotenv').config()
6-
7-
import {AuthorizationError} from './errors/AuthorizationError'
8-
import {ProjectsOctoKit} from './octokit/ProjectsOctoKit'
9-
import {TEST_CONFIG} from './testConfig'
10-
import {TColumnTypes} from './interfaces/TColumnTypes'
11-
import {IWrappedIssue} from './interfaces/IWrappedIssue'
12-
import {renderIssuesBlock} from './views/renderIssuesBlock'
13-
import {TRepoIssue} from './interfaces/TRepoIssue'
14-
import {TProject} from './interfaces/TProject'
15-
import {IRepoSourceConfig} from './interfaces/IRepoSourceConfig'
16-
17-
export const OWNER = 'legomushroom'
18-
export const REPO = 'codespaces-board'
19-
const TOKEN_NAME = 'REPO_GITHUB_PAT'
5+
require('dotenv').config();
6+
7+
import { AuthorizationError } from './errors/AuthorizationError';
8+
import { ProjectsOctoKit } from './octokit/ProjectsOctoKit';
9+
import { TEST_CONFIG } from './testConfig';
10+
import { TColumnTypes } from './interfaces/TColumnTypes';
11+
import { IWrappedIssue } from './interfaces/IWrappedIssue';
12+
import { renderIssuesBlock } from './views/renderIssuesBlock';
13+
import { TRepoIssue } from './interfaces/TRepoIssue';
14+
import { TProject } from './interfaces/TProject';
15+
import { IRepoSourceConfig } from './interfaces/IRepoSourceConfig';
16+
17+
export const OWNER = 'legomushroom';
18+
export const REPO = 'codespaces-board';
19+
const TOKEN_NAME = 'REPO_GITHUB_PAT';
2020

2121
const renderProject = async (
2222
projectKit: ProjectsOctoKit,
2323
repo: IRepoSourceConfig,
24-
project: TProject
24+
project: TProject,
2525
): Promise<string> => {
26-
const columns = await projectKit.getColumns(project)
27-
const issues = await projectKit.getRepoIssues(repo)
26+
const columns = await projectKit.getColumns(project);
27+
const issues = await projectKit.getRepoIssues(repo);
28+
29+
const backlogIssues = await projectKit.filterIssuesForColumnCards(
30+
issues,
31+
columns,
32+
TColumnTypes.Backlog,
33+
);
34+
35+
const committedIssues = await projectKit.filterIssuesForColumnCards(
36+
issues,
37+
columns,
38+
TColumnTypes.Committed,
39+
);
40+
41+
const blockedIssues = await projectKit.filterIssuesForColumnCards(
42+
issues,
43+
columns,
44+
TColumnTypes.Blocked,
45+
);
46+
2847
const progressIssues = await projectKit.filterIssuesForColumnCards(
2948
issues,
30-
columns[TColumnTypes.InProgress]
31-
)
32-
const doneIssues = await projectKit.filterIssuesForColumnCards(
49+
columns,
50+
TColumnTypes.InProgress,
51+
);
52+
53+
const inReviewIssues = await projectKit.filterIssuesForColumnCards(
3354
issues,
34-
columns[TColumnTypes.Done]
35-
)
36-
const backlogIssues = await projectKit.filterIssuesForColumnCards(
55+
columns,
56+
TColumnTypes.InReview,
57+
);
58+
59+
const waitingToDeployIssues = await projectKit.filterIssuesForColumnCards(
3760
issues,
38-
columns[TColumnTypes.Committed]
39-
)
40-
41-
const wrappedProgressIssues: IWrappedIssue[] = progressIssues.map(
42-
wrapIssue(TColumnTypes.InProgress)
43-
)
44-
const wrappedDoneIssues: IWrappedIssue[] = doneIssues.map(
45-
wrapIssue(TColumnTypes.Done)
46-
)
47-
const wrappedIssues = [...wrappedProgressIssues, ...wrappedDoneIssues]
48-
49-
const projectTitle = `## ${project.name}`
50-
const inWorkIssuesString = renderIssuesBlock(
51-
`🏗️ In work (${doneIssues.length}/${
52-
progressIssues.length + doneIssues.length
53-
})`,
54-
wrappedIssues
55-
)
56-
57-
const wrappedBacklogIssues: IWrappedIssue[] = backlogIssues.map(
58-
wrapIssue(TColumnTypes.Committed)
59-
)
60-
61-
const backlogIssuesString = renderIssuesBlock(
62-
`📅 Backlog (${wrappedBacklogIssues.length})`,
63-
wrappedBacklogIssues
64-
)
65-
66-
return ['', projectTitle, inWorkIssuesString, backlogIssuesString].join('\n')
67-
}
61+
columns,
62+
TColumnTypes.WaitingToDeploy,
63+
);
6864

69-
const wrapIssue = (column: TColumnTypes) => {
70-
return (issue: TRepoIssue) => {
71-
return {
72-
column,
73-
issue
74-
}
75-
}
76-
}
65+
const doneIssues = await projectKit.filterIssuesForColumnCards(
66+
issues,
67+
columns,
68+
TColumnTypes.Done,
69+
);
70+
71+
const inWorkIssues = [...progressIssues, ...inReviewIssues];
72+
const doneOrDeployIssues = [...waitingToDeployIssues, ...doneIssues];
73+
const allPlannedIssues = [...blockedIssues, ...committedIssues, ...inWorkIssues, ...doneOrDeployIssues];
74+
75+
const doneRate = doneOrDeployIssues.length / allPlannedIssues.length;
76+
const inWorkRate = inWorkIssues.length / allPlannedIssues.length;
77+
const committedRate = committedIssues.length / allPlannedIssues.length;
78+
79+
const donePercent = Math.round(100 * doneRate);
80+
const inWorkPercent = Math.round(100 * inWorkRate);
81+
const committedPercent = Math.round(100 * committedRate);
82+
83+
const blockedIssuesString = renderIssuesBlock(
84+
`⚠️ ${blockedIssues.length} Blocked`,
85+
blockedIssues,
86+
false,
87+
);
88+
89+
const inWorkCount = `${inWorkIssues.length}/${allPlannedIssues.length}`;
90+
const inWorkIssuesString = renderIssuesBlock(
91+
`🏃 ${inWorkCount} In work (${inWorkPercent}%)`,
92+
inWorkIssues,
93+
);
94+
95+
const committedIssuesString = renderIssuesBlock(
96+
`💪 ${committedIssues.length} Committed (${committedPercent}%)`,
97+
committedIssues,
98+
);
99+
100+
const doneCount = `${doneOrDeployIssues.length}/${allPlannedIssues.length}`;
101+
const doneIssuesString = renderIssuesBlock(
102+
`✅ ${doneCount} Done (${donePercent}%)`,
103+
doneOrDeployIssues,
104+
);
105+
106+
const projectTitle = `## ${project.name} - ${donePercent}% done`;
107+
const projectLink = `Link: [${project.name}](${project.html_url})`;
108+
const backlogIssuesCountString = `\n*Backlog: ${backlogIssues.length} issues*`
109+
110+
return [
111+
'',
112+
projectTitle,
113+
projectLink,
114+
blockedIssuesString,
115+
committedIssuesString,
116+
inWorkIssuesString,
117+
doneIssuesString,
118+
backlogIssuesCountString,
119+
].join('\n');
120+
};
77121

78122
async function run(): Promise<void> {
79123
try {
@@ -86,12 +130,12 @@ async function run(): Promise<void> {
86130
const projectKit = new ProjectsOctoKit(token);
87131
const repoProjects = await projectKit.getAllProjects(TEST_CONFIG.repos);
88132

89-
for (let { repo, projects } of repoProjects ) {
133+
for (let { repo, projects } of repoProjects) {
90134
const result = await Promise.all(
91-
projects.map(project => {
92-
return renderProject(projectKit, repo, project)
93-
})
94-
)
135+
projects.map((project) => {
136+
return renderProject(projectKit, repo, project);
137+
}),
138+
);
95139

96140
const issueBody = result.join('\n') + '\n';
97141

@@ -105,24 +149,25 @@ async function run(): Promise<void> {
105149
footer = await projectKit.getBoardHeaderText(TEST_CONFIG.footerFileUrl);
106150
}
107151

108-
const issueContents = [
109-
header,
110-
issueBody,
111-
footer,
112-
].join('\n');
152+
const issueContents = [header, issueBody, footer].join('\n');
113153

114-
const { status } = await projectKit.updateBoardIssue(TEST_CONFIG.boardIssue, issueContents);
154+
const { status } = await projectKit.updateBoardIssue(
155+
TEST_CONFIG.boardIssue,
156+
issueContents,
157+
);
115158

116159
if (status !== 200) {
117-
throw new Error(`Failed to update the issue ${TEST_CONFIG.boardIssue}.`);
160+
throw new Error(
161+
`Failed to update the issue ${TEST_CONFIG.boardIssue}`,
162+
);
118163
}
119164

120-
console.log(`Successfully updated the board issue.`);
165+
console.log(`Successfully updated the board issue ${TEST_CONFIG.boardIssue}`);
121166
}
122167
} catch (error) {
123168
console.error(error);
124169
core.setFailed(error.message);
125170
}
126171
}
127172

128-
run()
173+
run();

0 commit comments

Comments
 (0)