diff --git a/browserslist b/.browserslistrc
similarity index 100%
rename from browserslist
rename to .browserslistrc
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index d255c61a..7250be3b 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,11 +1,39 @@
### Summary:
+Fixes #[Issue_number]
+
+#### Type of change:
+
+(Delete where appropriate)
+
+- โจ New Feature/ Enhancement
+- ๐ Bug Fix
+- ๐งช Tests Update
+- ๐ Documentation Update (CATcher-org/WATcher-docs#[Issue_number])
+- ๐จ Code Refactoring
+
### Changes Made:
--
+- [Description of the changes made in your PR]
+
+### Screenshots:
-### Commit Message:
+(If applicable, provide screenshots or GIFs to visually demonstrate the changes.)
+
+### Proposed Commit Message:
```
-Let's
+Commit message to be used when the PR is merged
+(NOTE: Wrap the body at 72 characters)
```
+
+
+
Checklist:
+
+
+- [ ] I have tested my changes thoroughly.
+- [ ] I have created tests for any new code files created in this PR or provided a link to a issue/PR that addresses this.
+- [ ] I have added or modified code comments to improve code readability where necessary.
+- [ ] I have updated the project's documentation as necessary.
+
+
diff --git a/.github/workflows/coverage-report.yml b/.github/workflows/coverage-report.yml
index a37cef4a..0ec7609f 100644
--- a/.github/workflows/coverage-report.yml
+++ b/.github/workflows/coverage-report.yml
@@ -6,16 +6,16 @@ name: Get Code Coverage Report
on:
push:
- branches: [ master, release ]
+ branches: [master, release]
pull_request:
- branches: [ master, release ]
+ branches: [master, release]
jobs:
code-coverage:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
diff --git a/.github/workflows/deployment-actions.yml b/.github/workflows/deployment-actions.yml
index d45cbd9f..0b5b6bae 100644
--- a/.github/workflows/deployment-actions.yml
+++ b/.github/workflows/deployment-actions.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- name: Checkout
uses: actions/checkout@v2
@@ -56,84 +56,3 @@ jobs:
- name: Set upload_url Context
id: set_upload_url
run: echo "::set-output name=upload_url::${{ steps.draft_release.outputs.upload_url }}"
-
- deploy_linux:
- runs-on: ubuntu-latest
- needs: draft_release
- strategy:
- matrix:
- node-version: [12.x]
- steps:
- - name: Checkout
- uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - name: Build
- run: |
- npm install
- npm run electron:linux
- - name: Upload Release Asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ needs.draft_release.outputs.upload_url }}
- asset_path: ./release/WATcher-${{ needs.draft_release.outputs.version_num }}.AppImage
- asset_name: WATcher-${{ needs.draft_release.outputs.version_num }}.AppImage
- asset_content_type: application/octet-stream
-
- deploy_windows:
- runs-on: windows-latest
- needs: draft_release
- strategy:
- matrix:
- node-version: [12.x]
- steps:
- - name: Checkout
- uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - name: Build
- run: |
- npm install
- npm run electron:windows
- - name: Upload Release Asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ needs.draft_release.outputs.upload_url }}
- asset_path: ./release/WATcher ${{ needs.draft_release.outputs.version_num }}.exe
- asset_name: WATcher-${{ needs.draft_release.outputs.version_num }}.exe
- asset_content_type: application/octet-stream
-
- deploy_macos:
- runs-on: macos-latest
- needs: draft_release
- strategy:
- matrix:
- node-version: [12.x]
- steps:
- - name: Checkout
- uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - name: Build
- run: |
- npm install
- npm run electron:mac
- - name: Upload Release Asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ needs.draft_release.outputs.upload_url }}
- asset_path: ./release/WATcher-${{ needs.draft_release.outputs.version_num }}.dmg
- asset_name: WATcher-${{ needs.draft_release.outputs.version_num }}.dmg
- asset_content_type: application/octet-stream
diff --git a/.github/workflows/deployment-staging.yml b/.github/workflows/deployment-staging.yml
index 131ec3e2..736a2621 100644
--- a/.github/workflows/deployment-staging.yml
+++ b/.github/workflows/deployment-staging.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- name: Checkout
uses: actions/checkout@v2
diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml
index 000fcf22..b7a17294 100644
--- a/.github/workflows/github-actions.yml
+++ b/.github/workflows/github-actions.yml
@@ -6,25 +6,25 @@ name: Setup Builds and Tests
on:
push:
- branches: [ main, release ]
+ branches: [main, release]
pull_request:
- branches: [ main, release ]
+ branches: [main, release]
jobs:
linux-setup-and-tests:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - run: npm install
- - run: npm update
- - run: npm run lint
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - run: npm install
+ - run: npm update
+ - run: npm run lint
# - run: npm test -- "--karma-config=./tests/karma.ci.conf.js"
# - run: npm run webdriver-manager update -- --gecko false --standalone false --versions.chrome $(curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$(google-chrome --version | grep -iEo "[0-9]{1,3}" | head -n1))
# - run: npm run webdriver-manager update -- --chrome false --standalone false
@@ -34,30 +34,30 @@ jobs:
runs-on: macos-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - run: npm install
- - run: npm update
- - run: npm run lint
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - run: npm install
+ - run: npm update
+ - run: npm run lint
# - run: npm test -- "--karma-config=./tests/karma.ci.conf.js" || npm test -- "--karma-config=./tests/karma.ci.conf.js"
# retry tests once, in case they timed out on Mac OS
windows-setup-and-tests:
runs-on: windows-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - run: npm install
- - run: npm update
- - run: npm run lint
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - run: npm install
+ - run: npm update
+ - run: npm run lint
# - run: npm test -- "--karma-config=./tests/karma.ci.conf.js"
diff --git a/.github/workflows/staging-fetch.yml b/.github/workflows/staging-fetch.yml
index 949e4a76..6e25936a 100644
--- a/.github/workflows/staging-fetch.yml
+++ b/.github/workflows/staging-fetch.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [12.x]
+ node-version: [14.x]
steps:
- name: Checkout Upstream
uses: actions/checkout@v2
diff --git a/.gitignore b/.gitignore
index 295702ac..da66daf9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,6 @@
/release
main.js
src/**/*.js
-electron-utils/*.js
*.js.map
# tests coverage
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 00000000..9f418990
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+v14.17.6
\ No newline at end of file
diff --git a/README.md b/README.md
index 0c840426..01024f94 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,13 @@
**WAT**cher is a sister application to CATcher to be used to monitor software projects in a visual way, for educational use in particular.
- [**WATcher Ideation Discussion Page**](https://github.com/CATcher-org/CATcher/discussions/938)
-- **WATcher Documentation Home** :construction:
-(under development)
- - Direct link to the **User Guide**
- - Direct link to the **Developer Guide**
+- [**WATcher Documentation Home**](https://catcher-org.github.io/WATcher-docs/) :construction:
+ (under development)
+ - [Direct link to the **User Guide**](https://catcher-org.github.io/WATcher-docs/ug/)
+ - [Direct link to the **Developer Guide**](https://catcher-org.github.io/WATcher-docs/dg/)
+
+This project is based in [NUS School of Computing](https://www.comp.nus.edu.sg/), and part of the [NUS-OSS initiative](https://nus-oss.github.io/).
+
+Licence: MIT
+
+Contact: `seer@comp.nus.edu.sg`
diff --git a/angular.json b/angular.json
index 7edfb4f5..a2a68754 100644
--- a/angular.json
+++ b/angular.json
@@ -11,6 +11,7 @@
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
+ "aot": true,
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
@@ -24,21 +25,17 @@
"src/favicon.256x256.png",
"src/favicon.512x512.png"
],
- "styles": [
- "node_modules/prismjs/themes/prism-okaidia.css",
- "src/styles.css",
- "src/markdown.css",
- "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css"
- ],
- "scripts": [
- "node_modules/marked/lib/marked.js",
- "node_modules/prismjs/prism.js",
- "node_modules/prismjs/components/prism-csharp.min.js",
- "node_modules/prismjs/components/prism-css.min.js"
- ]
+ "styles": ["src/styles.css", "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css"],
+ "scripts": []
},
"configurations": {
"staging": {
+ "budgets": [
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "6kb"
+ }
+ ],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
@@ -56,6 +53,12 @@
]
},
"production": {
+ "budgets": [
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "6kb"
+ }
+ ],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
@@ -73,6 +76,12 @@
]
},
"test": {
+ "budgets": [
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "6kb"
+ }
+ ],
"optimization": false,
"outputHashing": "all",
"sourceMap": true,
@@ -145,10 +154,13 @@
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
- "styleext": "css"
+ "style": "css"
},
"@schematics/angular:directive": {
"prefix": "app"
}
+ },
+ "cli": {
+ "analytics": "80a9cde9-16b0-438d-9c52-044c077b19d0"
}
}
diff --git a/codegen.yml b/codegen.yml
index 901a4fd5..32397492 100644
--- a/codegen.yml
+++ b/codegen.yml
@@ -1,5 +1,7 @@
overwrite: true
-schema: "graphql/schema/github-schema.ts"
+schema:
+ - "graphql/schema/github-schema.ts"
+ - "graphql/schema/schema-extension.graphql"
documents:
- graphql/fragments/*.graphql
- graphql/queries/*.graphql
diff --git a/electron-builder.json b/electron-builder.json
deleted file mode 100644
index 0757e77a..00000000
--- a/electron-builder.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "appId": "WATcher",
- "productName": "WATcher",
- "directories": {
- "output": "release/"
- },
- "files": [
- "**/*",
- "!**/*.ts",
- "!*.code-workspace",
- "!LICENSE.md",
- "!package.json",
- "!package-lock.json",
- "!src/",
- "!e2e/",
- "!hooks/",
- "!angular.json",
- "!_config.yml",
- "!karma.conf.js",
- "!tsconfig.json",
- "!tslint.json"
- ],
- "win": {
- "icon": "dist/favicon.png",
- "target": ["portable"]
- },
- "mac": {
- "icon": "dist/favicon.png",
- "target": ["dmg"]
- },
- "linux": {
- "icon": "dist/favicon.png",
- "target": ["AppImage"]
- }
-}
diff --git a/electron-utils/menu-bar.ts b/electron-utils/menu-bar.ts
deleted file mode 100644
index 12264fad..00000000
--- a/electron-utils/menu-bar.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { app, BrowserWindow, Menu, MenuItem, MenuItemConstructorOptions } from 'electron';
-
-// Edited version of a template menu-bar provided by the electron API,
-// refer to https://electronjs.org/docs/api/menu for more information.
-const fileMenu: MenuItemConstructorOptions = {
- label: 'File',
- submenu: [
- {
- label: 'Quit WATcher',
- accelerator: 'CmdOrCtrl+Q',
- click() {
- app.quit();
- }
- }
- ]
-};
-
-const editMenu: MenuItemConstructorOptions = {
- label: 'Edit',
- submenu: [
- { role: 'undo' },
- { role: 'redo' },
- { type: 'separator' },
- { role: 'selectAll' },
- { role: 'cut' },
- { role: 'copy' },
- { role: 'paste' },
- { role: 'delete' }
- ]
-};
-
-const viewMenu: MenuItemConstructorOptions = {
- label: 'View',
- submenu: [{ role: 'resetZoom' }, { role: 'zoomIn' }, { role: 'zoomOut' }, { type: 'separator' }, { role: 'togglefullscreen' }]
-};
-
-export function createMenuOptions(isDevMode: boolean): MenuItemConstructorOptions[] {
- const mainMenuTemplate: MenuItemConstructorOptions[] = [fileMenu, editMenu, viewMenu];
-
- if (isDevMode) {
- let viewSubMenu: MenuItemConstructorOptions[];
- viewSubMenu = mainMenuTemplate[2].submenu as MenuItemConstructorOptions[];
- viewSubMenu.push({ type: 'separator' }, { role: 'toggleDevTools' });
- }
- return mainMenuTemplate;
-}
-
-function createInspectElementMenuItem(contextMenuCoords: { x; y }): MenuItem {
- return new MenuItem({
- label: 'Inspect Element',
- click: (menuItem, window, event) => {
- window.webContents.inspectElement(contextMenuCoords.x, contextMenuCoords.y);
- }
- });
-}
-
-/**
- * Creates a menu that is displayed when the context-menu event fires on the
- * given BrowserWindow (i.e. usually when user right-clicks on the window).
- * This menu will contain an 'Inspect Element' MenuItem.
- */
-export function createContextMenu(win: BrowserWindow): void {
- const contextMenuCoords = { x: null, y: null };
- const contextMenu = new Menu();
- contextMenu.append(createInspectElementMenuItem(contextMenuCoords));
-
- win.webContents.on('context-menu', (event, contextMenuParams) => {
- // record the mouse position, when context-menu event is fired
- contextMenuCoords.x = contextMenuParams.x;
- contextMenuCoords.y = contextMenuParams.y;
- contextMenu.popup({ window: win });
- });
-}
diff --git a/electron-utils/oauth.ts b/electron-utils/oauth.ts
deleted file mode 100644
index 3a2021b0..00000000
--- a/electron-utils/oauth.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { BrowserWindow, shell } from 'electron';
-import { v4 as uuid } from 'uuid';
-
-const nodeUrl = require('url');
-const fetch = require('node-fetch');
-const Logger = require('electron-log');
-
-const CLIENT_ID = 'dda4282bac3cac95148b'; // Client ID sent to github oauth
-const BASE_URL = 'https://github.com';
-const ACCESS_TOKEN_URL = 'https://catcher-auth.herokuapp.com/authenticate';
-const CALLBACK_URL = 'http://localhost:4200';
-
-let authWindow;
-
-/**
- * Will retrieve the access token from a proxy server which acts as a intermediary to retrieve the tokens from Github.
- * @param window - The main window of WATcher.
- * @param repoPermissionLevel - The level of permission required to be granted by the user to use WATcher.
- */
-export function getAccessToken(window: BrowserWindow, repoPermissionLevel: string): Promise {
- return getAuthorizationCode(window, repoPermissionLevel)
- .then((code) => {
- Logger.info('Obtained authorization code from Github');
- const accessTokenUrl = `${ACCESS_TOKEN_URL}/${code}`;
- return fetch(accessTokenUrl)
- .then((res) => res.json())
- .then((data) => {
- if (data.error) {
- throw new Error(data.error);
- }
- return data;
- });
- })
- .catch((error) => {
- throw error;
- });
-}
-
-/**
- * Get the authorization code from Github after success login.
- * @param parentWindow - The main window of WATcher
- * @param repoPermissionLevel - The level of permission required to be granted by the user to use WATcher.
- */
-function getAuthorizationCode(parentWindow: BrowserWindow, repoPermissionLevel: string) {
- let state: string;
- state = generateStateString();
- const oauthUrl = encodeURI(
- `${BASE_URL}/login/oauth/authorize?client_id=${CLIENT_ID}&scope=${repoPermissionLevel},read:user&state=${state}`
- );
-
- return new Promise(function (resolve, reject) {
- const windowParams = {
- autoHideMenuBar: true,
- alwaysOnTop: false,
- fullscreenable: false,
- parent: parentWindow,
- webPreferences: {
- nodeIntegration: true
- }
- };
- authWindow = new BrowserWindow(windowParams);
- authWindow.loadURL(oauthUrl);
- authWindow.show();
- Logger.info('Opening authentication window');
-
- authWindow.on('closed', (event) => {
- reject(new Error('WINDOW_CLOSED'));
- });
-
- authWindow.webContents.on('will-navigate', (event, newUrl) => {
- if (newUrl.startsWith(CALLBACK_URL)) {
- onCallback(newUrl);
- } else if (newUrl.startsWith(`${BASE_URL}/session`) || newUrl.startsWith(`${BASE_URL}/login`)) {
- // continue navigation within the auth window
- return;
- } else {
- // do not navigate to external links in the auth window
- // instead, navigate to them in the user's browser
- event.preventDefault();
- shell.openExternal(newUrl).then(() => Logger.info('External link is clicked on auth window, opening system browser...'));
- }
- });
-
- authWindow.webContents.on('new-window', (event, url, frameName, disposition, options) => {
- event.preventDefault();
- shell.openExternal(url).then(() => Logger.info('External link is clicked on auth window, opening system browser...'));
- });
-
- authWindow.webContents.on('will-redirect', (event, newUrl) => {
- Logger.info('Received redirect in auth window');
- if (newUrl.startsWith(CALLBACK_URL)) {
- onCallback(newUrl);
- }
- });
-
- function onCallback(callbackUrl: string) {
- const url_parts = nodeUrl.parse(callbackUrl, true);
- const query = url_parts.query;
- const code = query.code;
- const error = query.error;
- const returnedState = query.state;
-
- if (error !== undefined) {
- reject(error);
- } else if (isReturnedStateSame(state, returnedState) && code) {
- resolve(code);
- }
- setImmediate(function () {
- authWindow.close();
- authWindow.on('closed', () => {
- Logger.info('Closing authentication window');
- authWindow = null;
- });
- });
- }
- });
-}
-
-/**
- * Generates and assigns an unguessable random 'state' string to pass to Github for protection against cross-site request forgery attacks
- */
-function generateStateString(): string {
- return uuid();
-}
-
-function isReturnedStateSame(state: string, returnedState: string): boolean {
- return state === returnedState;
-}
diff --git a/electron-utils/supporting-logic.ts b/electron-utils/supporting-logic.ts
deleted file mode 100644
index 6e6f522d..00000000
--- a/electron-utils/supporting-logic.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { app } from 'electron';
-
-export function isDeveloperMode(): boolean {
- const args = process.argv.slice(1),
- serve = args.some((val) => val === '--serve');
- return !!serve;
-}
-
-export function isWindowsOs(): boolean {
- return process.platform === 'win32';
-}
-
-export function isMacOs(): boolean {
- return process.platform === 'darwin';
-}
-
-export function isLinuxOs(): boolean {
- return process.platform === 'linux';
-}
-
-export function getCurrentDirectory(isWindowsOs: boolean, isDevMode: boolean): string {
- return isWindowsOs ? (isDevMode ? app.getAppPath() : process.env.PORTABLE_EXECUTABLE_FILE) : app.getAppPath();
-}
-
-export const appTitle: string = require('../package.json').name + ' ' + require('../package.json').version;
diff --git a/graphql/fragments/issue-model.fragment.graphql b/graphql/fragments/issue-model.fragment.graphql
index e6c336da..bf90701b 100644
--- a/graphql/fragments/issue-model.fragment.graphql
+++ b/graphql/fragments/issue-model.fragment.graphql
@@ -22,4 +22,5 @@ fragment issueModel on Issue {
}
}
}
+ isDraft
}
diff --git a/graphql/queries/fetch-issues-by-team.graphql b/graphql/queries/fetch-issues-by-team.graphql
deleted file mode 100644
index 8a27f4ea..00000000
--- a/graphql/queries/fetch-issues-by-team.graphql
+++ /dev/null
@@ -1,36 +0,0 @@
-query FetchIssuesByTeam($owner: String!, $name: String!, $tutorial: String!, $filter: IssueFilters, $cursor: String, $commentCursor: String) {
- repository(owner: $owner, name: $name) {
- label(name: $tutorial) {
- issues(first: 100, filterBy: $filter, after: $cursor) {
- edges {
- cursor
- node {
- ...issue
- labels(first: 100) {
- edges {
- node {
- ...issueLabel
- }
- }
- }
- assignees(first: 100) {
- edges {
- node {
- ...issueAssignee
- }
- }
- }
- comments(first: 100, after: $commentCursor) {
- edges {
- cursor
- node {
- ...issueComment
- }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/graphql/queries/fetch-pullrequests.graphql b/graphql/queries/fetch-pullrequests.graphql
index f9a2ff5e..f85eaa03 100644
--- a/graphql/queries/fetch-pullrequests.graphql
+++ b/graphql/queries/fetch-pullrequests.graphql
@@ -5,6 +5,7 @@ query FetchPullRequests($owner: String!, $name: String!, $cursor: String) {
cursor
node {
...pullrequest
+ isDraft
labels(first: 100) {
edges {
node {
diff --git a/graphql/schema/schema-extension.graphql b/graphql/schema/schema-extension.graphql
new file mode 100644
index 00000000..632a77fb
--- /dev/null
+++ b/graphql/schema/schema-extension.graphql
@@ -0,0 +1,3 @@
+extend type Issue {
+ isDraft: Boolean
+}
\ No newline at end of file
diff --git a/main.ts b/main.ts
deleted file mode 100644
index 960b0200..00000000
--- a/main.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import { app, BrowserWindow, ipcMain, Menu, MenuItemConstructorOptions, nativeTheme, screen, shell } from 'electron';
-import * as path from 'path';
-import * as url from 'url';
-import { createContextMenu, createMenuOptions } from './electron-utils/menu-bar';
-import { getAccessToken } from './electron-utils/oauth';
-import { appTitle, isDeveloperMode, isLinuxOs, isMacOs } from './electron-utils/supporting-logic';
-
-const Logger = require('electron-log');
-const ICON_PATH = path.join(__dirname, 'dist/favicon.512x512.png');
-
-let win: BrowserWindow = null;
-const isDevMode = isDeveloperMode();
-
-/**
- * Will start the OAuth Web Flow and obtain the access token from Github.
- */
-ipcMain.on('github-oauth', (event, repoPermissionLevel) => {
- Logger.info('Starting authentication');
- getAccessToken(win, repoPermissionLevel)
- .then((data) => {
- Logger.info('Obtained access token from Github');
- event.sender.send('github-oauth-reply', { token: data.token });
- })
- .catch((error) => {
- event.sender.send('github-oauth-reply', {
- error: error.message,
- isWindowClosed: error.message === 'WINDOW_CLOSED'
- });
- });
-});
-
-ipcMain.handle('clear-storage', () => {
- return win.webContents.session.clearStorageData();
-});
-
-ipcMain.handle('open-link', (e, address) => {
- shell.openExternal(address);
-});
-
-function createWindow() {
- Logger.info('Creating primary window.');
- const size = screen.getPrimaryDisplay().workAreaSize;
- const windowOptions = {
- x: 0,
- y: 0,
- width: size.width,
- height: size.height,
- webPreferences: {
- nodeIntegration: true,
- allowRunningInsecureContent: !isDevMode
- }
- };
-
- if (isLinuxOs()) {
- // app icon needs to be set manually on Linux platforms
- windowOptions['icon'] = ICON_PATH;
- }
-
- // Create the browser window.
- win = new BrowserWindow(windowOptions);
- win.setTitle(appTitle);
-
- nativeTheme.themeSource = 'light';
-
- if (isDevMode) {
- require('electron-reload')(__dirname, {
- electron: require(`${__dirname}/node_modules/electron`)
- });
-
- createContextMenu(win);
- win.loadURL('http://localhost:4200');
- win.webContents.openDevTools();
- } else {
- win.loadURL(
- url.format({
- pathname: path.join(__dirname, 'dist/index.html'),
- protocol: 'file:',
- slashes: true
- })
- );
- }
-
- // Emitted when the window is closed.
- win.on('closed', () => {
- // Dereference the window object, usually you would store window
- // in an array if your app supports multi windows, this is the time
- // when you should delete the corresponding element.
- win = null;
- });
-}
-
-try {
- Logger.info('Initializing Electron app.');
- // This method will be called when Electron has finished
- // initialization and is ready to create browser windows.
- // Some APIs can only be used after this event occurs.
- app.on('ready', () => {
- Logger.info('Electron app in ready state.');
- // Build and Attach Menu-bar template to application.
- const mainMenuTemplate: MenuItemConstructorOptions[] = createMenuOptions(isDevMode);
- const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
- Menu.setApplicationMenu(mainMenu);
-
- createWindow();
- });
-
- // Quit when all windows are closed.
- app.on('window-all-closed', () => {
- Logger.info('Closing all windows in Electron.');
- // On OS X it is common for applications and their menu bar
- // to stay active until the user quits explicitly with Cmd + Q
- if (!isMacOs()) {
- app.quit();
- }
- });
-
- app.on('activate', () => {
- Logger.info('Electron app is activated.');
- // On OS X it's common to re-create a window in the app when the
- // dock icon is clicked and there are no other windows open.
- if (win === null) {
- createWindow();
- }
- });
-} catch (e) {
- Logger.error('Something went wrong in Electron.', e);
-}
diff --git a/package.json b/package.json
index 7f9bcc16..0879ac16 100644
--- a/package.json
+++ b/package.json
@@ -1,31 +1,19 @@
{
"name": "WATcher",
- "version": "0.0.2",
+ "version": "1.0.0",
"main": "main.js",
"scripts": {
- "postinstall": "npm run postinstall:electron && electron-builder install-app-deps",
- "postinstall:electron": "node postinstall",
- "postinstall:web": "node postinstall-web",
"ng": "ng",
- "start": "npm run postinstall:electron && npm-run-all -p codegen:gql-watch ng:serve electron:serve",
- "build": "npm run postinstall:electron && npm run codegen:gql && npm run electron:serve-tsc && ng build",
- "build:prod": "npm run build -- -c production --base-href=./",
"build:staging": "npm run codegen:gql && ng build --c staging --base-href=https://catcher-org.github.io/WATcher-staging/",
"build:prod:web": "npm run codegen:gql && ng build --prod --base-href=https://CATcher-org.github.io/WATcher/",
"ng:serve": "npm run codegen:gql && ng serve",
- "ng:serve:web": "npm run postinstall:web && npm run ng:serve -- -o",
+ "ng:serve:web": "npm run ng:serve -- -o",
"deploy:staging": "npm run build:staging && ngh --dir=dist --name=WATcher --email=se-edu@comp.nus.edu.sg --no-silent",
- "ng:serve:test": "npm run postinstall:web && npm run ng:serve -- --configuration=test -o",
+ "ng:serve:test": "npm run ng:serve -- --configuration=test -o",
"deploy:web": "npm run build:prod:web && ngh --dir=dist --name=WATcher --email=se-edu@comp.nus.edu.sg --no-silent",
- "electron:serve-tsc": "tsc -p tsconfig-serve.json",
- "electron:serve": "wait-on http-get://localhost:4200/ && npm run electron:serve-tsc && electron . --serve",
- "electron:local": "npm run build:prod && electron .",
- "electron:linux": "npm run build:prod && electron-builder build --linux --publish never",
- "electron:windows": "npm run build:prod && electron-builder build --windows --publish never",
- "electron:mac": "npm run build:prod && electron-builder build --mac --publish never",
"test": "npm run codegen:gql && ng test",
- "e2e": "npm run codegen:gql && npm run postinstall:web && ng e2e",
- "actions:e2e": "npm run codegen:gql && npm run postinstall:web && ng e2e --protractor-config=e2e/protractor.gh-actions.conf --webdriver-update=false",
+ "e2e": "npm run codegen:gql && ng e2e",
+ "actions:e2e": "npm run codegen:gql && ng e2e --protractor-config=e2e/protractor.gh-actions.conf --webdriver-update=false",
"webdriver-manager": "webdriver-manager",
"lint": "ng lint",
"lint:fix": "ng lint --fix",
@@ -40,89 +28,75 @@
}
},
"dependencies": {
- "@angular/animations": "^8.2.14",
- "@angular/cdk": "^7.3.7",
- "@angular/common": "^8.2.14",
- "@angular/compiler": "^8.2.14",
- "@angular/core": "^8.2.14",
- "@angular/forms": "^8.2.14",
- "@angular/material": "^7.3.7",
- "@angular/platform-browser": "^8.2.14",
- "@angular/platform-browser-dynamic": "^8.2.14",
- "@angular/router": "^8.2.14",
+ "@angular/animations": "^10.2.5",
+ "@angular/cdk": "^10.2.7",
+ "@angular/common": "^10.2.5",
+ "@angular/compiler": "^10.2.5",
+ "@angular/core": "^10.2.5",
+ "@angular/forms": "^10.2.5",
+ "@angular/material": "^10.2.7",
+ "@angular/platform-browser": "^10.2.5",
+ "@angular/platform-browser-dynamic": "^10.2.5",
+ "@angular/router": "^10.2.5",
"@octokit/rest": "^16.37.0",
- "@primer/octicons": "^17.3.0",
+ "@primer/octicons": "^17.12.0",
"@types/geojson": "7946.0.8",
- "ajv": "^6.11.0",
"apollo-angular": "^1.9.1",
"apollo-angular-link-http": "^1.10.0",
"apollo-cache-inmemory": "^1.6.0",
"apollo-client": "^2.6.0",
"apollo-link": "^1.2.14",
"apollo-link-context": "^1.0.20",
- "arcsecond": "^4.1.0",
- "core-js": "^3.16.4",
- "d3": "^7.4.4",
- "d3-time": "^3.0.0",
- "d3-time-format": "^4.1.0",
- "d3-timelines": "^1.3.1",
+ "core-js": "^3.28.0",
"diff-match-patch": "^1.0.4",
- "dompurify": "^2.3.1",
- "electron-log": "^4.4.1",
"graphql": "^14.6.0",
"graphql-tag": "2.11.0",
"karma-spec-reporter": "0.0.32",
"moment": "^2.24.0",
- "ngx-markdown": "^8.2.1",
- "ngx-mat-select-search": "^1.8.0",
- "node-fetch": "^2.6.0",
- "rxjs": "6.5.3",
- "tslib": "^1.9.0",
+ "ngx-mat-select-search": "^3.3.3",
+ "node-fetch": "^2.6.9",
+ "rxjs": "6.5.5",
+ "tslib": "^2.0.0",
"uuid": "7.0.3",
- "zone.js": "~0.9.1"
+ "zone.js": "~0.10.2"
},
"devDependencies": {
- "@angular-devkit/build-angular": "~0.803.29",
- "@angular/cli": "^8.3.29",
- "@angular/compiler-cli": "^8.2.14",
- "@angular/language-service": "^8.2.14",
+ "@angular-devkit/build-angular": "~0.1002.4",
+ "@angular/cli": "^10.2.4",
+ "@angular/compiler-cli": "^10.2.5",
+ "@angular/language-service": "^10.2.5",
"@graphql-codegen/cli": "1.17.7",
"@graphql-codegen/typescript": "1.17.7",
"@graphql-codegen/typescript-document-nodes": "1.17.7",
"@graphql-codegen/typescript-operations": "^1.18.4",
"@graphql-codegen/typescript-resolvers": "^1.20.0",
"@octokit/graphql-schema": "^8.24.0",
- "@types/d3": "^7.4.0",
- "@types/dompurify": "^2.3.1",
"@types/jasmine": "^3.8.2",
"@types/jasminewd2": "2.0.8",
- "@types/node": "~12.12.6",
- "@types/primer__octicons": "^17.0.0",
+ "@types/node": "^14.17.6",
+ "@types/primer__octicons": "^17.11.0",
"angular-cli-ghpages": "^1.0.0-rc.2",
- "codelyzer": "^5.0.1",
- "electron": "11.4.8",
- "electron-builder": "22.2.0",
- "electron-reload": "1.5.0",
+ "codelyzer": "^6.0.2",
"graphql-codegen-fragment-matcher": "^0.18.2",
"husky": "^4.2.5",
"jasmine": "^3.9.0",
- "jasmine-core": "3.5.0",
- "jasmine-spec-reporter": "4.2.1",
- "karma": "^4.4.1",
- "karma-chrome-launcher": "3.1.0",
- "karma-coverage-istanbul-reporter": "2.1.1",
+ "jasmine-core": "~3.8.0",
+ "jasmine-spec-reporter": "~5.0.0",
+ "karma": "~5.0.0",
+ "karma-chrome-launcher": "~3.1.0",
+ "karma-coverage-istanbul-reporter": "~3.0.2",
"karma-firefox-launcher": "^2.1.1",
- "karma-jasmine": "3.1.0",
- "karma-jasmine-html-reporter": "1.5.1",
+ "karma-jasmine": "~4.0.0",
+ "karma-jasmine-html-reporter": "^1.5.0",
"npm-run-all": "4.1.5",
"prettier": "2.2.1",
"pretty-quick": "^3.1.1",
- "protractor": "5.4.2",
+ "protractor": "~7.0.0",
"scuri": "^0.9.4",
"ts-node": "^7.0.1",
- "tslint": "5.20.1",
+ "tslint": "~6.1.0",
"tslint-config-prettier": "^1.18.0",
- "typescript": "3.5.3",
+ "typescript": "4.0.8",
"wait-on": "3.3.0",
"webdriver-manager": "12.1.7"
}
diff --git a/postinstall-web.js b/postinstall-web.js
deleted file mode 100644
index 7dce7645..00000000
--- a/postinstall-web.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Allow angular using electron module (native node modules)
-const fs = require('fs');
-const f_angular = 'node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/webpack-configs/browser.js';
-
-fs.readFile(f_angular, 'utf8', function (err, data) {
- if (err) {
- return console.log(err);
- }
- var result = data.replace(/target: "electron-renderer",/g, '');
- var result = result.replace(/target: "web",/g, '');
- var result = result.replace(/return \{/g, 'return {target: "web",');
-
- fs.writeFile(f_angular, result, 'utf8', function (err) {
- if (err) return console.log(err);
- });
-});
\ No newline at end of file
diff --git a/postinstall.js b/postinstall.js
deleted file mode 100644
index 1fb12759..00000000
--- a/postinstall.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Allow angular using electron module (native node modules)
-const fs = require('fs');
-const f_angular = 'node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/webpack-configs/browser.js';
-
-fs.readFile(f_angular, 'utf8', function (err, data) {
- if (err) {
- return console.log(err);
- }
- var result = data.replace(/target: "electron-renderer",/g, '');
- var result = result.replace(/target: "web",/g, '');
- var result = result.replace(/return \{/g, 'return {target: "electron-renderer",');
-
- fs.writeFile(f_angular, result, 'utf8', function (err) {
- if (err) return console.log(err);
- });
-});
\ No newline at end of file
diff --git a/src/app/activity-dashboard/event-tables/GithubEventDataTable.ts b/src/app/activity-dashboard/event-tables/GithubEventDataTable.ts
index fe36e0af..b7f1a7aa 100644
--- a/src/app/activity-dashboard/event-tables/GithubEventDataTable.ts
+++ b/src/app/activity-dashboard/event-tables/GithubEventDataTable.ts
@@ -1,5 +1,6 @@
import { DataSource } from '@angular/cdk/table';
-import { MatPaginator, MatSort } from '@angular/material';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSort } from '@angular/material/sort';
import * as moment from 'moment';
import { BehaviorSubject, merge, Observable, Subscription } from 'rxjs';
import { flatMap, map } from 'rxjs/operators';
diff --git a/src/app/activity-dashboard/event-tables/event-paginator.ts b/src/app/activity-dashboard/event-tables/event-paginator.ts
index ededda69..65791508 100644
--- a/src/app/activity-dashboard/event-tables/event-paginator.ts
+++ b/src/app/activity-dashboard/event-tables/event-paginator.ts
@@ -1,4 +1,4 @@
-import { MatPaginator } from '@angular/material';
+import { MatPaginator } from '@angular/material/paginator';
import { EventWeek } from '../event-week.model';
export function paginateData(paginator: MatPaginator, data: EventWeek[]): EventWeek[] {
diff --git a/src/app/activity-dashboard/event-tables/event-tables.component.ts b/src/app/activity-dashboard/event-tables/event-tables.component.ts
index 93bd52cd..b863792b 100644
--- a/src/app/activity-dashboard/event-tables/event-tables.component.ts
+++ b/src/app/activity-dashboard/event-tables/event-tables.component.ts
@@ -1,6 +1,7 @@
import { animate, state, style, transition, trigger } from '@angular/animations';
import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core';
-import { MatPaginator, MatSort } from '@angular/material';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSort } from '@angular/material/sort';
import { GithubUser } from '../../core/models/github-user.model';
import { GithubEventService } from '../../core/services/githubevent.service';
import { LoggingService } from '../../core/services/logging.service';
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index ccc2a91c..c1a797f7 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,6 +1,5 @@
import { AfterViewInit, Component } from '@angular/core';
import { AppConfig } from '../environments/environment';
-import { ElectronService } from './core/services/electron.service';
import { ErrorHandlingService } from './core/services/error-handling.service';
import { LoggingService } from './core/services/logging.service';
@@ -12,40 +11,16 @@ import { LoggingService } from './core/services/logging.service';
export class AppComponent implements AfterViewInit {
NOT_CONNECTED_ERROR: Error = new Error('You are not connected to the internet.');
- constructor(public electronService: ElectronService, logger: LoggingService, public errorHandlingService: ErrorHandlingService) {
+ constructor(logger: LoggingService, public errorHandlingService: ErrorHandlingService) {
logger.info('AppComponent: AppConfig', AppConfig);
- if (electronService.isElectron()) {
- logger.info('AppComponent: Mode electron');
- } else {
- logger.info('AppComponent: Mode web');
- }
+ logger.info('AppComponent: Mode web');
}
ngAfterViewInit() {
- this.addListenerForHttpLinks();
this.addListenerForNetworkOffline();
}
- /**
- * This listener will prevent the default behaviour of electron to open http links on electron browser itself.
- * Will use the client's default OS browser to open the link.
- */
- addListenerForHttpLinks() {
- document.addEventListener(
- 'click',
- (event) => {
- const elem = (event.target).closest('a[href^="http"]');
- if (elem) {
- event.preventDefault();
- event.stopPropagation();
- this.electronService.openLink(elem.href);
- }
- },
- false
- );
- }
-
/**
* This listener checks if WATcher has a connection to a network, and will show an error snackbar if it does not.
*/
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 9d59b345..7dd8801e 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -8,7 +8,6 @@ import { HttpLink, HttpLinkModule } from 'apollo-angular-link-http';
import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';
import { ApolloLink } from 'apollo-link';
import { setContext } from 'apollo-link-context';
-import { MarkdownModule, MarkedOptions } from 'ngx-markdown';
import 'reflect-metadata';
import graphqlTypes from '../../graphql/graphql-types';
import '../polyfills';
@@ -18,7 +17,6 @@ import { AppComponent } from './app.component';
import { AuthModule } from './auth/auth.module';
import { UserConfirmationComponent } from './core/guards/user-confirmation/user-confirmation.component';
import { AuthService } from './core/services/auth.service';
-import { ElectronService } from './core/services/electron.service';
import { ErrorHandlingService } from './core/services/error-handling.service';
import { AuthServiceFactory } from './core/services/factories/factory.auth.service';
import { GithubServiceFactory } from './core/services/factories/factory.github.service';
@@ -26,6 +24,7 @@ import { IssueServiceFactory } from './core/services/factories/factory.issue.ser
import { GithubService } from './core/services/github.service';
import { GithubEventService } from './core/services/githubevent.service';
import { IssueService } from './core/services/issue.service';
+import { LabelService } from './core/services/label.service';
import { LoggingService } from './core/services/logging.service';
import { PhaseService } from './core/services/phase.service';
import { SessionFixConfirmationComponent } from './core/services/session-fix-confirmation/session-fix-confirmation.component';
@@ -33,7 +32,6 @@ import { UserService } from './core/services/user.service';
import { IssuesViewerModule } from './issues-viewer/issues-viewer.module';
import { LabelDefinitionPopupComponent } from './shared/label-definition-popup/label-definition-popup.component';
import { HeaderComponent } from './shared/layout';
-import { markedOptionsFactory } from './shared/lib/marked';
import { RepoChangeFormComponent } from './shared/repo-change-form/repo-change-form.component';
import { SharedModule } from './shared/shared.module';
@@ -54,12 +52,6 @@ import { SharedModule } from './shared/shared.module';
ActivityDashboardModule,
SharedModule,
HttpClientModule,
- MarkdownModule.forRoot({
- markedOptions: {
- provide: MarkedOptions,
- useFactory: markedOptionsFactory
- }
- }),
AppRoutingModule,
ApolloModule,
HttpLinkModule
@@ -68,36 +60,36 @@ import { SharedModule } from './shared/shared.module';
{
provide: GithubService,
useFactory: GithubServiceFactory,
- deps: [ErrorHandlingService, Apollo, ElectronService, LoggingService]
+ deps: [ErrorHandlingService, Apollo, LoggingService]
},
{
provide: AuthService,
useFactory: AuthServiceFactory,
deps: [
- ElectronService,
Router,
NgZone,
GithubService,
UserService,
IssueService,
+ LabelService,
PhaseService,
GithubEventService,
Title,
+ ErrorHandlingService,
LoggingService
]
},
{
provide: IssueService,
useFactory: IssueServiceFactory,
- deps: [GithubService, UserService, PhaseService, ElectronService]
+ deps: [GithubService, UserService, PhaseService]
},
{
provide: ErrorHandler,
useClass: ErrorHandlingService
}
],
- bootstrap: [AppComponent],
- entryComponents: [UserConfirmationComponent, SessionFixConfirmationComponent, LabelDefinitionPopupComponent, RepoChangeFormComponent]
+ bootstrap: [AppComponent]
})
export class AppModule {
constructor(private apollo: Apollo, private httpLink: HttpLink, private authService: AuthService, private logger: LoggingService) {
diff --git a/src/app/auth/auth.component.html b/src/app/auth/auth.component.html
index ee113cc7..605b674f 100644
--- a/src/app/auth/auth.component.html
+++ b/src/app/auth/auth.component.html
@@ -1,13 +1,16 @@
-
-
+
+
+ WATcher
+
+
+
Confirm Login Account
- Session on {{ currentSessionOrg }}
@@ -24,3 +27,8 @@
+
+
+
+
+
diff --git a/src/app/auth/auth.component.ts b/src/app/auth/auth.component.ts
index 47cec5d9..9bb41d18 100644
--- a/src/app/auth/auth.component.ts
+++ b/src/app/auth/auth.component.ts
@@ -6,7 +6,6 @@ import { AppConfig } from '../../environments/environment';
import { GithubUser } from '../core/models/github-user.model';
import { ApplicationService } from '../core/services/application.service';
import { AuthService, AuthState } from '../core/services/auth.service';
-import { ElectronService } from '../core/services/electron.service';
import { ErrorHandlingService } from '../core/services/error-handling.service';
import { LoggingService } from '../core/services/logging.service';
import { PhaseService } from '../core/services/phase.service';
@@ -30,7 +29,6 @@ export class AuthComponent implements OnInit, OnDestroy {
constructor(
public appService: ApplicationService,
- public electronService: ElectronService,
private authService: AuthService,
private userService: UserService,
private errorHandlingService: ErrorHandlingService,
@@ -39,20 +37,7 @@ export class AuthComponent implements OnInit, OnDestroy {
private ngZone: NgZone,
private activatedRoute: ActivatedRoute,
private logger: LoggingService
- ) {
- this.electronService.registerIpcListener('github-oauth-reply', (event, { token, error, isWindowClosed }) => {
- this.ngZone.run(() => {
- if (error) {
- if (!isWindowClosed) {
- this.errorHandlingService.handleError(error);
- }
- this.goToSessionSelect();
- return;
- }
- this.authService.storeOAuthAccessToken(token);
- });
- });
- }
+ ) {}
ngOnInit() {
this.logger.startSession();
@@ -108,7 +93,6 @@ export class AuthComponent implements OnInit, OnDestroy {
}
ngOnDestroy() {
- this.electronService.removeIpcListeners('github-oauth-reply');
if (this.authStateSubscription) {
this.authStateSubscription.unsubscribe();
}
@@ -150,6 +134,14 @@ export class AuthComponent implements OnInit, OnDestroy {
return this.authState === AuthState.ConfirmOAuthUser;
}
+ isUserAuthenticated(): boolean {
+ return this.authState === AuthState.Authenticated;
+ }
+
+ isRepoSet(): boolean {
+ return this.phaseService.isRepoSet();
+ }
+
get currentSessionOrg(): string {
if (!this.sessionInformation) {
// Retrieve org details of session information from local storage
diff --git a/src/app/auth/auth.module.ts b/src/app/auth/auth.module.ts
index 1b7cdb09..46d81bbf 100644
--- a/src/app/auth/auth.module.ts
+++ b/src/app/auth/auth.module.ts
@@ -4,13 +4,20 @@ import { SharedModule } from '../shared/shared.module';
import { AuthRoutingModule } from './auth-routing.module';
import { AuthComponent } from './auth.component';
import { ConfirmLoginComponent } from './confirm-login/confirm-login.component';
+import { LoginComponent } from './login/login.component';
import { JsonParseErrorDialogComponent } from './profiles/json-parse-error-dialog/json-parse-error-dialog.component';
import { ProfilesComponent } from './profiles/profiles.component';
import { SessionSelectionComponent } from './session-selection/session-selection.component';
@NgModule({
imports: [AuthRoutingModule, SharedModule, CommonModule],
- declarations: [AuthComponent, ProfilesComponent, JsonParseErrorDialogComponent, ConfirmLoginComponent, SessionSelectionComponent],
- entryComponents: [JsonParseErrorDialogComponent]
+ declarations: [
+ AuthComponent,
+ ProfilesComponent,
+ JsonParseErrorDialogComponent,
+ LoginComponent,
+ ConfirmLoginComponent,
+ SessionSelectionComponent
+ ]
})
export class AuthModule {}
diff --git a/src/app/auth/confirm-login/confirm-login.component.html b/src/app/auth/confirm-login/confirm-login.component.html
index de429fef..38d2a365 100644
--- a/src/app/auth/confirm-login/confirm-login.component.html
+++ b/src/app/auth/confirm-login/confirm-login.component.html
@@ -3,10 +3,7 @@
Continue as {{ this.username }}
-
-