From 37b6a17eb03c3e9a578da214abd884d2b481fa9a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Apr 2024 00:03:17 +0000 Subject: [PATCH] Rebuild pages at 018db8238bc256c1dba73747ae3988ce8fa29843 --- CATcher-org_WATcher_main/authorship.json | 2 +- CATcher-org_WATcher_main/commits.json | 2 +- archive.zip | Bin 1252625 -> 1255026 bytes reposense-logs/reposense.log.0 | 1680 +++++++++++----------- summary.json | 2 +- 5 files changed, 843 insertions(+), 843 deletions(-) diff --git a/CATcher-org_WATcher_main/authorship.json b/CATcher-org_WATcher_main/authorship.json index e50d974..e63f1bd 100644 --- a/CATcher-org_WATcher_main/authorship.json +++ b/CATcher-org_WATcher_main/authorship.json @@ -1 +1 @@ -[{"path":"src/app/activity-dashboard/activity-dashboard.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".event-tables-wrapper {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" overflow-x: auto;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/activity-dashboard/activity-dashboard.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-list cols\u003d\"4\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"grid-flush-left\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ch1 class\u003d\"mat-headline\" style\u003d\"margin: 0px\"\u003eActivity\u003c/h1\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStart Date\u003c/mat-label\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"startMinDate\" [max]\u003d\"startMaxDate\" [matDatepicker]\u003d\"startPicker\" (dateChange)\u003d\"pickStartDate($event)\" /\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"startPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #startPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eEnd Date\u003c/mat-label\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"endMinDate\" [max]\u003d\"endMaxDate\" [matDatepicker]\u003d\"endPicker\" (dateChange)\u003d\"pickEndDate($event)\" /\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"endPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #endPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003c/mat-grid-list\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv class\u003d\"event-tables-wrapper\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003capp-event-tables"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [actor]\u003d\"assignee\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [columnsToDisplay]\u003d\"this.displayedColumns\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [expandedColumnsToDisplay]\u003d\"this.expandedColumns\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [actions]\u003d\"this.actionButtons\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e\u003c/app-event-tables\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":39}},{"path":"src/app/activity-dashboard/activity-dashboard.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatDatepickerInputEvent } from \u0027@angular/material/datepicker\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../core/services/githubevent.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { EXPANDED_TABLE_COLUMNS, TABLE_COLUMNS } from \u0027./event-tables/event-tables-columns\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ACTION_BUTTONS, EventTablesComponent } from \u0027./event-tables/event-tables.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" selector: \u0027app-activity-dashboard\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" templateUrl: \u0027./activity-dashboard.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./activity-dashboard.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class ActivityDashboardComponent implements OnInit {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.DATE_START, TABLE_COLUMNS.ISSUE_COUNT, TABLE_COLUMNS.PR_COUNT, TABLE_COLUMNS.COMMENT_COUNT];"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" readonly expandedColumns \u003d [EXPANDED_TABLE_COLUMNS.TITLE, EXPANDED_TABLE_COLUMNS.DATE];"},{"lineNumber":18,"author":{"gitId":"-"},"content":" readonly actionButtons: ACTION_BUTTONS[] \u003d [ACTION_BUTTONS.VIEW_IN_WEB];"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" startMinDate: Date;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" startMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" endMinDate: Date;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" endMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" @ViewChildren(EventTablesComponent) tables: QueryList\u003cEventTablesComponent\u003e;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService, private githubEventService: GithubEventService) {}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.githubEventService.getEvents();"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" pickStartDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.endMinDate \u003d event.value;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.start \u003d `${event.value}`));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" pickEndDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.startMaxDate \u003d event.value;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.end \u003d `${event.value}`));"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":44}},{"path":"src/app/activity-dashboard/activity-dashboard.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ActivityDashboardRoutingModule } from \u0027./activity-dashboard-routing.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ActivityDashboardComponent } from \u0027./activity-dashboard.component\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { EventTablesModule } from \u0027./event-tables/event-tables.module\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027./event-week-details/event-week-details.component\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" declarations: [ActivityDashboardComponent, EventWeekDetailsComponent],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [CommonModule, SharedModule, ActivityDashboardRoutingModule, EventTablesModule]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class ActivityDashboardModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":11}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".table-container {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" margin: 10px;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" min-width: 400px;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":".actor-card {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" padding: 10px;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 1px;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":".actor-username {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" flex-grow: 1;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" font-size: 15px;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" margin: 0;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" word-break: break-word;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":".avatar-container {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" margin-right: 10px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":".mat-table {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /* flex-wrap: wrap; */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":".mat-header-row {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":".example-element-row:hover {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" border: 3px solid rgba(0, 0, 0, 0.514);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" border-radius: 3px;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: #210749;"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":".example-element-row td {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" border-bottom-width: 0;"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":".example-element-detail {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" overflow: hidden;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"/* Colour cells */"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":".white {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" background-color: white;"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":".pale-green {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" background-color: palegreen;"},{"lineNumber":74,"author":{"gitId":"-"},"content":"}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":".green {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" background-color: green;"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":".scrollable-container {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" height: 53vh;"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" overflow: auto;"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 2px;"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" scrollbar-width: none;"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::-webkit-scrollbar {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" display: none;"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::before {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::after {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" position: sticky;"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" top: 100%;"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" top: 0;"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" bottom: 0;"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":105,"-":37}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"table-container\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"actor-card\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"this.actor\""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" class\u003d\"avatar-container\""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + this.actor.avatar_url + \u0027)\u0027,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title class\u003d\"actor-username\"\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" {{ this.actor !\u003d\u003d undefined ? this.actor.login : \u0027Unknown\u0027 }}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"this.githubEvents\" matSort multiTemplateDataRows\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"date_start\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Date \u003c/mat-header-cell\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" {{ element.date_start }}"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"issue_count\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Issue # \u003c/mat-header-cell\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.issue_count)\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ element.issue_count }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"pr_count\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e PR # \u003c/mat-header-cell\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.pr_count)\"\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" {{ element.pr_count }}"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"comment_count\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Comment # \u003c/mat-header-cell\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.comment_count)\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" {{ element.comment_count }}"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"this.columnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cmat-row"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" *matRowDef\u003d\"let eventWeek; columns: this.columnsToDisplay\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"example-element-row\""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"openDialog(eventWeek)\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-row\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-table\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-card *ngIf\u003d\"this.githubEvents.isLoading$ | async\" style\u003d\"display: flex; justify-content: center; align-items: center\"\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003cmat-paginator [pageSize]\u003d\"20\" [pageSizeOptions]\u003d\"[10, 20, 50]\"\u003e\u003c/mat-paginator\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":22,"-":48}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { animate, state, style, transition, trigger } from \u0027@angular/animations\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatDialog } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027../event-week-details/event-week-details.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventDataTable } from \u0027./GithubEventDataTable\u0027;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"import { NoEventsError } from \u0027./no-events-error.model\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"export enum ACTION_BUTTONS {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" VIEW_IN_WEB,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" COLLAPSE"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" selector: \u0027app-event-tables\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" templateUrl: \u0027./event-tables.component.html\u0027,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-tables.component.css\u0027]"},{"lineNumber":24,"author":{"gitId":"-"},"content":"})"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Angular Table Expandable Rows"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * ref: https://material.angular.io/components/table/examples#table-expandable-rows"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export class EventTablesComponent implements OnInit, AfterViewInit {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Input() columnsToDisplay: string[];"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Input() expandedColumnsToDisplay: string[];"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Input() actions: ACTION_BUTTONS[];"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() actor?: GithubUser \u003d undefined;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" @ViewChild(MatSort, { static: true }) sort: MatSort;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" githubEvents: GithubEventDataTable;"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" public readonly action_buttons \u003d ACTION_BUTTONS;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" constructor("},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" public githubEventService: GithubEventService,"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" public dialog: MatDialog,"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private logger: LoggingService,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private errorHandling: ErrorHandlingService"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" ) {}"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.githubEvents \u003d new GithubEventDataTable(this.githubEventService, this.logger, this.sort, this.paginator, this.actor, this.filters);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" });"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Formats the title text to account for those that contain long words."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * @param title - Title of Event that is to be displayed in the Table Row."},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fitTitleText(title: string): string {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":71,"author":{"gitId":"-"},"content":" const MAX_WORD_LENGTH \u003d 43;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const SPLITTER_TEXT \u003d \u0027 \u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" return title"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .split(SPLITTER_TEXT)"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .map((word) \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (word.length \u003e MAX_WORD_LENGTH) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return word.substring(0, MAX_WORD_LENGTH - 5).concat(ELLIPSES);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return word;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .join(SPLITTER_TEXT);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /** Not implemented yet. */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" viewEventInBrowser(id: number, event: Event) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`EventTablesComponent: Opening Event ${id} on Github`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // window.open(\u0027https://github.com/\u0027, \u0027_blank\u0027);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" /** Opens dialog to show the event details of the selected week. */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" openDialog(eventWeek: EventWeek) {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" if (eventWeek.events.length \u003c\u003d 0) {"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" this.errorHandling.handleError(new NoEventsError());"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" return;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.dialog.open(EventWeekDetailsComponent, {"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" data: {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" eventWeek,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: this.expandedColumnsToDisplay"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /** Returns color string of cell. Shade darkens with magnitude of number. */"},{"lineNumber":107,"author":{"gitId":"-"},"content":" colorCell(count: number) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (count \u003d\u003d\u003d 0) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return \u0027white\u0027;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } else if (count \u003e 0 \u0026\u0026 count \u003c\u003d 5) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return \u0027pale-green\u0027;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" } else if (count \u003e 6) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return \u0027green\u0027;"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":21,"-":95}},{"path":"src/app/activity-dashboard/event-tables/no-events-error.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export class NoEventsError extends Error {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" super(\u0027No events found for this week.\u0027);"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, NoEventsError.prototype);"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":6}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":".mat-dialog-content {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" min-width: 500px;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":20}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003ch2 mat-dialog-title\u003eEvent Week Details\u003c/h2\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"\u003cmat-dialog-content class\u003d\"mat-typography\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"data.eventWeek.events\"\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container matColumnDef\u003d\"{{ expandableColumn }}\" *ngFor\u003d\"let expandableColumn of data.expandedColumnsToDisplay\"\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e{{ expandableColumn }}\u003c/mat-header-cell\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-cell *matCellDef\u003d\"let property\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" {{ property[expandableColumn] }}"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/ng-container\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"data.expandedColumnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-row *matRowDef\u003d\"let property; columns: data.expandedColumnsToDisplay\"\u003e\u003c/mat-row\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-table\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c/mat-dialog-content\u003e"}],"authorContributionMap":{"NereusWB922":13}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Inject } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export interface DialogData {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" eventWeek: EventWeek;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: string[];"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-event-week-detail\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./event-week-details.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-week-details.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class EventWeekDetailsComponent {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":17}},{"path":"src/app/app-routing.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { RouterModule, Routes } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AuthGuard } from \u0027./core/guards/auth.guard\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ParseUrlParamsGuard } from \u0027./core/guards/parse-url-params.guard\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"const routes: Routes \u003d ["},{"lineNumber":10,"author":{"gitId":"-"},"content":" { path: \u0027\u0027, loadChildren: () \u003d\u003e AuthModule },"},{"lineNumber":11,"author":{"gitId":"-"},"content":" { path: \u0027issuesViewer/:org/:repo\u0027, canActivate: [ParseUrlParamsGuard], children: [] },"},{"lineNumber":12,"author":{"gitId":"-"},"content":" { path: \u0027issuesViewer\u0027, loadChildren: () \u003d\u003e IssuesViewerModule, canLoad: [AuthGuard] },"},{"lineNumber":13,"author":{"gitId":"-"},"content":" { path: \u0027activityDashboard\u0027, loadChildren: () \u003d\u003e ActivityDashboardModule, canLoad: [AuthGuard] }"},{"lineNumber":14,"author":{"gitId":"-"},"content":"];"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" imports: [RouterModule.forRoot(routes, { relativeLinkResolution: \u0027legacy\u0027 })],"},{"lineNumber":18,"author":{"gitId":"-"},"content":" exports: [RouterModule]"},{"lineNumber":19,"author":{"gitId":"-"},"content":"})"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class AppRoutingModule {}"}],"authorContributionMap":{"MadLamprey":1,"-":19}},{"path":"src/app/app.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ErrorHandler, NgModule, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BrowserModule, Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BrowserAnimationsModule } from \u0027@angular/platform-browser/animations\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"import { ApolloLink, InMemoryCache, PossibleTypesMap } from \u0027@apollo/client/core\u0027;"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":"import { setContext } from \u0027@apollo/client/link/context\u0027;"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":"import { Apollo } from \u0027apollo-angular\u0027;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"import { HttpLink } from \u0027apollo-angular/http\u0027;"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import \u0027reflect-metadata\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import graphqlTypes from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import \u0027../polyfills\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { AppRoutingModule } from \u0027./app-routing.module\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { AppComponent } from \u0027./app.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { UserConfirmationComponent } from \u0027./core/guards/user-confirmation/user-confirmation.component\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027./core/services/auth.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./core/services/error-handling.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./core/services/error-message.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { AuthServiceFactory } from \u0027./core/services/factories/factory.auth.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubServiceFactory } from \u0027./core/services/factories/factory.github.service\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssueServiceFactory } from \u0027./core/services/factories/factory.issue.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./core/services/github.service\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./core/services/githubevent.service\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./core/services/issue.service\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./core/services/label.service\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./core/services/logging.service\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027./core/services/repo-session-storage.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./core/services/user.service\u0027;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./core/services/view.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LabelDefinitionPopupComponent } from \u0027./shared/label-definition-popup/label-definition-popup.component\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import { HeaderComponent } from \u0027./shared/layout\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import { RepoChangeFormComponent } from \u0027./shared/repo-change-form/repo-change-form.component\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027./shared/shared.module\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" declarations: [AppComponent, HeaderComponent, UserConfirmationComponent, LabelDefinitionPopupComponent, RepoChangeFormComponent],"},{"lineNumber":41,"author":{"gitId":"-"},"content":" imports: ["},{"lineNumber":42,"author":{"gitId":"-"},"content":" BrowserModule,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" BrowserAnimationsModule,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AuthModule,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" IssuesViewerModule,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ActivityDashboardModule,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" SharedModule,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" AppRoutingModule"},{"lineNumber":50,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":51,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":52,"author":{"gitId":"-"},"content":" {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" provide: GithubService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" useFactory: GithubServiceFactory,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" deps: [ErrorHandlingService, Apollo, LoggingService]"},{"lineNumber":56,"author":{"gitId":"-"},"content":" },"},{"lineNumber":57,"author":{"gitId":"-"},"content":" {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" provide: AuthService,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" useFactory: AuthServiceFactory,"},{"lineNumber":60,"author":{"gitId":"-"},"content":" deps: ["},{"lineNumber":61,"author":{"gitId":"-"},"content":" Router,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" NgZone,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" GithubService,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" UserService,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" IssueService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" LabelService,"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" ViewService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" GithubEventService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Title,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ErrorHandlingService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" LoggingService"},{"lineNumber":72,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":73,"author":{"gitId":"-"},"content":" },"},{"lineNumber":74,"author":{"gitId":"-"},"content":" {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" provide: IssueService,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" useFactory: IssueServiceFactory,"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" deps: [GithubService, UserService, ViewService]"},{"lineNumber":78,"author":{"gitId":"-"},"content":" },"},{"lineNumber":79,"author":{"gitId":"-"},"content":" {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" provide: ErrorHandler,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" useClass: ErrorHandlingService"},{"lineNumber":82,"author":{"gitId":"-"},"content":" },"},{"lineNumber":83,"author":{"gitId":"-"},"content":" ErrorMessageService,"},{"lineNumber":84,"author":{"gitId":"-"},"content":" RepoSessionStorageService"},{"lineNumber":85,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":86,"author":{"gitId":"-"},"content":" bootstrap: [AppComponent]"},{"lineNumber":87,"author":{"gitId":"-"},"content":"})"},{"lineNumber":88,"author":{"gitId":"-"},"content":"export class AppModule {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" constructor(private apollo: Apollo, private httpLink: HttpLink, private authService: AuthService, private logger: LoggingService) {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" const URI \u003d \u0027https://api.github.com/graphql\u0027;"},{"lineNumber":91,"author":{"gitId":"-"},"content":" const log \u003d new ApolloLink((operation, forward) \u003d\u003e {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" operation.setContext({ start: performance.now() });"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL request\u0027, operation.getContext());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return forward(operation).map((result) \u003d\u003e {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" const time \u003d performance.now() - operation.getContext().start;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL response\u0027, operation.getContext(), `in ${Math.round(time)}ms`);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" const repo \u003d operation.getContext().response.body.data.repository;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" const item \u003d Object.keys(repo)[0];"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027AppModule: GraphQL response body\u0027, item, repo[item].edges.length, repo[item].edges);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":" });"},{"lineNumber":103,"author":{"gitId":"-"},"content":" const basic \u003d setContext(() \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return { headers: { Accept: \u0027charset\u003dutf-8\u0027 } };"},{"lineNumber":105,"author":{"gitId":"-"},"content":" });"},{"lineNumber":106,"author":{"gitId":"-"},"content":" const auth \u003d setContext(() \u003d\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return { headers: { Authorization: `Token ${this.authService.accessToken.getValue()}` } };"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":" const link \u003d ApolloLink.from([log, basic, auth, this.httpLink.create({ uri: URI })]);"},{"lineNumber":110,"author":{"gitId":"MadLamprey"},"content":" const possibleTypes: PossibleTypesMap \u003d {};"},{"lineNumber":111,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":112,"author":{"gitId":"MadLamprey"},"content":" graphqlTypes.__schema.types.forEach((type: any) \u003d\u003e {"},{"lineNumber":113,"author":{"gitId":"MadLamprey"},"content":" if (type.kind \u003d\u003d\u003d \u0027UNION\u0027 || type.kind \u003d\u003d\u003d \u0027INTERFACE\u0027) {"},{"lineNumber":114,"author":{"gitId":"MadLamprey"},"content":" possibleTypes[type.name] \u003d type.possibleTypes.map((possibleType: any) \u003d\u003e possibleType.name);"},{"lineNumber":115,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":" });"},{"lineNumber":117,"author":{"gitId":"MadLamprey"},"content":" const cache \u003d new InMemoryCache({ possibleTypes });"},{"lineNumber":118,"author":{"gitId":"-"},"content":" this.apollo.create({"},{"lineNumber":119,"author":{"gitId":"-"},"content":" link: link,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" cache: cache"},{"lineNumber":121,"author":{"gitId":"-"},"content":" });"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":3,"Arif-Khalid":1,"MadLamprey":13,"-":106}},{"path":"src/app/auth/auth.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, NgZone, OnDestroy, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { filter, flatMap, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../environments/environment\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../core/constants/storage-keys.constants\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ApplicationService } from \u0027../core/services/application.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { AuthService, AuthState } from \u0027../core/services/auth.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../core/services/error-handling.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../core/services/logging.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../core/services/user.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../core/services/view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" selector: \u0027app-auth\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" templateUrl: \u0027./auth.component.html\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./auth.component.css\u0027]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"})"},{"lineNumber":21,"author":{"gitId":"-"},"content":"export class AuthComponent implements OnInit, OnDestroy {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" authState: AuthState;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" accessTokenSubscription: Subscription;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" authStateSubscription: Subscription;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" currentUserName: string;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" urlEncodedSessionName: string;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" urlEncodedRepo: string;"},{"lineNumber":28,"author":{"gitId":"-"},"content":" sessionInformation: string;"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":31,"author":{"gitId":"-"},"content":" public appService: ApplicationService,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private authService: AuthService,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private userService: UserService,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private ngZone: NgZone,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private activatedRoute: ActivatedRoute,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private logger: LoggingService"},{"lineNumber":40,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.logger.startSession();"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" const oauthCode \u003d this.activatedRoute.snapshot.queryParamMap.get(\u0027code\u0027);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" const state \u003d this.activatedRoute.snapshot.queryParamMap.get(\u0027state\u0027);"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (this.authService.isAuthenticated()) {"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([this.viewService.currentView]);"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.initAccessTokenSubscription();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.initAuthStateSubscription();"},{"lineNumber":54,"author":{"gitId":"-"},"content":" this.createProfileFromUrlQueryParams();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.getRepoFromUrlQueryParams();"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (oauthCode) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // runs upon receiving oauthCode from the redirect"},{"lineNumber":58,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // this.restoreOrgDetailsFromLocalStorage();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthComponent: Obtained authorisation code from Github\u0027);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.fetchAccessToken(oauthCode, state);"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" this.authService.startOAuthIfHasNext();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Will fetch the access token from GitHub."},{"lineNumber":69,"author":{"gitId":"-"},"content":" * @param oauthCode - The authorisation code obtained from GitHub."},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @param state - The state returned from GitHub."},{"lineNumber":71,"author":{"gitId":"-"},"content":" */"},{"lineNumber":72,"author":{"gitId":"-"},"content":" fetchAccessToken(oauthCode: string, state: string) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (!this.authService.isReturnedStateSame(state)) {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Received incorrect state ${state}, continue waiting for correct state`);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Retrieving access token from Github`);"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" const accessTokenUrl \u003d `${AppConfig.accessTokenUrl}/${oauthCode}/client_id/${AppConfig.clientId}`;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" fetch(accessTokenUrl)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .then((res) \u003d\u003e res.json())"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .then((data) \u003d\u003e {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (data.error) {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" throw new Error(data.error);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.authService.storeOAuthAccessToken(data.token);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Sucessfully obtained access token`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" })"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .catch((err) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Error in data fetched from access token URL: ${err}`);"},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":94,"author":{"gitId":"-"},"content":" });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" ngOnDestroy() {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" if (this.authStateSubscription) {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.authStateSubscription.unsubscribe();"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":" if (this.accessTokenSubscription) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" this.accessTokenSubscription.unsubscribe();"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Checks whether the current version of WATcher is outdated."},{"lineNumber":108,"author":{"gitId":"-"},"content":" */"},{"lineNumber":109,"author":{"gitId":"-"},"content":" checkAppIsOutdated(): Observable\u003cany\u003e {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return this.appService.isApplicationOutdated().pipe("},{"lineNumber":111,"author":{"gitId":"-"},"content":" map((isOutdated: boolean) \u003d\u003e {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" if (isOutdated) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.applicationVersionOutdatedMessage());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" })"},{"lineNumber":116,"author":{"gitId":"-"},"content":" );"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" updateSession(sessionEvent: string) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.sessionInformation \u003d sessionEvent;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" goToSessionSelect() {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }"},{"lineNumber":126,"author":{"gitId":"-"},"content":""},{"lineNumber":127,"author":{"gitId":"-"},"content":" isUserNotAuthenticated(): boolean {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.NotAuthenticated;"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" isUserAuthenticating(): boolean {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.AwaitingAuthentication;"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" isAwaitingOAuthUserConfirm(): boolean {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.ConfirmOAuthUser;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" isUserAuthenticated(): boolean {"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.Authenticated;"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" isRepoSet(): boolean {"},{"lineNumber":144,"author":{"gitId":"NereusWB922"},"content":" return this.viewService.isRepoSet();"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" get currentSessionOrg(): string {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" if (!this.sessionInformation) {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Retrieve org details of session information from local storage"},{"lineNumber":150,"author":{"gitId":"-"},"content":" return window.localStorage.getItem(STORAGE_KEYS.ORG);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" return this.getOrgDetails(this.sessionInformation);"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Extracts the Organization Details from the input sessionInformation."},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param sessionInformation - string in the format of \u0027orgName/dataRepo\u0027"},{"lineNumber":158,"author":{"gitId":"-"},"content":" */"},{"lineNumber":159,"author":{"gitId":"-"},"content":" private getOrgDetails(sessionInformation: string) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return sessionInformation.split(\u0027/\u0027)[0];"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" private initAuthStateSubscription() {"},{"lineNumber":164,"author":{"gitId":"-"},"content":" this.authStateSubscription \u003d this.authService.currentAuthState.subscribe((state) \u003d\u003e {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" this.authState \u003d state;"},{"lineNumber":167,"author":{"gitId":"-"},"content":" });"},{"lineNumber":168,"author":{"gitId":"-"},"content":" });"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" private initAccessTokenSubscription() {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" this.accessTokenSubscription \u003d this.authService.accessToken"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":174,"author":{"gitId":"-"},"content":" filter((token: string) \u003d\u003e !!token),"},{"lineNumber":175,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e this.userService.getAuthenticatedUser())"},{"lineNumber":176,"author":{"gitId":"-"},"content":" )"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .subscribe((user: GithubUser) \u003d\u003e {"},{"lineNumber":178,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e {"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.currentUserName \u003d user.login;"},{"lineNumber":180,"author":{"gitId":"nknguyenhc"},"content":" if (this.authService.hasNext()) {"},{"lineNumber":181,"author":{"gitId":"nknguyenhc"},"content":" this.authService.completeLoginIfHasNext(this.currentUserName);"},{"lineNumber":182,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.ConfirmOAuthUser);"},{"lineNumber":184,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":185,"author":{"gitId":"-"},"content":" });"},{"lineNumber":186,"author":{"gitId":"-"},"content":" });"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" private createProfileFromUrlQueryParams() {"},{"lineNumber":190,"author":{"gitId":"-"},"content":" const urlParams \u003d this.activatedRoute.snapshot.queryParamMap;"},{"lineNumber":191,"author":{"gitId":"-"},"content":" if (urlParams.has(\u0027session\u0027)) {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" this.urlEncodedSessionName \u003d urlParams.get(\u0027session\u0027);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" private getRepoFromUrlQueryParams() {"},{"lineNumber":197,"author":{"gitId":"-"},"content":" const urlParams \u003d this.activatedRoute.snapshot.queryParamMap;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" if (urlParams.has(\u0027repo\u0027)) {"},{"lineNumber":199,"author":{"gitId":"-"},"content":" this.urlEncodedRepo \u003d urlParams.get(\u0027repo\u0027);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":4,"-":192}},{"path":"src/app/core/guards/auth.guard.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ActivatedRouteSnapshot, CanActivate, CanLoad, Route, Router, RouterStateSnapshot, UrlSegment } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../services/auth.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":7,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":8,"author":{"gitId":"-"},"content":"})"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export class AuthGuard implements CanActivate, CanLoad {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" constructor(private auth: AuthService, private router: Router) {}"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable\u003cboolean\u003e | Promise\u003cboolean\u003e | boolean {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" if (this.auth.isAuthenticated()) {"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" this.auth.clearNext();"},{"lineNumber":15,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" this.auth.storeNext(state);"},{"lineNumber":18,"author":{"gitId":"-"},"content":" this.router.navigate([\u0027\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" canLoad(route: Route, segments: UrlSegment[]): Observable\u003cboolean\u003e | Promise\u003cboolean\u003e | boolean {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" if (this.auth.isAuthenticated()) {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.router.navigate([\u0027\u0027]);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":2,"-":29}},{"path":"src/app/core/models/github-user.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027./github/group.interface\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" * Represents raw data returned from the GitHub API about a user."},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export interface RawGithubUser {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" avatar_url: string;"},{"lineNumber":8,"author":{"gitId":"-"},"content":" created_at: string;"},{"lineNumber":9,"author":{"gitId":"-"},"content":" html_url: string;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" login: string;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" node_id: string;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" two_factor_authentication: boolean;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" site_admin: false;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" type: string;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" updated_at: string;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" url: string;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * Represents a GitHub user in WATcher"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export class GithubUser implements RawGithubUser, Group {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" static NO_ASSIGNEE: GithubUser \u003d new GithubUser({"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" avatar_url: \u0027\u0027,"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" created_at: \u0027\u0027,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" html_url: \u0027\u0027,"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" login: \u0027Unassigned\u0027,"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" name: \u0027\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" node_id: \u0027\u0027,"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" two_factor_authentication: false,"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" site_admin: false,"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" type: \u0027\u0027,"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u0027\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" url: \u0027\u0027"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" avatar_url: string;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" created_at: string;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" html_url: string;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" login: string;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" name: string;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" node_id: string;"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" two_factor_authentication: boolean;"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" site_admin: false;"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" type: string;"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" updated_at: string;"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" url: string;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" constructor(rawData: RawGithubUser) {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" Object.assign(this, rawData);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" equals(other: any) {"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" if (!(other instanceof GithubUser)) {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" return false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" return this.login \u003d\u003d\u003d other.login;"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":48,"-":12}},{"path":"src/app/core/models/github/group.interface.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" * Represents a group used for grouping purposes."},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" * Groups can be used to organize issues/prs based on certain criteria,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" * such as milestones, assignees, or other properties."},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export interface Group {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" equals(other: any): boolean;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":8}},{"path":"src/app/core/models/issue.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubComment } from \u0027./github/github-comment.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027./github/github-issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027./github/github-label.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { HiddenData } from \u0027./hidden-data.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Milestone } from \u0027./milestone.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export class Issue {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" /** Basic Fields */"},{"lineNumber":10,"author":{"gitId":"-"},"content":" readonly globalId: string;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" readonly id: number;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" readonly created_at: string;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" readonly githubIssue: GithubIssue;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" githubComments: GithubComment[];"},{"lineNumber":15,"author":{"gitId":"-"},"content":" title: string;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" description: string;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" hiddenDataInDescription: HiddenData;"},{"lineNumber":18,"author":{"gitId":"-"},"content":" updated_at: string;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" closed_at: string;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" milestone: Milestone;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" state: string;"},{"lineNumber":22,"author":{"gitId":"-"},"content":" stateReason: string;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" issueOrPr: string;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" author: string;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" isDraft: boolean;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" /** Depending on the view, assignees attribute can be derived from Github\u0027s assignee feature OR from the Github\u0027s issue description */"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assignees?: string[];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" labels?: string[];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" githubLabels?: GithubLabel[];"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Formats the text to create space at the end of the user input to prevent any issues with"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * the markdown interpretation."},{"lineNumber":35,"author":{"gitId":"-"},"content":" *"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Brought over from comment-editor.component.ts"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */"},{"lineNumber":38,"author":{"gitId":"-"},"content":" static formatText(text: string): string {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (text \u003d\u003d\u003d null) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" if (text \u003d\u003d\u003d undefined) {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return undefined;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" const newLinesRegex \u003d /[\\n\\r]/gi;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" const textSplitArray \u003d text.split(newLinesRegex);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (textSplitArray.filter((split) \u003d\u003e split.trim() !\u003d\u003d \u0027\u0027).length \u003e 0) {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return `${text}\\n\\n`;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return text;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Processes and cleans a raw issue description obtained from user input."},{"lineNumber":58,"author":{"gitId":"-"},"content":" */"},{"lineNumber":59,"author":{"gitId":"-"},"content":" static updateDescription(description: string): string {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" const defaultString \u003d \u0027No details provided by bug reporter.\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return Issue.orDefaultString(Issue.formatText(description), defaultString);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Given two strings, returns the first if it is not an empty string or a false value such as null/undefined."},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Returns the second string if the first is an empty string."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static orDefaultString(stringA: string, def: string): string {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (!stringA) {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return def;"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return stringA.length !\u003d\u003d 0 ? stringA : def;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" protected constructor(githubIssue: GithubIssue) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /** Basic Fields */"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.globalId \u003d githubIssue.id;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.id \u003d +githubIssue.number;"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.created_at \u003d moment(githubIssue.created_at).format(\u0027lll\u0027);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.updated_at \u003d moment(githubIssue.updated_at).format(\u0027lll\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" this.closed_at \u003d moment(githubIssue.closed_at).format(\u0027lll\u0027);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.title \u003d githubIssue.title;"},{"lineNumber":83,"author":{"gitId":"-"},"content":" this.hiddenDataInDescription \u003d new HiddenData(githubIssue.body);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" this.description \u003d Issue.updateDescription(this.hiddenDataInDescription.originalStringWithoutHiddenData);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.state \u003d githubIssue.state;"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.stateReason \u003d githubIssue.stateReason;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.issueOrPr \u003d githubIssue.issueOrPr;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.author \u003d githubIssue.user.login;"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // this.githubIssue \u003d githubIssue;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" this.isDraft \u003d githubIssue.isDraft;"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.assignees \u003d githubIssue.assignees.map((assignee) \u003d\u003e assignee.login);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.githubLabels \u003d githubIssue.labels;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" this.labels \u003d githubIssue.labels.map((label) \u003d\u003e label.name);"},{"lineNumber":95,"author":{"gitId":"MadLamprey"},"content":" this.milestone \u003d githubIssue.milestone"},{"lineNumber":96,"author":{"gitId":"MadLamprey"},"content":" ? new Milestone(githubIssue.milestone)"},{"lineNumber":97,"author":{"gitId":"MadLamprey"},"content":" : this.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027"},{"lineNumber":98,"author":{"gitId":"MadLamprey"},"content":" ? Milestone.IssueWithoutMilestone"},{"lineNumber":99,"author":{"gitId":"MadLamprey"},"content":" : Milestone.PRWithoutMilestone;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" public static createPhaseBugReportingIssue(githubIssue: GithubIssue): Issue {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return new Issue(githubIssue);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" createGithubIssueDescription(): string {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return `${this.description}\\n${this.hiddenDataInDescription.toString()}`;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":"export interface Issues {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" [id: number]: Issue;"},{"lineNumber":113,"author":{"gitId":"-"},"content":"}"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":"export const IssuesFilter \u003d {"},{"lineNumber":116,"author":{"gitId":"-"},"content":" issuesViewer: {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Student: \u0027NO_FILTER\u0027,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Tutor: \u0027NO_FILTER\u0027,"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Admin: \u0027NO_FILTER\u0027"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":1,"MadLamprey":5,"-":115}},{"path":"src/app/core/models/label.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"-"},"content":" * Represents a label and its attributes."},{"lineNumber":3,"author":{"gitId":"-"},"content":" */"},{"lineNumber":4,"author":{"gitId":"-"},"content":"export class Label implements SimpleLabel {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" readonly name: string;"},{"lineNumber":6,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":7,"author":{"gitId":"-"},"content":" definition?: string;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" constructor(label: { name: string; color: string; definition?: string }) {"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" this.name \u003d label.name;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.color \u003d label.color;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" this.definition \u003d label.definition;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Represents a simplified label with name and color"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"export type SimpleLabel \u003d {"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" name: string;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"nknguyenhc":2,"-":20}},{"path":"src/app/core/models/milestone.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027./github/group.interface\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents a milestone and its attributes fetched from Github."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export class Milestone implements Group {"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" static IssueWithoutMilestone: Milestone \u003d new Milestone({ title: \u0027Issue without a milestone\u0027, state: null });"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" static PRWithoutMilestone: Milestone \u003d new Milestone({ title: \u0027PR without a milestone\u0027, state: null });"},{"lineNumber":9,"author":{"gitId":"-"},"content":" title: string;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" state: string;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" deadline?: Date;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" constructor(milestone: { title: string; state: string; due_on?: string }) {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" this.title \u003d milestone.title;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" this.state \u003d milestone.state;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" this.deadline \u003d milestone.due_on ? new Date(milestone.due_on) : undefined;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" public equals(other: any) {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" if (!(other instanceof Milestone)) {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" return false;"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" return this.title \u003d\u003d\u003d other.title;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":3,"NereusWB922":8,"MadLamprey":2,"-":12}},{"path":"src/app/core/models/repo-change-response.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":" * Represents the response of the repo-change-form component"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" */"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"export type RepoChangeResponse \u003d {"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" repo: string;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":" keepFilters: boolean;"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"};"}],"authorContributionMap":{"Arif-Khalid":7}},{"path":"src/app/core/models/session.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { pipe } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { throwIfFalse } from \u0027../../shared/lib/custom-ops\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Repo } from \u0027./repo.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027./view.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" * Session repository comprises the view and its corresponding repository array."},{"lineNumber":8,"author":{"gitId":"-"},"content":" */"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export interface SessionRepo {"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" view: View;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" repos: Repo[];"},{"lineNumber":12,"author":{"gitId":"-"},"content":"}"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Session data comprises an array of session repositories."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"export interface SessionData {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" sessionRepo: SessionRepo[];"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"export const SESSION_DATA_UNAVAILABLE \u003d \u0027Session data does not exist.\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"export const SESSION_DATA_MISSING_FIELDS \u003d \u0027Session data does not contain any repositories.\u0027;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export const NO_VALID_OPEN_VIEWS \u003d \u0027Invalid views in Session data.\u0027;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"export const OPENED_VIEW_REPO_UNDEFINED \u003d \u0027View has no repo defined.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"export function assertSessionDataIntegrity() {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return pipe("},{"lineNumber":28,"author":{"gitId":"-"},"content":" throwIfFalse("},{"lineNumber":29,"author":{"gitId":"-"},"content":" (sessionData) \u003d\u003e sessionData !\u003d\u003d undefined,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" () \u003d\u003e new Error(SESSION_DATA_UNAVAILABLE)"},{"lineNumber":31,"author":{"gitId":"-"},"content":" ),"},{"lineNumber":32,"author":{"gitId":"-"},"content":" throwIfFalse(hasSessionRepo, () \u003d\u003e new Error(SESSION_DATA_MISSING_FIELDS)),"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" throwIfFalse(areViewsValid, () \u003d\u003e new Error(NO_VALID_OPEN_VIEWS)),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" throwIfFalse(areReposDefined, () \u003d\u003e new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" );"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Checks if Session Data has all its crucial fields present."},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */"},{"lineNumber":42,"author":{"gitId":"-"},"content":"function hasSessionRepo(sessionData: SessionData): boolean {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo !\u003d null \u0026\u0026 Array.isArray(sessionData.sessionRepo) \u0026\u0026 sessionData.sessionRepo.length \u003e 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" * Checks if Views belong to a pre-defined View."},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":"function areViewsValid(sessionData: SessionData): boolean {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo.reduce("},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" (isViewValidSoFar: boolean, currentViewRepo: SessionRepo) \u003d\u003e isViewValidSoFar \u0026\u0026 currentViewRepo.view in View,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" true"},{"lineNumber":54,"author":{"gitId":"-"},"content":" );"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" * Checks if each View has an associated repo defined as well."},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":"function areReposDefined(sessionData: SessionData): boolean {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo.reduce("},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" (isViewRepoDefinedSoFar: boolean, currentViewRepo: SessionRepo) \u003d\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" isViewRepoDefinedSoFar \u0026\u0026 !!currentViewRepo.repos \u0026\u0026 Array.isArray(currentViewRepo.repos) \u0026\u0026 currentViewRepo.repos.length \u003e 0,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" true"},{"lineNumber":66,"author":{"gitId":"-"},"content":" );"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":13,"-":54}},{"path":"src/app/core/models/view.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export enum View {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" issuesViewer \u003d \u0027issuesViewer\u0027,"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" activityDashboard \u003d \u0027activityDashboard\u0027"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/core/services/auth.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { Router, RouterStateSnapshot } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BehaviorSubject, from, Observable, of } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"import { catchError, map, mergeMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { generateSessionId } from \u0027../../shared/lib/session\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { uuid } from \u0027../../shared/lib/uuid\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./githubevent.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./issue.service\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./label.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./user.service\u0027;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./view.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"export enum AuthState {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u0027NotAuthenticated\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u0027AwaitingAuthentication\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u0027ConfirmOAuthUser\u0027,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u0027Authenticated\u0027"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":28,"author":{"gitId":"-"},"content":"})"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Responsible for initiating the authentication process and querying or"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * updating the application state with regards to authentication."},{"lineNumber":33,"author":{"gitId":"-"},"content":" */"},{"lineNumber":34,"author":{"gitId":"-"},"content":"export class AuthService {"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DEFAULT_NO_PERMISSION_TO_PRIVATE_REPOS \u003d false;"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" private static readonly SESSION_NEXT_KEY \u003d \u0027next\u0027;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" authStateSource \u003d new BehaviorSubject(AuthState.NotAuthenticated);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" currentAuthState \u003d this.authStateSource.asObservable();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" accessToken \u003d new BehaviorSubject(undefined);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private state: string;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" ENABLE_POPUP_MESSAGE \u003d \u0027Please enable pop-ups in your browser\u0027;"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":46,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private ngZone: NgZone,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private userService: UserService,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private labelService: LabelService,"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private githubEventService: GithubEventService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private titleService: Title,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private logger: LoggingService"},{"lineNumber":57,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" * Stores the data about the next route in the session storage."},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" storeNext(next: RouterStateSnapshot) {"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" sessionStorage.setItem(AuthService.SESSION_NEXT_KEY, next.url);"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" * by checking the session storage."},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" hasNext(): boolean {"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" return sessionStorage.getItem(AuthService.SESSION_NEXT_KEY) !\u003d\u003d null;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" * and start OAuth process automatically if there is."},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" startOAuthIfHasNext() {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" if (this.hasNext()) {"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Start OAuth because there is a next route`);"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" this.startOAuthProcess(AuthService.DEFAULT_NO_PERMISSION_TO_PRIVATE_REPOS);"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" * and complete the login process if there is."},{"lineNumber":88,"author":{"gitId":"nknguyenhc"},"content":" * Assuming that user has authenticated on Github, and the app is awaiting confirmation."},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" completeLoginIfHasNext(username: string) {"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" if (!this.hasNext()) {"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Automatically complete login because there is a next route`);"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" this.userService.createUserModel(username).subscribe("},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":" () \u003d\u003e {"},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.Authenticated);"},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":" },"},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" (err) \u003d\u003e {"},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Automatic completion of login failed with an error: ${err}`);"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" * Clears the next route from the session storage."},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":111,"author":{"gitId":"nknguyenhc"},"content":" clearNext() {"},{"lineNumber":112,"author":{"gitId":"nknguyenhc"},"content":" sessionStorage.removeItem(AuthService.SESSION_NEXT_KEY);"},{"lineNumber":113,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":114,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":115,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"nknguyenhc"},"content":" * Redirect to the URL indicating the next route."},{"lineNumber":117,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":118,"author":{"gitId":"nknguyenhc"},"content":" redirectToNext() {"},{"lineNumber":119,"author":{"gitId":"nknguyenhc"},"content":" const next \u003d sessionStorage.getItem(AuthService.SESSION_NEXT_KEY);"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" this.viewService"},{"lineNumber":121,"author":{"gitId":"nknguyenhc"},"content":" .setupFromUrl(next)"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" .pipe("},{"lineNumber":123,"author":{"gitId":"nknguyenhc"},"content":" mergeMap(() \u003d\u003e this.setRepo()),"},{"lineNumber":124,"author":{"gitId":"nknguyenhc"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":125,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Failed to redirect to next URL with error: ${err}`);"},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":127,"author":{"gitId":"nknguyenhc"},"content":" this.clearNext();"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":129,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":130,"author":{"gitId":"nknguyenhc"},"content":" )"},{"lineNumber":131,"author":{"gitId":"nknguyenhc"},"content":" .subscribe((isSetupSuccesssful) \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"nknguyenhc"},"content":" if (isSetupSuccesssful) {"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" this.router.navigateByUrl(next);"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":135,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":136,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":137,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Will store the OAuth token."},{"lineNumber":140,"author":{"gitId":"-"},"content":" */"},{"lineNumber":141,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(token: string) {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" this.githubService.storeOAuthAccessToken(token);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" this.accessToken.next(token);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":147,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthService: Clearing access token and setting AuthState to NotAuthenticated.\u0027);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" this.accessToken.next(undefined);"},{"lineNumber":149,"author":{"gitId":"-"},"content":" this.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e this.router.navigate([\u0027\u0027]));"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":" logOut(): void {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" this.githubService.reset();"},{"lineNumber":155,"author":{"gitId":"-"},"content":" this.userService.reset();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" this.issueService.reset(true);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" this.viewService.reset();"},{"lineNumber":159,"author":{"gitId":"-"},"content":" this.githubEventService.reset();"},{"lineNumber":160,"author":{"gitId":"-"},"content":" this.logger.reset();"},{"lineNumber":161,"author":{"gitId":"-"},"content":" this.setLandingPageTitle();"},{"lineNumber":162,"author":{"gitId":"-"},"content":" this.issueService.setIssueTeamFilter(\u0027All Teams\u0027);"},{"lineNumber":163,"author":{"gitId":"-"},"content":" this.reset();"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":""},{"lineNumber":166,"author":{"gitId":"NereusWB922"},"content":" setTitleWithViewDetail(): void {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" const appSetting \u003d require(\u0027../../../../package.json\u0027);"},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":" const title \u003d `${appSetting.name} ${appSetting.version} - ${this.viewService.getCurrentRepositoryURL()}`;"},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Setting Title as ${title}`);"},{"lineNumber":170,"author":{"gitId":"-"},"content":" this.titleService.setTitle(title);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" setLandingPageTitle(): void {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" const appSetting \u003d require(\u0027../../../../package.json\u0027);"},{"lineNumber":175,"author":{"gitId":"-"},"content":" const title \u003d `${appSetting.name} ${appSetting.version}`;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Setting Title as ${title}`);"},{"lineNumber":177,"author":{"gitId":"-"},"content":" this.titleService.setTitle(title);"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" isAuthenticated(): boolean {"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return this.authStateSource.getValue() \u003d\u003d\u003d AuthState.Authenticated;"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" changeAuthState(newAuthState: AuthState) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" if (newAuthState \u003d\u003d\u003d AuthState.Authenticated) {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" const sessionId \u003d generateSessionId();"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.issueService.setSessionId(sessionId);"},{"lineNumber":188,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Successfully authenticated with session: ${sessionId}`);"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":" this.authStateSource.next(newAuthState);"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":194,"author":{"gitId":"-"},"content":" * Generates and assigns an unguessable random \u0027state\u0027 string to pass to Github for protection against cross-site request forgery attacks"},{"lineNumber":195,"author":{"gitId":"-"},"content":" */"},{"lineNumber":196,"author":{"gitId":"-"},"content":" generateStateString() {"},{"lineNumber":197,"author":{"gitId":"-"},"content":" this.state \u003d uuid();"},{"lineNumber":198,"author":{"gitId":"-"},"content":" sessionStorage.setItem(\u0027state\u0027, this.state);"},{"lineNumber":199,"author":{"gitId":"-"},"content":" }"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":" isReturnedStateSame(returnedState: string): boolean {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" const state \u003d sessionStorage.getItem(\u0027state\u0027);"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return returnedState \u003d\u003d\u003d state;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":207,"author":{"gitId":"-"},"content":" * Will start the Github OAuth web flow process."},{"lineNumber":208,"author":{"gitId":"-"},"content":" */"},{"lineNumber":209,"author":{"gitId":"-"},"content":" startOAuthProcess(hasPrivateConsent: boolean) {"},{"lineNumber":210,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthService: Starting authentication\u0027);"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // Available OAuth scopes https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps#available-scopes"},{"lineNumber":212,"author":{"gitId":"-"},"content":" let permissionLevel \u003d \u0027public-repo\u0027;"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" if (hasPrivateConsent) {"},{"lineNumber":215,"author":{"gitId":"-"},"content":" // grants WATcher access to private repos if user allows"},{"lineNumber":216,"author":{"gitId":"-"},"content":" permissionLevel \u003d \u0027repo\u0027;"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" const githubRepoPermission \u003d permissionLevel; // don\u0027t allow changes after logging ins"},{"lineNumber":220,"author":{"gitId":"-"},"content":""},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":222,"author":{"gitId":"-"},"content":""},{"lineNumber":223,"author":{"gitId":"-"},"content":" this.generateStateString();"},{"lineNumber":224,"author":{"gitId":"-"},"content":" this.redirectToOAuthPage("},{"lineNumber":225,"author":{"gitId":"-"},"content":" encodeURI("},{"lineNumber":226,"author":{"gitId":"-"},"content":" `${AppConfig.githubUrl}/login/oauth/authorize?client_id\u003d${AppConfig.clientId}\u0026scope\u003d${githubRepoPermission},read:user\u0026state\u003d${this.state}`"},{"lineNumber":227,"author":{"gitId":"-"},"content":" )"},{"lineNumber":228,"author":{"gitId":"-"},"content":" );"},{"lineNumber":229,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Redirecting for Github authentication`);"},{"lineNumber":230,"author":{"gitId":"-"},"content":" }"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Handles the clean up required after authentication and setting up of repository is completed."},{"lineNumber":234,"author":{"gitId":"-"},"content":" */"},{"lineNumber":235,"author":{"gitId":"nknguyenhc"},"content":" handleSetRepoSuccess(repoName: string) {"},{"lineNumber":236,"author":{"gitId":"NereusWB922"},"content":" this.setTitleWithViewDetail();"},{"lineNumber":237,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([View.issuesViewer], {"},{"lineNumber":238,"author":{"gitId":"nknguyenhc"},"content":" queryParams: {"},{"lineNumber":239,"author":{"gitId":"NereusWB922"},"content":" [ViewService.REPO_QUERY_PARAM_KEY]: repoName"},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":241,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":242,"author":{"gitId":"-"},"content":" }"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Setup repository after authentication."},{"lineNumber":246,"author":{"gitId":"-"},"content":" */"},{"lineNumber":247,"author":{"gitId":"-"},"content":" setRepo(): Observable\u003cboolean\u003e {"},{"lineNumber":248,"author":{"gitId":"NereusWB922"},"content":" return from(this.viewService.initializeCurrentRepository()).pipe("},{"lineNumber":249,"author":{"gitId":"-"},"content":" map(() \u003d\u003e {"},{"lineNumber":250,"author":{"gitId":"NereusWB922"},"content":" if (!this.viewService.currentRepo) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":" this.githubEventService.setLatestChangeEvent();"},{"lineNumber":254,"author":{"gitId":"NereusWB922"},"content":" this.handleSetRepoSuccess(this.viewService.currentRepo.toString());"},{"lineNumber":255,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":256,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":257,"author":{"gitId":"-"},"content":" catchError((error) \u003d\u003e {"},{"lineNumber":258,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":259,"author":{"gitId":"nknguyenhc"},"content":" this.clearNext();"},{"lineNumber":260,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":261,"author":{"gitId":"-"},"content":" })"},{"lineNumber":262,"author":{"gitId":"-"},"content":" );"},{"lineNumber":263,"author":{"gitId":"-"},"content":" }"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":266,"author":{"gitId":"-"},"content":" * Will redirect to GitHub OAuth page"},{"lineNumber":267,"author":{"gitId":"-"},"content":" */"},{"lineNumber":268,"author":{"gitId":"-"},"content":" private redirectToOAuthPage(url: string): void {"},{"lineNumber":269,"author":{"gitId":"-"},"content":" if (url \u003d\u003d null) {"},{"lineNumber":270,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }"},{"lineNumber":272,"author":{"gitId":"-"},"content":" window.location.href \u003d url;"},{"lineNumber":273,"author":{"gitId":"-"},"content":" }"},{"lineNumber":274,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":88,"NereusWB922":14,"-":172}},{"path":"src/app/core/services/error-message.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":4,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":5,"author":{"gitId":"-"},"content":"})"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Contains all error message prompts to user."},{"lineNumber":9,"author":{"gitId":"-"},"content":" */"},{"lineNumber":10,"author":{"gitId":"-"},"content":"export class ErrorMessageService {"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static repositoryNotPresentMessage() {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" return \u0027Invalid repository name. Please provide Github repository URL or the repository name in the format Org/Repository Name.\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" public static invalidUrlMessage() {"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" return \u0027URL is invalid, or repository does not exist, please indicate the repository you wish to view to continue.\u0027;"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static unableToFetchIssuesMessage() {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch issue.\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static unableToFetchMilestoneMessage() {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch milestones.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static unableToFetchLabelsMessage() {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch labels.\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static usersUnassignableMessage(assignee: string) {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return `Cannot assign ${assignee} to the issue. Please check if ${assignee} is authorized.`;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static unableToFetchUsersMessage() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch assignable users for repository\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static unableToFetchEventsMessage() {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch issue events for repository\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static unableToFetchActivityEventsMessage() {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch activity events for repository\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static unableToFetchDataFileMessage() {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch data file.\u0027;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static unableToFetchLatestReleaseMessage() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch latest release.\u0027;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static unableToFetchSettingsFileMessage() {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch settings file.\u0027;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static unableToFetchAuthenticatedUsersMessage() {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch authenticated user.\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static unableToOpenInBrowserMessage() {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return \u0027Unable to open this issue in Browser\u0027;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static applicationVersionOutdatedMessage() {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return \u0027Please update to the latest version of WATcher.\u0027;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static multipleDropdownOptionsErrorMessage() {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return \u0027Supply either Dropdown option number or text, not both.\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static noDropdownOptionsErrorMessage() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return \u0027No Dropdown identification parameters supplied.\u0027;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":4,"-":74}},{"path":"src/app/core/services/factories/factory.auth.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../auth.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../error-handling.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../issue.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../label.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../logging.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"// import { MockAuthService } from \u0027../mocks/mock.auth.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../user.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"export function AuthServiceFactory("},{"lineNumber":17,"author":{"gitId":"-"},"content":" router: Router,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" ngZone: NgZone,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" githubService: GithubService,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" userService: UserService,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" issueService: IssueService,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" labelService: LabelService,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" viewService: ViewService,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" githubEventService: GithubEventService,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" titleService: Title,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" errorHandlingService: ErrorHandlingService,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" logger: LoggingService"},{"lineNumber":28,"author":{"gitId":"-"},"content":") {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // return new MockAuthService("},{"lineNumber":32,"author":{"gitId":"-"},"content":" // router,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // ngZone,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // githubService,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // userService,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // issueService,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // labelService,"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" // viewService,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // githubEventService,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // titleService,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // logger"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // );"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return new AuthService("},{"lineNumber":45,"author":{"gitId":"-"},"content":" router,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ngZone,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" githubService,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" userService,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" issueService,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" labelService,"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" viewService,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" githubEventService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" titleService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" errorHandlingService,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" logger"},{"lineNumber":56,"author":{"gitId":"-"},"content":" );"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":4,"-":53}},{"path":"src/app/core/services/factories/factory.github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Apollo } from \u0027apollo-angular\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"// import { MockGithubService } from \u0027../mocks/mock.github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"export function GithubServiceFactory(handling: ErrorHandlingService, apollo: Apollo, logger: LoggingService) {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":11,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" // return new MockGithubService();"},{"lineNumber":13,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":14,"author":{"gitId":"-"},"content":" return new GithubService(handling, apollo, logger);"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"MadLamprey":1,"-":14}},{"path":"src/app/core/services/factories/factory.issue.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../issue.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"// import { MockIssueService } from \u0027../mocks/mock.issue.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../user.service\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../view.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"export function IssueServiceFactory(githubService: GithubService, userService: UserService, viewService: ViewService) {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":10,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" // return new MockIssueService(githubService, viewService, dataService);"},{"lineNumber":12,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" return new IssueService(githubService, userService, viewService);"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":4,"-":10}},{"path":"src/app/core/services/filters.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Sort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"import { BehaviorSubject, pipe } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { SimpleLabel } from \u0027../models/label.model\u0027;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":"import { Milestone } from \u0027../models/milestone.model\u0027;"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027./milestone.service\u0027;"},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":10,"author":{"gitId":"Arif-Khalid"},"content":"export type Filter \u003d {"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":" title: string;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" status: string[];"},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" type: string;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" sort: Sort;"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" labels: string[];"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":" milestones: string[];"},{"lineNumber":17,"author":{"gitId":"Arif-Khalid"},"content":" hiddenLabels: Set\u003cstring\u003e;"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: Set\u003cstring\u003e;"},{"lineNumber":19,"author":{"gitId":"Arif-Khalid"},"content":"};"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":"@Injectable({"},{"lineNumber":22,"author":{"gitId":"Arif-Khalid"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":23,"author":{"gitId":"Arif-Khalid"},"content":"})"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":"/**"},{"lineNumber":25,"author":{"gitId":"Arif-Khalid"},"content":" * Responsible for centralising filters"},{"lineNumber":26,"author":{"gitId":"Arif-Khalid"},"content":" * Filters are subscribed to and emitted from this service"},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" */"},{"lineNumber":28,"author":{"gitId":"Arif-Khalid"},"content":"export class FiltersService {"},{"lineNumber":29,"author":{"gitId":"Arif-Khalid"},"content":" public static readonly PRESET_VIEW_QUERY_PARAM_KEY \u003d \u0027presetview\u0027;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" readonly presetViews: {"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" [key: string]: () \u003d\u003e Filter;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" } \u003d {"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":" currentlyActive: () \u003d\u003e ({"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":" title: \u0027\u0027,"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" status: [\u0027open pullrequest\u0027, \u0027merged pullrequest\u0027, \u0027open issue\u0027, \u0027closed issue\u0027],"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" type: \u0027all\u0027,"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" sort: { active: \u0027status\u0027, direction: \u0027asc\u0027 },"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" labels: [],"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" milestones: this.getMilestonesForCurrentlyActive().map((milestone) \u003d\u003e milestone.title),"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: new Set\u003cstring\u003e(),"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: new Set\u003cstring\u003e()"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" contributions: () \u003d\u003e ({"},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":" title: \u0027\u0027,"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" status: [\u0027open pullrequest\u0027, \u0027merged pullrequest\u0027, \u0027open issue\u0027, \u0027closed issue\u0027],"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" type: \u0027all\u0027,"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":" sort: { active: \u0027id\u0027, direction: \u0027desc\u0027 },"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" labels: [],"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" milestones: this.milestoneService.milestones.map((milestone) \u003d\u003e milestone.title),"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: new Set\u003cstring\u003e(),"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: new Set\u003cstring\u003e()"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" custom: () \u003d\u003e this.filter$.value"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" // List of keys in the new filter change that causes current filter to not qualify to be a preset view."},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" readonly presetChangingKeys \u003d new Set\u003cstring\u003e([\u0027status\u0027, \u0027type\u0027, \u0027milestones\u0027, \u0027labels\u0027, \u0027deselectedLabels\u0027]);"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" readonly defaultFilter \u003d this.presetViews.currentlyActive;"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" public filter$ \u003d new BehaviorSubject\u003cFilter\u003e(this.defaultFilter());"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" // Either \u0027currentlyActive\u0027, \u0027contributions\u0027, or \u0027custom\u0027."},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" public presetView$ \u003d new BehaviorSubject\u003cstring\u003e(\u0027currentlyActive\u0027);"},{"lineNumber":63,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":64,"author":{"gitId":"Arif-Khalid"},"content":" // Helps in determining whether all milestones were selected from previous repo during sanitization of milestones"},{"lineNumber":65,"author":{"gitId":"Arif-Khalid"},"content":" private previousMilestonesLength \u003d 0;"},{"lineNumber":66,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":67,"author":{"gitId":"Arif-Khalid"},"content":" constructor("},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" private logger: LoggingService,"},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" private router: Router,"},{"lineNumber":70,"author":{"gitId":"Arif-Khalid"},"content":" private route: ActivatedRoute,"},{"lineNumber":71,"author":{"gitId":"Arif-Khalid"},"content":" private milestoneService: MilestoneService"},{"lineNumber":72,"author":{"gitId":"Arif-Khalid"},"content":" ) {}"},{"lineNumber":73,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":74,"author":{"gitId":"Arif-Khalid"},"content":" private pushFiltersToUrl(): void {"},{"lineNumber":75,"author":{"gitId":"Arif-Khalid"},"content":" const queryParams \u003d {};"},{"lineNumber":76,"author":{"gitId":"Arif-Khalid"},"content":" for (const filterName of Object.keys(this.filter$.value)) {"},{"lineNumber":77,"author":{"gitId":"Arif-Khalid"},"content":" if (this.filter$.value[filterName] instanceof Set) {"},{"lineNumber":78,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d JSON.stringify([...this.filter$.value[filterName]]);"},{"lineNumber":79,"author":{"gitId":"Arif-Khalid"},"content":" } else {"},{"lineNumber":80,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d JSON.stringify(this.filter$.value[filterName]);"},{"lineNumber":81,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":82,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":83,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[FiltersService.PRESET_VIEW_QUERY_PARAM_KEY] \u003d this.presetView$.value;"},{"lineNumber":84,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":85,"author":{"gitId":"Arif-Khalid"},"content":" this.router.navigate([], {"},{"lineNumber":86,"author":{"gitId":"Arif-Khalid"},"content":" relativeTo: this.route,"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" queryParams,"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":" queryParamsHandling: \u0027merge\u0027,"},{"lineNumber":89,"author":{"gitId":"Arif-Khalid"},"content":" replaceUrl: true"},{"lineNumber":90,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":91,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":93,"author":{"gitId":"Arif-Khalid"},"content":" clearFilters(): void {"},{"lineNumber":94,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(\u0027currentlyActive\u0027);"},{"lineNumber":95,"author":{"gitId":"Arif-Khalid"},"content":" this.previousMilestonesLength \u003d 0;"},{"lineNumber":96,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":97,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":98,"author":{"gitId":"Arif-Khalid"},"content":" initializeFromURLParams() {"},{"lineNumber":99,"author":{"gitId":"Arif-Khalid"},"content":" const nextFilter: Filter \u003d this.defaultFilter();"},{"lineNumber":100,"author":{"gitId":"Arif-Khalid"},"content":" const queryParams \u003d this.route.snapshot.queryParamMap;"},{"lineNumber":101,"author":{"gitId":"Arif-Khalid"},"content":" try {"},{"lineNumber":102,"author":{"gitId":"Arif-Khalid"},"content":" const presetView \u003d queryParams.get(FiltersService.PRESET_VIEW_QUERY_PARAM_KEY);"},{"lineNumber":103,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":104,"author":{"gitId":"Arif-Khalid"},"content":" // Use preset view if set in url"},{"lineNumber":105,"author":{"gitId":"Arif-Khalid"},"content":" if (presetView \u0026\u0026 this.presetViews.hasOwnProperty(presetView) \u0026\u0026 presetView !\u003d\u003d \u0027custom\u0027) {"},{"lineNumber":106,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(presetView);"},{"lineNumber":107,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":108,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":109,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":110,"author":{"gitId":"Arif-Khalid"},"content":" // No preset view and no other filters in params, use default view"},{"lineNumber":111,"author":{"gitId":"Arif-Khalid"},"content":" if (!presetView \u0026\u0026 Object.keys(nextFilter).every((filterName) \u003d\u003e queryParams.get(filterName) \u003d\u003d\u003d null)) {"},{"lineNumber":112,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(\u0027currentlyActive\u0027);"},{"lineNumber":113,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":114,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":115,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":116,"author":{"gitId":"Arif-Khalid"},"content":" for (const filterName of Object.keys(nextFilter)) {"},{"lineNumber":117,"author":{"gitId":"Arif-Khalid"},"content":" const stringifiedFilterData \u003d queryParams.get(filterName);"},{"lineNumber":118,"author":{"gitId":"Arif-Khalid"},"content":" if (!stringifiedFilterData) {"},{"lineNumber":119,"author":{"gitId":"Arif-Khalid"},"content":" continue;"},{"lineNumber":120,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":121,"author":{"gitId":"Arif-Khalid"},"content":" const filterData \u003d JSON.parse(stringifiedFilterData);"},{"lineNumber":122,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":123,"author":{"gitId":"Arif-Khalid"},"content":" if (nextFilter[filterName] instanceof Set) {"},{"lineNumber":124,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d new Set(filterData);"},{"lineNumber":125,"author":{"gitId":"Arif-Khalid"},"content":" } else {"},{"lineNumber":126,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d filterData;"},{"lineNumber":127,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":128,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":129,"author":{"gitId":"Arif-Khalid"},"content":" this.updateFilters(nextFilter);"},{"lineNumber":130,"author":{"gitId":"Arif-Khalid"},"content":" } catch (err) {"},{"lineNumber":131,"author":{"gitId":"Arif-Khalid"},"content":" this.logger.info(`FiltersService: Update filters from URL failed with an error: ${err}`);"},{"lineNumber":132,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":133,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":134,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":135,"author":{"gitId":"Arif-Khalid"},"content":" updateFilters(newFilters: Partial\u003cFilter\u003e): void {"},{"lineNumber":136,"author":{"gitId":"nknguyenhc"},"content":" const nextDropdownFilter: Filter \u003d {"},{"lineNumber":137,"author":{"gitId":"Arif-Khalid"},"content":" ...this.filter$.value,"},{"lineNumber":138,"author":{"gitId":"Arif-Khalid"},"content":" ...newFilters"},{"lineNumber":139,"author":{"gitId":"Arif-Khalid"},"content":" };"},{"lineNumber":140,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(nextDropdownFilter);"},{"lineNumber":141,"author":{"gitId":"nknguyenhc"},"content":" this.updatePresetViewFromFilters(newFilters);"},{"lineNumber":142,"author":{"gitId":"Arif-Khalid"},"content":" this.pushFiltersToUrl();"},{"lineNumber":143,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":144,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":145,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":146,"author":{"gitId":"nknguyenhc"},"content":" * Updates the filters without updating the preset view."},{"lineNumber":147,"author":{"gitId":"nknguyenhc"},"content":" * This should only be called when there are new labels/milestones."},{"lineNumber":148,"author":{"gitId":"nknguyenhc"},"content":" * The preset view will be reapplied."},{"lineNumber":149,"author":{"gitId":"nknguyenhc"},"content":" * @param newFilters The filters with new values"},{"lineNumber":150,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":151,"author":{"gitId":"nknguyenhc"},"content":" private updateFiltersWithoutUpdatingPresetView(newFilters: Partial\u003cFilter\u003e): void {"},{"lineNumber":152,"author":{"gitId":"nknguyenhc"},"content":" const nextDropdownFilter: Filter \u003d {"},{"lineNumber":153,"author":{"gitId":"nknguyenhc"},"content":" ...this.filter$.value,"},{"lineNumber":154,"author":{"gitId":"nknguyenhc"},"content":" ...newFilters"},{"lineNumber":155,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":156,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(nextDropdownFilter);"},{"lineNumber":157,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(this.presetViews[this.presetView$.value]());"},{"lineNumber":158,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":159,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":160,"author":{"gitId":"nknguyenhc"},"content":" private updatePresetViewFromFilters(newFilter: Partial\u003cFilter\u003e): void {"},{"lineNumber":161,"author":{"gitId":"nknguyenhc"},"content":" for (const key of Object.keys(newFilter)) {"},{"lineNumber":162,"author":{"gitId":"nknguyenhc"},"content":" if (this.presetChangingKeys.has(key)) {"},{"lineNumber":163,"author":{"gitId":"nknguyenhc"},"content":" this.presetView$.next(\u0027custom\u0027);"},{"lineNumber":164,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":165,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":166,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":167,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":168,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":169,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":170,"author":{"gitId":"nknguyenhc"},"content":" * Updates the filter based on a preset view."},{"lineNumber":171,"author":{"gitId":"nknguyenhc"},"content":" * @param presetViewName The name of the preset view, either \u0027currentlyActive\u0027, \u0027contributions\u0027, or \u0027custom\u0027."},{"lineNumber":172,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":173,"author":{"gitId":"nknguyenhc"},"content":" updatePresetView(presetViewName: string) {"},{"lineNumber":174,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(this.presetViews[presetViewName]());"},{"lineNumber":175,"author":{"gitId":"nknguyenhc"},"content":" this.presetView$.next(presetViewName);"},{"lineNumber":176,"author":{"gitId":"Arif-Khalid"},"content":" this.pushFiltersToUrl();"},{"lineNumber":177,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":178,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":179,"author":{"gitId":"Arif-Khalid"},"content":" sanitizeLabels(allLabels: SimpleLabel[]): void {"},{"lineNumber":180,"author":{"gitId":"Arif-Khalid"},"content":" const allLabelsSet \u003d new Set(allLabels.map((label) \u003d\u003e label.name));"},{"lineNumber":181,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":182,"author":{"gitId":"Arif-Khalid"},"content":" const newHiddenLabels: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":183,"author":{"gitId":"Arif-Khalid"},"content":" for (const hiddenLabel of this.filter$.value.hiddenLabels) {"},{"lineNumber":184,"author":{"gitId":"Arif-Khalid"},"content":" if (allLabelsSet.has(hiddenLabel)) {"},{"lineNumber":185,"author":{"gitId":"Arif-Khalid"},"content":" newHiddenLabels.add(hiddenLabel);"},{"lineNumber":186,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":187,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":188,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":189,"author":{"gitId":"nknguyenhc"},"content":" const newDeselectedLabels: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":190,"author":{"gitId":"nknguyenhc"},"content":" for (const deselectedLabel of this.filter$.value.deselectedLabels) {"},{"lineNumber":191,"author":{"gitId":"nknguyenhc"},"content":" if (allLabelsSet.has(deselectedLabel)) {"},{"lineNumber":192,"author":{"gitId":"nknguyenhc"},"content":" newDeselectedLabels.add(deselectedLabel);"},{"lineNumber":193,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":194,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":195,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":196,"author":{"gitId":"nknguyenhc"},"content":" const newLabels \u003d this.filter$.value.labels.filter((label) \u003d\u003e allLabelsSet.has(label));"},{"lineNumber":197,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":198,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({"},{"lineNumber":199,"author":{"gitId":"nknguyenhc"},"content":" labels: newLabels,"},{"lineNumber":200,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: newHiddenLabels,"},{"lineNumber":201,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: newDeselectedLabels"},{"lineNumber":202,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":203,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":204,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":205,"author":{"gitId":"Arif-Khalid"},"content":" sanitizeMilestones(allMilestones: Milestone[]) {"},{"lineNumber":206,"author":{"gitId":"MadLamprey"},"content":" const milestones \u003d allMilestones.map((milestone) \u003d\u003e milestone.title);"},{"lineNumber":207,"author":{"gitId":"MadLamprey"},"content":" milestones.push(Milestone.IssueWithoutMilestone.title, Milestone.PRWithoutMilestone.title);"},{"lineNumber":208,"author":{"gitId":"MadLamprey"},"content":" const allMilestonesSet \u003d new Set(milestones);"},{"lineNumber":209,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":210,"author":{"gitId":"Arif-Khalid"},"content":" // All previous milestones were selected, reset to all new milestones selected"},{"lineNumber":211,"author":{"gitId":"Arif-Khalid"},"content":" if (this.filter$.value.milestones.length \u003d\u003d\u003d this.previousMilestonesLength) {"},{"lineNumber":212,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({ milestones: [...allMilestonesSet] });"},{"lineNumber":213,"author":{"gitId":"MadLamprey"},"content":" this.previousMilestonesLength \u003d allMilestonesSet.size;"},{"lineNumber":214,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":215,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":216,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":217,"author":{"gitId":"Arif-Khalid"},"content":" const newMilestones: string[] \u003d [];"},{"lineNumber":218,"author":{"gitId":"Arif-Khalid"},"content":" for (const milestone of this.filter$.value.milestones) {"},{"lineNumber":219,"author":{"gitId":"Arif-Khalid"},"content":" if (allMilestonesSet.has(milestone)) {"},{"lineNumber":220,"author":{"gitId":"Arif-Khalid"},"content":" newMilestones.push(milestone);"},{"lineNumber":221,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":222,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":223,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":224,"author":{"gitId":"Arif-Khalid"},"content":" // No applicable milestones, reset to all milestones selected"},{"lineNumber":225,"author":{"gitId":"Arif-Khalid"},"content":" if (newMilestones.length \u003d\u003d\u003d 0) {"},{"lineNumber":226,"author":{"gitId":"Arif-Khalid"},"content":" newMilestones.push(...allMilestonesSet);"},{"lineNumber":227,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":228,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":229,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({ milestones: newMilestones });"},{"lineNumber":230,"author":{"gitId":"MadLamprey"},"content":" this.previousMilestonesLength \u003d allMilestonesSet.size;"},{"lineNumber":231,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":232,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":233,"author":{"gitId":"nknguyenhc"},"content":" getMilestonesForCurrentlyActive(): Milestone[] {"},{"lineNumber":234,"author":{"gitId":"nknguyenhc"},"content":" const earliestOpenMilestone \u003d this.milestoneService.getEarliestOpenMilestone();"},{"lineNumber":235,"author":{"gitId":"nknguyenhc"},"content":" if (earliestOpenMilestone) {"},{"lineNumber":236,"author":{"gitId":"NereusWB922"},"content":" return [earliestOpenMilestone, Milestone.PRWithoutMilestone];"},{"lineNumber":237,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":238,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":239,"author":{"gitId":"nknguyenhc"},"content":" const latestClosedMilestone \u003d this.milestoneService.getLatestClosedMilestone();"},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" if (latestClosedMilestone) {"},{"lineNumber":241,"author":{"gitId":"NereusWB922"},"content":" return [latestClosedMilestone, Milestone.PRWithoutMilestone];"},{"lineNumber":242,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":243,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":244,"author":{"gitId":"NereusWB922"},"content":" return [...this.milestoneService.milestones, Milestone.PRWithoutMilestone];"},{"lineNumber":245,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":246,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"nknguyenhc":97,"Arif-Khalid":141,"NereusWB922":3,"MadLamprey":5}},{"path":"src/app/core/services/github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { ApolloQueryResult } from \u0027@apollo/client/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Apollo, QueryRef } from \u0027apollo-angular\u0027;"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { DocumentNode } from \u0027graphql\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { BehaviorSubject, forkJoin, from, merge, Observable, of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { catchError, filter, flatMap, map, throwIfEmpty } from \u0027rxjs/operators\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" FetchIssue,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" FetchIssueQuery,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" FetchIssuesQuery,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" FetchPullRequests,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" FetchPullRequestsQuery"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} from \u0027../../../../graphql/graphql-types\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { getNumberOfPages } from \u0027../../shared/lib/github-paginator-parser\u0027;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"import { GithubUser, RawGithubUser } from \u0027../models/github-user.model\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { IssueLastModifiedManagerModel } from \u0027../models/github/cache-manager/issue-last-modified-manager.model\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { IssuesCacheManager } from \u0027../models/github/cache-manager/issues-cache-manager.model\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { GithubEvent } from \u0027../models/github/github-event.model\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssue } from \u0027../models/github/github-graphql.issue\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssueOrPr } from \u0027../models/github/github-graphql.issue-or-pr\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { GithubResponse } from \u0027../models/github/github-response.model\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { GithubRelease } from \u0027../models/github/github.release\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { ERRORCODE_NOT_FOUND, ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./error-message.service\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"const { Octokit } \u003d require(\u0027@octokit/rest\u0027);"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"const WATCHER_ORG \u003d \u0027WATcher-org\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"const WATCHER_REPO \u003d \u0027WATcher\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"/** Owner of Repository to watch */"},{"lineNumber":40,"author":{"gitId":"-"},"content":"let ORG_NAME \u003d \u0027\u0027; // repoOrg"},{"lineNumber":41,"author":{"gitId":"-"},"content":"/** Name of Repository to watch */"},{"lineNumber":42,"author":{"gitId":"-"},"content":"let REPO \u003d \u0027\u0027; // repoName"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"/** Owner of Settings repository, currently not used */"},{"lineNumber":45,"author":{"gitId":"-"},"content":"let MOD_ORG \u003d \u0027\u0027;"},{"lineNumber":46,"author":{"gitId":"-"},"content":"/** Name of Settings repository, currently not used */"},{"lineNumber":47,"author":{"gitId":"-"},"content":"let DATA_REPO \u003d \u0027\u0027;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"const MAX_ITEMS_PER_PAGE \u003d 100;"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"let octokit \u003d new Octokit();"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":53,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":54,"author":{"gitId":"-"},"content":"})"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Responsible for communicating with GitHub to create, update, read and delete"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * features related to Github using GitHub API Requests."},{"lineNumber":59,"author":{"gitId":"-"},"content":" * For example, issues, issue labels and repositories."},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":"export class GithubService {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private static readonly IF_NONE_MATCH_EMPTY \u003d { \u0027If-None-Match\u0027: \u0027\u0027 };"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" private issuesCacheManager \u003d new IssuesCacheManager();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private issuesLastModifiedManager \u003d new IssueLastModifiedManagerModel();"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private issueQueryRefs \u003d new Map\u003cnumber, QueryRef\u003cFetchIssueQuery\u003e\u003e();"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" constructor(private errorHandlingService: ErrorHandlingService, private apollo: Apollo, private logger: LoggingService) {}"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(accessToken: string) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" octokit \u003d new Octokit({"},{"lineNumber":72,"author":{"gitId":"-"},"content":" auth() {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return `Token ${accessToken}`;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" },"},{"lineNumber":75,"author":{"gitId":"-"},"content":" log: {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" debug: (message, ...otherInfo) \u003d\u003e this.logger.debug(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // Do not log info for HTTP response 304 due to repeated polling"},{"lineNumber":78,"author":{"gitId":"-"},"content":" info: (message, ...otherInfo) \u003d\u003e"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /304 in \\d+ms$/.test(message) ? undefined : this.logger.info(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" warn: (message, ...otherInfo) \u003d\u003e this.logger.warn(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":81,"author":{"gitId":"-"},"content":" error: (message, ...otherInfo) \u003d\u003e this.logger.error(\u0027GithubService: \u0027 + message, ...otherInfo)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":" });"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets settings repository. Not used."},{"lineNumber":88,"author":{"gitId":"-"},"content":" * @param orgName WATcher organisation"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @param dataRepo WATcher repository"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" storeOrganizationDetails(orgName: string, dataRepo: string) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" MOD_ORG \u003d orgName;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" DATA_REPO \u003d dataRepo;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * Sets repository to watch. This repository is used for fetching from Github."},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" * @param viewRepoOwner Repository owner"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * @param repoName Repository name"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" storeViewDetails(viewRepoOwner: string, repoName: string) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" REPO \u003d repoName;"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" ORG_NAME \u003d viewRepoOwner;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query."},{"lineNumber":108,"author":{"gitId":"-"},"content":" * In WATcher, this includes pull requests."},{"lineNumber":109,"author":{"gitId":"-"},"content":" *"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */"},{"lineNumber":113,"author":{"gitId":"-"},"content":" fetchIssuesGraphql(issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":115,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Github Issues consists of issues and pull requests in WATcher."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" const issueObs \u003d this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":119,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":120,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesQuery, GithubGraphqlIssueOrPr\u003e("},{"lineNumber":122,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO, filter: graphqlFilter },"},{"lineNumber":124,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.issues.edges,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" GithubGraphqlIssueOrPr"},{"lineNumber":126,"author":{"gitId":"-"},"content":" );"},{"lineNumber":127,"author":{"gitId":"-"},"content":" })"},{"lineNumber":128,"author":{"gitId":"-"},"content":" );"},{"lineNumber":129,"author":{"gitId":"-"},"content":" const prObs \u003d this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":130,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":131,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchPullRequestsQuery, GithubGraphqlIssueOrPr\u003e("},{"lineNumber":133,"author":{"gitId":"-"},"content":" FetchPullRequests,"},{"lineNumber":134,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO },"},{"lineNumber":135,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.pullRequests.edges,"},{"lineNumber":136,"author":{"gitId":"-"},"content":" GithubGraphqlIssueOrPr"},{"lineNumber":137,"author":{"gitId":"-"},"content":" );"},{"lineNumber":138,"author":{"gitId":"-"},"content":" })"},{"lineNumber":139,"author":{"gitId":"-"},"content":" );"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" // Concatenate both streams together."},{"lineNumber":142,"author":{"gitId":"-"},"content":" return merge(issueObs, prObs);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * Checks if there are pages of filtered issues that are not cached in the cache model,"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * and updates the model to cache these new pages."},{"lineNumber":148,"author":{"gitId":"-"},"content":" * @param filter - The issue filter."},{"lineNumber":149,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if there are pages that do not exist in the cache model."},{"lineNumber":150,"author":{"gitId":"-"},"content":" */"},{"lineNumber":151,"author":{"gitId":"-"},"content":" private toFetchIssues(filter: RestGithubIssueFilter): Observable\u003cboolean\u003e {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" const pageFetchLimit \u003d 100;"},{"lineNumber":153,"author":{"gitId":"-"},"content":""},{"lineNumber":154,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubIssue[]\u003e;"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return this.getIssuesAPICall(filter, 1).pipe("},{"lineNumber":156,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue[]\u003e) \u003d\u003e {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":158,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":160,"author":{"gitId":"-"},"content":" flatMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e[] \u003d [];"},{"lineNumber":162,"author":{"gitId":"-"},"content":" if (numOfPages \u003e pageFetchLimit) {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" throw new Error(`Repository has too many pages (${numOfPages}), not supported.`);"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":" for (let i \u003d 2; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" apiCalls.push(this.getIssuesAPICall(filter, i));"},{"lineNumber":167,"author":{"gitId":"-"},"content":" }"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":170,"author":{"gitId":"-"},"content":" map((resultArray: GithubResponse\u003cGithubIssue[]\u003e[]) \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" const responses \u003d [responseInFirstPage, ...resultArray];"},{"lineNumber":172,"author":{"gitId":"-"},"content":" const isCached \u003d responses.reduce((result, response) \u003d\u003e {"},{"lineNumber":173,"author":{"gitId":"-"},"content":" return result \u0026\u0026 response.isCached;"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }, true);"},{"lineNumber":175,"author":{"gitId":"-"},"content":" responses.forEach((resp, index) \u003d\u003e this.issuesCacheManager.set(index + 1, resp));"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return !isCached;"},{"lineNumber":177,"author":{"gitId":"-"},"content":" })"},{"lineNumber":178,"author":{"gitId":"-"},"content":" );"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * Checks if the specified repository exists."},{"lineNumber":183,"author":{"gitId":"-"},"content":" * @param owner - Owner of Specified Repository."},{"lineNumber":184,"author":{"gitId":"-"},"content":" * @param repo - Name of Repository."},{"lineNumber":185,"author":{"gitId":"-"},"content":" */"},{"lineNumber":186,"author":{"gitId":"-"},"content":" isRepositoryPresent(owner: string, repo: string): Observable\u003cboolean\u003e {"},{"lineNumber":187,"author":{"gitId":"-"},"content":" return from(octokit.repos.get({ owner: owner, repo: repo, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":188,"author":{"gitId":"-"},"content":" map((rawData: { status: number }) \u003d\u003e {"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return rawData.status !\u003d\u003d ERRORCODE_NOT_FOUND;"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":191,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":194,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.repositoryNotPresentMessage()))"},{"lineNumber":195,"author":{"gitId":"-"},"content":" );"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":199,"author":{"gitId":"-"},"content":" * Fetches information about an issue using GraphQL."},{"lineNumber":200,"author":{"gitId":"-"},"content":" *"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * If the issue is not modified, return a `304 - Not Modified` response."},{"lineNumber":202,"author":{"gitId":"-"},"content":" *"},{"lineNumber":203,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":204,"author":{"gitId":"-"},"content":" * @returns Observable\u003cGithubGraphqlIssue\u003e that represents the response object."},{"lineNumber":205,"author":{"gitId":"-"},"content":" */"},{"lineNumber":206,"author":{"gitId":"-"},"content":" fetchIssueGraphql(id: number): Observable\u003cGithubGraphqlIssue\u003e {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (this.issueQueryRefs.get(id) \u003d\u003d\u003d undefined) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" const newQueryRef \u003d this.apollo.watchQuery\u003cFetchIssueQuery\u003e({"},{"lineNumber":209,"author":{"gitId":"-"},"content":" query: FetchIssue,"},{"lineNumber":210,"author":{"gitId":"-"},"content":" variables: {"},{"lineNumber":211,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" issueId: id"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":" });"},{"lineNumber":216,"author":{"gitId":"-"},"content":" this.issueQueryRefs.set(id, newQueryRef);"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" const queryRef \u003d this.issueQueryRefs.get(id);"},{"lineNumber":220,"author":{"gitId":"-"},"content":" return this.toFetchIssue(id).pipe("},{"lineNumber":221,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":222,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e from(queryRef.refetch())),"},{"lineNumber":223,"author":{"gitId":"-"},"content":" map((value: ApolloQueryResult\u003cFetchIssueQuery\u003e) \u003d\u003e {"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return new GithubGraphqlIssue(value.data.repository.issue);"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":226,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e new HttpErrorResponse({ status: 304 }))"},{"lineNumber":227,"author":{"gitId":"-"},"content":" );"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }"},{"lineNumber":229,"author":{"gitId":"-"},"content":""},{"lineNumber":230,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Checks if the issue has been modified since the last query, and"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * updates the model to reflect the last modified time."},{"lineNumber":233,"author":{"gitId":"-"},"content":" *"},{"lineNumber":234,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":235,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if the issue has been modified."},{"lineNumber":236,"author":{"gitId":"-"},"content":" */"},{"lineNumber":237,"author":{"gitId":"-"},"content":" toFetchIssue(id: number): Observable\u003cboolean\u003e {"},{"lineNumber":238,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":239,"author":{"gitId":"-"},"content":" octokit.issues.get({"},{"lineNumber":240,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":241,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":242,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":243,"author":{"gitId":"-"},"content":" headers: { \u0027If-Modified-Since\u0027: this.issuesLastModifiedManager.get(id) }"},{"lineNumber":244,"author":{"gitId":"-"},"content":" })"},{"lineNumber":245,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":246,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":247,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":250,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchIssuesMessage()))"},{"lineNumber":251,"author":{"gitId":"-"},"content":" );"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" fetchAllMilestones(): Observable\u003cArray\u003c{}\u003e\u003e {"},{"lineNumber":255,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":256,"author":{"gitId":"-"},"content":" octokit.issues.listMilestonesForRepo({"},{"lineNumber":257,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":258,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":259,"author":{"gitId":"-"},"content":" state: \u0027all\u0027,"},{"lineNumber":260,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":261,"author":{"gitId":"-"},"content":" headers: GithubService.IF_NONE_MATCH_EMPTY"},{"lineNumber":262,"author":{"gitId":"-"},"content":" })"},{"lineNumber":263,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":264,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":265,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":266,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":267,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchMilestoneMessage()))"},{"lineNumber":268,"author":{"gitId":"-"},"content":" );"},{"lineNumber":269,"author":{"gitId":"-"},"content":" }"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" fetchAllLabels(): Observable\u003cArray\u003c{}\u003e\u003e {"},{"lineNumber":272,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":273,"author":{"gitId":"-"},"content":" octokit.issues.listLabelsForRepo({"},{"lineNumber":274,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":275,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":276,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":277,"author":{"gitId":"-"},"content":" headers: GithubService.IF_NONE_MATCH_EMPTY"},{"lineNumber":278,"author":{"gitId":"-"},"content":" })"},{"lineNumber":279,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":280,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":283,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchLabelsMessage()))"},{"lineNumber":284,"author":{"gitId":"-"},"content":" );"},{"lineNumber":285,"author":{"gitId":"-"},"content":" }"},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":288,"author":{"gitId":"-"},"content":" * Checks if the given list of users are allowed to be assigned to an issue."},{"lineNumber":289,"author":{"gitId":"-"},"content":" * @param assignees - GitHub usernames to be checked"},{"lineNumber":290,"author":{"gitId":"-"},"content":" */"},{"lineNumber":291,"author":{"gitId":"-"},"content":" areUsersAssignable(assignees: string[]): Observable\u003cvoid\u003e {"},{"lineNumber":292,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":293,"author":{"gitId":"-"},"content":" octokit.issues.listAssignees({"},{"lineNumber":294,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":295,"author":{"gitId":"-"},"content":" repo: REPO"},{"lineNumber":296,"author":{"gitId":"-"},"content":" })"},{"lineNumber":297,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":298,"author":{"gitId":"-"},"content":" map(({ data }: { data: { login: string }[] }) \u003d\u003e data.map(({ login }) \u003d\u003e login)),"},{"lineNumber":299,"author":{"gitId":"-"},"content":" map((assignables: string[]) \u003d\u003e"},{"lineNumber":300,"author":{"gitId":"-"},"content":" assignees.forEach((assignee) \u003d\u003e {"},{"lineNumber":301,"author":{"gitId":"-"},"content":" if (!assignables.includes(assignee)) {"},{"lineNumber":302,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.usersUnassignableMessage(assignee));"},{"lineNumber":303,"author":{"gitId":"-"},"content":" }"},{"lineNumber":304,"author":{"gitId":"-"},"content":" })"},{"lineNumber":305,"author":{"gitId":"-"},"content":" )"},{"lineNumber":306,"author":{"gitId":"-"},"content":" );"},{"lineNumber":307,"author":{"gitId":"-"},"content":" }"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":" getUsersAssignable(): Observable\u003cGithubUser[]\u003e {"},{"lineNumber":310,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":311,"author":{"gitId":"-"},"content":" octokit.issues.listAssignees({"},{"lineNumber":312,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":313,"author":{"gitId":"-"},"content":" repo: REPO"},{"lineNumber":314,"author":{"gitId":"-"},"content":" })"},{"lineNumber":315,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":316,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":317,"author":{"gitId":"NereusWB922"},"content":" const data: RawGithubUser[] \u003d response[\u0027data\u0027];"},{"lineNumber":318,"author":{"gitId":"NereusWB922"},"content":" return data.map((rawGithubUser) \u003d\u003e {"},{"lineNumber":319,"author":{"gitId":"NereusWB922"},"content":" return new GithubUser(rawGithubUser);"},{"lineNumber":320,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":321,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":322,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchUsersMessage()))"},{"lineNumber":323,"author":{"gitId":"-"},"content":" );"},{"lineNumber":324,"author":{"gitId":"-"},"content":" }"},{"lineNumber":325,"author":{"gitId":"-"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" fetchEventsForRepo(): Observable\u003cany[]\u003e {"},{"lineNumber":327,"author":{"gitId":"-"},"content":" return from(octokit.issues.listEventsForRepo({ owner: ORG_NAME, repo: REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":328,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":329,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":330,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":331,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchEventsMessage()))"},{"lineNumber":332,"author":{"gitId":"-"},"content":" );"},{"lineNumber":333,"author":{"gitId":"-"},"content":" }"},{"lineNumber":334,"author":{"gitId":"-"},"content":""},{"lineNumber":335,"author":{"gitId":"-"},"content":" fetchEventsForRepoCall(pageNumber: number): Observable\u003cGithubResponse\u003cany[]\u003e\u003e {"},{"lineNumber":336,"author":{"gitId":"-"},"content":" return \u003cObservable\u003cGithubResponse\u003cany[]\u003e\u003e\u003efrom("},{"lineNumber":337,"author":{"gitId":"-"},"content":" octokit.activity.listRepoEvents({"},{"lineNumber":338,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":339,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":340,"author":{"gitId":"-"},"content":" page: pageNumber"},{"lineNumber":341,"author":{"gitId":"-"},"content":" })"},{"lineNumber":342,"author":{"gitId":"-"},"content":" ).pipe(catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchActivityEventsMessage())));"},{"lineNumber":343,"author":{"gitId":"-"},"content":" }"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":346,"author":{"gitId":"-"},"content":" * Fetches all events of current repository for Activity Dashboard."},{"lineNumber":347,"author":{"gitId":"-"},"content":" * Adapted from getIssueApiCalls()."},{"lineNumber":348,"author":{"gitId":"-"},"content":" *"},{"lineNumber":349,"author":{"gitId":"-"},"content":" * @returns GithubEvents observable"},{"lineNumber":350,"author":{"gitId":"-"},"content":" */"},{"lineNumber":351,"author":{"gitId":"-"},"content":" fetchAllEventsForRepo(): Observable\u003cGithubEvent[]\u003e {"},{"lineNumber":352,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubEvent[]\u003e;"},{"lineNumber":353,"author":{"gitId":"-"},"content":" return this.fetchEventsForRepoCall(1).pipe("},{"lineNumber":354,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubEvent[]\u003e) \u003d\u003e {"},{"lineNumber":355,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":356,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":357,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":358,"author":{"gitId":"-"},"content":" flatMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":359,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubEvent[]\u003e\u003e[] \u003d [];"},{"lineNumber":360,"author":{"gitId":"-"},"content":" for (let i \u003d 1; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":361,"author":{"gitId":"-"},"content":" apiCalls.push(this.fetchEventsForRepoCall(i));"},{"lineNumber":362,"author":{"gitId":"-"},"content":" }"},{"lineNumber":363,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":365,"author":{"gitId":"-"},"content":" map((responseArray) \u003d\u003e responseArray.map((x) \u003d\u003e x[\u0027data\u0027]))"},{"lineNumber":366,"author":{"gitId":"-"},"content":" );"},{"lineNumber":367,"author":{"gitId":"-"},"content":" }"},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":370,"author":{"gitId":"-"},"content":" * Not in use. Fetches data csv file from Organization repository."},{"lineNumber":371,"author":{"gitId":"-"},"content":" */"},{"lineNumber":372,"author":{"gitId":"-"},"content":" fetchDataFile(): Observable\u003c{}\u003e {"},{"lineNumber":373,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":374,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027data.csv\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":375,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":376,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e {"},{"lineNumber":377,"author":{"gitId":"-"},"content":" return { data: atob(rawData[\u0027data\u0027][\u0027content\u0027]) };"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":379,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchDataFileMessage()))"},{"lineNumber":380,"author":{"gitId":"-"},"content":" );"},{"lineNumber":381,"author":{"gitId":"-"},"content":" }"},{"lineNumber":382,"author":{"gitId":"-"},"content":""},{"lineNumber":383,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":384,"author":{"gitId":"-"},"content":" * Gets information of latest release of WATcher."},{"lineNumber":385,"author":{"gitId":"-"},"content":" * @returns GithubRelease observable"},{"lineNumber":386,"author":{"gitId":"-"},"content":" */"},{"lineNumber":387,"author":{"gitId":"-"},"content":" fetchLatestRelease(): Observable\u003cGithubRelease\u003e {"},{"lineNumber":388,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":389,"author":{"gitId":"-"},"content":" octokit.repos.getLatestRelease({ owner: WATCHER_ORG, repo: WATCHER_REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":390,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":391,"author":{"gitId":"-"},"content":" map((res) \u003d\u003e res[\u0027data\u0027]),"},{"lineNumber":392,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchLatestReleaseMessage()))"},{"lineNumber":393,"author":{"gitId":"-"},"content":" );"},{"lineNumber":394,"author":{"gitId":"-"},"content":" }"},{"lineNumber":395,"author":{"gitId":"-"},"content":""},{"lineNumber":396,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":397,"author":{"gitId":"-"},"content":" * Fetches the data file that is regulates session information."},{"lineNumber":398,"author":{"gitId":"-"},"content":" * @return Observable\u003cSessionData\u003e representing session information."},{"lineNumber":399,"author":{"gitId":"-"},"content":" */"},{"lineNumber":400,"author":{"gitId":"-"},"content":" fetchSettingsFile(): Observable\u003cSessionData\u003e {"},{"lineNumber":401,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":402,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027settings.json\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":403,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":404,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e JSON.parse(atob(rawData[\u0027data\u0027][\u0027content\u0027]))),"},{"lineNumber":405,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchSettingsFileMessage()))"},{"lineNumber":406,"author":{"gitId":"-"},"content":" );"},{"lineNumber":407,"author":{"gitId":"-"},"content":" }"},{"lineNumber":408,"author":{"gitId":"-"},"content":""},{"lineNumber":409,"author":{"gitId":"-"},"content":" fetchAuthenticatedUser(): Observable\u003cGithubUser\u003e {"},{"lineNumber":410,"author":{"gitId":"-"},"content":" return from(octokit.users.getAuthenticated()).pipe("},{"lineNumber":411,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":412,"author":{"gitId":"NereusWB922"},"content":" const data: RawGithubUser \u003d response[\u0027data\u0027];"},{"lineNumber":413,"author":{"gitId":"NereusWB922"},"content":" return new GithubUser(data);"},{"lineNumber":414,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":415,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchAuthenticatedUsersMessage()))"},{"lineNumber":416,"author":{"gitId":"-"},"content":" );"},{"lineNumber":417,"author":{"gitId":"-"},"content":" }"},{"lineNumber":418,"author":{"gitId":"-"},"content":""},{"lineNumber":419,"author":{"gitId":"-"},"content":" getRepoURL(): string {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" return ORG_NAME.concat(\u0027/\u0027).concat(REPO);"},{"lineNumber":421,"author":{"gitId":"-"},"content":" }"},{"lineNumber":422,"author":{"gitId":"-"},"content":""},{"lineNumber":423,"author":{"gitId":"-"},"content":" viewIssueInBrowser(id: number, event: Event) {"},{"lineNumber":424,"author":{"gitId":"-"},"content":" if (id) {"},{"lineNumber":425,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.getRepoURL()).concat(\u0027/issues/\u0027).concat(String(id)));"},{"lineNumber":426,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":427,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(new Error(ErrorMessageService.unableToOpenInBrowserMessage()));"},{"lineNumber":428,"author":{"gitId":"-"},"content":" }"},{"lineNumber":429,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":430,"author":{"gitId":"-"},"content":" }"},{"lineNumber":431,"author":{"gitId":"-"},"content":""},{"lineNumber":432,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":433,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Resetting issues cache`);"},{"lineNumber":434,"author":{"gitId":"-"},"content":" this.issuesCacheManager.clear();"},{"lineNumber":435,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.clear();"},{"lineNumber":436,"author":{"gitId":"-"},"content":" this.issueQueryRefs.clear();"},{"lineNumber":437,"author":{"gitId":"-"},"content":" }"},{"lineNumber":438,"author":{"gitId":"-"},"content":""},{"lineNumber":439,"author":{"gitId":"-"},"content":" getProfilesData(): Promise\u003cResponse\u003e {"},{"lineNumber":440,"author":{"gitId":"-"},"content":" return fetch(AppConfig.clientDataUrl);"},{"lineNumber":441,"author":{"gitId":"-"},"content":" }"},{"lineNumber":442,"author":{"gitId":"-"},"content":""},{"lineNumber":443,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":444,"author":{"gitId":"-"},"content":" * Performs an API call to fetch a page of filtered issues with a given pageNumber."},{"lineNumber":445,"author":{"gitId":"-"},"content":" *"},{"lineNumber":446,"author":{"gitId":"-"},"content":" * The request is sent with the ETag of the latest cached HTTP response."},{"lineNumber":447,"author":{"gitId":"-"},"content":" * If page requested has the same ETag, or the request results in an error,"},{"lineNumber":448,"author":{"gitId":"-"},"content":" * then the cached page is returned instead."},{"lineNumber":449,"author":{"gitId":"-"},"content":" *"},{"lineNumber":450,"author":{"gitId":"-"},"content":" * @param filter - The issue filter"},{"lineNumber":451,"author":{"gitId":"-"},"content":" * @param pageNumber - The page to be fetched"},{"lineNumber":452,"author":{"gitId":"-"},"content":" * @returns An observable representing the response containing a single page of filtered issues"},{"lineNumber":453,"author":{"gitId":"-"},"content":" */"},{"lineNumber":454,"author":{"gitId":"-"},"content":" private getIssuesAPICall(filter: RestGithubIssueFilter, pageNumber: number): Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e {"},{"lineNumber":455,"author":{"gitId":"-"},"content":" const apiCall: Promise\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e \u003d octokit.issues.listForRepo({"},{"lineNumber":456,"author":{"gitId":"-"},"content":" ...filter,"},{"lineNumber":457,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":458,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":459,"author":{"gitId":"-"},"content":" sort: \u0027created\u0027,"},{"lineNumber":460,"author":{"gitId":"-"},"content":" direction: \u0027desc\u0027,"},{"lineNumber":461,"author":{"gitId":"-"},"content":" per_page: 100,"},{"lineNumber":462,"author":{"gitId":"-"},"content":" page: pageNumber,"},{"lineNumber":463,"author":{"gitId":"-"},"content":" headers: { \u0027If-None-Match\u0027: this.issuesCacheManager.getEtagFor(pageNumber) },"},{"lineNumber":464,"author":{"gitId":"-"},"content":" state: \u0027all\u0027"},{"lineNumber":465,"author":{"gitId":"-"},"content":" });"},{"lineNumber":466,"author":{"gitId":"-"},"content":" const apiCall$ \u003d from("},{"lineNumber":467,"author":{"gitId":"-"},"content":" apiCall.catch((err) \u003d\u003e {"},{"lineNumber":468,"author":{"gitId":"-"},"content":" return this.issuesCacheManager.get(pageNumber);"},{"lineNumber":469,"author":{"gitId":"-"},"content":" })"},{"lineNumber":470,"author":{"gitId":"-"},"content":" );"},{"lineNumber":471,"author":{"gitId":"-"},"content":""},{"lineNumber":472,"author":{"gitId":"-"},"content":" return apiCall$.pipe("},{"lineNumber":473,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":474,"author":{"gitId":"-"},"content":" // catchError does not appear to catch an error on an observable created from a promise..."},{"lineNumber":475,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Error caught in getIssuesAPICall`);"},{"lineNumber":476,"author":{"gitId":"-"},"content":" return of(this.issuesCacheManager.get(pageNumber));"},{"lineNumber":477,"author":{"gitId":"-"},"content":" })"},{"lineNumber":478,"author":{"gitId":"-"},"content":" );"},{"lineNumber":479,"author":{"gitId":"-"},"content":" }"},{"lineNumber":480,"author":{"gitId":"-"},"content":""},{"lineNumber":481,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":482,"author":{"gitId":"-"},"content":" * Fetches a list of items using a GraphQL query that queries for paginated data."},{"lineNumber":483,"author":{"gitId":"-"},"content":" *"},{"lineNumber":484,"author":{"gitId":"-"},"content":" * @param query - The GraphQL query that queries for paginated data."},{"lineNumber":485,"author":{"gitId":"-"},"content":" * @param variables - Additional variables for the GraphQL query."},{"lineNumber":486,"author":{"gitId":"-"},"content":" * @callback pluckEdges A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":487,"author":{"gitId":"-"},"content":" * @callback Model Constructor for the item model."},{"lineNumber":488,"author":{"gitId":"-"},"content":" * @returns A list of items from the query."},{"lineNumber":489,"author":{"gitId":"-"},"content":" */"},{"lineNumber":490,"author":{"gitId":"-"},"content":" private fetchGraphqlList\u003cT, M\u003e("},{"lineNumber":491,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":492,"author":{"gitId":"-"},"content":" variables: {},"},{"lineNumber":493,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":494,"author":{"gitId":"-"},"content":" Model: new (data) \u003d\u003e M"},{"lineNumber":495,"author":{"gitId":"-"},"content":" ): Observable\u003cArray\u003cM\u003e\u003e {"},{"lineNumber":496,"author":{"gitId":"-"},"content":" return this.withPagination\u003cT\u003e(pluckEdges, query, variables, false).pipe("},{"lineNumber":497,"author":{"gitId":"-"},"content":" map((results: ApolloQueryResult\u003cT\u003e[]) \u003d\u003e {"},{"lineNumber":498,"author":{"gitId":"-"},"content":" const issues \u003d results.reduce((accumulated, current) \u003d\u003e accumulated.concat(pluckEdges(current)), []);"},{"lineNumber":499,"author":{"gitId":"-"},"content":" return issues.map((issue) \u003d\u003e new Model(issue.node));"},{"lineNumber":500,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":501,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e {"},{"lineNumber":502,"author":{"gitId":"-"},"content":" return new HttpErrorResponse({ status: 304 });"},{"lineNumber":503,"author":{"gitId":"-"},"content":" })"},{"lineNumber":504,"author":{"gitId":"-"},"content":" );"},{"lineNumber":505,"author":{"gitId":"-"},"content":" }"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":508,"author":{"gitId":"-"},"content":" * Returns an observable that will continually emit the currently accumulated results, until a page that has less"},{"lineNumber":509,"author":{"gitId":"-"},"content":" * than 100 items is found, after which it performs a final emit with the full results array, and completes."},{"lineNumber":510,"author":{"gitId":"-"},"content":" *"},{"lineNumber":511,"author":{"gitId":"-"},"content":" * If `shouldAccumulate` is false, the observable will emit only the latest result, it will still complete on the"},{"lineNumber":512,"author":{"gitId":"-"},"content":" * same condition."},{"lineNumber":513,"author":{"gitId":"-"},"content":" *"},{"lineNumber":514,"author":{"gitId":"-"},"content":" * @callback pluckEdges - A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":515,"author":{"gitId":"-"},"content":" * @params query - The query to be performed."},{"lineNumber":516,"author":{"gitId":"-"},"content":" * @params variables - The variables for the query."},{"lineNumber":517,"author":{"gitId":"-"},"content":" * @params shouldAccumulate - Whether the observable should accumulate the results."},{"lineNumber":518,"author":{"gitId":"-"},"content":" * @returns an observable"},{"lineNumber":519,"author":{"gitId":"-"},"content":" */"},{"lineNumber":520,"author":{"gitId":"-"},"content":" private withPagination\u003cT\u003e("},{"lineNumber":521,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":522,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":523,"author":{"gitId":"-"},"content":" variables: { [key: string]: any } \u003d {},"},{"lineNumber":524,"author":{"gitId":"-"},"content":" shouldAccumulate: boolean \u003d true"},{"lineNumber":525,"author":{"gitId":"-"},"content":" ): Observable\u003cApolloQueryResult\u003cT\u003e[]\u003e {"},{"lineNumber":526,"author":{"gitId":"-"},"content":" const maxResultsCount \u003d 100;"},{"lineNumber":527,"author":{"gitId":"-"},"content":" const apollo \u003d this.apollo;"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" let accumulatedResults: ApolloQueryResult\u003cT\u003e[] \u003d [];"},{"lineNumber":530,"author":{"gitId":"-"},"content":" const behaviorSubject: BehaviorSubject\u003cApolloQueryResult\u003cT\u003e[]\u003e \u003d new BehaviorSubject(accumulatedResults);"},{"lineNumber":531,"author":{"gitId":"-"},"content":""},{"lineNumber":532,"author":{"gitId":"-"},"content":" async function queryWith(cursor: string): Promise\u003cvoid\u003e {"},{"lineNumber":533,"author":{"gitId":"-"},"content":" const graphqlQuery \u003d apollo.watchQuery\u003cT\u003e({ query, variables: { ...variables, cursor } });"},{"lineNumber":534,"author":{"gitId":"-"},"content":""},{"lineNumber":535,"author":{"gitId":"-"},"content":" await graphqlQuery.refetch().then(async (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e {"},{"lineNumber":536,"author":{"gitId":"-"},"content":" const intermediate \u003d Array.isArray(results) ? results : [results];"},{"lineNumber":537,"author":{"gitId":"-"},"content":" const edges \u003d pluckEdges(results);"},{"lineNumber":538,"author":{"gitId":"-"},"content":" const nextCursor \u003d edges.length \u003d\u003d\u003d 0 ? null : edges[edges.length - 1].cursor;"},{"lineNumber":539,"author":{"gitId":"-"},"content":""},{"lineNumber":540,"author":{"gitId":"-"},"content":" if (shouldAccumulate) {"},{"lineNumber":541,"author":{"gitId":"-"},"content":" accumulatedResults \u003d accumulatedResults.concat(intermediate);"},{"lineNumber":542,"author":{"gitId":"-"},"content":" behaviorSubject.next(accumulatedResults);"},{"lineNumber":543,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":544,"author":{"gitId":"-"},"content":" behaviorSubject.next(intermediate);"},{"lineNumber":545,"author":{"gitId":"-"},"content":" }"},{"lineNumber":546,"author":{"gitId":"-"},"content":" if (edges.length \u003c maxResultsCount || !nextCursor) {"},{"lineNumber":547,"author":{"gitId":"-"},"content":" // No more queries to perform."},{"lineNumber":548,"author":{"gitId":"-"},"content":" behaviorSubject.complete();"},{"lineNumber":549,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":550,"author":{"gitId":"-"},"content":" }"},{"lineNumber":551,"author":{"gitId":"-"},"content":""},{"lineNumber":552,"author":{"gitId":"-"},"content":" // Use a chain of await to ensure that all recursive queries are completed before `complete` is called."},{"lineNumber":553,"author":{"gitId":"-"},"content":" await queryWith(nextCursor);"},{"lineNumber":554,"author":{"gitId":"-"},"content":" });"},{"lineNumber":555,"author":{"gitId":"-"},"content":" }"},{"lineNumber":556,"author":{"gitId":"-"},"content":""},{"lineNumber":557,"author":{"gitId":"-"},"content":" queryWith(null);"},{"lineNumber":558,"author":{"gitId":"-"},"content":""},{"lineNumber":559,"author":{"gitId":"-"},"content":" return behaviorSubject.asObservable();"},{"lineNumber":560,"author":{"gitId":"-"},"content":" }"},{"lineNumber":561,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":10,"MadLamprey":2,"-":549}},{"path":"src/app/core/services/grouping/assignee-grouping-strategy.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { GithubUser } from \u0027../../models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" * A GroupingStrategy that groups issues/prs based on their assignees."},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class AssigneeGroupingStrategy implements GroupingStrategy {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific assignee."},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" * If it is the\"No Assignee\" group, unassigned issues are returned."},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * Otherwise, issues assigned to the specified user are returned."},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: GithubUser): Issue[] {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" if (key \u003d\u003d\u003d GithubUser.NO_ASSIGNEE) {"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" return this.getUnassignedData(issues);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" return this.getDataAssignedToUser(issues, key);"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" * Retrieves an Observable emitting users who can be assigned to issues,"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" * including a special \"No Assignee\" option."},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGithubUser[]\u003e {"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" return this.githubService.getUsersAssignable().pipe("},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" map((users) \u003d\u003e {"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" users.push(GithubUser.NO_ASSIGNEE);"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" return users;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" })"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" * Groups other than \"No Assignee\" need to be shown on the"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" * hidden group list if empty."},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: GithubUser): boolean {"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" return group !\u003d\u003d GithubUser.NO_ASSIGNEE;"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" private getDataAssignedToUser(issues: Issue[], user: GithubUser): Issue[] {"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" const filteredIssues \u003d issues.filter((issue) \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" if (this.isPullRequest(issue)) {"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" return this.isPullRequestCreatedByTarget(issue, user);"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" return this.isIssueAssignedToTarget(issue, user);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" return filteredIssues;"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" private getUnassignedData(issues: Issue[]): Issue[] {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" return issues.filter((issue) \u003d\u003e !this.isPullRequest(issue) \u0026\u0026 issue.assignees.length \u003d\u003d\u003d 0);"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" private isPullRequest(issue: Issue): boolean {"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" return issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027;"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" private isPullRequestCreatedByTarget(issue: Issue, target: GithubUser): boolean {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" return issue.author \u003d\u003d\u003d target.login;"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" private isIssueAssignedToTarget(issue: Issue, target: GithubUser): boolean {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" const isAssigneesFieldDefined \u003d !!issue.assignees;"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" return isAssigneesFieldDefined \u0026\u0026 issue.assignees.includes(target.login);"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":81}},{"path":"src/app/core/services/grouping/grouping-context.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable, Injector } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { BehaviorSubject, Observable } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../models/github/group.interface\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { AssigneeGroupingStrategy } from \u0027./assignee-grouping-strategy.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { MilestoneGroupingStrategy } from \u0027./milestone-grouping-strategy.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export enum GroupBy {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" Assignee \u003d \u0027assignee\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" Milestone \u003d \u0027milestone\u0027"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export const DEFAULT_GROUPBY \u003d GroupBy.Assignee;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" * A service responsible for managing the current grouping strategy and providing grouped data."},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export class GroupingContextService {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" public static readonly GROUP_BY_QUERY_PARAM_KEY \u003d \u0027groupby\u0027;"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" private currGroupBySubject: BehaviorSubject\u003cGroupBy\u003e;"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" currGroupBy: GroupBy;"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" currGroupBy$: Observable\u003cGroupBy\u003e;"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" private groupingStrategyMap: Map\u003cstring, GroupingStrategy\u003e;"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" constructor(private injector: Injector, private route: ActivatedRoute, private router: Router) {"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy \u003d DEFAULT_GROUPBY;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBySubject \u003d new BehaviorSubject\u003cGroupBy\u003e(this.currGroupBy);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy$ \u003d this.currGroupBySubject.asObservable();"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap \u003d new Map\u003cstring, GroupingStrategy\u003e();"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" // Initialize the grouping strategy map with available strategies"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap.set(GroupBy.Assignee, this.injector.get(AssigneeGroupingStrategy));"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap.set(GroupBy.Milestone, this.injector.get(MilestoneGroupingStrategy));"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" * Initializes the service from URL parameters."},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" initializeFromUrlParams() {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" const groupByParam \u003d this.route.snapshot.queryParamMap.get(GroupingContextService.GROUP_BY_QUERY_PARAM_KEY);"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" if (groupByParam \u0026\u0026 Object.values(GroupBy).includes(groupByParam as GroupBy)) {"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(groupByParam as GroupBy);"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" } else {"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(DEFAULT_GROUPBY);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" * Sets the current grouping type and updates the corresponding query parameter in the URL."},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" * @param groupBy The grouping type to set."},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" setCurrentGroupingType(groupBy: GroupBy): void {"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy \u003d groupBy;"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBySubject.next(this.currGroupBy);"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([], {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" relativeTo: this.route,"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" queryParams: {"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" [GroupingContextService.GROUP_BY_QUERY_PARAM_KEY]: groupBy"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" },"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" replaceUrl: true"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific group."},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" * @param issues - An array of issues to be grouped."},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group by which issues are to be grouped."},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" * @returns An array of issues belonging to the specified group."},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], group: Group): Issue[] {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" return strategy.getDataForGroup(issues, group);"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" * Retrieves all groups available for current grouping strategy."},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" * @returns An Observable emitting an array of groups."},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGroup[]\u003e {"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" return strategy.getGroups();"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" * Determines whether a group should be shown on hidden list if it contains no issues."},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group to check."},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" * @returns A boolean indicating whether the group should be shown on hidden list if empty."},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Group): boolean {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" return strategy.isInHiddenList(group);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" * Resets the current grouping type to the default."},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" reset(): void {"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(DEFAULT_GROUPBY);"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":110}},{"path":"src/app/core/services/grouping/grouping-strategy.interface.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../models/github/group.interface\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" * Represent a strategy for grouping issues/prs."},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" * This interface follows the Strategy Pattern, allowing for different"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" * strategies to be implemented for grouping issues/prs based on different criteria."},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export interface GroupingStrategy {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific group."},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" * @param issues - An array of issues to be grouped."},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" * @param key - The group by which issues are to be grouped."},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" * @returns An array of issues belonging to the specified group."},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: Group): Issue[];"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" * Retrieves observable emitting groups available for the grouping strategy."},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * @returns An Observable emitting an array of groups."},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGroup[]\u003e;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Determines whether a group should be shown on hidden list if it contains no issues."},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group to check."},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" * @returns A boolean indicating whether the group should be shown on hidden list if empty."},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Group): boolean;"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":31}},{"path":"src/app/core/services/grouping/milestone-grouping-strategy.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Milestone } from \u0027../../models/milestone.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { MilestoneService } from \u0027../milestone.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" * A GroupingStrategy that groups issues/prs based on their milestones."},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class MilestoneGroupingStrategy implements GroupingStrategy {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(private milestoneService: MilestoneService) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a milestone."},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: Milestone): Issue[] {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" return issues.filter((issue) \u003d\u003e issue.milestone.equals(key));"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Retrieves an Observable emitting milestones available for grouping issues."},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cMilestone[]\u003e {"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneService.fetchMilestones().pipe("},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" map((milestones) \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" const parseMilestone \u003d this.milestoneService.parseMilestoneData(milestones);"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" parseMilestone.push(Milestone.IssueWithoutMilestone);"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" parseMilestone.push(Milestone.PRWithoutMilestone);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" return parseMilestone;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" })"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" * Groups other than Default Milestone need to be shown on the"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" * hidden group list if empty."},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Milestone): boolean {"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" return group !\u003d\u003d Milestone.IssueWithoutMilestone \u0026\u0026 group !\u003d\u003d Milestone.PRWithoutMilestone;"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":45,"MadLamprey":1}},{"path":"src/app/core/services/issue.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { BehaviorSubject, Observable, of, Subscription, throwError, timer } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { catchError, exhaustMap, finalize, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue, Issues, IssuesFilter } from \u0027../models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./user.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./view.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Responsible for creating and updating issues, and periodically fetching issues"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * using GitHub."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class IssueService {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" static readonly POLL_INTERVAL \u003d 5000; // 5 seconds"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" issues: Issues;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" issues$: BehaviorSubject\u003cIssue[]\u003e;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private sessionId: string;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private issueTeamFilter \u003d \u0027All Teams\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private issuesPollSubscription: Subscription;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /** Whether the IssueService is downloading the data from Github*/"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public isLoading \u003d new BehaviorSubject\u003cboolean\u003e(false);"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" constructor(private githubService: GithubService, private userService: UserService, private viewService: ViewService) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.issues$ \u003d new BehaviorSubject(new Array\u003cIssue\u003e());"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" startPollIssues() {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (this.issuesPollSubscription \u003d\u003d\u003d undefined) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (this.issues$.getValue().length \u003d\u003d\u003d 0) {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.isLoading.next(true);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.issuesPollSubscription \u003d timer(0, IssueService.POLL_INTERVAL)"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":44,"author":{"gitId":"-"},"content":" exhaustMap(() \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return this.reloadAllIssues().pipe("},{"lineNumber":46,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(err)),"},{"lineNumber":47,"author":{"gitId":"-"},"content":" finalize(() \u003d\u003e this.isLoading.next(false))"},{"lineNumber":48,"author":{"gitId":"-"},"content":" );"},{"lineNumber":49,"author":{"gitId":"-"},"content":" })"},{"lineNumber":50,"author":{"gitId":"-"},"content":" )"},{"lineNumber":51,"author":{"gitId":"-"},"content":" .subscribe();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" stopPollIssues() {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (this.issuesPollSubscription) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.issuesPollSubscription.unsubscribe();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" this.issuesPollSubscription \u003d undefined;"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":" reloadAllIssues() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this.initializeData();"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" getIssue(id: number): Observable\u003cIssue\u003e {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return this.getLatestIssue(id);"},{"lineNumber":69,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return of(this.issues[id]);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" getLatestIssue(id: number): Observable\u003cIssue\u003e {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this.githubService.fetchIssueGraphql(id).pipe("},{"lineNumber":76,"author":{"gitId":"-"},"content":" map((response: GithubIssue) \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.createAndSaveIssueModels([response]);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return this.issues[id];"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return of(this.issues[id]);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" );"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * This function will update the issue\u0027s state of the application. This function needs to be called whenever a issue is added/updated."},{"lineNumber":88,"author":{"gitId":"-"},"content":" *"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @params issuesToUpdate - An array of issues to update the state of the application with."},{"lineNumber":90,"author":{"gitId":"-"},"content":" */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private updateLocalStore(issuesToUpdate: Issue[]) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" const newIssues \u003d { ...this.issues };"},{"lineNumber":93,"author":{"gitId":"-"},"content":" issuesToUpdate.forEach((issue) \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" newIssues[issue.id] \u003d issue;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" });"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.issues \u003d newIssues;"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" this.issues$.next(Object.values(this.issues));"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" reset(resetSessionId: boolean) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (resetSessionId) {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.sessionId \u003d undefined;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" this.issues \u003d undefined;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" this.issues$.next(new Array\u003cIssue\u003e());"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.stopPollIssues();"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" private initializeData(): Observable\u003cIssue[]\u003e {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" let issuesAPICallsByFilter: Observable\u003cArray\u003cGithubIssue\u003e\u003e;"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" switch (IssuesFilter[this.viewService.currentView][this.userService.currentUser.role]) {"},{"lineNumber":116,"author":{"gitId":"-"},"content":" case \u0027FILTER_BY_CREATOR\u0027:"},{"lineNumber":117,"author":{"gitId":"-"},"content":" issuesAPICallsByFilter \u003d this.githubService.fetchIssuesGraphql("},{"lineNumber":118,"author":{"gitId":"-"},"content":" new RestGithubIssueFilter({ creator: this.userService.currentUser.loginId })"},{"lineNumber":119,"author":{"gitId":"-"},"content":" );"},{"lineNumber":120,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" case \u0027NO_FILTER\u0027:"},{"lineNumber":122,"author":{"gitId":"-"},"content":" issuesAPICallsByFilter \u003d this.githubService.fetchIssuesGraphql(new RestGithubIssueFilter({}));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":124,"author":{"gitId":"-"},"content":" case \u0027NO_ACCESS\u0027:"},{"lineNumber":125,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return of([]);"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" const fetchedIssueIds: number[] \u003d [];"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" return issuesAPICallsByFilter.pipe("},{"lineNumber":132,"author":{"gitId":"-"},"content":" map((githubIssues: GithubIssue[]) \u003d\u003e {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" const issues \u003d this.createAndSaveIssueModels(githubIssues);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" for (const issue of issues) {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" fetchedIssueIds.push(issue.id);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" const outdatedIssueIds: number[] \u003d this.getOutdatedIssueIds(fetchedIssueIds);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" this.deleteIssuesFromLocalStore(outdatedIssueIds);"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined) {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" return [];"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return Object.values(this.issues);"},{"lineNumber":145,"author":{"gitId":"-"},"content":" })"},{"lineNumber":146,"author":{"gitId":"-"},"content":" );"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" private createAndSaveIssueModels(githubIssues: GithubIssue[]): Issue[] {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" const issues: Issue[] \u003d [];"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (const githubIssue of githubIssues) {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" const issue \u003d this.createIssueModel(githubIssue);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" issues.push(issue);"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":" this.updateLocalStore(issues);"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" return issues;"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" private deleteIssuesFromLocalStore(ids: number[]): void {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" const withoutIssuesToRemove \u003d { ...this.issues };"},{"lineNumber":163,"author":{"gitId":"-"},"content":" for (const id of ids) {"},{"lineNumber":164,"author":{"gitId":"-"},"content":" delete withoutIssuesToRemove[id];"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" this.issues \u003d withoutIssuesToRemove;"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.issues$.next(Object.values(this.issues));"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":173,"author":{"gitId":"-"},"content":" * Returns an array of outdated issue ids by comparing the ids of the recently"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * fetched issues with the current issue ids in the local store"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */"},{"lineNumber":176,"author":{"gitId":"-"},"content":" private getOutdatedIssueIds(fetchedIssueIds: number[]): number[] {"},{"lineNumber":177,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Ignore for first fetch or ignore if there is no fetch result"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" We also have to ignore for no fetch result as the cache might return a"},{"lineNumber":181,"author":{"gitId":"-"},"content":" 304 reponse with no differences in issues, resulting in the fetchIssueIds"},{"lineNumber":182,"author":{"gitId":"-"},"content":" to be empty"},{"lineNumber":183,"author":{"gitId":"-"},"content":" */"},{"lineNumber":184,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined || !fetchedIssueIds.length) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" return [];"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" const fetchedIssueIdsSet \u003d new Set\u003cnumber\u003e(fetchedIssueIds);"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" const result \u003d Object.keys(this.issues)"},{"lineNumber":191,"author":{"gitId":"-"},"content":" .map((x) \u003d\u003e +x)"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .filter((issueId) \u003d\u003e !fetchedIssueIdsSet.has(issueId));"},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" private createIssueModel(githubIssue: GithubIssue): Issue {"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" switch (this.viewService.currentView) {"},{"lineNumber":199,"author":{"gitId":"NereusWB922"},"content":" case View.issuesViewer:"},{"lineNumber":200,"author":{"gitId":"-"},"content":" return Issue.createPhaseBugReportingIssue(githubIssue);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":202,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" setIssueTeamFilter(filterValue: string) {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (filterValue) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" this.issueTeamFilter \u003d filterValue;"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" setSessionId(sessionId: string) {"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.sessionId \u003d sessionId;"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" getIssueTeamFilter(): string {"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return this.issueTeamFilter;"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }"},{"lineNumber":219,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":6,"-":213}},{"path":"src/app/core/services/label.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { BehaviorSubject, EMPTY, Observable, of, Subject, Subscription, timer } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { catchError, exhaustMap, finalize, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Label, SimpleLabel } from \u0027../models/label.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/* The threshold to decide if color is dark or light."},{"lineNumber":8,"author":{"gitId":"-"},"content":"A higher threshold value will result in more colors determined to be \"dark\"."},{"lineNumber":9,"author":{"gitId":"-"},"content":"W3C recommendation is 0.179, but 0.184 is chosen so that some colors (like bright red)"},{"lineNumber":10,"author":{"gitId":"-"},"content":"are considered dark (Github too consider them dark) */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"const COLOR_DARKNESS_THRESHOLD \u003d 0.184;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"const COLOR_BLACK \u003d \u0027000000\u0027; // Dark color for text with light background"},{"lineNumber":14,"author":{"gitId":"-"},"content":"const COLOR_WHITE \u003d \u0027ffffff\u0027; // Light color for text with dark background"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":18,"author":{"gitId":"-"},"content":"})"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Responsible for retrieval and parsing of label data"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * from the GitHub repository for the WATcher application."},{"lineNumber":23,"author":{"gitId":"-"},"content":" */"},{"lineNumber":24,"author":{"gitId":"-"},"content":"export class LabelService {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" static readonly POLL_INTERVAL \u003d 5000; // 5 seconds"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" labels: Label[];"},{"lineNumber":28,"author":{"gitId":"-"},"content":" simpleLabels: SimpleLabel[];"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" private labelsPollSubscription: Subscription;"},{"lineNumber":31,"author":{"gitId":"Arif-Khalid"},"content":" private labelsSubject \u003d new Subject\u003cSimpleLabel[]\u003e();"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" startPollLabels() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (this.labelsPollSubscription) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.labelsPollSubscription \u003d timer(0, LabelService.POLL_INTERVAL)"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":41,"author":{"gitId":"-"},"content":" exhaustMap(() \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return this.fetchLabels().pipe("},{"lineNumber":43,"author":{"gitId":"-"},"content":" catchError(() \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return EMPTY;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" );"},{"lineNumber":47,"author":{"gitId":"-"},"content":" })"},{"lineNumber":48,"author":{"gitId":"-"},"content":" )"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .subscribe(() \u003d\u003e {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" this.labelsSubject.next(this.simpleLabels);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" stopPollLabels() {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (this.labelsPollSubscription) {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.labelsPollSubscription.unsubscribe();"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.labelsPollSubscription \u003d undefined;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" connect(): Observable\u003cSimpleLabel[]\u003e {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return this.labelsSubject.asObservable();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Fetch labels from Github."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public fetchLabels(): Observable\u003cany\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return this.githubService.fetchAllLabels().pipe("},{"lineNumber":70,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.labels \u003d this.parseLabelData(response);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.simpleLabels \u003d this.labels;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.labelsSubject.next(this.simpleLabels);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return response;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" })"},{"lineNumber":76,"author":{"gitId":"-"},"content":" );"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Parses label information and returns an array of Label objects."},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param labels - Label Information from API."},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" parseLabelData(labels: Array\u003cany\u003e): Label[] {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" const labelData: Label[] \u003d [];"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" for (const label of labels) {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" labelData.push(new Label(label));"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return labelData;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Returns true if the given color is considered \"dark\""},{"lineNumber":94,"author":{"gitId":"-"},"content":" * The color is considered \"dark\" if its luminance is less than COLOR_DARKNESS_THRESHOLD"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @param inputColor: the color"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */"},{"lineNumber":97,"author":{"gitId":"-"},"content":" isDarkColor(inputColor: string): boolean {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" const COLOR \u003d inputColor.charAt(0) \u003d\u003d\u003d \u0027#\u0027 ? inputColor.substring(1, 7) : inputColor;"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const R \u003d parseInt(COLOR.substring(0, 2), 16);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" const G \u003d parseInt(COLOR.substring(2, 4), 16);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" const B \u003d parseInt(COLOR.substring(4, 6), 16);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" const RGB \u003d [R / 255, G / 255, B / 255];"},{"lineNumber":103,"author":{"gitId":"-"},"content":" const LINEAR_RGB \u003d RGB.map((col) \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (col \u003c\u003d 0.03928) {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return col / 12.92;"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return Math.pow((col + 0.055) / 1.055, 2.4);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":" // Calculate the luminance of the color"},{"lineNumber":110,"author":{"gitId":"-"},"content":" const LUMINANCE \u003d 0.2126 * LINEAR_RGB[0] + 0.7152 * LINEAR_RGB[1] + 0.0722 * LINEAR_RGB[2];"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // The color is \"dark\" if the luminance is lower than the threshold"},{"lineNumber":112,"author":{"gitId":"-"},"content":" return LUMINANCE \u003c COLOR_DARKNESS_THRESHOLD;"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Returns a css style for the background and text color of the label"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * @param color: the color of the label"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @return the style with background-color in rgb"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @throws exception if input is an invalid color code"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */"},{"lineNumber":121,"author":{"gitId":"-"},"content":" setLabelStyle(color: string) {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" let textColor: string;"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" textColor \u003d this.isDarkColor(color) ? COLOR_WHITE : COLOR_BLACK;"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" const styles \u003d {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${color}`,"},{"lineNumber":128,"author":{"gitId":"-"},"content":" color: `#${textColor}`"},{"lineNumber":129,"author":{"gitId":"-"},"content":" };"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" return styles;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" reset() {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.labels \u003d undefined;"},{"lineNumber":136,"author":{"gitId":"-"},"content":" this.simpleLabels \u003d undefined;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" this.stopPollLabels();"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"-":137}},{"path":"src/app/core/services/milestone.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Milestone } from \u0027../models/milestone.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":8,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":9,"author":{"gitId":"-"},"content":"})"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Responsible for retrieval and parsing and syncing of milestone data"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * from the GitHub repository for the WATcher application."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class MilestoneService {"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" milestones: Milestone[] \u003d [];"},{"lineNumber":17,"author":{"gitId":"-"},"content":" hasNoMilestones: boolean;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Fetch all milestones from github."},{"lineNumber":23,"author":{"gitId":"-"},"content":" */"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public fetchMilestones(): Observable\u003cany\u003e {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return this.githubService.fetchAllMilestones().pipe("},{"lineNumber":26,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.milestones \u003d this.parseMilestoneData(response);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.hasNoMilestones \u003d response.length \u003d\u003d\u003d 0;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return response;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" })"},{"lineNumber":31,"author":{"gitId":"-"},"content":" );"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Parses milestone information and returns an array of Milestone objects."},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param milestones - Milestone Information from API."},{"lineNumber":37,"author":{"gitId":"-"},"content":" */"},{"lineNumber":38,"author":{"gitId":"-"},"content":" parseMilestoneData(milestones: Array\u003cany\u003e): Milestone[] {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" const milestoneData: Milestone[] \u003d [];"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" for (const milestone of milestones) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" milestoneData.push(new Milestone(milestone));"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }"},{"lineNumber":44,"author":{"gitId":"-"},"content":" milestoneData.sort((a: Milestone, b: Milestone) \u003d\u003e a.title.localeCompare(b.title));"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" return milestoneData;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" * Gets the open milestone with the earliest deadline."},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" * Returns null if there is no open milestone with deadline."},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" getEarliestOpenMilestone(): Milestone {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" let earliestOpenMilestone: Milestone \u003d null;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" for (const milestone of this.milestones) {"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" if (!milestone.deadline || milestone.state !\u003d\u003d \u0027open\u0027) {"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" continue;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" if (earliestOpenMilestone \u003d\u003d\u003d null) {"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" earliestOpenMilestone \u003d milestone;"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" } else if (milestone.deadline \u003c earliestOpenMilestone.deadline) {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" earliestOpenMilestone \u003d milestone;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":" return earliestOpenMilestone;"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" * Gets the closed milestone with the latest deadline."},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" * Returns null if there is no closed milestone with deadline."},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" getLatestClosedMilestone(): Milestone {"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" let latestClosedMilestone: Milestone \u003d null;"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" for (const milestone of this.milestones) {"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" if (!milestone.deadline || milestone.state !\u003d\u003d \u0027closed\u0027) {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" continue;"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" if (latestClosedMilestone \u003d\u003d\u003d null) {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" latestClosedMilestone \u003d milestone;"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" } else if (milestone.deadline \u003e latestClosedMilestone.deadline) {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" latestClosedMilestone \u003d milestone;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":" return latestClosedMilestone;"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":39,"-":47}},{"path":"src/app/core/services/view.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { BehaviorSubject, Observable, of, Subject } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../constants/storage-keys.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../models/repo.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./error-message.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027./repo-url-cache.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"export const SESSION_AVALIABILITY_FIX_FAILED \u003d \u0027Session Availability Fix failed.\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" * The title of each view that appears in the header bar."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"export const ViewDescription \u003d {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" [View.issuesViewer]: \u0027Issues Dashboard\u0027,"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" [View.activityDashboard]: \u0027Activity Dashboard\u0027"},{"lineNumber":22,"author":{"gitId":"-"},"content":"};"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * All data of the session."},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Add accessible views here."},{"lineNumber":27,"author":{"gitId":"-"},"content":" */"},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const STARTING_SESSION_DATA: SessionData \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sessionRepo: ["},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" { view: View.issuesViewer, repos: [] }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" // { view: View.activityDashboard, repos: [] }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":33,"author":{"gitId":"-"},"content":"};"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":"export const STARTING_VIEW \u003d View.issuesViewer;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":38,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":39,"author":{"gitId":"-"},"content":"})"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Responsible for managing the current selected feature of WATcher as well as the"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * current session data and repository details related to the session."},{"lineNumber":44,"author":{"gitId":"-"},"content":" */"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":"export class ViewService {"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" public static readonly REPO_QUERY_PARAM_KEY \u003d \u0027repo\u0027;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" public currentView: View \u003d STARTING_VIEW;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" public currentRepo: Repo; // current or main repository of current view"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" public otherRepos: Repo[]; // more repositories relevant to this view"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" repoSetSource \u003d new BehaviorSubject(false);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" repoSetState \u003d this.repoSetSource.asObservable();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Expose an observable to track changes to currentRepo"},{"lineNumber":57,"author":{"gitId":"-"},"content":" *"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * TODO - replace all references to currentRepo to have"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * dependencies subscribe to this observable?"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public repoChanged$: Subject\u003cRepo | null\u003e \u003d new Subject();"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" /** Whether the ViewService is changing the repository */"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public isChangingRepo \u003d new BehaviorSubject\u003cboolean\u003e(false);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" public sessionData \u003d STARTING_SESSION_DATA; // stores session data for the session"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" constructor("},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" private githubService: GithubService,"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" private repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" public logger: LoggingService,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" private route: ActivatedRoute,"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" private router: Router"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" ) {}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Sets the current main repository and additional repos if any."},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" * Updates session data in View Service and local storage."},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Updates Github Service with current repository."},{"lineNumber":80,"author":{"gitId":"-"},"content":" * @param repo Main current repository"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param repos Additional repositories"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" setRepository(repo: Repo, repos?: Repo[]): void {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" this.currentRepo \u003d repo;"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.otherRepos \u003d repos ? repos : [];"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" this.sessionData.sessionRepo.find((x) \u003d\u003e x.view \u003d\u003d\u003d this.currentView).repos \u003d this.getRepository();"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" this.githubService.storeViewDetails(this.currentRepo.owner, this.currentRepo.name);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" localStorage.setItem(\u0027sessionData\u0027, JSON.stringify(this.sessionData));"},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" this.router.navigate([\u0027issuesViewer\u0027], {"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" queryParams: {"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" [ViewService.REPO_QUERY_PARAM_KEY]: repo.toString()"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" },"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Changes current respository to a new repository."},{"lineNumber":99,"author":{"gitId":"-"},"content":" * @param repo New current repository"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private changeCurrentRepository(repo: Repo): void {"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: Changing current repository to \u0027${repo}\u0027`);"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" if (this.currentView \u003d\u003d\u003d View.issuesViewer) {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" /** Adds past repositories to view */"},{"lineNumber":106,"author":{"gitId":"-"},"content":" (this.otherRepos || []).push(this.currentRepo);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":" this.setRepository(repo, this.otherRepos);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" this.repoUrlCacheService.cache(repo.toString());"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" this.repoChanged$.next(repo);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Change repository if a valid repository is provided"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * @param repo New repository"},{"lineNumber":118,"author":{"gitId":"-"},"content":" */"},{"lineNumber":119,"author":{"gitId":"-"},"content":" async changeRepositoryIfValid(repo: Repo) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(true);"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" const isValidRepository \u003d await this.githubService.isRepositoryPresent(repo.owner, repo.name).toPromise();"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(false);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" this.changeCurrentRepository(repo);"},{"lineNumber":129,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(false);"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Returns the full repository array of the current feature."},{"lineNumber":134,"author":{"gitId":"-"},"content":" */"},{"lineNumber":135,"author":{"gitId":"-"},"content":" getRepository(): Repo[] {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return [this.currentRepo].concat(this.otherRepos);"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Retrieves the repository url from local storage and sets to current repository."},{"lineNumber":141,"author":{"gitId":"-"},"content":" */"},{"lineNumber":142,"author":{"gitId":"-"},"content":" async initializeCurrentRepository() {"},{"lineNumber":143,"author":{"gitId":"-"},"content":" const org \u003d window.localStorage.getItem(STORAGE_KEYS.ORG);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" const repoName \u003d window.localStorage.getItem(STORAGE_KEYS.DATA_REPO);"},{"lineNumber":145,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: received initial org (${org}) and initial name (${repoName})`);"},{"lineNumber":146,"author":{"gitId":"-"},"content":" let repo: Repo;"},{"lineNumber":147,"author":{"gitId":"-"},"content":" if (!org || !repoName) {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" repo \u003d Repo.ofEmptyRepo();"},{"lineNumber":149,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" repo \u003d new Repo(org, repoName);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" const isValidRepository \u003d await this.githubService.isRepositoryPresent(repo.owner, repo.name).toPromise();"},{"lineNumber":153,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: Repo is ${repo}`);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" this.setRepository(repo);"},{"lineNumber":158,"author":{"gitId":"-"},"content":" this.repoSetSource.next(true);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":162,"author":{"gitId":"nknguyenhc"},"content":" * Set items in the local storage corresponding to the next URL."},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" * This includes checking if the view is valid, and if the repo is of the correct format."},{"lineNumber":164,"author":{"gitId":"nknguyenhc"},"content":" * @param url The partial URL without the host, e.g. `/issuesViewer?repo\u003dCATcher%2FWATcher."},{"lineNumber":165,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":166,"author":{"gitId":"nknguyenhc"},"content":" setupFromUrl(url: string): Observable\u003cvoid\u003e {"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" return of(this.getViewAndRepoFromUrl(url)).pipe("},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":" map(([viewName, repoName]) \u003d\u003e {"},{"lineNumber":169,"author":{"gitId":"NereusWB922"},"content":" if (!this.isViewAllowed(viewName)) {"},{"lineNumber":170,"author":{"gitId":"nknguyenhc"},"content":" throw new Error(ErrorMessageService.invalidUrlMessage());"},{"lineNumber":171,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":172,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":173,"author":{"gitId":"nknguyenhc"},"content":" if (repoName \u003d\u003d\u003d null) {"},{"lineNumber":174,"author":{"gitId":"nknguyenhc"},"content":" throw new Error(ErrorMessageService.invalidUrlMessage());"},{"lineNumber":175,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":176,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":177,"author":{"gitId":"nknguyenhc"},"content":" const newRepo \u003d Repo.of(repoName);"},{"lineNumber":178,"author":{"gitId":"nknguyenhc"},"content":" if (newRepo) {"},{"lineNumber":179,"author":{"gitId":"nknguyenhc"},"content":" window.localStorage.setItem(STORAGE_KEYS.ORG, newRepo.owner);"},{"lineNumber":180,"author":{"gitId":"nknguyenhc"},"content":" window.localStorage.setItem(STORAGE_KEYS.DATA_REPO, newRepo.name);"},{"lineNumber":181,"author":{"gitId":"nknguyenhc"},"content":" this.repoUrlCacheService.cache(newRepo.toString());"},{"lineNumber":182,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":183,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":184,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":185,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":186,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":187,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":188,"author":{"gitId":"NereusWB922"},"content":" * Initializes a repo based on the URL parameters and changes the repo if valid."},{"lineNumber":189,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":190,"author":{"gitId":"NereusWB922"},"content":" initializeRepoFromUrlParams(): void {"},{"lineNumber":191,"author":{"gitId":"NereusWB922"},"content":" const repoParams \u003d this.route.snapshot.queryParamMap.get(ViewService.REPO_QUERY_PARAM_KEY);"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":193,"author":{"gitId":"NereusWB922"},"content":" const newRepo \u003d Repo.of(repoParams);"},{"lineNumber":194,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" this.changeRepositoryIfValid(newRepo);"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" getViewAndRepoFromUrl(url: string): [string, string] {"},{"lineNumber":199,"author":{"gitId":"nknguyenhc"},"content":" const urlObject \u003d new URL(`${location.protocol}//${location.host}${url}`);"},{"lineNumber":200,"author":{"gitId":"nknguyenhc"},"content":" const pathname \u003d urlObject.pathname;"},{"lineNumber":201,"author":{"gitId":"NereusWB922"},"content":" const reponame \u003d urlObject.searchParams.get(ViewService.REPO_QUERY_PARAM_KEY);"},{"lineNumber":202,"author":{"gitId":"nknguyenhc"},"content":" return [pathname, reponame];"},{"lineNumber":203,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":204,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":205,"author":{"gitId":"NereusWB922"},"content":" isViewAllowed(viewName: string) {"},{"lineNumber":206,"author":{"gitId":"NereusWB922"},"content":" return viewName \u003d\u003d\u003d \u0027/\u0027 + View.issuesViewer;"},{"lineNumber":207,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":208,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" isRepoSet(): boolean {"},{"lineNumber":210,"author":{"gitId":"-"},"content":" return this.repoSetSource.getValue();"},{"lineNumber":211,"author":{"gitId":"-"},"content":" }"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":214,"author":{"gitId":"NereusWB922"},"content":" * Changes view and updates View Service\u0027s properties."},{"lineNumber":215,"author":{"gitId":"NereusWB922"},"content":" * @param view New view"},{"lineNumber":216,"author":{"gitId":"-"},"content":" */"},{"lineNumber":217,"author":{"gitId":"NereusWB922"},"content":" changeView(view: View) {"},{"lineNumber":218,"author":{"gitId":"NereusWB922"},"content":" this.currentView \u003d view;"},{"lineNumber":219,"author":{"gitId":"-"},"content":""},{"lineNumber":220,"author":{"gitId":"-"},"content":" // For now, assumes repository stays the same"},{"lineNumber":221,"author":{"gitId":"NereusWB922"},"content":" this.githubService.storeViewDetails(this.currentRepo.owner, this.currentRepo.name);"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" public getCurrentRepositoryURL() {"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return this.currentRepo.owner.concat(\u0027/\u0027).concat(this.currentRepo.name);"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" reset() {"},{"lineNumber":229,"author":{"gitId":"NereusWB922"},"content":" this.currentView \u003d STARTING_VIEW;"},{"lineNumber":230,"author":{"gitId":"-"},"content":" }"},{"lineNumber":231,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":42,"NereusWB922":52,"-":137}},{"path":"src/app/issues-viewer/card-view/card-view.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".card-column {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":".card {"},{"lineNumber":6,"author":{"gitId":"-"},"content":" margin: 8px 0px 8px 0px;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":".mat-card-title {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" font-size: 12px;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" text-align: center;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" overflow: auto;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" word-break: break-word;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":".column-header .mat-card-title {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":".mat-card {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" padding: 10px;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":":host ::ng-deep div.mat-card-header-text {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" margin: 2px;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"div.column-header .mat-card-title {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" margin: 0;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":"div.column-header {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" z-index: 5;"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"div.column-header .mat-card-header {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":".scrollable-container {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" height: 53vh;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" overflow: auto;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-bottom: 2px;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" scrollbar-width: none;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":".scrollable-container::-webkit-scrollbar {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" display: none;"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":60,"author":{"gitId":"-"},"content":".scrollable-container::before {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" height: 6px;"},{"lineNumber":66,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":67,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":68,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":".scrollable-container::after {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" position: sticky;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" top: 100%;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" height: 6px;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":79,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":80,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":81,"author":{"gitId":"-"},"content":"}"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":".scrollable-container-wrapper {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":89,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":91,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" top: 0;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":97,"author":{"gitId":"-"},"content":"}"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":101,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":102,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":103,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" bottom: 0;"},{"lineNumber":105,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":106,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":".loading-spinner {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":113,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":114,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":115,"author":{"gitId":"-"},"content":"}"},{"lineNumber":116,"author":{"gitId":"-"},"content":""},{"lineNumber":117,"author":{"gitId":"-"},"content":".mat-card-subtitle {"},{"lineNumber":118,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":119,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":120,"author":{"gitId":"-"},"content":" font-size: 11px;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" text-align: left;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" overflow: auto;"},{"lineNumber":123,"author":{"gitId":"-"},"content":" margin: 6px 0;"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":".row-count {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" border-radius: 3px;"},{"lineNumber":129,"author":{"gitId":"-"},"content":" cursor: default;"},{"lineNumber":130,"author":{"gitId":"-"},"content":" padding: 6px;"},{"lineNumber":131,"author":{"gitId":"-"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":132,"author":{"gitId":"-"},"content":" font-weight: 410;"},{"lineNumber":133,"author":{"gitId":"-"},"content":" display: inline-flex;"},{"lineNumber":134,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":135,"author":{"gitId":"-"},"content":"}"},{"lineNumber":136,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":137,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .pagination-hide-arrow .mat-paginator-navigation-previous {"},{"lineNumber":138,"author":{"gitId":"nknguyenhc"},"content":" display: none !important;"},{"lineNumber":139,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":140,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":141,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .pagination-hide-arrow .mat-paginator-navigation-next {"},{"lineNumber":142,"author":{"gitId":"nknguyenhc"},"content":" display: none !important;"},{"lineNumber":143,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":144,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":145,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .mat-paginator-range-actions {"},{"lineNumber":146,"author":{"gitId":"nknguyenhc"},"content":" height: 47px;"},{"lineNumber":147,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":12,"-":135}},{"path":"src/app/issues-viewer/card-view/card-view.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"card-column\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" [ngTemplateOutlet]\u003d\"getHeaderTemplate() || defaultHeader\""},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" [ngTemplateOutletContext]\u003d\"{ $implicit: this.group }\""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/ng-container\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"issue-pr-cards\" *ngFor\u003d\"let issue of this.issues$ | async; index as i\"\u003e"},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-issue-pr-card [issue]\u003d\"issue\" [filter]\u003d\"issues.filter\"\u003e\u003c/app-issue-pr-card\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-card class\u003d\"loading-spinner\" *ngIf\u003d\"this.issues.isLoading$ | async\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-paginator"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" [pageSize]\u003d\"pageSize\""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" [pageSizeOptions]\u003d\"[10, 20, 50]\""},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" [class]\u003d\"pageSize \u003e\u003d issueLength ? \u0027pagination-hide-arrow\u0027 : \u0027\u0027\""},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" (page)\u003d\"updatePageSize($event.pageSize)\""},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" \u003e\u003c/mat-paginator\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"\u003c!-- Template --\u003e"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #defaultHeader\u003e"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"loading-spinner\"\u003e"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #assigneeHeader let-assignee\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column-header\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-card\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-card-header [ngStyle]\u003d\"{ height: \u002740px\u0027 }\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":36,"author":{"gitId":"-"},"content":" mat-card-avatar"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"assignee\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + assignee.avatar_url + \u0027)\u0027,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cmat-card-title\u003e"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" {{ assignee.login }}"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ this.issues.count }}\u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/mat-card-header\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #milestoneHeader let-milestone\u003e"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"column-header\"\u003e"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-header [ngStyle]\u003d\"{ height: \u002740px\u0027 }\"\u003e"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" {{ milestone.title }}"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ this.issues.count }}\u003c/div\u003e"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-header\u003e"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":28,"Arif-Khalid":1,"-":28}},{"path":"src/app/issues-viewer/card-view/card-view.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" AfterViewInit,"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" Component,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" ElementRef,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" EventEmitter,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" Input,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" OnDestroy,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" OnInit,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" Output,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" TemplateRef,"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" ViewChild"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"} from \u0027@angular/core\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":"import { FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { FilterableComponent, FilterableSource } from \u0027../../shared/issue-tables/filterableTypes\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { IssuesDataTable } from \u0027../../shared/issue-tables/IssuesDataTable\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":25,"author":{"gitId":"-"},"content":" selector: \u0027app-card-view\u0027,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" templateUrl: \u0027./card-view.component.html\u0027,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./card-view.component.css\u0027]"},{"lineNumber":28,"author":{"gitId":"-"},"content":"})"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Displays issues as Cards."},{"lineNumber":32,"author":{"gitId":"-"},"content":" */"},{"lineNumber":33,"author":{"gitId":"-"},"content":"export class CardViewComponent implements OnInit, AfterViewInit, OnDestroy, FilterableComponent {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() headers: string[];"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" @Input() group?: Group \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027defaultHeader\u0027) defaultHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027assigneeHeader\u0027) assigneeHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027milestoneHeader\u0027) milestoneHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" issues: IssuesDataTable;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" issues$: Observable\u003cIssue[]\u003e;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" private timeoutId: NodeJS.Timeout | null \u003d null;"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private issuesLengthSubscription: Subscription;"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private issuesLoadingStateSubscription: Subscription;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"Arif-Khalid"},"content":" isLoading \u003d true;"},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" issueLength \u003d 0;"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" pageSize \u003d 20;"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" @Output() issueLengthChange: EventEmitter\u003cNumber\u003e \u003d new EventEmitter\u003cNumber\u003e();"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" constructor("},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" public element: ElementRef,"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" public issueService: IssueService,"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" private filtersService: FiltersService,"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" private milestoneService: MilestoneService"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" ) {}"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" this.issues \u003d new IssuesDataTable("},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" this.issueService,"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService,"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" this.filtersService,"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" this.milestoneService,"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" this.paginator,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" this.headers,"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" this.group,"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" this.filters"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" this.timeoutId \u003d setTimeout(() \u003d\u003e {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.issues.loadIssues();"},{"lineNumber":81,"author":{"gitId":"-"},"content":" this.issues$ \u003d this.issues.connect();"},{"lineNumber":82,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":83,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when issues change"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" this.issuesLengthSubscription \u003d this.issues$.subscribe(() \u003d\u003e {"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" this.issueLength \u003d this.issues.count;"},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" this.issueLengthChange.emit(this.issueLength);"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":89,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when loading state changes"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" this.issuesLoadingStateSubscription \u003d this.issues.isLoading$.subscribe((isLoadingUpdate) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"Arif-Khalid"},"content":" this.isLoading \u003d isLoadingUpdate;"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":93,"author":{"gitId":"-"},"content":" });"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" getHeaderTemplate(): TemplateRef\u003cany\u003e {"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" switch (this.groupingContextService.currGroupBy) {"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Assignee:"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" return this.assigneeHeaderTemplate;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Milestone:"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneHeaderTemplate;"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" default:"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" return this.defaultHeaderTemplate;"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" if (this.timeoutId) {"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" clearTimeout(this.timeoutId);"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" if (this.issues) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" this.issues.disconnect();"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" if (this.issuesLengthSubscription) {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" this.issuesLengthSubscription.unsubscribe();"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" if (this.issuesLoadingStateSubscription) {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" this.issuesLoadingStateSubscription.unsubscribe();"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" retrieveFilterable(): FilterableSource {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return this.issues;"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":129,"author":{"gitId":"nknguyenhc"},"content":" updatePageSize(newPageSize: number) {"},{"lineNumber":130,"author":{"gitId":"nknguyenhc"},"content":" this.pageSize \u003d newPageSize;"},{"lineNumber":131,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":21,"NereusWB922":59,"Arif-Khalid":10,"-":42}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".hidden-groups {"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" min-width: 150px;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" max-width: 300px;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":".row-count {"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 3px;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" cursor: default;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" padding: 6px;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" font-weight: 410;"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" display: inline-flex;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header {"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":".mat-card {"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 0px;"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" padding: 10px;"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" justify-content: center;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":".mat-card-title {"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" text-align: center;"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" margin: 0;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" flex-grow: 1;"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" margin: 2px;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" word-break: break-word;"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":".mat-card-avatar {"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" height: 30px;"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" width: 30px;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header .mat-card-title {"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" font-size: 12px;"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" height: 67vh;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" overflow: auto;"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" scrollbar-width: none;"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" -ms-overflow-style: none;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":".scrollable-containers::-webkit-scrollbar {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" display: none;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before,"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" pointer-events: none;"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" content: \u0027\u0027;"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" z-index: 2;"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" height: 6px;"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" display: block;"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before {"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" position: sticky;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":81,"NereusWB922":1}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv *ngIf\u003d\"groups.length \u003e 0\" class\u003d\"hidden-groups\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card matTooltip\u003d\"Users that have no Issues/PRs pertaining to the current filter\" matTooltipShowDelay\u003d\"0\" matTooltipHideDelay\u003d\"0\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003eHidden {{ this.groupingContextService.currGroupBy }}s\u003c/mat-card-title\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ groups.length }}\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv *ngFor\u003d\"let group of groups\"\u003e"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container [ngTemplateOutlet]\u003d\"getCardTemplate()\" [ngTemplateOutletContext]\u003d\"{ $implicit: group }\"\u003e\u003c/ng-container\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c!-- Templates --\u003e"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #defaultCard let-group\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"loading-spinner\"\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #assigneeCard let-assignee\u003e"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + assignee.avatar_url + \u0027)\u0027,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002730px\u0027"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e{{ assignee.login }}\u003c/mat-card-title\u003e"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #milestoneCard let-milestone\u003e"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e{{ milestone.title }}\u003c/mat-card-title\u003e"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"}],"authorContributionMap":{"NereusWB922":41}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Input, TemplateRef, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-hidden-groups\u0027,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./hidden-groups.component.html\u0027,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./hidden-groups.component.css\u0027]"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export class HiddenGroupsComponent {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" @Input() groups: Group[] \u003d [];"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027defaultCard\u0027) defaultCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027assigneeCard\u0027) assigneeCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027milestoneCard\u0027) milestoneCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" constructor(public groupingContextService: GroupingContextService) {}"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" getCardTemplate(): TemplateRef\u003cany\u003e {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" switch (this.groupingContextService.currGroupBy) {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Assignee:"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" return this.assigneeCardTemplate;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Milestone:"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneCardTemplate;"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" default:"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" return this.defaultCardTemplate;"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":29}},{"path":"src/app/issues-viewer/issues-viewer.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"loading-spinner\" *ngIf\u003d\"(this.viewService.isChangingRepo | async) || this.groups.length \u003d\u003d\u003d 0; else elseBlock\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e \u003c/mat-progress-spinner\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cng-template #elseBlock\u003e"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-filter-bar [views$]\u003d\"views\"\u003e\u003c/app-filter-bar\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"wrapper\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003capp-card-view"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" *ngFor\u003d\"let group of groups\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" [group]\u003d\"group\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" (issueLengthChange)\u003d\"updateHiddenGroups($event, group)\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003e\u003c/app-card-view\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003capp-hidden-groups [groups]\u003d\"this.hiddenGroups\"\u003e\u003c/app-hidden-groups\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":5,"Arif-Khalid":3,"-":14}},{"path":"src/app/issues-viewer/issues-viewer.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { NavigationEnd, NavigationStart, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, of, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { filter } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../core/models/github/group.interface\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../core/models/repo.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../core/services/filters.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../core/services/issue.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../core/services/label.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../core/services/milestone.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../core/services/view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":19,"author":{"gitId":"-"},"content":" selector: \u0027app-issues-viewer\u0027,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issues-viewer.component.html\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issues-viewer.component.css\u0027]"},{"lineNumber":22,"author":{"gitId":"-"},"content":"})"},{"lineNumber":23,"author":{"gitId":"-"},"content":"export class IssuesViewerComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" /** Observes for any change in repo*/"},{"lineNumber":27,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" groupByChangeSubscription: Subscription;"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /** Observes for any change in the cardviews */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" viewChange: Subscription;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" popStateEventSubscription: Subscription;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" availableGroupsSubscription: Subscription;"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" popStateNavigationId: number;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" /** Users to show as columns */"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" groups: Group[] \u003d [];"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" /** The list of users with 0 issues (hidden) */"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" hiddenGroups: Group[] \u003d [];"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" @ViewChildren(CardViewComponent) cardViews: QueryList\u003cCardViewComponent\u003e;"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" views \u003d new BehaviorSubject\u003cQueryList\u003cCardViewComponent\u003e\u003e(undefined);"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" public viewService: ViewService,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public githubService: GithubService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public issueService: IssueService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" public milestoneService: MilestoneService,"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" private router: Router,"},{"lineNumber":58,"author":{"gitId":"Arif-Khalid"},"content":" private filtersService: FiltersService"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" this.repoChangeSubscription \u003d this.viewService.repoChanged$.subscribe((newRepo) \u003d\u003e {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":64,"author":{"gitId":"-"},"content":" });"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" this.groupByChangeSubscription \u003d this.groupingContextService.currGroupBy$.subscribe((newGroupBy) \u003d\u003e {"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" this.initialize();"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" this.popStateEventSubscription \u003d this.router.events"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" .pipe(filter((event) \u003d\u003e event instanceof NavigationEnd || event instanceof NavigationStart))"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" .subscribe((event) \u003d\u003e {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" if (event instanceof NavigationStart \u0026\u0026 event.navigationTrigger \u003d\u003d\u003d \u0027popstate\u0027) {"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" this.popStateNavigationId \u003d event.id;"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" if (event instanceof NavigationEnd \u0026\u0026 event.id \u003d\u003d\u003d this.popStateNavigationId) {"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" this.viewService.initializeRepoFromUrlParams();"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.initializeFromUrlParams();"},{"lineNumber":80,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.initializeFromURLParams();"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.initializeFromUrlParams();"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.initializeFromURLParams();"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.viewChange \u003d this.cardViews.changes.subscribe((x) \u003d\u003e this.views.next(x));"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":97,"author":{"gitId":"-"},"content":" this.viewChange.unsubscribe();"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.popStateEventSubscription.unsubscribe();"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":103,"author":{"gitId":"-"},"content":" */"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private initialize() {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" if (this.availableGroupsSubscription) {"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" this.availableGroupsSubscription.unsubscribe();"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.checkIfValidRepository().subscribe((isValidRepository) \u003d\u003e {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":" });"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" // Fetch assignees"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" this.groups \u003d [];"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups \u003d [];"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" this.availableGroupsSubscription \u003d this.groupingContextService.getGroups().subscribe((x) \u003d\u003e (this.groups \u003d x));"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" // Fetch issues"},{"lineNumber":122,"author":{"gitId":"-"},"content":" this.issueService.reloadAllIssues();"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" * Checks if our current repository available on view service is indeed a valid repository"},{"lineNumber":127,"author":{"gitId":"-"},"content":" */"},{"lineNumber":128,"author":{"gitId":"-"},"content":" private checkIfValidRepository() {"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" const currentRepo \u003d this.viewService.currentRepo;"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" if (Repo.isInvalidRepoName(currentRepo)) {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" return this.githubService.isRepositoryPresent(currentRepo.owner, currentRepo.name);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":138,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" * Update the list of hidden group based on the new info."},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" * @param issueLength The number of issues under this group."},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" * @param group The group."},{"lineNumber":142,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":143,"author":{"gitId":"NereusWB922"},"content":" updateHiddenGroups(issueLength: number, target: Group) {"},{"lineNumber":144,"author":{"gitId":"NereusWB922"},"content":" if (issueLength \u003d\u003d\u003d 0 \u0026\u0026 this.groupingContextService.isInHiddenList(target)) {"},{"lineNumber":145,"author":{"gitId":"NereusWB922"},"content":" this.addToHiddenGroups(target);"},{"lineNumber":146,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":147,"author":{"gitId":"NereusWB922"},"content":" this.removeFromHiddenGroups(target);"},{"lineNumber":148,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":149,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":150,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":151,"author":{"gitId":"NereusWB922"},"content":" private addToHiddenGroups(target: Group) {"},{"lineNumber":152,"author":{"gitId":"NereusWB922"},"content":" const isGroupPresent \u003d this.hiddenGroups.some((group) \u003d\u003e group.equals(target));"},{"lineNumber":153,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":154,"author":{"gitId":"NereusWB922"},"content":" if (!isGroupPresent) {"},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups.push(target);"},{"lineNumber":156,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":157,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":158,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":" private removeFromHiddenGroups(target: Group) {"},{"lineNumber":160,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups \u003d this.hiddenGroups.filter((group) \u003d\u003e !group.equals(target));"},{"lineNumber":161,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":12,"NereusWB922":62,"Arif-Khalid":5,"-":83}},{"path":"src/app/issues-viewer/issues-viewer.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FilterBarModule } from \u0027../shared/filter-bar/filter-bar.module\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssuesPrCardModule } from \u0027../shared/issue-pr-card/issue-pr-card.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { HiddenGroupsComponent } from \u0027./hidden-groups/hidden-groups.component\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerRoutingModule } from \u0027./issues-viewer-routing.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { IssuesViewerComponent } from \u0027./issues-viewer.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [FilterBarModule, IssuesViewerRoutingModule, IssuesPrCardModule, SharedModule],"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" declarations: [IssuesViewerComponent, CardViewComponent, HiddenGroupsComponent],"},{"lineNumber":13,"author":{"gitId":"-"},"content":" exports: [IssuesViewerComponent, CardViewComponent]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class IssuesViewerModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":13}},{"path":"src/app/shared/filter-bar/filter-bar.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".dropdown-filters .mat-form-field {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":4,"author":{"gitId":"-"},"content":" max-width: 20%;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" width: 17%; /* depends on number of filters*/"},{"lineNumber":6,"author":{"gitId":"-"},"content":"}"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":".search-bar {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" width: 90%;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":".dropdown-filters {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":".label-filter-grid-tile {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":".submit-button {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" margin-left: 8px;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":21}},{"path":"src/app/shared/filter-bar/filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-grid-list cols\u003d\"7\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile colspan\u003d\"3\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-form-field class\u003d\"search-bar\"\u003e"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":" \u003cinput"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" matInput"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":" value\u003d\"{{ this.filtersService.filter$.value.title }}\""},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" (keyup)\u003d\"this.filtersService.updateFilters({ title: $event.target.value })\""},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":" placeholder\u003d\"Search\""},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":" /\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile colspan\u003d\"3\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"dropdown-filters\"\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-label\u003eGroup by\u003c/mat-label\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-select"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" [value]\u003d\"this.groupingContextService.currGroupBy$ | async\""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" (selectionChange)\u003d\"this.groupingContextService.setCurrentGroupingType($event.value)\""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" \u003e"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-option *ngFor\u003d\"let option of this.groupByEnum | keyvalue\" [value]\u003d\"option.value\"\u003e{{ option.key }}\u003c/mat-option\u003e"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-select\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStatus\u003c/mat-label\u003e"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-select [value]\u003d\"this.filter.status\" (selectionChange)\u003d\"this.filtersService.updateFilters({ status: $event.value })\" multiple\u003e"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"open pullrequest\"\u003eOpen Pull Requests\u003c/mat-option\u003e"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"merged pullrequest\"\u003eMerged Pull Requests\u003c/mat-option\u003e"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"closed pullrequest\"\u003eClosed Pull Request\u003c/mat-option\u003e"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" value\u003d\"open issue\"\u003eOpen Issues\u003c/mat-option\u003e"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" value\u003d\"closed issue\"\u003eClosed Issues\u003c/mat-option\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eType\u003c/mat-label\u003e"},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-select [value]\u003d\"this.filter.type\" (selectionChange)\u003d\"this.filtersService.updateFilters({ type: $event.value })\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"all\"\u003eAll\u003c/mat-option\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"issue\"\u003eIssue\u003c/mat-option\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"pullrequest\"\u003ePull Request\u003c/mat-option\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":42,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-form-field"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" appearance\u003d\"standard\""},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" matSort"},{"lineNumber":45,"author":{"gitId":"Arif-Khalid"},"content":" [matSortDisableClear]\u003d\"true\""},{"lineNumber":46,"author":{"gitId":"Arif-Khalid"},"content":" (matSortChange)\u003d\"this.filtersService.updateFilters({ sort: $event })\""},{"lineNumber":47,"author":{"gitId":"Arif-Khalid"},"content":" \u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eSort\u003c/mat-label\u003e"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-select [value]\u003d\"this.filter.sort.active\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"id\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"id\"\u003eID\u003c/span\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"title\"\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"title\"\u003eTitle\u003c/span\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"date\"\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"date\"\u003eDate Updated\u003c/span\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":59,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option value\u003d\"status\"\u003e"},{"lineNumber":60,"author":{"gitId":"MadLamprey"},"content":" \u003cspan mat-sort-header\u003d\"status\"\u003eStatus\u003c/span\u003e"},{"lineNumber":61,"author":{"gitId":"MadLamprey"},"content":" \u003c/mat-option\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eMilestone\u003c/mat-label\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-select"},{"lineNumber":67,"author":{"gitId":"-"},"content":" #milestoneSelectorRef"},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" [value]\u003d\"this.filter.milestones\""},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" (selectionChange)\u003d\"this.filtersService.updateFilters({ milestones: $event.value })\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" [disabled]\u003d\"this.milestoneService.hasNoMilestones\""},{"lineNumber":71,"author":{"gitId":"-"},"content":" multiple"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003cmat-select-trigger *ngIf\u003d\"this.milestoneService.hasNoMilestones\"\u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003cspan\u003eNo Milestones\u003c/span\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003c/mat-select-trigger\u003e"},{"lineNumber":76,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-option *ngFor\u003d\"let milestone of this.milestoneService.milestones\" [value]\u003d\"milestone.title\"\u003e"},{"lineNumber":77,"author":{"gitId":"-"},"content":" {{ milestone.title }}"},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":79,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" [value]\u003d\"\u0027Issue without a milestone\u0027\"\u003eIssues without a milestone\u003c/mat-option\u003e"},{"lineNumber":80,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" [value]\u003d\"\u0027PR without a milestone\u0027\"\u003ePRs without a milestone\u003c/mat-option\u003e"},{"lineNumber":81,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":82,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":83,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile class\u003d\"label-filter-grid-tile\" colspan\u003d\"1\"\u003e"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-label-filter-bar\u003e\u003c/app-label-filter-bar\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":"\u003c/mat-grid-list\u003e"}],"authorContributionMap":{"nknguyenhc":6,"Arif-Khalid":18,"NereusWB922":9,"MadLamprey":5,"-":51}},{"path":"src/app/shared/filter-bar/filter-bar.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnDestroy, OnInit, QueryList, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatSelect } from \u0027@angular/material/select\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"import { Filter, FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../../core/services/view.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { FilterableComponent } from \u0027../issue-tables/filterableTypes\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { LabelFilterBarComponent } from \u0027./label-filter-bar/label-filter-bar.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This component is abstracted out filterbar used by both detailed-viewer page"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * and Issues-viewer"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */"},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" selector: \u0027app-filter-bar\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" templateUrl: \u0027./filter-bar.component.html\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./filter-bar.component.css\u0027]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"})"},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":"export class FilterBarComponent implements OnInit, OnDestroy {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Input() views$: BehaviorSubject\u003cQueryList\u003cFilterableComponent\u003e\u003e;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" /** Selected dropdown filter value */"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" filter: Filter \u003d this.filtersService.defaultFilter();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" groupByEnum: typeof GroupBy \u003d GroupBy;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /** Milestone subscription */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" milestoneSubscription: Subscription;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @ViewChild(LabelFilterBarComponent, { static: true }) labelFilterBar: LabelFilterBarComponent;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" @ViewChild(\u0027milestoneSelectorRef\u0027, { static: false }) milestoneSelectorRef: MatSelect;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"Arif-Khalid"},"content":" constructor("},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" public milestoneService: MilestoneService,"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" public filtersService: FiltersService,"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" private logger: LoggingService"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" ) {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" this.repoChangeSubscription \u003d this.viewService.repoChanged$.subscribe((newRepo) \u003d\u003e this.newRepoInitialize());"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" this.newRepoInitialize();"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" // One-time initializations"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.filter$.subscribe((filter) \u003d\u003e {"},{"lineNumber":53,"author":{"gitId":"Arif-Khalid"},"content":" this.filter \u003d filter;"},{"lineNumber":54,"author":{"gitId":"Arif-Khalid"},"content":" this.applyFilter();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" });"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" this.views$.subscribe(() \u003d\u003e this.applyFilter());"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.milestoneSubscription.unsubscribe();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Signals to IssuesDataTable that a change has occurred in filter."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" applyFilter() {"},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" this.views$?.value?.forEach((v) \u003d\u003e (v.retrieveFilterable().filter \u003d this.filter));"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Checks if program is filtering by type issue."},{"lineNumber":74,"author":{"gitId":"-"},"content":" */"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" isFilterIssue() {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" return this.filter.type \u003d\u003d\u003d \u0027issue\u0027 || this.filter.type \u003d\u003d\u003d \u0027all\u0027;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" isFilterPullRequest() {"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" return this.filter.type \u003d\u003d\u003d \u0027pullrequest\u0027 || this.filter.type \u003d\u003d\u003d \u0027all\u0027;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":85,"author":{"gitId":"Arif-Khalid"},"content":" * Re-called when repo has changed"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" private newRepoInitialize() {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // Fetch milestones and update dropdown filter"},{"lineNumber":89,"author":{"gitId":"-"},"content":" this.milestoneSubscription \u003d this.milestoneService.fetchMilestones().subscribe("},{"lineNumber":90,"author":{"gitId":"-"},"content":" (response) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027IssuesViewerComponent: Fetched milestones from Github\u0027);"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.sanitizeMilestones(this.milestoneService.milestones);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" },"},{"lineNumber":94,"author":{"gitId":"-"},"content":" (err) \u003d\u003e {},"},{"lineNumber":95,"author":{"gitId":"-"},"content":" () \u003d\u003e {}"},{"lineNumber":96,"author":{"gitId":"-"},"content":" );"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":6,"Arif-Khalid":17,"-":69}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"::ng-deep.mat-menu-content:not(:empty) {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" /* Override mat-menu-content\u0027s non-empty default CSS. */"},{"lineNumber":3,"author":{"gitId":"-"},"content":" padding-top: 0px !important;"},{"lineNumber":4,"author":{"gitId":"-"},"content":" padding-bottom: 0px !important;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"}"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"::ng-deep.mat-menu-panel {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Override mat-menu-panel\u0027s default CSS. */"},{"lineNumber":9,"author":{"gitId":"-"},"content":" width: 280px;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" max-width: none !important;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":".popup-container {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" flex-direction: column;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":".popupmenu {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" width: max-content;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":".scroll-container {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" max-height: 400px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" overflow-y: auto;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -ms-overflow-style: none; /* IE and Edge */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" scrollbar-width: none; /* Firefox */"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":31,"author":{"gitId":"-"},"content":".scroll-container::before {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" height: 7px;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":40,"author":{"gitId":"-"},"content":"}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":".scroll-container::after {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" position: sticky;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" top: 100%;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" height: 7px;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":".scroll-container-wrapper {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":56,"author":{"gitId":"-"},"content":"}"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":".scroll-container-wrapper::before {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":60,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" top: 0;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":66,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":67,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.7), transparent);"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":".scroll-container-wrapper::after {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" bottom: 0;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":79,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.7), transparent);"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":".scroll-container::-webkit-scrollbar {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" display: none; /* Hide scrollbar for Chrome, Safari and Opera */"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":".flexbox-container {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" flex-direction: row;"},{"lineNumber":89,"author":{"gitId":"-"},"content":" justify-content: flex-start;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 10px;"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" padding: 0px 12px;"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 4px;"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" box-sizing: border-box;"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":".flexbox-container:hover {"},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgba(0, 0, 0, 0.04);"},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":".flexbox-container-strikethrough {"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" top: 50%;"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" width: 90%;"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":" left: 50%;"},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" transform: translate(-50%, -50%);"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" height: 2px;"},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":" background-color: black;"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":".input-field {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" width: calc(100% - (2 * 15px)); /* To account for left and right padding. */"},{"lineNumber":115,"author":{"gitId":"-"},"content":" padding: 0 15px;"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":".mat-chip {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" height: auto;"},{"lineNumber":120,"author":{"gitId":"-"},"content":" padding: 5.5px 7px;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" line-height: 1.1em;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" position: inherit;"},{"lineNumber":123,"author":{"gitId":"-"},"content":" border-radius: 6px;"},{"lineNumber":124,"author":{"gitId":"-"},"content":" font-size: 12px;"},{"lineNumber":125,"author":{"gitId":"-"},"content":" min-height: 16px;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" max-height: 42px;"},{"lineNumber":127,"author":{"gitId":"-"},"content":" margin: 0px;"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":".mat-stroked-button {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" font-weight: normal;"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":".hidden {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" display: none !important;"},{"lineNumber":136,"author":{"gitId":"-"},"content":"}"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":"mat-list-option {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" width: max-content;"},{"lineNumber":140,"author":{"gitId":"-"},"content":"}"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":".no-labels {"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /* Chosen to look similar to button above. */"},{"lineNumber":144,"author":{"gitId":"-"},"content":" padding: 0 16px;"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":146,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":20,"-":126}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button *ngIf\u003d\"loaded\" [matMenuTriggerFor]\u003d\"menu\"\u003e"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" {{ selectedLabelNames.size \u003d\u003d\u003d 0 ? \u0027All\u0027 : selectedLabelNames.size }} Selected | {{ hiddenLabelNames?.size || 0 }} Hidden â–¾"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button disabled *ngIf\u003d\"!loaded\" color\u003d\"accent\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cmat-progress-bar mode\u003d\"query\"\u003e\u003c/mat-progress-bar\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003cmat-menu #menu\u003d\"matMenu\" class\u003d\"popupmenu\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv (click)\u003d\"$event.stopPropagation()\" class\u003d\"popup-container\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\" class\u003d\"input-field\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eLabels\u003c/mat-label\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cinput #input matInput placeholder\u003d\"Find labels\" /\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"removeAllSelection()\"\u003eRemove all\u003c/button\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!hasLabels(input.value)\" class\u003d\"no-labels\"\u003eNo Labels Found!\u003c/div\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container-wrapper\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container\"\u003e"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":" *ngFor\u003d\"let label of this.allLabels\""},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":" class\u003d\"flexbox-container\""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"changeLabelState(label)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" [class.hidden]\u003d\"filter(input.value, label.name)\""},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" [style]\u003d\"{ border: \u00272px solid \u0027 + getColor(label) }\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"!hiddenLabelNames.has(label.name)\" (click)\u003d\"hide(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility\u003c/mat-icon\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"hiddenLabelNames.has(label.name)\" (click)\u003d\"show(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility_off\u003c/mat-icon\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":36,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"labelService.setLabelStyle(label.color)\""},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" [disabled]\u003d\"hiddenLabelNames.has(label.name)\""},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"changeLabelState(label)\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" {{ label.name }}"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngIf\u003d\"deselectedLabelNames.has(label.name)\" class\u003d\"flexbox-container-strikethrough\"\u003e\u003c/div\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003c/mat-menu\u003e"}],"authorContributionMap":{"nknguyenhc":12,"-":35}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SimpleLabel } from \u0027../../../core/models/label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../../../core/services/filters.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-label-filter-bar\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./label-filter-bar.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./label-filter-bar.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class LabelFilterBarComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DEFAULT_LABEL_COLOR: string \u003d \u0027transparent\u0027;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DESELECTED_LABEL_COLOR: string \u003d \u0027#b00020\u0027;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" private static readonly SELECTED_LABEL_COLOR: string \u003d \u0027#41c300\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" labels$: Observable\u003cSimpleLabel[]\u003e;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" allLabels: SimpleLabel[];"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" selectedLabelNames: Set\u003cstring\u003e \u003d new Set\u003cstring\u003e();"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabelNames: Set\u003cstring\u003e \u003d new Set\u003cstring\u003e();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" hiddenLabelNames: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":23,"author":{"gitId":"-"},"content":" loaded \u003d false;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" labelSubscription: Subscription;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" constructor(private labelService: LabelService, private logger: LoggingService, private filtersService: FiltersService) {}"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.loaded \u003d false;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.load();"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.labels$ \u003d this.labelService.connect();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.labels$.subscribe((labels) \u003d\u003e {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.allLabels \u003d labels;"},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.sanitizeLabels(this.allLabels);"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames \u003d new Set\u003cstring\u003e(this.filtersService.filter$.value.labels);"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames \u003d this.filtersService.filter$.value.deselectedLabels;"},{"lineNumber":42,"author":{"gitId":"Arif-Khalid"},"content":" this.hiddenLabelNames \u003d this.filtersService.filter$.value.hiddenLabels;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" });"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.labelSubscription?.unsubscribe();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" hide(label: string): void {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (this.hiddenLabelNames.has(label)) {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.add(label);"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.updateFilters({ hiddenLabels: this.hiddenLabelNames });"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" /** Show labels that were hidden */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" show(label: string): void {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!this.hiddenLabelNames.has(label)) {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.delete(label);"},{"lineNumber":66,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.updateFilters({ hiddenLabels: this.hiddenLabelNames });"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" * Change label to the next state."},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" * Label has the following state rotation: default -\u003e selected -\u003e deselected."},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" * @param label The label to change state"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" changeLabelState(label: SimpleLabel) {"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" if (this.selectedLabelNames.has(label.name)) {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames.delete(label.name);"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames.add(label.name);"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" } else if (this.deselectedLabelNames.has(label.name)) {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames.delete(label.name);"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames.add(label.name);"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" this.updateSelection();"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" * Returns the border color of the label."},{"lineNumber":88,"author":{"gitId":"nknguyenhc"},"content":" * The border color represents the state of the label."},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" getColor(label: SimpleLabel): string {"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" if (this.selectedLabelNames.has(label.name)) {"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.SELECTED_LABEL_COLOR;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" } else if (this.deselectedLabelNames.has(label.name)) {"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.DESELECTED_LABEL_COLOR;"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.DEFAULT_LABEL_COLOR;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" /** loads in the labels in the repository */"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public load() {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" this.labelService.startPollLabels();"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.labelSubscription \u003d this.labelService.fetchLabels().subscribe("},{"lineNumber":104,"author":{"gitId":"-"},"content":" (response) \u003d\u003e {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027LabelFilterBarComponent: Fetched labels from Github\u0027);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" },"},{"lineNumber":107,"author":{"gitId":"-"},"content":" (err) \u003d\u003e {},"},{"lineNumber":108,"author":{"gitId":"-"},"content":" () \u003d\u003e {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.loaded \u003d true;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" );"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" filter(filter: string, target: string): boolean {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return !target.toLowerCase().includes(filter.toLowerCase());"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" hasLabels(filter: string): boolean {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (this.allLabels \u003d\u003d\u003d undefined || this.allLabels.length \u003d\u003d\u003d 0) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" return this.allLabels.some((label) \u003d\u003e !this.filter(filter, label.name));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" updateSelection(): void {"},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" this.filtersService.updateFilters({"},{"lineNumber":127,"author":{"gitId":"nknguyenhc"},"content":" labels: Array.from(this.selectedLabelNames),"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: this.deselectedLabelNames"},{"lineNumber":129,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" removeAllSelection(): void {"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames \u003d new Set\u003cstring\u003e();"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames \u003d new Set\u003cstring\u003e();"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.updateSelection();"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":39,"Arif-Khalid":9,"-":89}},{"path":"src/app/shared/issue-pr-card/issue-pr-card-labels/issue-pr-card-labels.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { GithubLabel } from \u0027../../../core/models/github/github-label.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":6,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card-labels\u0027,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card-labels.component.html\u0027,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card-labels.component.css\u0027]"},{"lineNumber":9,"author":{"gitId":"-"},"content":"})"},{"lineNumber":10,"author":{"gitId":"-"},"content":"export class IssuePrCardLabelsComponent {"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" @Input() labels: GithubLabel[];"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" @Input() labelSet: Set\u003cstring\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" constructor(public labelService: LabelService) {}"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":3,"-":11}},{"path":"src/app/shared/issue-pr-card/issue-pr-card.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-card class\u003d\"card\" [ngClass]\u003d\"getIssueOpenOrCloseColorCSSClass()\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ca class\u003d\"no-underline link-grey-dark\" (click)\u003d\"viewIssueInBrowser($event)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cspan [matTooltip]\u003d\"this.issue.updated_at\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003capp-issue-pr-card-header [issue]\u003d\"issue\"\u003e\u003c/app-issue-pr-card-header\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cmat-card-content\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003capp-issue-pr-card-milestone [milestone]\u003d\"issue.milestone\"\u003e\u003c/app-issue-pr-card-milestone\u003e"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-issue-pr-card-labels [labels]\u003d\"issue.githubLabels\" [labelSet]\u003d\"filter?.hiddenLabels\"\u003e\u003c/app-issue-pr-card-labels\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/mat-card-content\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/a\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c/mat-card\u003e"}],"authorContributionMap":{"Arif-Khalid":1,"-":10}},{"path":"src/app/shared/issue-pr-card/issue-pr-card.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class IssuePrCardComponent {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Input() issue: Issue;"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" @Input() filter?: Filter;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" constructor(private logger: LoggingService, private githubService: GithubService, public labelService: LabelService) {}"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" /** Opens issue in new window */"},{"lineNumber":20,"author":{"gitId":"-"},"content":" viewIssueInBrowser(event: Event) {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.logger.info(`CardViewComponent: Opening Issue ${this.issue.id} on Github`);"},{"lineNumber":22,"author":{"gitId":"-"},"content":" this.githubService.viewIssueInBrowser(this.issue.id, event);"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" /** Returns CSS class for border color */"},{"lineNumber":26,"author":{"gitId":"-"},"content":" getIssueOpenOrCloseColorCSSClass() {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (this.issue.state \u003d\u003d\u003d \u0027OPEN\u0027) {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" if (this.issue.isDraft) {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return \u0027grey\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return \u0027border-green\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":" } else if (this.issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027 \u0026\u0026 this.issue.state \u003d\u003d\u003d \u0027CLOSED\u0027) {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return \u0027border-red\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" } else if (this.issue.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027 \u0026\u0026 this.issue.stateReason \u003d\u003d\u003d \u0027NOT_PLANNED\u0027) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return \u0027border-gray\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return \u0027border-purple\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Truncates description to fit in card content."},{"lineNumber":44,"author":{"gitId":"-"},"content":" * @param description - Description of Issue that is to be displayed."},{"lineNumber":45,"author":{"gitId":"-"},"content":" */"},{"lineNumber":46,"author":{"gitId":"-"},"content":" fitDescriptionText(): string {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":48,"author":{"gitId":"-"},"content":" const MAX_CHARACTER_LENGTH \u003d 72;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" return this.issue.description.slice(0, MAX_CHARACTER_LENGTH) + ELLIPSES;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"-":51}},{"path":"src/app/shared/issue-tables/IssuesDataTable.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { DataSource } from \u0027@angular/cdk/table\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, merge, Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":"import { Filter, FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":"import { applyDropdownFilter } from \u0027./dropdownfilter\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { FilterableSource } from \u0027./filterableTypes\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027./issue-paginator\u0027;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":"import { applySort } from \u0027./issue-sorter\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027./search-filter\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"export class IssuesDataTable extends DataSource\u003cIssue\u003e implements FilterableSource {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public count \u003d 0;"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" private filterChange \u003d new BehaviorSubject(this.filtersService.defaultFilter());"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private issuesSubject \u003d new BehaviorSubject\u003cIssue[]\u003e([]);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private issueSubscription: Subscription;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" public isLoading$ \u003d this.issueService.isLoading.asObservable();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":26,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" private groupingContextService: GroupingContextService,"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" private filtersService: FiltersService,"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" private milestoneService: MilestoneService,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private paginator: MatPaginator,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private displayedColumn: string[],"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" private group?: Group,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private defaultFilter?: (issue: Issue) \u003d\u003e boolean"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" super();"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" connect(): Observable\u003cIssue[]\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return this.issuesSubject.asObservable();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" disconnect() {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.filterChange.complete();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.issuesSubject.complete();"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" if (this.issueSubscription) {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.issueSubscription.unsubscribe();"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.issueService.stopPollIssues();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" loadIssues() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" let page;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (this.paginator !\u003d\u003d undefined) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" page \u003d this.paginator.page;"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" const displayDataChanges \u003d [this.issueService.issues$, page, this.filterChange].filter((x) \u003d\u003e x !\u003d\u003d undefined);"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" this.issueService.startPollIssues();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.issueSubscription \u003d merge(...displayDataChanges)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":62,"author":{"gitId":"-"},"content":" // maps each change in display value to new issue ordering or filtering"},{"lineNumber":63,"author":{"gitId":"-"},"content":" map(() \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" let data \u003d \u003cIssue[]\u003eObject.values(this.issueService.issues$.getValue()).reverse();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (this.defaultFilter) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" data \u003d data.filter(this.defaultFilter);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Filter by assignee of issue"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" data \u003d this.groupingContextService.getDataForGroup(data, this.group);"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"Arif-Khalid"},"content":" // Apply Filters"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" data \u003d applyDropdownFilter(this.filter, data, !this.milestoneService.hasNoMilestones);"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"Arif-Khalid"},"content":" data \u003d applySearchFilter(this.filter.title, this.displayedColumn, this.issueService, data);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" this.count \u003d data.length;"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"Arif-Khalid"},"content":" data \u003d applySort(this.filter.sort, data);"},{"lineNumber":78,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (this.paginator !\u003d\u003d undefined) {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" data \u003d paginateData(this.paginator, data);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":83,"author":{"gitId":"-"},"content":" })"},{"lineNumber":84,"author":{"gitId":"-"},"content":" )"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .subscribe((issues) \u003d\u003e {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.issuesSubject.next(issues);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" });"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"Arif-Khalid"},"content":" get filter(): Filter {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this.filterChange.value;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"Arif-Khalid"},"content":" set filter(filter: Filter) {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.filterChange.next(filter);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":7,"Arif-Khalid":9,"-":75}},{"path":"src/app/shared/issue-tables/dropdownfilter.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":""},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"type StatusInfo \u003d {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" type: string;"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" status: string;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"};"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" * Converts a status string into an info object"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":"const infoFromStatus \u003d (statusString: string): StatusInfo \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" const [status, type] \u003d statusString.split(\u0027 \u0027);"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" return { status, type };"},{"lineNumber":15,"author":{"gitId":"-"},"content":"};"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * This module serves to improve separation of concerns in IssuesDataTable.ts and IssueList.ts module by containing the logic for"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * applying dropdownFilter to the issues data table in this module."},{"lineNumber":20,"author":{"gitId":"-"},"content":" * This module exports a single function applyDropDownFilter which is called by IssueList."},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":" * This functions returns the data passed in after all the filters of dropdownFilters are applied"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"export function applyDropdownFilter(filter: Filter, data: Issue[], isFilteringByMilestone: boolean): Issue[] {"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" const filteredData: Issue[] \u003d data.filter((issue) \u003d\u003e {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" let ret \u003d true;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" // status can either be \u0027open\u0027, \u0027closed\u0027, or \u0027merged\u0027"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" ret \u0026\u0026"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" filter.status.some((item) \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" const statusInfo \u003d infoFromStatus(item);"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" return statusInfo.status \u003d\u003d\u003d issue.state.toLowerCase() \u0026\u0026 statusInfo.type \u003d\u003d\u003d issue.issueOrPr.toLowerCase();"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"Arif-Khalid"},"content":" if (filter.type \u003d\u003d\u003d \u0027issue\u0027) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" ret \u003d ret \u0026\u0026 issue.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027;"},{"lineNumber":37,"author":{"gitId":"Arif-Khalid"},"content":" } else if (filter.type \u003d\u003d\u003d \u0027pullrequest\u0027) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ret \u003d ret \u0026\u0026 issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d ret \u0026\u0026 (!isFilteringByMilestone || filter.milestones.some((milestone) \u003d\u003e issue.milestone.title \u003d\u003d\u003d milestone));"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d ret \u0026\u0026 issue.labels.every((label) \u003d\u003e !filter.deselectedLabels.has(label));"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" return ret \u0026\u0026 filter.labels.every((label) \u003d\u003e issue.labels.includes(label));"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":45,"author":{"gitId":"Arif-Khalid"},"content":" return filteredData;"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":18,"Arif-Khalid":8,"-":20}},{"path":"src/app/shared/issue-tables/filterableTypes.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"-"},"content":" * This module aims to abstract out classes that can be filtered"},{"lineNumber":3,"author":{"gitId":"-"},"content":" */"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * FilterableSource is an interface that contains a source that can be filtered"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * by a string filter or dropdownFilter."},{"lineNumber":10,"author":{"gitId":"-"},"content":" * The source should set filter and dropdownFilter as a getter and setter"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * and applies the filter when these variables are changed."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export interface FilterableSource {"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" filter: Filter;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * FilterComponent is a component that contains a FilterableSource"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export interface FilterableComponent {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" retrieveFilterable: () \u003d\u003e FilterableSource;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":3,"-":19}},{"path":"src/app/shared/issue-tables/issue-sorter.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { Sort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"export function applySort(sort: Sort, data: Issue[]): Issue[] {"},{"lineNumber":6,"author":{"gitId":"-"},"content":" if (!sort.active) {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":8,"author":{"gitId":"-"},"content":" }"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":" const direction: number \u003d sort.direction \u003d\u003d\u003d \u0027asc\u0027 ? 1 : -1;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" switch (sort.active) {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" case \u0027id\u0027:"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByIntegerValue(a.id, b.id));"},{"lineNumber":15,"author":{"gitId":"-"},"content":" case \u0027date\u0027:"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByDateValue(a.updated_at, b.updated_at));"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" case \u0027status\u0027:"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByIssueType(a, b));"},{"lineNumber":19,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // title, responseTag are string values"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByStringValue(a[sort.active], b[sort.active]));"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"function compareByStringValue(valueA: string, valueB: string): number {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" const orderA \u003d String(valueA || \u0027\u0027).toUpperCase();"},{"lineNumber":27,"author":{"gitId":"-"},"content":" const orderB \u003d String(valueB || \u0027\u0027).toUpperCase();"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return orderA \u003c orderB ? -1 : 1;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":"function compareByIntegerValue(valueA: number, valueB: number): number {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return valueA \u003c valueB ? -1 : 1;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":"function compareByDateValue(valueA: string, valueB: string): number {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return moment(valueA).isBefore(valueB) ? -1 : 1;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"}"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":"function compareByIssueType(valueA: Issue, valueB: Issue): number {"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":" const sortOrder \u003d {"},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" \u0027OPEN PullRequest\u0027: 0,"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" \u0027OPEN Issue\u0027: 1,"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" \u0027MERGED PullRequest\u0027: 2,"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" \u0027CLOSED Issue\u0027: 3,"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":" \u0027CLOSED PullRequest\u0027: 4"},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" };"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" const aOrder \u003d sortOrder[valueA.state + \u0027 \u0027 + valueA.issueOrPr] || -1;"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" const bOrder \u003d sortOrder[valueB.state + \u0027 \u0027 + valueB.issueOrPr] || -1;"},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" if (aOrder \u003d\u003d\u003d bOrder) {"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":" return compareByStringValue(valueA.title, valueB.title);"},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" } else if (aOrder \u003e bOrder) {"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":" return 1;"},{"lineNumber":55,"author":{"gitId":"MadLamprey"},"content":" } else {"},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" return -1;"},{"lineNumber":57,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":58,"author":{"gitId":"MadLamprey"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"MadLamprey":26,"-":30}},{"path":"src/app/shared/layout/header.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-toolbar color\u003d\"primary\" style\u003d\"position: sticky; position: -webkit-sticky; top: 0; z-index: 1000\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":3,"author":{"gitId":"-"},"content":" *ngIf\u003d\"isBackButtonShown()\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" mat-icon-button"},{"lineNumber":5,"author":{"gitId":"-"},"content":" class\u003d\"mat-toolbar mat-primary back-button\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.9)\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (click)\u003d\"goBack()\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003earrow_back_ios\u003c/mat-icon\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003ca class\u003d\"mat-toolbar mat-primary\" style\u003d\"text-decoration: none\" [routerLink]\u003d\"viewService.isRepoSet() ? viewService.currentView : null\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003eWATcher v{{ this.getVersion() }}\u003c/a"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" \u003cspan id\u003d\"view-descriptor\" *ngIf\u003d\"auth.isAuthenticated()\" style\u003d\"margin-left: 70px\"\u003e"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" {{ this.presetViews[this.filtersService.presetView$.value] }}"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" \u003c!-- Gateway to activity dashboard, do not delete --\u003e"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" \u003c!--div *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 this.viewService.sessionData.sessionRepo.length \u003e 1\"\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mat-menu-item"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" *ngFor\u003d\"let sessionRepo of this.viewService.sessionData.sessionRepo\""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"this.routeToSelectedView(sessionRepo.view)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cspan\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-icon [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.viewService.currentView \u003d\u003d\u003d sessionRepo.view ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" {{ this.getViewDescription(sessionRepo.view) }}"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div--\u003e"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated()\"\u003e"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngFor\u003d\"let presetView of this.presetViews | keyvalue\"\u003e"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-menu-item *ngIf\u003d\"presetView.key !\u003d\u003d \u0027custom\u0027\" (click)\u003d\"this.filtersService.updatePresetView(presetView.key)\"\u003e"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" \u003cspan\u003e"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-icon"},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":" [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.filtersService.presetView$.value \u003d\u003d\u003d presetView.key ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" \u003e"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":" {{ presetView.value }}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" \u003c/span\u003e"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" \u003c/button\u003e"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c!-- everything else --\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet()\"\u003e"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" \u003cspan id\u003d\"view-descriptor\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" {{ this.currentRepo || \u0027No Repository Set\u0027 }}"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":63,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" matTooltip\u003d\"{{ viewService.isRepoSet() ? \u0027Change Repository\u0027 : \u0027Select Repository\u0027 }}\""},{"lineNumber":65,"author":{"gitId":"-"},"content":" (click)\u003d\"this.openChangeRepoDialog()\""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eedit\u003c/mat-icon\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Download WATcher Log\" (click)\u003d\"this.exportLogFile()\"\u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003ereceipt\u003c/mat-icon\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Give feedback about WATcher\" (click)\u003d\"openIssueTracker()\"\u003e"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003email\u003c/mat-icon\u003e"},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet() \u0026\u0026 isOpenUrlButtonShown()\""},{"lineNumber":82,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":83,"author":{"gitId":"-"},"content":" matTooltip\u003d\"View current page on GitHub\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" (click)\u003d\"viewBrowser()\""},{"lineNumber":85,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eopen_in_new\u003c/mat-icon\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 (this.isLoading$ | async); else notLoading\"\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":91,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" \u003cng-template #notLoading\u003e"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet() \u0026\u0026 isReloadButtonShown() \u0026\u0026 !this.isReloadButtonDisabled\""},{"lineNumber":96,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":97,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Synchronize with Github data\""},{"lineNumber":98,"author":{"gitId":"-"},"content":" (click)\u003d\"reload()\""},{"lineNumber":99,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Sync"},{"lineNumber":101,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003erefresh\u003c/mat-icon\u003e"},{"lineNumber":102,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 isReloadButtonShown() \u0026\u0026 this.isReloadButtonDisabled\"\u003e"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"font-size: 14px; margin-right: 7px\"\u003eSync\u003c/span\u003e"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u003cbutton *ngIf\u003d\"auth.isAuthenticated()\" mat-button matTooltip\u003d\"Log out\" (click)\u003d\"openLogOutDialog(); $event.stopPropagation()\"\u003e"},{"lineNumber":110,"author":{"gitId":"-"},"content":" ({{ userService.currentUser.loginId }})"},{"lineNumber":111,"author":{"gitId":"-"},"content":" \u003cmat-icon style\u003d\"margin-left: 2px\"\u003eexit_to_app\u003c/mat-icon\u003e"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003c/mat-toolbar\u003e"}],"authorContributionMap":{"nknguyenhc":21,"NereusWB922":10,"-":82}},{"path":"src/app/shared/layout/header.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Location } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Component, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router, RoutesRecognized } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { filter, pairwise, switchMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../../core/constants/storage-keys.constants\u0027;"},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":"import { RepoChangeResponse } from \u0027../../core/models/repo-change-response.model\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../../core/models/repo.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../core/models/view.model\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../../core/services/auth.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { DialogService } from \u0027../../core/services/dialog.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027../../core/services/repo-session-storage.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027../../core/services/repo-url-cache.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../core/services/user.service\u0027;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"import { ViewDescription, ViewService } from \u0027../../core/services/view.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"const ISSUE_TRACKER_URL \u003d \u0027https://github.com/CATcher-org/WATcher/issues\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":29,"author":{"gitId":"-"},"content":" selector: \u0027app-layout-header\u0027,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" templateUrl: \u0027./header.component.html\u0027"},{"lineNumber":31,"author":{"gitId":"-"},"content":"})"},{"lineNumber":32,"author":{"gitId":"-"},"content":"export class HeaderComponent implements OnInit {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private prevUrl;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" isReloadButtonDisabled \u003d false;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ISSUE_FILTER \u003d \u0027/issues?q\u003dis:issue+is:all\u0027; // the filtered list must be an issue and must be open"},{"lineNumber":36,"author":{"gitId":"-"},"content":" TUTORIAL_LABEL \u003d \u0027+label:tutorial.\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" TEAM_LABEL \u003d \u0027+label:team.\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" EXCLUDE_DUPLICATE \u003d \u0027+-label:duplicate\u0027; // exclude duplicate issues"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" public isLoading$: Observable\u003cboolean\u003e;"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" // Messages for the modal popup window upon logging out"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private readonly logOutDialogMessages \u003d [\u0027Do you wish to log out?\u0027];"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private readonly yesButtonDialogMessage \u003d \u0027Yes, I wish to log out\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private readonly noButtonDialogMessage \u003d \"No, I don\u0027t wish to log out\";"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":" readonly presetViews: {"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" [key: string]: string;"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" } \u003d {"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" currentlyActive: \u0027Currently active\u0027,"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" contributions: \u0027Contributions\u0027,"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" custom: \u0027Custom\u0027"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" /** Model for the displayed repository name */"},{"lineNumber":56,"author":{"gitId":"-"},"content":" currentRepo \u003d \u0027\u0027;"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":59,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public auth: AuthService,"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" public viewService: ViewService,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public userService: UserService,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public logger: LoggingService,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private location: Location,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private githubEventService: GithubEventService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private labelService: LabelService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private dialogService: DialogService,"},{"lineNumber":72,"author":{"gitId":"Arif-Khalid"},"content":" private repoSessionStorageService: RepoSessionStorageService,"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" private filtersService: FiltersService,"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" private groupingContextService: GroupingContextService"},{"lineNumber":75,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" router.events"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":78,"author":{"gitId":"-"},"content":" filter((e: any) \u003d\u003e e instanceof RoutesRecognized),"},{"lineNumber":79,"author":{"gitId":"-"},"content":" pairwise()"},{"lineNumber":80,"author":{"gitId":"-"},"content":" )"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .subscribe((e) \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.prevUrl \u003d e[0].urlAfterRedirects;"},{"lineNumber":83,"author":{"gitId":"-"},"content":" });"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.auth.currentAuthState.subscribe(() \u003d\u003e {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (auth.isAuthenticated() \u0026\u0026 !repoSessionStorageService.hasRepoLocation()) {"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" if (!this.auth.hasNext()) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.openChangeRepoDialog();"},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" this.auth.redirectToNext();"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }"},{"lineNumber":93,"author":{"gitId":"-"},"content":" });"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" this.viewService.repoSetState.subscribe((state) \u003d\u003e {"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" if (auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet()) {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" this.initializeRepoNameInTitle();"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":" });"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" this.viewService.repoChanged$.subscribe((repo) \u003d\u003e {"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" this.initializeRepoNameInTitle();"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" this.isLoading$ \u003d this.issueService.isLoading.asObservable();"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" ngOnInit() {}"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" * Replaces and resets the current view data and routes the app to the"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" * newly selected view."},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" * @param selectedView - Selected View that is selected by the user."},{"lineNumber":114,"author":{"gitId":"-"},"content":" */"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" routeToSelectedView(selectedView: string): void {"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" // Do nothing if the selected view is the current view."},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.currentView \u003d\u003d\u003d View[selectedView]) {"},{"lineNumber":118,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" // Replace Current View Data."},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" this.viewService.changeView(View[selectedView]);"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" // Remove current view issues and load selected view issues."},{"lineNumber":125,"author":{"gitId":"-"},"content":" this.githubService.reset();"},{"lineNumber":126,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":127,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":128,"author":{"gitId":"-"},"content":" this.reload();"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":" // Route app to new view."},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":" this.router.navigateByUrl(this.viewService.currentView);"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" isBackButtonShown(): boolean {"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" return `/${this.viewService.currentView}` !\u003d\u003d this.router.url \u0026\u0026 this.router.url !\u003d\u003d \u0027/\u0027 \u0026\u0026 !this.router.url.startsWith(\u0027/?code\u0027);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" isReloadButtonShown(): boolean {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return this.router.url !\u003d\u003d \u0027/phaseBugReporting/issues/new\u0027;"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" isOpenUrlButtonShown(): boolean {"},{"lineNumber":143,"author":{"gitId":"NereusWB922"},"content":" return this.viewService.currentView \u003d\u003d\u003d View.issuesViewer || this.viewService.currentView \u003d\u003d\u003d View.activityDashboard;"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" getVersion(): string {"},{"lineNumber":147,"author":{"gitId":"-"},"content":" return AppConfig.version;"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }"},{"lineNumber":149,"author":{"gitId":"-"},"content":""},{"lineNumber":150,"author":{"gitId":"NereusWB922"},"content":" getViewDescription(openView: string): string {"},{"lineNumber":151,"author":{"gitId":"NereusWB922"},"content":" return ViewDescription[openView];"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }"},{"lineNumber":153,"author":{"gitId":"-"},"content":""},{"lineNumber":154,"author":{"gitId":"-"},"content":" goBack() {"},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" if (this.prevUrl \u003d\u003d\u003d `/${this.viewService.currentView}/issues/new`) {"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" this.router.navigateByUrl(this.viewService.currentView);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" this.location.back();"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":" viewBrowser() {"},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.currentView \u003d\u003d\u003d View.activityDashboard) {"},{"lineNumber":164,"author":{"gitId":"NereusWB922"},"content":" window.open(`https://github.com/${this.viewService.currentRepo.owner}/${this.viewService.currentRepo.name}/pulse`);"},{"lineNumber":165,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }"},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":" const routerUrl \u003d this.router.url.substring(1); // remove the first \u0027/\u0027 from string"},{"lineNumber":169,"author":{"gitId":"-"},"content":" const issueUrlIndex \u003d routerUrl.indexOf(\u0027/\u0027); // find the index of second \u0027/\u0027"},{"lineNumber":170,"author":{"gitId":"-"},"content":" let issueUrl: string;"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" // If can\u0027t find the index of second \u0027/\u0027, then router is at the /issues (table list) page"},{"lineNumber":173,"author":{"gitId":"-"},"content":" if (issueUrlIndex \u003c 0) {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // Apply filters to the issueUrl"},{"lineNumber":175,"author":{"gitId":"-"},"content":" issueUrl \u003d this.ISSUE_FILTER;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":177,"author":{"gitId":"-"},"content":" // issueUrl will be from the second \u0027/\u0027"},{"lineNumber":178,"author":{"gitId":"-"},"content":" issueUrl \u003d routerUrl.substring(issueUrlIndex);"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // Open the url in user\u0027s preferred browser"},{"lineNumber":181,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.githubService.getRepoURL()).concat(issueUrl));"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" openIssueTracker() {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" window.open(ISSUE_TRACKER_URL);"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d true;"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" this.githubEventService.reloadPage().subscribe("},{"lineNumber":192,"author":{"gitId":"-"},"content":" (success) \u003d\u003e success,"},{"lineNumber":193,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":194,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error, () \u003d\u003e this.githubEventService.reloadPage());"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }"},{"lineNumber":196,"author":{"gitId":"-"},"content":" );"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" this.labelService.fetchLabels().subscribe("},{"lineNumber":199,"author":{"gitId":"-"},"content":" (success) \u003d\u003e success,"},{"lineNumber":200,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":201,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error, () \u003d\u003e this.labelService.fetchLabels());"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }"},{"lineNumber":203,"author":{"gitId":"-"},"content":" );"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" // Prevent user from spamming the reload button"},{"lineNumber":206,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d false;"},{"lineNumber":208,"author":{"gitId":"-"},"content":" }, 3000);"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":" logOut() {"},{"lineNumber":212,"author":{"gitId":"-"},"content":" this.auth.logOut();"},{"lineNumber":213,"author":{"gitId":"-"},"content":" }"},{"lineNumber":214,"author":{"gitId":"-"},"content":""},{"lineNumber":215,"author":{"gitId":"-"},"content":" openLogOutDialog() {"},{"lineNumber":216,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openUserConfirmationModal("},{"lineNumber":217,"author":{"gitId":"-"},"content":" this.logOutDialogMessages,"},{"lineNumber":218,"author":{"gitId":"-"},"content":" this.yesButtonDialogMessage,"},{"lineNumber":219,"author":{"gitId":"-"},"content":" this.noButtonDialogMessage"},{"lineNumber":220,"author":{"gitId":"-"},"content":" );"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" dialogRef.afterClosed().subscribe((res) \u003d\u003e {"},{"lineNumber":223,"author":{"gitId":"-"},"content":" if (res) {"},{"lineNumber":224,"author":{"gitId":"-"},"content":" this.logger.info(`HeaderComponent: Logging out from ${this.userService.currentUser.loginId}`);"},{"lineNumber":225,"author":{"gitId":"-"},"content":" this.logOut();"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }"},{"lineNumber":227,"author":{"gitId":"-"},"content":" });"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }"},{"lineNumber":229,"author":{"gitId":"-"},"content":""},{"lineNumber":230,"author":{"gitId":"-"},"content":" exportLogFile() {"},{"lineNumber":231,"author":{"gitId":"-"},"content":" this.logger.exportLogFile();"},{"lineNumber":232,"author":{"gitId":"-"},"content":" }"},{"lineNumber":233,"author":{"gitId":"-"},"content":""},{"lineNumber":234,"author":{"gitId":"-"},"content":" initializeRepoNameInTitle() {"},{"lineNumber":235,"author":{"gitId":"NereusWB922"},"content":" if (Repo.isInvalidRepoName(this.viewService.currentRepo)) {"},{"lineNumber":236,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":237,"author":{"gitId":"-"},"content":" }"},{"lineNumber":238,"author":{"gitId":"NereusWB922"},"content":" const currentRepoString \u003d this.viewService.currentRepo.toString();"},{"lineNumber":239,"author":{"gitId":"-"},"content":" this.logger.info(`HeaderComponent: initializing current repository name as ${currentRepoString}`);"},{"lineNumber":240,"author":{"gitId":"-"},"content":" this.currentRepo \u003d currentRepoString;"},{"lineNumber":241,"author":{"gitId":"-"},"content":" }"},{"lineNumber":242,"author":{"gitId":"-"},"content":""},{"lineNumber":243,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Change repository viewed on Issue Dashboard, if a valid repository is provided."},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Re-open dialog to prompt for another repository if an invalid one is provided."},{"lineNumber":246,"author":{"gitId":"-"},"content":" */"},{"lineNumber":247,"author":{"gitId":"Arif-Khalid"},"content":" changeRepositoryIfValid(repo: Repo, newRepoString: string, keepFilters: boolean) {"},{"lineNumber":248,"author":{"gitId":"-"},"content":" if (newRepoString \u003d\u003d\u003d this.currentRepo) {"},{"lineNumber":249,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":250,"author":{"gitId":"-"},"content":" }"},{"lineNumber":251,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":252,"author":{"gitId":"NereusWB922"},"content":" this.viewService"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .changeRepositoryIfValid(repo)"},{"lineNumber":254,"author":{"gitId":"-"},"content":" .then(() \u003d\u003e {"},{"lineNumber":255,"author":{"gitId":"NereusWB922"},"content":" this.auth.setTitleWithViewDetail();"},{"lineNumber":256,"author":{"gitId":"-"},"content":" this.currentRepo \u003d newRepoString;"},{"lineNumber":257,"author":{"gitId":"NereusWB922"},"content":" if (!keepFilters) {"},{"lineNumber":258,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.reset();"},{"lineNumber":259,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.clearFilters();"},{"lineNumber":260,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":261,"author":{"gitId":"-"},"content":" })"},{"lineNumber":262,"author":{"gitId":"-"},"content":" .catch((error) \u003d\u003e {"},{"lineNumber":263,"author":{"gitId":"-"},"content":" this.openChangeRepoDialog();"},{"lineNumber":264,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":265,"author":{"gitId":"-"},"content":" });"},{"lineNumber":266,"author":{"gitId":"-"},"content":" }"},{"lineNumber":267,"author":{"gitId":"-"},"content":""},{"lineNumber":268,"author":{"gitId":"-"},"content":" openChangeRepoDialog() {"},{"lineNumber":269,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openChangeRepoDialog(this.currentRepo);"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"Arif-Khalid"},"content":" dialogRef.afterClosed().subscribe((res: RepoChangeResponse | null) \u003d\u003e {"},{"lineNumber":272,"author":{"gitId":"-"},"content":" if (!res) {"},{"lineNumber":273,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":274,"author":{"gitId":"-"},"content":" }"},{"lineNumber":275,"author":{"gitId":"Arif-Khalid"},"content":" const newRepo \u003d Repo.of(res.repo);"},{"lineNumber":276,"author":{"gitId":"-"},"content":""},{"lineNumber":277,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.isRepoSet()) {"},{"lineNumber":278,"author":{"gitId":"Arif-Khalid"},"content":" this.changeRepositoryIfValid(newRepo, newRepo.toString(), res.keepFilters);"},{"lineNumber":279,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":280,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":281,"author":{"gitId":"-"},"content":" * From session-selection.component.ts"},{"lineNumber":282,"author":{"gitId":"-"},"content":" *"},{"lineNumber":283,"author":{"gitId":"-"},"content":" * Persist repo information in local browser storage"},{"lineNumber":284,"author":{"gitId":"-"},"content":" * To retrieve after authentication redirects back to WATcher"},{"lineNumber":285,"author":{"gitId":"-"},"content":" *"},{"lineNumber":286,"author":{"gitId":"-"},"content":" * Since localStorage::setItem with an undefined value can result in"},{"lineNumber":287,"author":{"gitId":"-"},"content":" * the subsequent value being stored as a string being \u0027undefined\u0027, check"},{"lineNumber":288,"author":{"gitId":"-"},"content":" * if undefined before storing it. Let\u0027s reset the items before setting them."},{"lineNumber":289,"author":{"gitId":"-"},"content":" */"},{"lineNumber":290,"author":{"gitId":"-"},"content":" window.localStorage.removeItem(STORAGE_KEYS.ORG);"},{"lineNumber":291,"author":{"gitId":"-"},"content":" window.localStorage.removeItem(STORAGE_KEYS.DATA_REPO);"},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":" if (newRepo) {"},{"lineNumber":294,"author":{"gitId":"-"},"content":" window.localStorage.setItem(STORAGE_KEYS.ORG, newRepo.owner);"},{"lineNumber":295,"author":{"gitId":"-"},"content":" window.localStorage.setItem(STORAGE_KEYS.DATA_REPO, newRepo.name);"},{"lineNumber":296,"author":{"gitId":"-"},"content":""},{"lineNumber":297,"author":{"gitId":"-"},"content":" this.repoUrlCacheService.cache(newRepo.toString());"},{"lineNumber":298,"author":{"gitId":"-"},"content":" }"},{"lineNumber":299,"author":{"gitId":"-"},"content":" this.auth.setRepo().subscribe();"},{"lineNumber":300,"author":{"gitId":"-"},"content":" }"},{"lineNumber":301,"author":{"gitId":"-"},"content":" });"},{"lineNumber":302,"author":{"gitId":"-"},"content":" }"},{"lineNumber":303,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":12,"Arif-Khalid":9,"NereusWB922":39,"-":243}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".change-repo-form-title {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":".mat-dialog-content {"},{"lineNumber":6,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":".mat-form-field {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":".mat-dialog-actions {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" justify-content: flex-end;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":17,"author":{"gitId":"Arif-Khalid"},"content":".change-repo-form-header {"},{"lineNumber":18,"author":{"gitId":"Arif-Khalid"},"content":" display: flex;"},{"lineNumber":19,"author":{"gitId":"Arif-Khalid"},"content":" justify-content: space-between;"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":5,"-":15}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"\u003cdiv class\u003d\"change-repo-form-header\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ch1 mat-dialog-title class\u003d\"change-repo-form-title\"\u003e{{ data.repoName ? \u0027Change repository\u0027 : \u0027Select repository\u0027 }}\u003c/h1\u003e"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-checkbox *ngIf\u003d\"data.repoName\" [(ngModel)]\u003d\"this.keepFilters\"\u003eKeep Filters\u003c/mat-checkbox\u003e"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-content\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cform (ngSubmit)\u003d\"onYesClick()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eRepository Location (Github Link or Org/Repo)\u003c/mat-label\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cinput matInput [(ngModel)]\u003d\"this.repoName\" [formControl]\u003d\"repoChangeForm\" [matAutocomplete]\u003d\"auto\" /\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-autocomplete #auto\u003d\"matAutocomplete\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-option *ngFor\u003d\"let suggestion of filteredSuggestions | async\" [value]\u003d\"suggestion\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" {{ suggestion }}"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-autocomplete\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/form\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-actions\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"onNoClick()\" color\u003d\"warn\"\u003eCancel\u003c/button\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"onYesClick()\" color\u003d\"primary\"\u003e{{ data.repoName ? \u0027Change Repo\u0027 : \u0027Select Repo\u0027 }}\u003c/button\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"Arif-Khalid":3,"-":18}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Inject, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FormControl } from \u0027@angular/forms\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { MatDialogRef, MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { RepoChangeResponse } from \u0027../../core/models/repo-change-response.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027../../core/services/repo-url-cache.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-repo-change-form\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./repo-change-form.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./repo-change-form.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class RepoChangeFormComponent implements OnInit {"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" public repoName: string;"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" public keepFilters: boolean;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" filteredSuggestions: Observable\u003cstring[]\u003e;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" repoChangeForm \u003d new FormControl();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":20,"author":{"gitId":"-"},"content":" public dialogRef: MatDialogRef\u003cRepoChangeFormComponent\u003e,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Inject(MAT_DIALOG_DATA) public data"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" this.repoName \u003d data.repoName;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.initRepoChangeForm();"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" private initRepoChangeForm() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.filteredSuggestions \u003d this.repoUrlCacheService.getFilteredSuggestions(this.repoChangeForm);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" onYesClick(): void {"},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" const response: RepoChangeResponse \u003d {"},{"lineNumber":37,"author":{"gitId":"Arif-Khalid"},"content":" repo: this.repoName,"},{"lineNumber":38,"author":{"gitId":"Arif-Khalid"},"content":" keepFilters: this.keepFilters"},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" };"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" this.dialogRef.close(response);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" onNoClick(): void {"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" this.dialogRef.close(null);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":9,"-":37}},{"path":"src/test.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"// This file is required by karma.conf.js and loads recursively all the .spec and framework files"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"// tslint:disable:ordered-imports"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"// Ordered-imports rule is disabled here because the import statement for \u0027zone-testing\u0027 must be"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"// at the top to prevent test setup breakage in \u0027npm run test\u0027."},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import \u0027zone.js/dist/zone-testing\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { getTestBed } from \u0027@angular/core/testing\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from \u0027@angular/platform-browser-dynamic/testing\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"declare const require: any;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"// First, initialize the Angular testing environment."},{"lineNumber":13,"author":{"gitId":"-"},"content":"getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());"},{"lineNumber":14,"author":{"gitId":"-"},"content":"// Then we find all the tests."},{"lineNumber":15,"author":{"gitId":"-"},"content":"const context \u003d require.context(\u0027../tests\u0027, true, /\\.spec\\.ts$/);"},{"lineNumber":16,"author":{"gitId":"-"},"content":"// And load the modules."},{"lineNumber":17,"author":{"gitId":"-"},"content":"context.keys().map(context);"}],"authorContributionMap":{"NereusWB922":4,"-":13}},{"path":"tests/app/auth/login/login.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { ComponentFixture, TestBed, waitForAsync } from \u0027@angular/core/testing\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { LoginComponent } from \u0027../../../../src/app/auth/login/login.component\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { AuthService, AuthState } from \u0027../../../../src/app/core/services/auth.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027LoginComponent\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" let authServiceSpy: jasmine.SpyObj\u003cAuthService\u003e;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" let errorHandlingServiceSpy: jasmine.SpyObj\u003cErrorHandlingService\u003e;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" let component: LoginComponent;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" let fixture: ComponentFixture\u003cLoginComponent\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" beforeEach("},{"lineNumber":15,"author":{"gitId":"-"},"content":" waitForAsync(() \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy \u003d jasmine.createSpyObj\u003cAuthService\u003e(\u0027AuthService\u0027, [\u0027startOAuthProcess\u0027, \u0027changeAuthState\u0027]);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj\u003cLoggingService\u003e(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" errorHandlingServiceSpy \u003d jasmine.createSpyObj\u003cErrorHandlingService\u003e(\u0027ErrorHandlingService\u0027, [\u0027handleError\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" TestBed.configureTestingModule({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" { provide: AuthService, useValue: authServiceSpy },"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" { provide: ErrorHandlingService, useValue: errorHandlingServiceSpy }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":26,"author":{"gitId":"-"},"content":" declarations: [LoginComponent]"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }).compileComponents();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" fixture \u003d TestBed.createComponent(LoginComponent);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fixture.detectChanges();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" })"},{"lineNumber":33,"author":{"gitId":"-"},"content":" );"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expect(component).toBeTruthy();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startPublicOnlyLoginProcess should call startLoginProcess with false\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" component.startPublicOnlyLoginProcess();"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(false);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startIncludePrivateLoginProcess should call startLoginProcess with true\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" component.startIncludePrivateLoginProcess();"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(true);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call authService.startOAuthProcess on startLoginProcess\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.startOAuthProcess).toHaveBeenCalledWith(hasPrivateConsent);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027LoginComponent: Beginning login process\u0027);"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call error handling methods when error is thrown\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const errorMessage \u003d \u0027Error!\u0027;"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" const error: Error \u003d new Error(errorMessage);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy.startOAuthProcess.and.throwError(error);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.changeAuthState).toHaveBeenCalledWith(AuthState.NotAuthenticated);"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" expect(errorHandlingServiceSpy.handleError).toHaveBeenCalledWith(error);"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info.calls.allArgs()).toEqual(["},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" [\u0027LoginComponent: Beginning login process\u0027],"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" [`LoginComponent: Login process failed with an error: ${error}`]"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":49,"-":31}},{"path":"tests/app/core/models/session-model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" assertSessionDataIntegrity,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" NO_VALID_OPEN_VIEWS,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" OPENED_VIEW_REPO_UNDEFINED,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" SESSION_DATA_MISSING_FIELDS,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" SESSION_DATA_UNAVAILABLE"},{"lineNumber":8,"author":{"gitId":"-"},"content":"} from \u0027../../../../src/app/core/models/session.model\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../../../src/app/core/models/view.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { VALID_SESSION_DATA, WATCHER_REPO } from \u0027../../../constants/session.constants\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"describe(\u0027Session Model\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" describe(\u0027assertSessionDataIntegrity()\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" it(\u0027should throw error on unavailable session\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" of(undefined)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":17,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":18,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":19,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_UNAVAILABLE))"},{"lineNumber":20,"author":{"gitId":"-"},"content":" });"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid session\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: null })"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [] })"},{"lineNumber":31,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":33,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" });"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: \u0027repo\u0027 })"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":39,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":" });"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session with invalid views\u0027, () \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: \u0027invalidView\u0027 as View, repos: [WATCHER_REPO] }] })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":48,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(NO_VALID_OPEN_VIEWS))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid repo\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: undefined }] })"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":57,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: null }] })"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":63,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: \u0027\u0027 }] })"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":69,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: [] }] })"},{"lineNumber":73,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should pass for valid session data\u0027, () \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" of(VALID_SESSION_DATA)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" .subscribe((el) \u003d\u003e expect(el).toEqual(VALID_SESSION_DATA));"},{"lineNumber":84,"author":{"gitId":"-"},"content":" });"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":28,"-":58}},{"path":"tests/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { NO_ERRORS_SCHEMA } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ComponentFixture, fakeAsync, TestBed, tick } from \u0027@angular/core/testing\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatSelectionList } from \u0027@angular/material/list\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { MatMenuModule } from \u0027@angular/material/menu\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { BehaviorSubject, of } from \u0027rxjs\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { SimpleLabel } from \u0027../../../../../src/app/core/models/label.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { FiltersService } from \u0027../../../../../src/app/core/services/filters.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { LabelService } from \u0027../../../../../src/app/core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { LabelFilterBarComponent } from \u0027../../../../../src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"import { LABEL_NAME_SEVERITY_HIGH, LABEL_NAME_SEVERITY_LOW, SEVERITY_SIMPLE_LABELS } from \u0027../../../../constants/label.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027LabelFilterBarComponent\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" let component: LabelFilterBarComponent;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" let fixture: ComponentFixture\u003cLabelFilterBarComponent\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" let labelServiceSpy: jasmine.SpyObj\u003cLabelService\u003e;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" let filtersServiceSpy: jasmine.SpyObj\u003cFiltersService\u003e;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" let labelsSubject: BehaviorSubject\u003cSimpleLabel[]\u003e;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" beforeEach(async () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy \u003d jasmine.createSpyObj(\u0027LabelService\u0027, [\u0027connect\u0027, \u0027startPollLabels\u0027, \u0027fetchLabels\u0027]);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027, \u0027debug\u0027]);"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" filtersServiceSpy \u003d jasmine.createSpyObj(\u0027FiltersService\u0027, [\u0027updateFilters\u0027, \u0027sanitizeLabels\u0027]);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" TestBed.configureTestingModule({"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" providers: ["},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" { provide: LabelService, useValue: labelServiceSpy },"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" { provide: FiltersService, useValue: filtersServiceSpy }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" ],"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" imports: [MatMenuModule],"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" declarations: [LabelFilterBarComponent],"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" schemas: [NO_ERRORS_SCHEMA]"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" }).compileComponents();"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" fixture \u003d TestBed.createComponent(LabelFilterBarComponent);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" fixture.detectChanges();"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" expect(component).toBeTruthy();"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027ngAfterViewInit\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" // Setup labels observable"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" labelsSubject \u003d new BehaviorSubject\u003cSimpleLabel[]\u003e([]);"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy.fetchLabels.and.returnValue(of([]));"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy.connect.and.returnValue(labelsSubject.asObservable());"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":" filtersServiceSpy.sanitizeLabels.and.callThrough();"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"Arif-Khalid"},"content":" // it(\u0027should update allLabels with latest emmitted value after ngAfterViewInit\u0027, fakeAsync(() \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"Arif-Khalid"},"content":" // component.ngAfterViewInit();"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" // tick();"},{"lineNumber":58,"author":{"gitId":"Arif-Khalid"},"content":" // labelsSubject.next(SEVERITY_SIMPLE_LABELS);"},{"lineNumber":59,"author":{"gitId":"Arif-Khalid"},"content":" // expect(component.allLabels).toEqual(SEVERITY_SIMPLE_LABELS);"},{"lineNumber":60,"author":{"gitId":"Arif-Khalid"},"content":" // }));"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027hide(label)\u0027, () \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should add label to hidden labels set and update filter\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const label \u003d LABEL_NAME_SEVERITY_HIGH;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).not.toContain(label);"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" component.hide(label);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).toContain(label);"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ hiddenLabels: component.hiddenLabelNames });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027show(label)\u0027, () \u003d\u003e {"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should remove label from hidden labels set and update filter\u0027, () \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" const label \u003d LABEL_NAME_SEVERITY_HIGH;"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" component.hide(label);"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).toContain(label);"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" component.show(label);"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).not.toContain(label);"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ hiddenLabels: component.hiddenLabelNames });"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027hasLabels\u0027, () \u003d\u003e {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" component.allLabels \u003d SEVERITY_SIMPLE_LABELS;"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return true if any label match the filter\u0027, () \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027low\u0027;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeTrue();"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return false if no label match the filter\u0027, () \u003d\u003e {"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027priority\u0027;"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeFalse();"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return false if no label exists\u0027, () \u003d\u003e {"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027low\u0027;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" component.allLabels \u003d [];"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeFalse();"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027updateSelection\u0027, () \u003d\u003e {"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should update filters service with selected labels\u0027, () \u003d\u003e {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" const selectedLabels \u003d [LABEL_NAME_SEVERITY_HIGH, LABEL_NAME_SEVERITY_LOW];"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" component.selectedLabelNames \u003d new Set\u003cstring\u003e(selectedLabels);"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":124,"author":{"gitId":"nknguyenhc"},"content":" component.updateSelection();"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ labels: selectedLabels, deselectedLabels: new Set\u003cstring\u003e() });"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027removeAllSelection\u0027, () \u003d\u003e {"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should deselect all labels and update the filter\u0027, () \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":" component.removeAllSelection();"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" expect(component.selectedLabelNames).toEqual(new Set\u003cstring\u003e());"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" expect(component.deselectedLabelNames).toEqual(new Set\u003cstring\u003e());"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":"});"}],"authorContributionMap":{"nknguyenhc":5,"NereusWB922":124,"Arif-Khalid":8}},{"path":"tests/app/shared/issue-tables/issue-paginator.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027../../../../src/app/shared/issue-tables/issue-paginator\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issue-paginator\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027paginateData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" let dataSet_7: Issue[];"},{"lineNumber":14,"author":{"gitId":"-"},"content":" let paginator: MatPaginator;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" dataSet_7 \u003d ["},{"lineNumber":22,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" paginator \u003d { pageSize: 3 } as MatPaginator;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" });"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" it(\u0027should set the length of paginator to the length of data\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" paginateData(paginator, dataSet_7);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" expect(paginator.length).toEqual(7);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues according to page index\u0027, () \u003d\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 0;"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" // Returns issues index 0 to 2"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([mediumSeverityIssueWithResponse, mediumSeverityIssueWithAssigneee, lowSeverityFeatureFlawIssue]);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues in the previous page if there are no issues on the current page\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 3;"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Returns issues index 6 on page 2"},{"lineNumber":50,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([highSeverityDocumentationBugIssue]);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" });"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":4,"-":50}},{"path":"tests/app/shared/issue-tables/issue-sorter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { applySort } from \u0027../../../../src/app/shared/issue-tables/issue-sorter\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_EARLIER,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_LATER,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issuer-sorter\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027applySort()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" const dummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" const otherDummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d [dummyIssue, otherDummyIssue];"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedEarlier: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_EARLIER);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedLater: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_LATER);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const issuesWithDifferentUpdatedDate: Issue[] \u003d [issueUpdatedEarlier, issueUpdatedLater];"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" const matSort: MatSort \u003d new MatSort();"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return the same data if sort.active is not set\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" const sortedData \u003d applySort(matSort, issuesList);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(sortedData).toEqual(issuesList);"},{"lineNumber":26,"author":{"gitId":"-"},"content":" });"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their string fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027title\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuesByTitleAsc \u003d applySort(matSort, issuesList);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuesByTitleDesc \u003d applySort(matSort, issuesList);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their id fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027id\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByIdAsc \u003d applySort(matSort, issuesList);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdAsc, otherDummyIssue, dummyIssue);"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByIdDesc \u003d applySort(matSort, issuesList);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdDesc, dummyIssue, otherDummyIssue);"},{"lineNumber":48,"author":{"gitId":"-"},"content":" });"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their updated date fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" matSort.active \u003d \u0027date\u0027;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateAsc \u003d applySort(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateAsc, issueUpdatedEarlier, issueUpdatedLater);"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateDesc \u003d applySort(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateDesc, issueUpdatedLater, issueUpdatedEarlier);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" });"},{"lineNumber":61,"author":{"gitId":"-"},"content":" });"},{"lineNumber":62,"author":{"gitId":"-"},"content":"});"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * This helper method helps to check if the sorted issues are in their"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * correct order based on the variable arguments provided."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":"function assertOrder(sortedIssues: Issue[], ...expectedSortedIssues: Issue[]) {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" for (let i \u003d 0; i \u003c sortedIssues.length; i++) {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expect(sortedIssues[i].id).toBe(expectedSortedIssues[i].id);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":28,"-":44}},{"path":"tests/app/shared/issue-tables/search-filter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../../../src/app/core/services/issue.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../../../../src/app/shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027../../../../src/app/shared/issue-tables/search-filter\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV } from \u0027../../../constants/data.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import { GITHUB_LABEL_FEATURE_FLAW } from \u0027../../../constants/githublabel.constants\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"describe(\u0027search-filter\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" describe(\u0027applySearchFilter()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" let searchKey: string;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" const displayedColumns: string[] \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" const issueService: IssueService \u003d new IssueService(null, null, null);"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues which are assigned to a specific user\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" searchKey \u003d USER_ANUBHAV.loginId;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" it(\u0027can filter for issues using label\u0027, () \u003d\u003e {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" searchKey \u003d GITHUB_LABEL_FEATURE_FLAW.name;"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([lowSeverityFeatureFlawIssue]);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" });"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues that contain the search key in any other column\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // Search by id of issue"},{"lineNumber":43,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithResponse.id.toString();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithResponse]);"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Search by title of issue"},{"lineNumber":47,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithAssigneee.title;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":9,"-":42}},{"path":"tests/constants/data.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { UserRole } from \u0027../../src/app/core/models/user.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const csvString \u003d"},{"lineNumber":4,"author":{"gitId":"-"},"content":" `"},{"lineNumber":5,"author":{"gitId":"-"},"content":"role,name,team"},{"lineNumber":6,"author":{"gitId":"-"},"content":"student,JunWei96,CS2103T-W12-3"},{"lineNumber":7,"author":{"gitId":"-"},"content":"admin,damithc,"},{"lineNumber":8,"author":{"gitId":"-"},"content":"tutor,anubh-v,CS2103T-W12-3"},{"lineNumber":9,"author":{"gitId":"-"},"content":"admin,geshuming,"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-3"},{"lineNumber":12,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-3"},{"lineNumber":13,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-4"},{"lineNumber":14,"author":{"gitId":"-"},"content":"tutor,q ,CS2103T-W12-4"},{"lineNumber":15,"author":{"gitId":"-"},"content":"student,003-samuel,CS2103T-W12-3"},{"lineNumber":16,"author":{"gitId":"-"},"content":"student,damithc,CS2103T-W12-3"},{"lineNumber":17,"author":{"gitId":"-"},"content":"student,RonakLakhotia,CS2103T-W12-4"},{"lineNumber":18,"author":{"gitId":"-"},"content":"student,ptvrajsk,CS2103T-W12-3` + ` `;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"// jsonData is a json representation of csvString"},{"lineNumber":21,"author":{"gitId":"-"},"content":"export const jsonData \u003d {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" roles: {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" students: {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" junwei96: \u0027true\u0027,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: \u0027true\u0027,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" damithc: \u0027true\u0027,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ronaklakhotia: \u0027true\u0027,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ptvrajsk: \u0027true\u0027"},{"lineNumber":29,"author":{"gitId":"-"},"content":" },"},{"lineNumber":30,"author":{"gitId":"-"},"content":" tutors: { \u0027anubh-v\u0027: \u0027true\u0027, \u0027jj-lim\u0027: \u0027true\u0027, q: \u0027true\u0027 },"},{"lineNumber":31,"author":{"gitId":"-"},"content":" admins: { damithc: \u0027true\u0027, geshuming: \u0027true\u0027 }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" },"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u0027team-structure\u0027: {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u0027CS2103T-W12-3\u0027: {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" junwei96: \u0027JunWei96\u0027,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: \u0027003-samuel\u0027,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" damithc: \u0027damithc\u0027,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ptvrajsk: \u0027ptvrajsk\u0027"},{"lineNumber":39,"author":{"gitId":"-"},"content":" },"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u0027CS2103T-W12-4\u0027: { ronaklakhotia: \u0027RonakLakhotia\u0027 }"},{"lineNumber":41,"author":{"gitId":"-"},"content":" },"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u0027students-allocation\u0027: {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" junwei96: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":45,"author":{"gitId":"-"},"content":" damithc: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ronaklakhotia: { teamId: \u0027CS2103T-W12-4\u0027 },"},{"lineNumber":47,"author":{"gitId":"-"},"content":" ptvrajsk: { teamId: \u0027CS2103T-W12-3\u0027 }"},{"lineNumber":48,"author":{"gitId":"-"},"content":" },"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u0027tutors-allocation\u0027: {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u0027anubh-v\u0027: { \u0027CS2103T-W12-3\u0027: \u0027true\u0027 },"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u0027jj-lim\u0027: { \u0027CS2103T-W12-3\u0027: \u0027true\u0027, \u0027CS2103T-W12-4\u0027: \u0027true\u0027 },"},{"lineNumber":52,"author":{"gitId":"-"},"content":" q: { \u0027CS2103T-W12-4\u0027: \u0027true\u0027 }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" },"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u0027admins-allocation\u0027: { damithc: {}, geshuming: {} }"},{"lineNumber":55,"author":{"gitId":"-"},"content":"};"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"export const USER_JUNWEI \u003d {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" loginId: \u0027JunWei96\u0027,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Student"},{"lineNumber":60,"author":{"gitId":"-"},"content":"};"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":"export const USER_ANUBHAV \u003d {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" loginId: \u0027anubh-v\u0027,"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Student"},{"lineNumber":65,"author":{"gitId":"-"},"content":"};"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"export const USER_Q \u003d {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" loginId: \u0027q\u0027,"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Tutor"},{"lineNumber":70,"author":{"gitId":"-"},"content":"};"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":"export const USER_SHUMING \u003d {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" loginId: \u0027geshuming\u0027,"},{"lineNumber":74,"author":{"gitId":"-"},"content":" role: UserRole.Admin,"},{"lineNumber":75,"author":{"gitId":"-"},"content":" allocatedTeams: []"},{"lineNumber":76,"author":{"gitId":"-"},"content":"};"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":"export const USER_WITH_TWO_ROLES \u003d {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" loginId: \u0027damithc\u0027,"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Admin"},{"lineNumber":81,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":4,"-":77}},{"path":"tests/constants/error.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { RequestError } from \u0027@octokit/request-error\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"export const STANDARD_ERROR \u003d new Error(\u0027This is a normal error\u0027);"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"export const ERROR_WITH_NO_MESSAGE \u003d new Error();"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_304_ERROR \u003d new HttpErrorResponse({ status: 304 });"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_422_ERROR \u003d new HttpErrorResponse({ status: 422 });"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_500_ERROR \u003d new HttpErrorResponse({ status: 500 });"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_400_ERROR \u003d new HttpErrorResponse({ status: 400 });"},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_401_ERROR \u003d new HttpErrorResponse({ status: 401 });"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_404_ERROR \u003d new HttpErrorResponse({ status: 404 });"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_UNKNOWN_ERROR \u003d new HttpErrorResponse({ status: 999 });"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":"export const OCTOKIT_REQUEST_ERROR \u003d new RequestError(\u0027This is an octokit request error\u0027, 400, {"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" request: { method: \u0027GET\u0027, url: \u0027\u0027, headers: {} }"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":24}},{"path":"tests/constants/githubissue.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { IssueState, IssueStateReason } from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../../src/app/core/models/github/github-issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_ANUBHAV } from \u0027./data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { EMPTY_TEAM_RESPONSE } from \u0027./githubcomment.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" GITHUB_LABEL_DOCUMENTATION_BUG,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FEATURE_FLAW,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GITHUB_LABEL_HIGH_SEVERITY,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" GITHUB_LABEL_LOW_SEVERITY,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":15,"author":{"gitId":"-"},"content":"} from \u0027./githublabel.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"const randomId: () \u003d\u003e string \u003d () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return Math.floor(Math.random() * 1000000000).toString();"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"const randomIssueNumber: () \u003d\u003e number \u003d () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Math.round(Math.random() * 1000);"},{"lineNumber":23,"author":{"gitId":"-"},"content":"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"const randomISODate: (startDate?: Date, endDate?: Date) \u003d\u003e string \u003d ("},{"lineNumber":26,"author":{"gitId":"-"},"content":" startDate: Date \u003d new Date(2020, 1, 1),"},{"lineNumber":27,"author":{"gitId":"-"},"content":" endDate: Date \u003d new Date()"},{"lineNumber":28,"author":{"gitId":"-"},"content":") \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return new Date(startDate.getTime() + Math.random() * (startDate.getTime() - endDate.getTime())).toISOString();"},{"lineNumber":30,"author":{"gitId":"-"},"content":"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_DETAILS \u003d {"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" login: USER_ANUBHAV.loginId"},{"lineNumber":34,"author":{"gitId":"-"},"content":"};"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"export const MILESTONE_ONE \u003d {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" number: \u00271\u0027,"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" title: \u0027Milestone 1\u0027,"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" state: \u0027Open\u0027"},{"lineNumber":40,"author":{"gitId":"-"},"content":"};"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":43,"author":{"gitId":"-"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" number: 92,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":46,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":49,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":"export const CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" number: 92,"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Closed,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Completed,"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u00272020-03-22T15:37:32Z\u0027,"},{"lineNumber":74,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_EARLIER \u003d new GithubIssue({"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000001\u0027,"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" number: 1,"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-09-02T16:19:02Z\u0027,"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-09-03T13:37:32Z\u0027,"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/93\u0027,"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_LATER \u003d new GithubIssue({"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000002\u0027,"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" number: 2,"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-10-02T16:19:02Z\u0027,"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-10-22T13:37:32Z\u0027,"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/94\u0027,"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":120,"author":{"gitId":"-"},"content":"});"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY \u003d new GithubIssue({"},{"lineNumber":123,"author":{"gitId":"-"},"content":" id: \u0027384830567\u0027,"},{"lineNumber":124,"author":{"gitId":"-"},"content":" number: 130,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":126,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":127,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":128,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":129,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":130,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":131,"author":{"gitId":"-"},"content":" title: \u0027App is sometimes slow\u0027,"},{"lineNumber":132,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":134,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":140,"author":{"gitId":"-"},"content":"});"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":143,"author":{"gitId":"-"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":144,"author":{"gitId":"-"},"content":" number: 32,"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":146,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":147,"author":{"gitId":"-"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":148,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":149,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":150,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":151,"author":{"gitId":"-"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":152,"author":{"gitId":"-"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":153,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":154,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":157,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":160,"author":{"gitId":"-"},"content":"});"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_WITHOUT_MILESTONE \u003d new GithubIssue({"},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":164,"author":{"gitId":"NereusWB922"},"content":" number: 32,"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":166,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":168,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":169,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":171,"author":{"gitId":"NereusWB922"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":172,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":173,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":175,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":176,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":177,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":178,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":179,"author":{"gitId":"-"},"content":"});"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_ASSIGNEES \u003d new GithubIssue({"},{"lineNumber":182,"author":{"gitId":"-"},"content":" id: \u0027551732011\u0027,"},{"lineNumber":183,"author":{"gitId":"-"},"content":" number: 91,"},{"lineNumber":184,"author":{"gitId":"NereusWB922"},"content":" assignees: [USER_ANUBHAV_DETAILS],"},{"lineNumber":185,"author":{"gitId":"-"},"content":" body: \u0027Screen freezes every few minutes\u0027,"},{"lineNumber":186,"author":{"gitId":"-"},"content":" created_at: \u00272020-01-18T07:01:45Z\u0027,"},{"lineNumber":187,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":188,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":190,"author":{"gitId":"-"},"content":" title: \u0027Screen freezes\u0027,"},{"lineNumber":191,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-02T12:50:02Z\u0027,"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":193,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/91\u0027,"},{"lineNumber":194,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" comments: [EMPTY_TEAM_RESPONSE],"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":199,"author":{"gitId":"-"},"content":"});"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":"export const generateIssueWithRandomData: () \u003d\u003e GithubIssue \u003d () \u003d\u003e {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" const created_and_updated_date: string \u003d randomISODate();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" const issueNumber: number \u003d randomIssueNumber();"},{"lineNumber":204,"author":{"gitId":"-"},"content":" const severityLabels: GithubLabel[] \u003d [GITHUB_LABEL_LOW_SEVERITY, GITHUB_LABEL_MEDIUM_SEVERITY, GITHUB_LABEL_HIGH_SEVERITY];"},{"lineNumber":205,"author":{"gitId":"-"},"content":" const typeLabels: GithubLabel[] \u003d [GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_DOCUMENTATION_BUG];"},{"lineNumber":206,"author":{"gitId":"-"},"content":" return new GithubIssue({"},{"lineNumber":207,"author":{"gitId":"-"},"content":" id: randomId(),"},{"lineNumber":208,"author":{"gitId":"-"},"content":" number: issueNumber,"},{"lineNumber":209,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":210,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":211,"author":{"gitId":"-"},"content":" body: `Issue No.: ${issueNumber}\\nSample Content.`,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" created_at: created_and_updated_date,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, typeLabels[issueNumber % 3], severityLabels[issueNumber % 3]],"},{"lineNumber":214,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":215,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":216,"author":{"gitId":"-"},"content":" title: `Random Issue: ${issueNumber}`,"},{"lineNumber":217,"author":{"gitId":"-"},"content":" updated_at: created_and_updated_date,"},{"lineNumber":218,"author":{"gitId":"-"},"content":" url: `https://api.github.com/repos/CATcher-org/pe-results/issues/${issueNumber}`,"},{"lineNumber":219,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":220,"author":{"gitId":"-"},"content":" });"},{"lineNumber":221,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":99,"-":122}},{"path":"tests/constants/githublabel.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FUNCTIONALITY_BUG \u003d {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" color: \u00279900cc\u0027,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FunctionalityBug\u0027"},{"lineNumber":6,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FEATURE_FLAW \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FeatureFlaw\u0027"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_DOCUMENTATION_BUG \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.DocumentationBug\u0027"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_LOW_SEVERITY \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ffcccc\u0027,"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Low\u0027"},{"lineNumber":21,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_HIGH_SEVERITY \u003d {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ff6666\u0027,"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.High\u0027"},{"lineNumber":26,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_MEDIUM_SEVERITY \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color: \u0027ff9999\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Medium\u0027"},{"lineNumber":31,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TUTORIAL_LABEL \u003d {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" color: \u0027c2e0c6\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" name: \u0027tutorial.CS2103T-W12\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TEAM_LABEL \u003d {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d4c5f9\u0027,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" name: \u0027team.3\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":"} as GithubLabel;"}],"authorContributionMap":{"NereusWB922":13,"-":28}},{"path":"tests/constants/label.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { SimpleLabel } from \u0027../../src/app/core/models/label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"// Label name constants"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_VERY_LOW \u003d \u0027veryLow\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_LOW \u003d \u0027low\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_MEDIUM \u003d \u0027medium\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_HIGH \u003d \u0027high\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"// Label category constants"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export const CATEGORY_SEVERITY \u003d \u0027severity\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"// Label name constants"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_VERY_LOW \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_VERY_LOW;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_LOW \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_LOW;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_MEDIUM \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_MEDIUM;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_HIGH \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_HIGH;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"// Label definition constants"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_VERY_LOW \u003d"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that is \u003cmark\u003epurely cosmetic\u003c/mark\u003e and \u003cmark\u003edoes not affect usage\u003c/mark\u003e. For example, \u0027 +"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cul\u003e\u0027 +"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003etypo issues\u003c/li\u003e\u0027 +"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003espacing issues\u003c/li\u003e\u0027 +"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003elayout issues\u003c/li\u003e\u0027 +"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003ecolor issues\u003c/li\u003e\u0027 +"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003efont issues\u003c/li\u003e\u0027 +"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003c/ul\u003e\u0027 +"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \"in the docs or the UI that doesn\u0027t affect usage.\u003c/p\u003e\";"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_LOW \u003d"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that is unlikely to affect normal operations of the product. \u0027 +"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" \u0027Appears only in very rare situations and causes a minor inconvenience only.\u003c/p\u003e\u0027;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_MEDIUM \u003d"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that causes occasional inconvenience to some users but they can \u0027 + \u0027continue to use the product.\u003c/p\u003e\u0027;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_HIGH \u003d"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that affects most users and causes major problems for users.\u0027 + \u0027i.e., makes the product almost unusable for most users.\u003c/p\u003e\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":"// Label color constants"},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const COLOR_BLACK \u003d \u0027000000\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":"export const COLOR_WHITE \u003d \u0027ffffff\u0027;"},{"lineNumber":40,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_VERY_LOW \u003d \u0027ffe0e0\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_LOW \u003d \u0027ffcccc\u0027;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_MEDIUM \u003d \u0027ff9999\u0027;"},{"lineNumber":43,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_HIGH \u003d \u0027ff6666\u0027;"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":"// CSS style constants"},{"lineNumber":46,"author":{"gitId":"-"},"content":"export const DARK_BG_LIGHT_TEXT \u003d {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${COLOR_BLACK}`,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" color: `#${COLOR_WHITE}`"},{"lineNumber":49,"author":{"gitId":"-"},"content":"};"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":"export const LIGHT_BG_DARK_TEXT \u003d {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${COLOR_WHITE}`,"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: `#${COLOR_BLACK}`"},{"lineNumber":54,"author":{"gitId":"-"},"content":"};"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_LABELS \u003d ["},{"lineNumber":57,"author":{"gitId":"-"},"content":" {"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_VERY_LOW,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_VERY_LOW,"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_VERY_LOW"},{"lineNumber":61,"author":{"gitId":"-"},"content":" },"},{"lineNumber":62,"author":{"gitId":"-"},"content":" {"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_LOW,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" color: COLOR_SEVERITY_LOW,"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_LOW"},{"lineNumber":66,"author":{"gitId":"-"},"content":" },"},{"lineNumber":67,"author":{"gitId":"-"},"content":" {"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_MEDIUM,"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_MEDIUM,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_MEDIUM"},{"lineNumber":71,"author":{"gitId":"-"},"content":" },"},{"lineNumber":72,"author":{"gitId":"-"},"content":" {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_HIGH,"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_HIGH,"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_HIGH"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":"];"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_SIMPLE_LABELS: SimpleLabel[] \u003d SEVERITY_LABELS.map((label) \u003d\u003e ({"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" name: label.name,"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" color: label.color"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"}));"}],"authorContributionMap":{"NereusWB922":49,"-":33}},{"path":"tests/constants/session.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { SessionData, SessionRepo } from \u0027../../src/app/core/models/session.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../src/app/core/models/view.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const WATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/WATcher\u0027);"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export const CATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/CATcher\u0027);"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"const ISSUES_VIEWER_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" view: View.issuesViewer,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":11,"author":{"gitId":"-"},"content":"};"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"const ACTIVITY_DASHBOARD_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" view: View.activityDashboard,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":16,"author":{"gitId":"-"},"content":"};"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"export const VALID_SESSION_DATA: SessionData \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" sessionRepo: [ISSUES_VIEWER_SESSION_REPO, ACTIVITY_DASHBOARD_SESSION_REPO]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":13,"-":7}},{"path":"tests/model/issue.model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { Milestone } from \u0027../../src/app/core/models/milestone.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_ANUBHAV } from \u0027../constants/data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITHOUT_MILESTONE,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" MILESTONE_ONE"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../constants/githublabel.constants\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"describe(\u0027Issue model class\u0027, () \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" describe(\u0027.createPhaseBugReportIssue(githubIssue)\u0027, () \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should correctly create a issue that has an empty description\u0027, async () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" expect(issue.globalId).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.id);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(issue.id).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.number);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" expect(issue.created_at).toEqual(moment(ISSUE_WITH_EMPTY_DESCRIPTION.created_at).format(\u0027lll\u0027));"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" expect(issue.title).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.title);"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" expect(issue.description).toEqual(\u0027No details provided by bug reporter.\u0027);"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" expect(issue.updated_at).toEqual(moment(ISSUE_WITH_EMPTY_DESCRIPTION.updated_at).format(\u0027lll\u0027));"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" expect(issue.closed_at).toEqual(\u0027Invalid date\u0027);"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" expect(issue.milestone).toEqual(new Milestone(MILESTONE_ONE));"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" expect(issue.state).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.state);"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" expect(issue.stateReason).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.stateReason);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" expect(issue.issueOrPr).toEqual(\u0027Issue\u0027);"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" expect(issue.author).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.user.login);"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" expect(issue.isDraft).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.isDraft);"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" expect(issue.assignees).toEqual([]);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(issue.labels).toEqual(["},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TEAM_LABEL.name,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TUTORIAL_LABEL.name,"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG.name,"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY.name"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(issue.githubLabels).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.labels);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set close date correctly for closed issue\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" expect(issue.closed_at).toEqual(moment(CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION.closed_at).format(\u0027lll\u0027));"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set milestone to default milestone for issue without milestone\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITHOUT_MILESTONE);"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" expect(issue.milestone).toEqual(Milestone.IssueWithoutMilestone);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" });"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set assignees correctly for issue with assignees\u0027, () \u003d\u003e {"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" expect(issue.assignees).toEqual([USER_ANUBHAV.loginId]);"},{"lineNumber":63,"author":{"gitId":"-"},"content":" });"},{"lineNumber":64,"author":{"gitId":"-"},"content":" });"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027.updateDescription(description)\u0027, () \u003d\u003e {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" it(\u0027correctly clean strings obtained from users\u0027, () \u003d\u003e {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" const noDetailsFromBugReporter \u003d \u0027No details provided by bug reporter.\u0027;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(\u0027\u0027)).toBe(noDetailsFromBugReporter);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(null)).toBe(noDetailsFromBugReporter);"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" const typicalDescription \u003d \u0027The app crashes after parsing config files.\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(typicalDescription)).toBe(typicalDescription + \u0027\\n\\n\u0027);"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" const inputWithSpecialChars \u003d \u0027$%^!@\u0026-_test\u0027;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(inputWithSpecialChars)).toBe(inputWithSpecialChars + \u0027\\n\\n\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":"});"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":"describe(\u0027Issue\u0027, () \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" const dummyIssue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":83,"author":{"gitId":"-"},"content":" const otherDummyIssue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" const noReportedDescriptionString \u003d \u0027No details provided by bug reporter.\\n\u0027;"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" it(\u0027.createGithubIssueDescription() forms the correct GitHub Issue description for the issue\u0027, () \u003d\u003e {"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" expect(dummyIssue.createGithubIssueDescription()).toEqual(noReportedDescriptionString);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" expect(otherDummyIssue.createGithubIssueDescription()).toEqual(`${otherDummyIssue.description}\\n`);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" });"},{"lineNumber":92,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":57,"MadLamprey":1,"-":34}},{"path":"tests/services/error-handling.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { ErrorHandlingService } from \u0027../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { FormErrorComponent } from \u0027../../src/app/shared/error-toasters/form-error/form-error.component\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { GeneralMessageErrorComponent } from \u0027../../src/app/shared/error-toasters/general-message-error/general-message-error.component\u0027;"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":" ERROR_WITH_NO_MESSAGE,"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":" HTTP_304_ERROR,"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" HTTP_400_ERROR,"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" HTTP_401_ERROR,"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" HTTP_404_ERROR,"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" HTTP_422_ERROR,"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" HTTP_500_ERROR,"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" HTTP_UNKNOWN_ERROR,"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" OCTOKIT_REQUEST_ERROR,"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" STANDARD_ERROR"},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":"} from \u0027../constants/error.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":"let errorHandlingService: ErrorHandlingService;"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":"let mockLoggingService;"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":"let mockSnackBar;"},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":"describe(\u0027ErrorHandlingService\u0027, () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" mockLoggingService \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027error\u0027, \u0027debug\u0027]);"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":" mockSnackBar \u003d jasmine.createSpyObj(\u0027MatSnackBar\u0027, [\u0027openFromComponent\u0027]);"},{"lineNumber":25,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService \u003d new ErrorHandlingService(mockSnackBar, mockLoggingService);"},{"lineNumber":26,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":27,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":28,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027ErrorHandlingService: handleError()\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should log errors when handling errors\u0027, () \u003d\u003e {"},{"lineNumber":30,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(STANDARD_ERROR);"},{"lineNumber":31,"author":{"gitId":"MadLamprey"},"content":" expect(mockLoggingService.error).toHaveBeenCalledWith(STANDARD_ERROR);"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":33,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":34,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the GeneralMessageErrorComponent when handling Errors\u0027, () \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(STANDARD_ERROR);"},{"lineNumber":36,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, {"},{"lineNumber":37,"author":{"gitId":"MadLamprey"},"content":" data: { message: STANDARD_ERROR.message }"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should stringify Errors if there is no message before displaying\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(ERROR_WITH_NO_MESSAGE);"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, {"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" data: { message: JSON.stringify(ERROR_WITH_NO_MESSAGE) }"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should not open the snackbar when handling http status 304 errors\u0027, () \u003d\u003e {"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_304_ERROR);"},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).not.toHaveBeenCalled();"},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the FormErrorComponent when handling http status 422 errors\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_422_ERROR);"},{"lineNumber":55,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(FormErrorComponent, { data: HTTP_422_ERROR });"},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":57,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":58,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the GeneralMessageErrorComponent when handling other http errors\u0027, () \u003d\u003e {"},{"lineNumber":59,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_500_ERROR);"},{"lineNumber":60,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_500_ERROR });"},{"lineNumber":61,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_400_ERROR);"},{"lineNumber":62,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_400_ERROR });"},{"lineNumber":63,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_401_ERROR);"},{"lineNumber":64,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_401_ERROR });"},{"lineNumber":65,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_404_ERROR);"},{"lineNumber":66,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_404_ERROR });"},{"lineNumber":67,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_UNKNOWN_ERROR);"},{"lineNumber":68,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_UNKNOWN_ERROR });"},{"lineNumber":69,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledTimes(5);"},{"lineNumber":70,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":71,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":72,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should treat octokit request errors as http errors\u0027, () \u003d\u003e {"},{"lineNumber":73,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(OCTOKIT_REQUEST_ERROR);"},{"lineNumber":74,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: OCTOKIT_REQUEST_ERROR });"},{"lineNumber":75,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":76,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":77,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":77}},{"path":"tests/services/label.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Label } from \u0027../../src/app/core/models/label.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { LabelService } from \u0027../../src/app/core/services/label.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import * as LabelConstant from \u0027../constants/label.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"let labelService: LabelService;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"let labelList: Label[];"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027LabelService: fetchLabels()\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAllLabels\u0027]);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" labelService \u003d new LabelService(githubServiceSpy);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" });"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should fetch labels successfully\u0027, () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mockLabels \u003d LabelConstant.SEVERITY_LABELS;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const parsedLabels \u003d labelService.parseLabelData(mockLabels);"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.fetchAllLabels.and.returnValue(of(mockLabels));"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" labelService.fetchLabels().subscribe((response) \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" expect(response).toEqual(mockLabels);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(labelService.labels).toEqual(parsedLabels);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" expect(labelService.simpleLabels).toEqual(parsedLabels);"},{"lineNumber":27,"author":{"gitId":"-"},"content":" });"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" expect(githubServiceSpy.fetchAllLabels).toHaveBeenCalled();"},{"lineNumber":30,"author":{"gitId":"-"},"content":" });"},{"lineNumber":31,"author":{"gitId":"-"},"content":"});"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: parseLabelData()\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" beforeAll(() \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" labelList \u003d labelService.parseLabelData(LabelConstant.SEVERITY_LABELS);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" afterAll(() \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity very low label\u0027, () \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_VERY_LOW);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].color).toBe(LabelConstant.COLOR_SEVERITY_VERY_LOW);"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].definition).toBe(LabelConstant.DEFINITION_SEVERITY_VERY_LOW);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" });"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity low label\u0027, () \u003d\u003e {"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_LOW);"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].color).toBe(LabelConstant.COLOR_SEVERITY_LOW);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].definition).toBe(LabelConstant.DEFINITION_SEVERITY_LOW);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity medium label\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_MEDIUM);"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].color).toBe(LabelConstant.COLOR_SEVERITY_MEDIUM);"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].definition).toBe(LabelConstant.DEFINITION_SEVERITY_MEDIUM);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity high label\u0027, () \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_HIGH);"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].color).toBe(LabelConstant.COLOR_SEVERITY_HIGH);"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].definition).toBe(LabelConstant.DEFINITION_SEVERITY_HIGH);"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"-"},"content":"});"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: isDarkColor()\u0027, () \u003d\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" afterEach(() \u003d\u003e {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" });"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" it(\u0027should be true for dark color\u0027, () \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" expect(labelService.isDarkColor(LabelConstant.COLOR_BLACK)).toBeTruthy();"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" it(\u0027should be false for light color\u0027, () \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" expect(labelService.isDarkColor(LabelConstant.COLOR_WHITE)).toBeFalsy();"},{"lineNumber":83,"author":{"gitId":"-"},"content":" });"},{"lineNumber":84,"author":{"gitId":"-"},"content":"});"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: setLabelStyle()\u0027, () \u003d\u003e {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" });"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" afterEach(() \u003d\u003e {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" });"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" it(\u0027should be dark color background with light color text\u0027, () \u003d\u003e {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" expect(labelService.setLabelStyle(LabelConstant.COLOR_BLACK)).toEqual(LabelConstant.DARK_BG_LIGHT_TEXT);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" });"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" it(\u0027should be light color background with dark color text\u0027, () \u003d\u003e {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" expect(labelService.setLabelStyle(LabelConstant.COLOR_WHITE)).toEqual(LabelConstant.LIGHT_BG_DARK_TEXT);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":34,"-":68}},{"path":"tests/services/milestone.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { Milestone } from \u0027../../src/app/core/models/milestone.model\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"import { MilestoneService } from \u0027../../src/app/core/services/milestone.service\u0027;"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"let milestoneService: MilestoneService;"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"describe(\u0027MilestoneService\u0027, () \u003d\u003e {"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAllMilestones\u0027]);"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" milestoneService \u003d new MilestoneService(githubServiceSpy);"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027MilestoneService: fetchMilestones()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should fetch all milestones\u0027, (done) \u003d\u003e {"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" const mockMilestones \u003d [{ title: \u0027Milestone 1\u0027 }, { title: \u0027Milestone 2\u0027 }];"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy.fetchAllMilestones.and.returnValue(of(mockMilestones));"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":" milestoneService.fetchMilestones().subscribe((response) \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":" expect(githubServiceSpy.fetchAllMilestones).toHaveBeenCalled();"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones.length).toBe(2);"},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones[0].title).toBe(\u0027Milestone 1\u0027);"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.hasNoMilestones).toBeFalse();"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":25,"author":{"gitId":"MadLamprey"},"content":" done();"},{"lineNumber":26,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":27,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":28,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":29,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should handle no milestones\u0027, (done) \u003d\u003e {"},{"lineNumber":30,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy.fetchAllMilestones.and.returnValue(of([]));"},{"lineNumber":31,"author":{"gitId":"MadLamprey"},"content":" milestoneService.fetchMilestones().subscribe((response) \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" expect(githubServiceSpy.fetchAllMilestones).toHaveBeenCalled();"},{"lineNumber":33,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones.length).toBe(0);"},{"lineNumber":34,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.hasNoMilestones).toBeTrue();"},{"lineNumber":35,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":36,"author":{"gitId":"MadLamprey"},"content":" done();"},{"lineNumber":37,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027MilestoneService: parseMilestoneData()\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should parse milestone data correctly\u0027, () \u003d\u003e {"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" const mockMilestones \u003d [{ title: \u0027Milestone 2\u0027 }, { title: \u0027Milestone 1\u0027 }];"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" const parsedMilestones \u003d milestoneService.parseMilestoneData(mockMilestones);"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" for (const milestone of parsedMilestones) {"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":" expect(milestone).toBeInstanceOf(Milestone);"},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":" expect(parsedMilestones.length).toBe(2);"},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" expect(parsedMilestones[0].title).toBe(\u0027Milestone 1\u0027);"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":54}},{"path":"tests/services/user.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../src/app/core/services/logging.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../src/app/core/services/user.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_JUNWEI } from \u0027../constants/data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"let userService: UserService;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"describe(\u0027UserService\u0027, () \u003d\u003e {"},{"lineNumber":11,"author":{"gitId":"-"},"content":" beforeAll(() \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAuthenticatedUser\u0027]);"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" userService \u003d new UserService(githubServiceSpy, loggingServiceSpy);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" });"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027createUserModel(loginId)\u0027, () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should create a user correctly\u0027, async () \u003d\u003e {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const createdUser \u003d await userService.createUserModel(USER_JUNWEI.loginId).toPromise();"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" expect(createdUser).toEqual(USER_JUNWEI);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":" });"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027reset()\u0027, () \u003d\u003e {"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set current user as undefined\u0027, async () \u003d\u003e {"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" await userService.createUserModel(USER_JUNWEI.loginId).toPromise();"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" expect(userService.currentUser).toEqual(USER_JUNWEI);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" userService.reset();"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027UserService: Clearing current user\u0027);"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" expect(userService.currentUser).toEqual(undefined);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" });"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":20,"-":15}},{"path":"tests/services/view.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { STORAGE_KEYS } from \u0027../../src/app/core/constants/storage-keys.constants\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../src/app/core/models/view.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { ErrorMessageService } from \u0027../../src/app/core/services/error-message.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../src/app/core/services/logging.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { RepoUrlCacheService } from \u0027../../src/app/core/services/repo-url-cache.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../../src/app/core/services/view.service\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"import { CATCHER_REPO, WATCHER_REPO } from \u0027../constants/session.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"let viewService: ViewService;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"let repoUrlCacheServiceSpy: jasmine.SpyObj\u003cRepoUrlCacheService\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"let routerSpy: jasmine.SpyObj\u003cRouter\u003e;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"let activatedRouteSpy: jasmine.SpyObj\u003cActivatedRoute\u003e;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027ViewService\u0027, () \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027isRepositoryPresent\u0027, \u0027storeViewDetails\u0027]);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" activatedRouteSpy \u003d jasmine.createSpyObj(\u0027ActivatedRoute\u0027, [\u0027snapshot\u0027]);"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" routerSpy \u003d jasmine.createSpyObj(\u0027Router\u0027, [\u0027navigate\u0027]);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" repoUrlCacheServiceSpy \u003d jasmine.createSpyObj(\u0027RepoUrlCacheService\u0027, [\u0027cache\u0027]);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" viewService \u003d new ViewService(githubServiceSpy, repoUrlCacheServiceSpy, loggingServiceSpy, activatedRouteSpy, routerSpy);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" });"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027setRepository(Repo, Repo[])\u0027, () \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set the current repositories and update session data\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" const repos: Repo[] \u003d [CATCHER_REPO];"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO, repos);"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.otherRepos).toEqual(repos);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" const currentSessionRepo \u003d viewService.sessionData.sessionRepo.find((x) \u003d\u003e x.view \u003d\u003d\u003d viewService.currentView);"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" expect(currentSessionRepo?.repos).toEqual([WATCHER_REPO, CATCHER_REPO]);"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should store view details via githubService and update localStorage\u0027, () \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" const localStorageSetItem \u003d spyOn(localStorage, \u0027setItem\u0027);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" expect(githubServiceSpy.storeViewDetails).toHaveBeenCalledWith(WATCHER_REPO.owner, WATCHER_REPO.name);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItem).toHaveBeenCalledWith(\u0027sessionData\u0027, JSON.stringify(viewService.sessionData));"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should navigate to the new repository\u0027, () \u003d\u003e {"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"-"},"content":" });"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027changeRepositoryIfValid(Repo)\u0027, () \u003d\u003e {"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set isChangingRepo to true at the start and false at the end\u0027, async () \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const isChangingRepoNextSpy \u003d spyOn(viewService.isChangingRepo, \u0027next\u0027);"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" spyOn(viewService, \u0027setRepository\u0027);"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" await viewService.changeRepositoryIfValid(WATCHER_REPO);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" expect(isChangingRepoNextSpy.calls.first().args[0]).toBe(true);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(isChangingRepoNextSpy.calls.mostRecent().args[0]).toBe(false);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" });"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error if repository is not valid\u0027, async () \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(false));"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" await expectAsync(viewService.changeRepositoryIfValid(WATCHER_REPO)).toBeRejectedWithError("},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" ErrorMessageService.repositoryNotPresentMessage()"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":82,"author":{"gitId":"-"},"content":" });"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set and navigate to new repo if repo is valid\u0027, async () \u003d\u003e {"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" const repoChanged$Spy \u003d spyOn(viewService.repoChanged$, \u0027next\u0027);"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" await viewService.changeRepositoryIfValid(WATCHER_REPO);"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(`ViewService: Changing current repository to \u0027${WATCHER_REPO}\u0027`);"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" expect(repoUrlCacheServiceSpy.cache).toHaveBeenCalledWith(WATCHER_REPO.toString());"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" expect(repoChanged$Spy).toHaveBeenCalledWith(WATCHER_REPO);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" });"},{"lineNumber":100,"author":{"gitId":"-"},"content":" });"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027initializeCurrentRepository()\u0027, () \u003d\u003e {"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" const org \u003d WATCHER_REPO.owner;"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" const repoName \u003d WATCHER_REPO.name;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" const localStorageGetItemSpy \u003d spyOn(window.localStorage, \u0027getItem\u0027);"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" localStorageGetItemSpy.withArgs(STORAGE_KEYS.ORG).and.returnValue(org);"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" localStorageGetItemSpy.withArgs(STORAGE_KEYS.DATA_REPO).and.returnValue(repoName);"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set and navigate to new repo if repo is valid\u0027, async () \u003d\u003e {"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" const repoSetSourceNext \u003d spyOn(viewService.repoSetSource, \u0027next\u0027);"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" await viewService.initializeCurrentRepository();"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(`ViewService: Repo is ${WATCHER_REPO}`);"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" expect(repoSetSourceNext).toHaveBeenCalledWith(true);"},{"lineNumber":126,"author":{"gitId":"-"},"content":" });"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error if repository is invalid\u0027, async () \u003d\u003e {"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(false));"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":" await expectAsync(viewService.initializeCurrentRepository()).toBeRejectedWithError(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027changeView(View)\u0027, () \u003d\u003e {"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set current view\u0027, () \u003d\u003e {"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toEqual(View.issuesViewer);"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" viewService.changeView(View.activityDashboard);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":143,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toEqual(View.activityDashboard);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" });"},{"lineNumber":145,"author":{"gitId":"-"},"content":" });"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" describe(\u0027.reset()\u0027, () \u003d\u003e {"},{"lineNumber":148,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should reset the currentView of the ViewService\u0027, () \u003d\u003e {"},{"lineNumber":149,"author":{"gitId":"NereusWB922"},"content":" viewService.currentView \u003d View.activityDashboard;"},{"lineNumber":150,"author":{"gitId":"NereusWB922"},"content":" viewService.reset();"},{"lineNumber":151,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toBe(View.issuesViewer);"},{"lineNumber":152,"author":{"gitId":"-"},"content":" });"},{"lineNumber":153,"author":{"gitId":"-"},"content":" });"},{"lineNumber":154,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027setupFromUrl(url)\u0027, () \u003d\u003e {"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set items in local storage if url is valid\u0027, async () \u003d\u003e {"},{"lineNumber":157,"author":{"gitId":"NereusWB922"},"content":" const validUrl \u003d `/issuesViewer?repo\u003d${WATCHER_REPO.owner}%2F${WATCHER_REPO.name}`;"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" const localStorageSetItemSpy \u003d spyOn(window.localStorage, \u0027setItem\u0027);"},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":160,"author":{"gitId":"NereusWB922"},"content":" await viewService.setupFromUrl(validUrl).toPromise();"},{"lineNumber":161,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":162,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItemSpy).toHaveBeenCalledWith(STORAGE_KEYS.ORG, WATCHER_REPO.owner);"},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItemSpy).toHaveBeenCalledWith(STORAGE_KEYS.DATA_REPO, WATCHER_REPO.name);"},{"lineNumber":164,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":165,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":166,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for url without repo paramater\u0027, (done) \u003d\u003e {"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" const urlWithoutRepo \u003d \u0027/issuesViewer\u0027;"},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":169,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(urlWithoutRepo).subscribe({"},{"lineNumber":170,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.invalidUrlMessage()));"},{"lineNumber":172,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":173,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":174,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":175,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":176,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":177,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for empty url\u0027, (done) \u003d\u003e {"},{"lineNumber":178,"author":{"gitId":"NereusWB922"},"content":" const emptyUrl \u003d \u0027\u0027;"},{"lineNumber":179,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":180,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(emptyUrl).subscribe({"},{"lineNumber":181,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":182,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.invalidUrlMessage()));"},{"lineNumber":183,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":184,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":185,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":186,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":187,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":188,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for url with invalid repo format\u0027, (done) \u003d\u003e {"},{"lineNumber":189,"author":{"gitId":"NereusWB922"},"content":" const urlWithInvalidRepoFormat \u003d \u0027/issuesViewer?repo\u003dInvalidRepo\u0027;"},{"lineNumber":190,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":191,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(urlWithInvalidRepoFormat).subscribe({"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":193,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.repositoryNotPresentMessage()));"},{"lineNumber":194,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":199,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":175,"-":24}}] +[{"path":"src/app/activity-dashboard/activity-dashboard.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".event-tables-wrapper {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" overflow-x: auto;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/activity-dashboard/activity-dashboard.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-list cols\u003d\"4\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"grid-flush-left\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ch1 class\u003d\"mat-headline\" style\u003d\"margin: 0px\"\u003eActivity\u003c/h1\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStart Date\u003c/mat-label\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"startMinDate\" [max]\u003d\"startMaxDate\" [matDatepicker]\u003d\"startPicker\" (dateChange)\u003d\"pickStartDate($event)\" /\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"startPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #startPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eEnd Date\u003c/mat-label\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"endMinDate\" [max]\u003d\"endMaxDate\" [matDatepicker]\u003d\"endPicker\" (dateChange)\u003d\"pickEndDate($event)\" /\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"endPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #endPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003c/mat-grid-list\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv class\u003d\"event-tables-wrapper\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003capp-event-tables"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [actor]\u003d\"assignee\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [columnsToDisplay]\u003d\"this.displayedColumns\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [expandedColumnsToDisplay]\u003d\"this.expandedColumns\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [actions]\u003d\"this.actionButtons\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e\u003c/app-event-tables\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":39}},{"path":"src/app/activity-dashboard/activity-dashboard.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatDatepickerInputEvent } from \u0027@angular/material/datepicker\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../core/services/githubevent.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { EXPANDED_TABLE_COLUMNS, TABLE_COLUMNS } from \u0027./event-tables/event-tables-columns\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ACTION_BUTTONS, EventTablesComponent } from \u0027./event-tables/event-tables.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" selector: \u0027app-activity-dashboard\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" templateUrl: \u0027./activity-dashboard.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./activity-dashboard.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class ActivityDashboardComponent implements OnInit {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.DATE_START, TABLE_COLUMNS.ISSUE_COUNT, TABLE_COLUMNS.PR_COUNT, TABLE_COLUMNS.COMMENT_COUNT];"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" readonly expandedColumns \u003d [EXPANDED_TABLE_COLUMNS.TITLE, EXPANDED_TABLE_COLUMNS.DATE];"},{"lineNumber":18,"author":{"gitId":"-"},"content":" readonly actionButtons: ACTION_BUTTONS[] \u003d [ACTION_BUTTONS.VIEW_IN_WEB];"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" startMinDate: Date;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" startMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" endMinDate: Date;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" endMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" @ViewChildren(EventTablesComponent) tables: QueryList\u003cEventTablesComponent\u003e;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService, private githubEventService: GithubEventService) {}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.githubEventService.getEvents();"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" pickStartDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.endMinDate \u003d event.value;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.start \u003d `${event.value}`));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" pickEndDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.startMaxDate \u003d event.value;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.end \u003d `${event.value}`));"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":44}},{"path":"src/app/activity-dashboard/activity-dashboard.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ActivityDashboardRoutingModule } from \u0027./activity-dashboard-routing.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ActivityDashboardComponent } from \u0027./activity-dashboard.component\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { EventTablesModule } from \u0027./event-tables/event-tables.module\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027./event-week-details/event-week-details.component\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" declarations: [ActivityDashboardComponent, EventWeekDetailsComponent],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [CommonModule, SharedModule, ActivityDashboardRoutingModule, EventTablesModule]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class ActivityDashboardModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":11}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".table-container {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" margin: 10px;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" min-width: 400px;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":".actor-card {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" padding: 10px;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 1px;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":".actor-username {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" flex-grow: 1;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" font-size: 15px;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" margin: 0;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" word-break: break-word;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":".avatar-container {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" margin-right: 10px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":".mat-table {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /* flex-wrap: wrap; */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":".mat-header-row {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":".example-element-row:hover {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" border: 3px solid rgba(0, 0, 0, 0.514);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" border-radius: 3px;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: #210749;"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":".example-element-row td {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" border-bottom-width: 0;"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":".example-element-detail {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" overflow: hidden;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"/* Colour cells */"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":".white {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" background-color: white;"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":".pale-green {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" background-color: palegreen;"},{"lineNumber":74,"author":{"gitId":"-"},"content":"}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":".green {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" background-color: green;"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":".scrollable-container {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" height: 53vh;"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" overflow: auto;"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 2px;"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" scrollbar-width: none;"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::-webkit-scrollbar {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" display: none;"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::before {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::after {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" position: sticky;"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" top: 100%;"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" top: 0;"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" bottom: 0;"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":105,"-":37}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"table-container\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"actor-card\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"this.actor\""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" class\u003d\"avatar-container\""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + this.actor.avatar_url + \u0027)\u0027,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title class\u003d\"actor-username\"\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" {{ this.actor !\u003d\u003d undefined ? this.actor.login : \u0027Unknown\u0027 }}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"this.githubEvents\" matSort multiTemplateDataRows\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"date_start\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Date \u003c/mat-header-cell\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" {{ element.date_start }}"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"issue_count\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Issue # \u003c/mat-header-cell\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.issue_count)\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ element.issue_count }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"pr_count\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e PR # \u003c/mat-header-cell\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.pr_count)\"\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" {{ element.pr_count }}"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"comment_count\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Comment # \u003c/mat-header-cell\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.comment_count)\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" {{ element.comment_count }}"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"this.columnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cmat-row"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" *matRowDef\u003d\"let eventWeek; columns: this.columnsToDisplay\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"example-element-row\""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"openDialog(eventWeek)\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-row\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-table\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-card *ngIf\u003d\"this.githubEvents.isLoading$ | async\" style\u003d\"display: flex; justify-content: center; align-items: center\"\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003cmat-paginator [pageSize]\u003d\"20\" [pageSizeOptions]\u003d\"[10, 20, 50]\"\u003e\u003c/mat-paginator\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":22,"-":48}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { animate, state, style, transition, trigger } from \u0027@angular/animations\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatDialog } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027../event-week-details/event-week-details.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventDataTable } from \u0027./GithubEventDataTable\u0027;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"import { NoEventsError } from \u0027./no-events-error.model\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"export enum ACTION_BUTTONS {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" VIEW_IN_WEB,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" COLLAPSE"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" selector: \u0027app-event-tables\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" templateUrl: \u0027./event-tables.component.html\u0027,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-tables.component.css\u0027]"},{"lineNumber":24,"author":{"gitId":"-"},"content":"})"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Angular Table Expandable Rows"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * ref: https://material.angular.io/components/table/examples#table-expandable-rows"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export class EventTablesComponent implements OnInit, AfterViewInit {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Input() columnsToDisplay: string[];"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Input() expandedColumnsToDisplay: string[];"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Input() actions: ACTION_BUTTONS[];"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() actor?: GithubUser \u003d undefined;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" @ViewChild(MatSort, { static: true }) sort: MatSort;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" githubEvents: GithubEventDataTable;"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" public readonly action_buttons \u003d ACTION_BUTTONS;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" constructor("},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" public githubEventService: GithubEventService,"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" public dialog: MatDialog,"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private logger: LoggingService,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private errorHandling: ErrorHandlingService"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" ) {}"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.githubEvents \u003d new GithubEventDataTable(this.githubEventService, this.logger, this.sort, this.paginator, this.actor, this.filters);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" });"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Formats the title text to account for those that contain long words."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * @param title - Title of Event that is to be displayed in the Table Row."},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fitTitleText(title: string): string {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":71,"author":{"gitId":"-"},"content":" const MAX_WORD_LENGTH \u003d 43;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const SPLITTER_TEXT \u003d \u0027 \u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" return title"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .split(SPLITTER_TEXT)"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .map((word) \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (word.length \u003e MAX_WORD_LENGTH) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return word.substring(0, MAX_WORD_LENGTH - 5).concat(ELLIPSES);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return word;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .join(SPLITTER_TEXT);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /** Not implemented yet. */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" viewEventInBrowser(id: number, event: Event) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`EventTablesComponent: Opening Event ${id} on Github`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // window.open(\u0027https://github.com/\u0027, \u0027_blank\u0027);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" /** Opens dialog to show the event details of the selected week. */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" openDialog(eventWeek: EventWeek) {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" if (eventWeek.events.length \u003c\u003d 0) {"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" this.errorHandling.handleError(new NoEventsError());"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" return;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.dialog.open(EventWeekDetailsComponent, {"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" data: {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" eventWeek,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: this.expandedColumnsToDisplay"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /** Returns color string of cell. Shade darkens with magnitude of number. */"},{"lineNumber":107,"author":{"gitId":"-"},"content":" colorCell(count: number) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (count \u003d\u003d\u003d 0) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return \u0027white\u0027;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } else if (count \u003e 0 \u0026\u0026 count \u003c\u003d 5) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return \u0027pale-green\u0027;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" } else if (count \u003e 6) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return \u0027green\u0027;"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":21,"-":95}},{"path":"src/app/activity-dashboard/event-tables/no-events-error.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export class NoEventsError extends Error {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" super(\u0027No events found for this week.\u0027);"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, NoEventsError.prototype);"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":6}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":".mat-dialog-content {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" min-width: 500px;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":20}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003ch2 mat-dialog-title\u003eEvent Week Details\u003c/h2\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"\u003cmat-dialog-content class\u003d\"mat-typography\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"data.eventWeek.events\"\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container matColumnDef\u003d\"{{ expandableColumn }}\" *ngFor\u003d\"let expandableColumn of data.expandedColumnsToDisplay\"\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e{{ expandableColumn }}\u003c/mat-header-cell\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-cell *matCellDef\u003d\"let property\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" {{ property[expandableColumn] }}"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/ng-container\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"data.expandedColumnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-row *matRowDef\u003d\"let property; columns: data.expandedColumnsToDisplay\"\u003e\u003c/mat-row\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-table\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c/mat-dialog-content\u003e"}],"authorContributionMap":{"NereusWB922":13}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Inject } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export interface DialogData {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" eventWeek: EventWeek;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: string[];"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-event-week-detail\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./event-week-details.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-week-details.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class EventWeekDetailsComponent {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":17}},{"path":"src/app/app-routing.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { RouterModule, Routes } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AuthGuard } from \u0027./core/guards/auth.guard\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ParseUrlParamsGuard } from \u0027./core/guards/parse-url-params.guard\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"const routes: Routes \u003d ["},{"lineNumber":10,"author":{"gitId":"-"},"content":" { path: \u0027\u0027, loadChildren: () \u003d\u003e AuthModule },"},{"lineNumber":11,"author":{"gitId":"-"},"content":" { path: \u0027issuesViewer/:org/:repo\u0027, canActivate: [ParseUrlParamsGuard], children: [] },"},{"lineNumber":12,"author":{"gitId":"-"},"content":" { path: \u0027issuesViewer\u0027, loadChildren: () \u003d\u003e IssuesViewerModule, canLoad: [AuthGuard] },"},{"lineNumber":13,"author":{"gitId":"-"},"content":" { path: \u0027activityDashboard\u0027, loadChildren: () \u003d\u003e ActivityDashboardModule, canLoad: [AuthGuard] }"},{"lineNumber":14,"author":{"gitId":"-"},"content":"];"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" imports: [RouterModule.forRoot(routes, { relativeLinkResolution: \u0027legacy\u0027 })],"},{"lineNumber":18,"author":{"gitId":"-"},"content":" exports: [RouterModule]"},{"lineNumber":19,"author":{"gitId":"-"},"content":"})"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class AppRoutingModule {}"}],"authorContributionMap":{"MadLamprey":1,"-":19}},{"path":"src/app/app.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ErrorHandler, NgModule, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BrowserModule, Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BrowserAnimationsModule } from \u0027@angular/platform-browser/animations\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"import { ApolloLink, InMemoryCache, PossibleTypesMap } from \u0027@apollo/client/core\u0027;"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":"import { setContext } from \u0027@apollo/client/link/context\u0027;"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":"import { Apollo } from \u0027apollo-angular\u0027;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"import { HttpLink } from \u0027apollo-angular/http\u0027;"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import \u0027reflect-metadata\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import graphqlTypes from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import \u0027../polyfills\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { AppRoutingModule } from \u0027./app-routing.module\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { AppComponent } from \u0027./app.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { UserConfirmationComponent } from \u0027./core/guards/user-confirmation/user-confirmation.component\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027./core/services/auth.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./core/services/error-handling.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./core/services/error-message.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { AuthServiceFactory } from \u0027./core/services/factories/factory.auth.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubServiceFactory } from \u0027./core/services/factories/factory.github.service\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssueServiceFactory } from \u0027./core/services/factories/factory.issue.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./core/services/github.service\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./core/services/githubevent.service\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./core/services/issue.service\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./core/services/label.service\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./core/services/logging.service\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027./core/services/repo-session-storage.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./core/services/user.service\u0027;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./core/services/view.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LabelDefinitionPopupComponent } from \u0027./shared/label-definition-popup/label-definition-popup.component\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import { HeaderComponent } from \u0027./shared/layout\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import { RepoChangeFormComponent } from \u0027./shared/repo-change-form/repo-change-form.component\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027./shared/shared.module\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" declarations: [AppComponent, HeaderComponent, UserConfirmationComponent, LabelDefinitionPopupComponent, RepoChangeFormComponent],"},{"lineNumber":41,"author":{"gitId":"-"},"content":" imports: ["},{"lineNumber":42,"author":{"gitId":"-"},"content":" BrowserModule,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" BrowserAnimationsModule,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AuthModule,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" IssuesViewerModule,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ActivityDashboardModule,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" SharedModule,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" AppRoutingModule"},{"lineNumber":50,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":51,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":52,"author":{"gitId":"-"},"content":" {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" provide: GithubService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" useFactory: GithubServiceFactory,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" deps: [ErrorHandlingService, Apollo, LoggingService]"},{"lineNumber":56,"author":{"gitId":"-"},"content":" },"},{"lineNumber":57,"author":{"gitId":"-"},"content":" {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" provide: AuthService,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" useFactory: AuthServiceFactory,"},{"lineNumber":60,"author":{"gitId":"-"},"content":" deps: ["},{"lineNumber":61,"author":{"gitId":"-"},"content":" Router,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" NgZone,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" GithubService,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" UserService,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" IssueService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" LabelService,"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" ViewService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" GithubEventService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Title,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ErrorHandlingService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" LoggingService"},{"lineNumber":72,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":73,"author":{"gitId":"-"},"content":" },"},{"lineNumber":74,"author":{"gitId":"-"},"content":" {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" provide: IssueService,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" useFactory: IssueServiceFactory,"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" deps: [GithubService, UserService, ViewService]"},{"lineNumber":78,"author":{"gitId":"-"},"content":" },"},{"lineNumber":79,"author":{"gitId":"-"},"content":" {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" provide: ErrorHandler,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" useClass: ErrorHandlingService"},{"lineNumber":82,"author":{"gitId":"-"},"content":" },"},{"lineNumber":83,"author":{"gitId":"-"},"content":" ErrorMessageService,"},{"lineNumber":84,"author":{"gitId":"-"},"content":" RepoSessionStorageService"},{"lineNumber":85,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":86,"author":{"gitId":"-"},"content":" bootstrap: [AppComponent]"},{"lineNumber":87,"author":{"gitId":"-"},"content":"})"},{"lineNumber":88,"author":{"gitId":"-"},"content":"export class AppModule {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" constructor(private apollo: Apollo, private httpLink: HttpLink, private authService: AuthService, private logger: LoggingService) {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" const URI \u003d \u0027https://api.github.com/graphql\u0027;"},{"lineNumber":91,"author":{"gitId":"-"},"content":" const log \u003d new ApolloLink((operation, forward) \u003d\u003e {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" operation.setContext({ start: performance.now() });"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL request\u0027, operation.getContext());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return forward(operation).map((result) \u003d\u003e {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" const time \u003d performance.now() - operation.getContext().start;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL response\u0027, operation.getContext(), `in ${Math.round(time)}ms`);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" const repo \u003d operation.getContext().response.body.data.repository;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" const item \u003d Object.keys(repo)[0];"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027AppModule: GraphQL response body\u0027, item, repo[item].edges.length, repo[item].edges);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":" });"},{"lineNumber":103,"author":{"gitId":"-"},"content":" const basic \u003d setContext(() \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return { headers: { Accept: \u0027charset\u003dutf-8\u0027 } };"},{"lineNumber":105,"author":{"gitId":"-"},"content":" });"},{"lineNumber":106,"author":{"gitId":"-"},"content":" const auth \u003d setContext(() \u003d\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return { headers: { Authorization: `Token ${this.authService.accessToken.getValue()}` } };"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":" const link \u003d ApolloLink.from([log, basic, auth, this.httpLink.create({ uri: URI })]);"},{"lineNumber":110,"author":{"gitId":"MadLamprey"},"content":" const possibleTypes: PossibleTypesMap \u003d {};"},{"lineNumber":111,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":112,"author":{"gitId":"MadLamprey"},"content":" graphqlTypes.__schema.types.forEach((type: any) \u003d\u003e {"},{"lineNumber":113,"author":{"gitId":"MadLamprey"},"content":" if (type.kind \u003d\u003d\u003d \u0027UNION\u0027 || type.kind \u003d\u003d\u003d \u0027INTERFACE\u0027) {"},{"lineNumber":114,"author":{"gitId":"MadLamprey"},"content":" possibleTypes[type.name] \u003d type.possibleTypes.map((possibleType: any) \u003d\u003e possibleType.name);"},{"lineNumber":115,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":" });"},{"lineNumber":117,"author":{"gitId":"MadLamprey"},"content":" const cache \u003d new InMemoryCache({ possibleTypes });"},{"lineNumber":118,"author":{"gitId":"-"},"content":" this.apollo.create({"},{"lineNumber":119,"author":{"gitId":"-"},"content":" link: link,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" cache: cache"},{"lineNumber":121,"author":{"gitId":"-"},"content":" });"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":3,"Arif-Khalid":1,"MadLamprey":13,"-":106}},{"path":"src/app/auth/auth.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, NgZone, OnDestroy, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { filter, flatMap, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../environments/environment\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../core/constants/storage-keys.constants\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ApplicationService } from \u0027../core/services/application.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { AuthService, AuthState } from \u0027../core/services/auth.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../core/services/error-handling.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../core/services/logging.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../core/services/user.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../core/services/view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" selector: \u0027app-auth\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" templateUrl: \u0027./auth.component.html\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./auth.component.css\u0027]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"})"},{"lineNumber":21,"author":{"gitId":"-"},"content":"export class AuthComponent implements OnInit, OnDestroy {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" authState: AuthState;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" accessTokenSubscription: Subscription;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" authStateSubscription: Subscription;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" currentUserName: string;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" urlEncodedSessionName: string;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" urlEncodedRepo: string;"},{"lineNumber":28,"author":{"gitId":"-"},"content":" sessionInformation: string;"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":31,"author":{"gitId":"-"},"content":" public appService: ApplicationService,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private authService: AuthService,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private userService: UserService,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private ngZone: NgZone,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private activatedRoute: ActivatedRoute,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private logger: LoggingService"},{"lineNumber":40,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.logger.startSession();"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" const oauthCode \u003d this.activatedRoute.snapshot.queryParamMap.get(\u0027code\u0027);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" const state \u003d this.activatedRoute.snapshot.queryParamMap.get(\u0027state\u0027);"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (this.authService.isAuthenticated()) {"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([this.viewService.currentView]);"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.initAccessTokenSubscription();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.initAuthStateSubscription();"},{"lineNumber":54,"author":{"gitId":"-"},"content":" this.createProfileFromUrlQueryParams();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.getRepoFromUrlQueryParams();"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (oauthCode) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // runs upon receiving oauthCode from the redirect"},{"lineNumber":58,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // this.restoreOrgDetailsFromLocalStorage();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthComponent: Obtained authorisation code from Github\u0027);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.fetchAccessToken(oauthCode, state);"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" this.authService.startOAuthIfHasNext();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Will fetch the access token from GitHub."},{"lineNumber":69,"author":{"gitId":"-"},"content":" * @param oauthCode - The authorisation code obtained from GitHub."},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @param state - The state returned from GitHub."},{"lineNumber":71,"author":{"gitId":"-"},"content":" */"},{"lineNumber":72,"author":{"gitId":"-"},"content":" fetchAccessToken(oauthCode: string, state: string) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (!this.authService.isReturnedStateSame(state)) {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Received incorrect state ${state}, continue waiting for correct state`);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Retrieving access token from Github`);"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" const accessTokenUrl \u003d `${AppConfig.accessTokenUrl}/${oauthCode}/client_id/${AppConfig.clientId}`;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" fetch(accessTokenUrl)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .then((res) \u003d\u003e res.json())"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .then((data) \u003d\u003e {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (data.error) {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" throw new Error(data.error);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.authService.storeOAuthAccessToken(data.token);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Sucessfully obtained access token`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" })"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .catch((err) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.logger.info(`AuthComponent: Error in data fetched from access token URL: ${err}`);"},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":94,"author":{"gitId":"-"},"content":" });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" ngOnDestroy() {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" if (this.authStateSubscription) {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.authStateSubscription.unsubscribe();"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":" if (this.accessTokenSubscription) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" this.accessTokenSubscription.unsubscribe();"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Checks whether the current version of WATcher is outdated."},{"lineNumber":108,"author":{"gitId":"-"},"content":" */"},{"lineNumber":109,"author":{"gitId":"-"},"content":" checkAppIsOutdated(): Observable\u003cany\u003e {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return this.appService.isApplicationOutdated().pipe("},{"lineNumber":111,"author":{"gitId":"-"},"content":" map((isOutdated: boolean) \u003d\u003e {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" if (isOutdated) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.applicationVersionOutdatedMessage());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" })"},{"lineNumber":116,"author":{"gitId":"-"},"content":" );"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" updateSession(sessionEvent: string) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.sessionInformation \u003d sessionEvent;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" goToSessionSelect() {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }"},{"lineNumber":126,"author":{"gitId":"-"},"content":""},{"lineNumber":127,"author":{"gitId":"-"},"content":" isUserNotAuthenticated(): boolean {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.NotAuthenticated;"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" isUserAuthenticating(): boolean {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.AwaitingAuthentication;"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" isAwaitingOAuthUserConfirm(): boolean {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.ConfirmOAuthUser;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" isUserAuthenticated(): boolean {"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return this.authState \u003d\u003d\u003d AuthState.Authenticated;"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" isRepoSet(): boolean {"},{"lineNumber":144,"author":{"gitId":"NereusWB922"},"content":" return this.viewService.isRepoSet();"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" get currentSessionOrg(): string {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" if (!this.sessionInformation) {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Retrieve org details of session information from local storage"},{"lineNumber":150,"author":{"gitId":"-"},"content":" return window.localStorage.getItem(STORAGE_KEYS.ORG);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" return this.getOrgDetails(this.sessionInformation);"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Extracts the Organization Details from the input sessionInformation."},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param sessionInformation - string in the format of \u0027orgName/dataRepo\u0027"},{"lineNumber":158,"author":{"gitId":"-"},"content":" */"},{"lineNumber":159,"author":{"gitId":"-"},"content":" private getOrgDetails(sessionInformation: string) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return sessionInformation.split(\u0027/\u0027)[0];"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" private initAuthStateSubscription() {"},{"lineNumber":164,"author":{"gitId":"-"},"content":" this.authStateSubscription \u003d this.authService.currentAuthState.subscribe((state) \u003d\u003e {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" this.authState \u003d state;"},{"lineNumber":167,"author":{"gitId":"-"},"content":" });"},{"lineNumber":168,"author":{"gitId":"-"},"content":" });"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" private initAccessTokenSubscription() {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" this.accessTokenSubscription \u003d this.authService.accessToken"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":174,"author":{"gitId":"-"},"content":" filter((token: string) \u003d\u003e !!token),"},{"lineNumber":175,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e this.userService.getAuthenticatedUser())"},{"lineNumber":176,"author":{"gitId":"-"},"content":" )"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .subscribe((user: GithubUser) \u003d\u003e {"},{"lineNumber":178,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e {"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.currentUserName \u003d user.login;"},{"lineNumber":180,"author":{"gitId":"nknguyenhc"},"content":" if (this.authService.hasNext()) {"},{"lineNumber":181,"author":{"gitId":"nknguyenhc"},"content":" this.authService.completeLoginIfHasNext(this.currentUserName);"},{"lineNumber":182,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" this.authService.changeAuthState(AuthState.ConfirmOAuthUser);"},{"lineNumber":184,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":185,"author":{"gitId":"-"},"content":" });"},{"lineNumber":186,"author":{"gitId":"-"},"content":" });"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" private createProfileFromUrlQueryParams() {"},{"lineNumber":190,"author":{"gitId":"-"},"content":" const urlParams \u003d this.activatedRoute.snapshot.queryParamMap;"},{"lineNumber":191,"author":{"gitId":"-"},"content":" if (urlParams.has(\u0027session\u0027)) {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" this.urlEncodedSessionName \u003d urlParams.get(\u0027session\u0027);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" private getRepoFromUrlQueryParams() {"},{"lineNumber":197,"author":{"gitId":"-"},"content":" const urlParams \u003d this.activatedRoute.snapshot.queryParamMap;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" if (urlParams.has(\u0027repo\u0027)) {"},{"lineNumber":199,"author":{"gitId":"-"},"content":" this.urlEncodedRepo \u003d urlParams.get(\u0027repo\u0027);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":4,"-":192}},{"path":"src/app/core/guards/auth.guard.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ActivatedRouteSnapshot, CanActivate, CanLoad, Route, Router, RouterStateSnapshot, UrlSegment } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../services/auth.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":7,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":8,"author":{"gitId":"-"},"content":"})"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export class AuthGuard implements CanActivate, CanLoad {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" constructor(private auth: AuthService, private router: Router) {}"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable\u003cboolean\u003e | Promise\u003cboolean\u003e | boolean {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" if (this.auth.isAuthenticated()) {"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" this.auth.clearNext();"},{"lineNumber":15,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" this.auth.storeNext(state);"},{"lineNumber":18,"author":{"gitId":"-"},"content":" this.router.navigate([\u0027\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" canLoad(route: Route, segments: UrlSegment[]): Observable\u003cboolean\u003e | Promise\u003cboolean\u003e | boolean {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" if (this.auth.isAuthenticated()) {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.router.navigate([\u0027\u0027]);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":2,"-":29}},{"path":"src/app/core/models/github-user.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027./github/group.interface\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" * Represents raw data returned from the GitHub API about a user."},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export interface RawGithubUser {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" avatar_url: string;"},{"lineNumber":8,"author":{"gitId":"-"},"content":" created_at: string;"},{"lineNumber":9,"author":{"gitId":"-"},"content":" html_url: string;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" login: string;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" node_id: string;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" two_factor_authentication: boolean;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" site_admin: false;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" type: string;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" updated_at: string;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" url: string;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * Represents a GitHub user in WATcher"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export class GithubUser implements RawGithubUser, Group {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" static NO_ASSIGNEE: GithubUser \u003d new GithubUser({"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" avatar_url: \u0027\u0027,"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" created_at: \u0027\u0027,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" html_url: \u0027\u0027,"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" login: \u0027Unassigned\u0027,"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" name: \u0027\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" node_id: \u0027\u0027,"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" two_factor_authentication: false,"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" site_admin: false,"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" type: \u0027\u0027,"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u0027\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" url: \u0027\u0027"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" avatar_url: string;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" created_at: string;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" html_url: string;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" login: string;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" name: string;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" node_id: string;"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" two_factor_authentication: boolean;"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" site_admin: false;"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" type: string;"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" updated_at: string;"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" url: string;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" constructor(rawData: RawGithubUser) {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" Object.assign(this, rawData);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" equals(other: any) {"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" if (!(other instanceof GithubUser)) {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" return false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" return this.login \u003d\u003d\u003d other.login;"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":48,"-":12}},{"path":"src/app/core/models/github/group.interface.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" * Represents a group used for grouping purposes."},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" * Groups can be used to organize issues/prs based on certain criteria,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" * such as milestones, assignees, or other properties."},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export interface Group {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" equals(other: any): boolean;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":8}},{"path":"src/app/core/models/issue.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubComment } from \u0027./github/github-comment.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027./github/github-issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027./github/github-label.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { HiddenData } from \u0027./hidden-data.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Milestone } from \u0027./milestone.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export class Issue {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" /** Basic Fields */"},{"lineNumber":10,"author":{"gitId":"-"},"content":" readonly globalId: string;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" readonly id: number;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" readonly created_at: string;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" readonly githubIssue: GithubIssue;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" githubComments: GithubComment[];"},{"lineNumber":15,"author":{"gitId":"-"},"content":" title: string;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" description: string;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" hiddenDataInDescription: HiddenData;"},{"lineNumber":18,"author":{"gitId":"-"},"content":" updated_at: string;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" closed_at: string;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" milestone: Milestone;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" state: string;"},{"lineNumber":22,"author":{"gitId":"-"},"content":" stateReason: string;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" issueOrPr: string;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" author: string;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" isDraft: boolean;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" /** Depending on the view, assignees attribute can be derived from Github\u0027s assignee feature OR from the Github\u0027s issue description */"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assignees?: string[];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" labels?: string[];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" githubLabels?: GithubLabel[];"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Formats the text to create space at the end of the user input to prevent any issues with"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * the markdown interpretation."},{"lineNumber":35,"author":{"gitId":"-"},"content":" *"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Brought over from comment-editor.component.ts"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */"},{"lineNumber":38,"author":{"gitId":"-"},"content":" static formatText(text: string): string {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (text \u003d\u003d\u003d null) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" if (text \u003d\u003d\u003d undefined) {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return undefined;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" const newLinesRegex \u003d /[\\n\\r]/gi;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" const textSplitArray \u003d text.split(newLinesRegex);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (textSplitArray.filter((split) \u003d\u003e split.trim() !\u003d\u003d \u0027\u0027).length \u003e 0) {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return `${text}\\n\\n`;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return text;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Processes and cleans a raw issue description obtained from user input."},{"lineNumber":58,"author":{"gitId":"-"},"content":" */"},{"lineNumber":59,"author":{"gitId":"-"},"content":" static updateDescription(description: string): string {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" const defaultString \u003d \u0027No details provided by bug reporter.\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return Issue.orDefaultString(Issue.formatText(description), defaultString);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Given two strings, returns the first if it is not an empty string or a false value such as null/undefined."},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Returns the second string if the first is an empty string."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static orDefaultString(stringA: string, def: string): string {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (!stringA) {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return def;"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return stringA.length !\u003d\u003d 0 ? stringA : def;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" protected constructor(githubIssue: GithubIssue) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /** Basic Fields */"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.globalId \u003d githubIssue.id;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.id \u003d +githubIssue.number;"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.created_at \u003d moment(githubIssue.created_at).format(\u0027lll\u0027);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.updated_at \u003d moment(githubIssue.updated_at).format(\u0027lll\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" this.closed_at \u003d moment(githubIssue.closed_at).format(\u0027lll\u0027);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.title \u003d githubIssue.title;"},{"lineNumber":83,"author":{"gitId":"-"},"content":" this.hiddenDataInDescription \u003d new HiddenData(githubIssue.body);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" this.description \u003d Issue.updateDescription(this.hiddenDataInDescription.originalStringWithoutHiddenData);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.state \u003d githubIssue.state;"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.stateReason \u003d githubIssue.stateReason;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.issueOrPr \u003d githubIssue.issueOrPr;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.author \u003d githubIssue.user.login;"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // this.githubIssue \u003d githubIssue;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" this.isDraft \u003d githubIssue.isDraft;"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.assignees \u003d githubIssue.assignees.map((assignee) \u003d\u003e assignee.login);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.githubLabels \u003d githubIssue.labels;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" this.labels \u003d githubIssue.labels.map((label) \u003d\u003e label.name);"},{"lineNumber":95,"author":{"gitId":"MadLamprey"},"content":" this.milestone \u003d githubIssue.milestone"},{"lineNumber":96,"author":{"gitId":"MadLamprey"},"content":" ? new Milestone(githubIssue.milestone)"},{"lineNumber":97,"author":{"gitId":"MadLamprey"},"content":" : this.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027"},{"lineNumber":98,"author":{"gitId":"MadLamprey"},"content":" ? Milestone.IssueWithoutMilestone"},{"lineNumber":99,"author":{"gitId":"MadLamprey"},"content":" : Milestone.PRWithoutMilestone;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" public static createPhaseBugReportingIssue(githubIssue: GithubIssue): Issue {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return new Issue(githubIssue);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" createGithubIssueDescription(): string {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return `${this.description}\\n${this.hiddenDataInDescription.toString()}`;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":"export interface Issues {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" [id: number]: Issue;"},{"lineNumber":113,"author":{"gitId":"-"},"content":"}"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":"export const IssuesFilter \u003d {"},{"lineNumber":116,"author":{"gitId":"-"},"content":" issuesViewer: {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Student: \u0027NO_FILTER\u0027,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Tutor: \u0027NO_FILTER\u0027,"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Admin: \u0027NO_FILTER\u0027"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":1,"MadLamprey":5,"-":115}},{"path":"src/app/core/models/label.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"-"},"content":" * Represents a label and its attributes."},{"lineNumber":3,"author":{"gitId":"-"},"content":" */"},{"lineNumber":4,"author":{"gitId":"-"},"content":"export class Label implements SimpleLabel {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" readonly name: string;"},{"lineNumber":6,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":7,"author":{"gitId":"-"},"content":" definition?: string;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" constructor(label: { name: string; color: string; definition?: string }) {"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" this.name \u003d label.name;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.color \u003d label.color;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" this.definition \u003d label.definition;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Represents a simplified label with name and color"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"export type SimpleLabel \u003d {"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" name: string;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"nknguyenhc":2,"-":20}},{"path":"src/app/core/models/milestone.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027./github/group.interface\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents a milestone and its attributes fetched from Github."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export class Milestone implements Group {"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" static IssueWithoutMilestone: Milestone \u003d new Milestone({ title: \u0027Issue without a milestone\u0027, state: null });"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" static PRWithoutMilestone: Milestone \u003d new Milestone({ title: \u0027PR without a milestone\u0027, state: null });"},{"lineNumber":9,"author":{"gitId":"-"},"content":" title: string;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" state: string;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" deadline?: Date;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" constructor(milestone: { title: string; state: string; due_on?: string }) {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" this.title \u003d milestone.title;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" this.state \u003d milestone.state;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" this.deadline \u003d milestone.due_on ? new Date(milestone.due_on) : undefined;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" public equals(other: any) {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" if (!(other instanceof Milestone)) {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" return false;"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" return this.title \u003d\u003d\u003d other.title;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":3,"NereusWB922":8,"MadLamprey":2,"-":12}},{"path":"src/app/core/models/repo-change-response.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":" * Represents the response of the repo-change-form component"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" */"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"export type RepoChangeResponse \u003d {"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" repo: string;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":" keepFilters: boolean;"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"};"}],"authorContributionMap":{"Arif-Khalid":7}},{"path":"src/app/core/models/session.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { pipe } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { throwIfFalse } from \u0027../../shared/lib/custom-ops\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Repo } from \u0027./repo.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027./view.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" * Session repository comprises the view and its corresponding repository array."},{"lineNumber":8,"author":{"gitId":"-"},"content":" */"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export interface SessionRepo {"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" view: View;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" repos: Repo[];"},{"lineNumber":12,"author":{"gitId":"-"},"content":"}"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Session data comprises an array of session repositories."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"export interface SessionData {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" sessionRepo: SessionRepo[];"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"export const SESSION_DATA_UNAVAILABLE \u003d \u0027Session data does not exist.\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"export const SESSION_DATA_MISSING_FIELDS \u003d \u0027Session data does not contain any repositories.\u0027;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export const NO_VALID_OPEN_VIEWS \u003d \u0027Invalid views in Session data.\u0027;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"export const OPENED_VIEW_REPO_UNDEFINED \u003d \u0027View has no repo defined.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"export function assertSessionDataIntegrity() {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return pipe("},{"lineNumber":28,"author":{"gitId":"-"},"content":" throwIfFalse("},{"lineNumber":29,"author":{"gitId":"-"},"content":" (sessionData) \u003d\u003e sessionData !\u003d\u003d undefined,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" () \u003d\u003e new Error(SESSION_DATA_UNAVAILABLE)"},{"lineNumber":31,"author":{"gitId":"-"},"content":" ),"},{"lineNumber":32,"author":{"gitId":"-"},"content":" throwIfFalse(hasSessionRepo, () \u003d\u003e new Error(SESSION_DATA_MISSING_FIELDS)),"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" throwIfFalse(areViewsValid, () \u003d\u003e new Error(NO_VALID_OPEN_VIEWS)),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" throwIfFalse(areReposDefined, () \u003d\u003e new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" );"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Checks if Session Data has all its crucial fields present."},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */"},{"lineNumber":42,"author":{"gitId":"-"},"content":"function hasSessionRepo(sessionData: SessionData): boolean {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo !\u003d null \u0026\u0026 Array.isArray(sessionData.sessionRepo) \u0026\u0026 sessionData.sessionRepo.length \u003e 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" * Checks if Views belong to a pre-defined View."},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":"function areViewsValid(sessionData: SessionData): boolean {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo.reduce("},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" (isViewValidSoFar: boolean, currentViewRepo: SessionRepo) \u003d\u003e isViewValidSoFar \u0026\u0026 currentViewRepo.view in View,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" true"},{"lineNumber":54,"author":{"gitId":"-"},"content":" );"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" * Checks if each View has an associated repo defined as well."},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @param sessionData"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":"function areReposDefined(sessionData: SessionData): boolean {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return sessionData.sessionRepo.reduce("},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" (isViewRepoDefinedSoFar: boolean, currentViewRepo: SessionRepo) \u003d\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" isViewRepoDefinedSoFar \u0026\u0026 !!currentViewRepo.repos \u0026\u0026 Array.isArray(currentViewRepo.repos) \u0026\u0026 currentViewRepo.repos.length \u003e 0,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" true"},{"lineNumber":66,"author":{"gitId":"-"},"content":" );"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":13,"-":54}},{"path":"src/app/core/models/view.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export enum View {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" issuesViewer \u003d \u0027issuesViewer\u0027,"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" activityDashboard \u003d \u0027activityDashboard\u0027"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/core/services/auth.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { Router, RouterStateSnapshot } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BehaviorSubject, from, Observable, of } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"import { catchError, map, mergeMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { generateSessionId } from \u0027../../shared/lib/session\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { uuid } from \u0027../../shared/lib/uuid\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./githubevent.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./issue.service\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./label.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./user.service\u0027;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./view.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"export enum AuthState {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u0027NotAuthenticated\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u0027AwaitingAuthentication\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u0027ConfirmOAuthUser\u0027,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u0027Authenticated\u0027"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":28,"author":{"gitId":"-"},"content":"})"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Responsible for initiating the authentication process and querying or"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * updating the application state with regards to authentication."},{"lineNumber":33,"author":{"gitId":"-"},"content":" */"},{"lineNumber":34,"author":{"gitId":"-"},"content":"export class AuthService {"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DEFAULT_NO_PERMISSION_TO_PRIVATE_REPOS \u003d false;"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" private static readonly SESSION_NEXT_KEY \u003d \u0027next\u0027;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" authStateSource \u003d new BehaviorSubject(AuthState.NotAuthenticated);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" currentAuthState \u003d this.authStateSource.asObservable();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" accessToken \u003d new BehaviorSubject(undefined);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private state: string;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" ENABLE_POPUP_MESSAGE \u003d \u0027Please enable pop-ups in your browser\u0027;"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":46,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private ngZone: NgZone,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private userService: UserService,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private labelService: LabelService,"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private githubEventService: GithubEventService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private titleService: Title,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private logger: LoggingService"},{"lineNumber":57,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" * Stores the data about the next route in the session storage."},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" storeNext(next: RouterStateSnapshot) {"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" sessionStorage.setItem(AuthService.SESSION_NEXT_KEY, next.url);"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" * by checking the session storage."},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" hasNext(): boolean {"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" return sessionStorage.getItem(AuthService.SESSION_NEXT_KEY) !\u003d\u003d null;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" * and start OAuth process automatically if there is."},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" startOAuthIfHasNext() {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" if (this.hasNext()) {"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Start OAuth because there is a next route`);"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" this.startOAuthProcess(AuthService.DEFAULT_NO_PERMISSION_TO_PRIVATE_REPOS);"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" * Checks if there is a next route to be redirected to after login,"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" * and complete the login process if there is."},{"lineNumber":88,"author":{"gitId":"nknguyenhc"},"content":" * Assuming that user has authenticated on Github, and the app is awaiting confirmation."},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" completeLoginIfHasNext(username: string) {"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" if (!this.hasNext()) {"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Automatically complete login because there is a next route`);"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" this.userService.createUserModel(username).subscribe("},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":" () \u003d\u003e {"},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.Authenticated);"},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":" },"},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" (err) \u003d\u003e {"},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":" this.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Automatic completion of login failed with an error: ${err}`);"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" * Clears the next route from the session storage."},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":111,"author":{"gitId":"nknguyenhc"},"content":" clearNext() {"},{"lineNumber":112,"author":{"gitId":"nknguyenhc"},"content":" sessionStorage.removeItem(AuthService.SESSION_NEXT_KEY);"},{"lineNumber":113,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":114,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":115,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"nknguyenhc"},"content":" * Redirect to the URL indicating the next route."},{"lineNumber":117,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":118,"author":{"gitId":"nknguyenhc"},"content":" redirectToNext() {"},{"lineNumber":119,"author":{"gitId":"nknguyenhc"},"content":" const next \u003d sessionStorage.getItem(AuthService.SESSION_NEXT_KEY);"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" this.viewService"},{"lineNumber":121,"author":{"gitId":"nknguyenhc"},"content":" .setupFromUrl(next)"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" .pipe("},{"lineNumber":123,"author":{"gitId":"nknguyenhc"},"content":" mergeMap(() \u003d\u003e this.setRepo()),"},{"lineNumber":124,"author":{"gitId":"nknguyenhc"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":125,"author":{"gitId":"nknguyenhc"},"content":" this.logger.info(`AuthService: Failed to redirect to next URL with error: ${err}`);"},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" this.errorHandlingService.handleError(err);"},{"lineNumber":127,"author":{"gitId":"nknguyenhc"},"content":" this.clearNext();"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":129,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":130,"author":{"gitId":"nknguyenhc"},"content":" )"},{"lineNumber":131,"author":{"gitId":"nknguyenhc"},"content":" .subscribe((isSetupSuccesssful) \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"nknguyenhc"},"content":" if (isSetupSuccesssful) {"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" this.router.navigateByUrl(next);"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":135,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":136,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":137,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Will store the OAuth token."},{"lineNumber":140,"author":{"gitId":"-"},"content":" */"},{"lineNumber":141,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(token: string) {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" this.githubService.storeOAuthAccessToken(token);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" this.accessToken.next(token);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":147,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthService: Clearing access token and setting AuthState to NotAuthenticated.\u0027);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" this.accessToken.next(undefined);"},{"lineNumber":149,"author":{"gitId":"-"},"content":" this.changeAuthState(AuthState.NotAuthenticated);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" this.ngZone.run(() \u003d\u003e this.router.navigate([\u0027\u0027]));"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":" logOut(): void {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" this.githubService.reset();"},{"lineNumber":155,"author":{"gitId":"-"},"content":" this.userService.reset();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" this.issueService.reset(true);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" this.viewService.reset();"},{"lineNumber":159,"author":{"gitId":"-"},"content":" this.githubEventService.reset();"},{"lineNumber":160,"author":{"gitId":"-"},"content":" this.logger.reset();"},{"lineNumber":161,"author":{"gitId":"-"},"content":" this.setLandingPageTitle();"},{"lineNumber":162,"author":{"gitId":"-"},"content":" this.issueService.setIssueTeamFilter(\u0027All Teams\u0027);"},{"lineNumber":163,"author":{"gitId":"-"},"content":" this.reset();"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":""},{"lineNumber":166,"author":{"gitId":"NereusWB922"},"content":" setTitleWithViewDetail(): void {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" const appSetting \u003d require(\u0027../../../../package.json\u0027);"},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":" const title \u003d `${appSetting.name} ${appSetting.version} - ${this.viewService.getCurrentRepositoryURL()}`;"},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Setting Title as ${title}`);"},{"lineNumber":170,"author":{"gitId":"-"},"content":" this.titleService.setTitle(title);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" setLandingPageTitle(): void {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" const appSetting \u003d require(\u0027../../../../package.json\u0027);"},{"lineNumber":175,"author":{"gitId":"-"},"content":" const title \u003d `${appSetting.name} ${appSetting.version}`;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Setting Title as ${title}`);"},{"lineNumber":177,"author":{"gitId":"-"},"content":" this.titleService.setTitle(title);"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" isAuthenticated(): boolean {"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return this.authStateSource.getValue() \u003d\u003d\u003d AuthState.Authenticated;"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" changeAuthState(newAuthState: AuthState) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" if (newAuthState \u003d\u003d\u003d AuthState.Authenticated) {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" const sessionId \u003d generateSessionId();"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.issueService.setSessionId(sessionId);"},{"lineNumber":188,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Successfully authenticated with session: ${sessionId}`);"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":" this.authStateSource.next(newAuthState);"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":194,"author":{"gitId":"-"},"content":" * Generates and assigns an unguessable random \u0027state\u0027 string to pass to Github for protection against cross-site request forgery attacks"},{"lineNumber":195,"author":{"gitId":"-"},"content":" */"},{"lineNumber":196,"author":{"gitId":"-"},"content":" generateStateString() {"},{"lineNumber":197,"author":{"gitId":"-"},"content":" this.state \u003d uuid();"},{"lineNumber":198,"author":{"gitId":"-"},"content":" sessionStorage.setItem(\u0027state\u0027, this.state);"},{"lineNumber":199,"author":{"gitId":"-"},"content":" }"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":" isReturnedStateSame(returnedState: string): boolean {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" const state \u003d sessionStorage.getItem(\u0027state\u0027);"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return returnedState \u003d\u003d\u003d state;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":207,"author":{"gitId":"-"},"content":" * Will start the Github OAuth web flow process."},{"lineNumber":208,"author":{"gitId":"-"},"content":" */"},{"lineNumber":209,"author":{"gitId":"-"},"content":" startOAuthProcess(hasPrivateConsent: boolean) {"},{"lineNumber":210,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AuthService: Starting authentication\u0027);"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // Available OAuth scopes https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps#available-scopes"},{"lineNumber":212,"author":{"gitId":"-"},"content":" let permissionLevel \u003d \u0027public-repo\u0027;"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" if (hasPrivateConsent) {"},{"lineNumber":215,"author":{"gitId":"-"},"content":" // grants WATcher access to private repos if user allows"},{"lineNumber":216,"author":{"gitId":"-"},"content":" permissionLevel \u003d \u0027repo\u0027;"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" const githubRepoPermission \u003d permissionLevel; // don\u0027t allow changes after logging ins"},{"lineNumber":220,"author":{"gitId":"-"},"content":""},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.changeAuthState(AuthState.AwaitingAuthentication);"},{"lineNumber":222,"author":{"gitId":"-"},"content":""},{"lineNumber":223,"author":{"gitId":"-"},"content":" this.generateStateString();"},{"lineNumber":224,"author":{"gitId":"-"},"content":" this.redirectToOAuthPage("},{"lineNumber":225,"author":{"gitId":"-"},"content":" encodeURI("},{"lineNumber":226,"author":{"gitId":"-"},"content":" `${AppConfig.githubUrl}/login/oauth/authorize?client_id\u003d${AppConfig.clientId}\u0026scope\u003d${githubRepoPermission},read:user\u0026state\u003d${this.state}`"},{"lineNumber":227,"author":{"gitId":"-"},"content":" )"},{"lineNumber":228,"author":{"gitId":"-"},"content":" );"},{"lineNumber":229,"author":{"gitId":"-"},"content":" this.logger.info(`AuthService: Redirecting for Github authentication`);"},{"lineNumber":230,"author":{"gitId":"-"},"content":" }"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Handles the clean up required after authentication and setting up of repository is completed."},{"lineNumber":234,"author":{"gitId":"-"},"content":" */"},{"lineNumber":235,"author":{"gitId":"nknguyenhc"},"content":" handleSetRepoSuccess(repoName: string) {"},{"lineNumber":236,"author":{"gitId":"NereusWB922"},"content":" this.setTitleWithViewDetail();"},{"lineNumber":237,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([View.issuesViewer], {"},{"lineNumber":238,"author":{"gitId":"nknguyenhc"},"content":" queryParams: {"},{"lineNumber":239,"author":{"gitId":"NereusWB922"},"content":" [ViewService.REPO_QUERY_PARAM_KEY]: repoName"},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":241,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":242,"author":{"gitId":"-"},"content":" }"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Setup repository after authentication."},{"lineNumber":246,"author":{"gitId":"-"},"content":" */"},{"lineNumber":247,"author":{"gitId":"-"},"content":" setRepo(): Observable\u003cboolean\u003e {"},{"lineNumber":248,"author":{"gitId":"NereusWB922"},"content":" return from(this.viewService.initializeCurrentRepository()).pipe("},{"lineNumber":249,"author":{"gitId":"-"},"content":" map(() \u003d\u003e {"},{"lineNumber":250,"author":{"gitId":"NereusWB922"},"content":" if (!this.viewService.currentRepo) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":" this.githubEventService.setLatestChangeEvent();"},{"lineNumber":254,"author":{"gitId":"NereusWB922"},"content":" this.handleSetRepoSuccess(this.viewService.currentRepo.toString());"},{"lineNumber":255,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":256,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":257,"author":{"gitId":"-"},"content":" catchError((error) \u003d\u003e {"},{"lineNumber":258,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":259,"author":{"gitId":"nknguyenhc"},"content":" this.clearNext();"},{"lineNumber":260,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":261,"author":{"gitId":"-"},"content":" })"},{"lineNumber":262,"author":{"gitId":"-"},"content":" );"},{"lineNumber":263,"author":{"gitId":"-"},"content":" }"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":266,"author":{"gitId":"-"},"content":" * Will redirect to GitHub OAuth page"},{"lineNumber":267,"author":{"gitId":"-"},"content":" */"},{"lineNumber":268,"author":{"gitId":"-"},"content":" private redirectToOAuthPage(url: string): void {"},{"lineNumber":269,"author":{"gitId":"-"},"content":" if (url \u003d\u003d null) {"},{"lineNumber":270,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }"},{"lineNumber":272,"author":{"gitId":"-"},"content":" window.location.href \u003d url;"},{"lineNumber":273,"author":{"gitId":"-"},"content":" }"},{"lineNumber":274,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":88,"NereusWB922":14,"-":172}},{"path":"src/app/core/services/error-message.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":4,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":5,"author":{"gitId":"-"},"content":"})"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Contains all error message prompts to user."},{"lineNumber":9,"author":{"gitId":"-"},"content":" */"},{"lineNumber":10,"author":{"gitId":"-"},"content":"export class ErrorMessageService {"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static repositoryNotPresentMessage() {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" return \u0027Invalid repository name. Please provide Github repository URL or the repository name in the format Org/Repository Name.\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" public static invalidUrlMessage() {"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" return \u0027URL is invalid, or repository does not exist, please indicate the repository you wish to view to continue.\u0027;"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static unableToFetchIssuesMessage() {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch issue.\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static unableToFetchMilestoneMessage() {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch milestones.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static unableToFetchLabelsMessage() {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch labels.\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static usersUnassignableMessage(assignee: string) {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return `Cannot assign ${assignee} to the issue. Please check if ${assignee} is authorized.`;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static unableToFetchUsersMessage() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch assignable users for repository\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static unableToFetchEventsMessage() {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch issue events for repository\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static unableToFetchActivityEventsMessage() {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch activity events for repository\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static unableToFetchDataFileMessage() {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch data file.\u0027;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static unableToFetchLatestReleaseMessage() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch latest release.\u0027;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static unableToFetchSettingsFileMessage() {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch settings file.\u0027;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static unableToFetchAuthenticatedUsersMessage() {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return \u0027Failed to fetch authenticated user.\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static unableToOpenInBrowserMessage() {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return \u0027Unable to open this issue in Browser\u0027;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static applicationVersionOutdatedMessage() {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return \u0027Please update to the latest version of WATcher.\u0027;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static multipleDropdownOptionsErrorMessage() {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return \u0027Supply either Dropdown option number or text, not both.\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static noDropdownOptionsErrorMessage() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return \u0027No Dropdown identification parameters supplied.\u0027;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":4,"-":74}},{"path":"src/app/core/services/factories/factory.auth.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../auth.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../error-handling.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../issue.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../label.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../logging.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"// import { MockAuthService } from \u0027../mocks/mock.auth.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../user.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"export function AuthServiceFactory("},{"lineNumber":17,"author":{"gitId":"-"},"content":" router: Router,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" ngZone: NgZone,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" githubService: GithubService,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" userService: UserService,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" issueService: IssueService,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" labelService: LabelService,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" viewService: ViewService,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" githubEventService: GithubEventService,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" titleService: Title,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" errorHandlingService: ErrorHandlingService,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" logger: LoggingService"},{"lineNumber":28,"author":{"gitId":"-"},"content":") {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // return new MockAuthService("},{"lineNumber":32,"author":{"gitId":"-"},"content":" // router,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // ngZone,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // githubService,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // userService,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // issueService,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // labelService,"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" // viewService,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // githubEventService,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // titleService,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // logger"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // );"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return new AuthService("},{"lineNumber":45,"author":{"gitId":"-"},"content":" router,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ngZone,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" githubService,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" userService,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" issueService,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" labelService,"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" viewService,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" githubEventService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" titleService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" errorHandlingService,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" logger"},{"lineNumber":56,"author":{"gitId":"-"},"content":" );"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":4,"-":53}},{"path":"src/app/core/services/factories/factory.github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Apollo } from \u0027apollo-angular\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"// import { MockGithubService } from \u0027../mocks/mock.github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"export function GithubServiceFactory(handling: ErrorHandlingService, apollo: Apollo, logger: LoggingService) {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":11,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" // return new MockGithubService();"},{"lineNumber":13,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":14,"author":{"gitId":"-"},"content":" return new GithubService(handling, apollo, logger);"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"MadLamprey":1,"-":14}},{"path":"src/app/core/services/factories/factory.issue.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"// import { AppConfig } from \u0027../../../../environments/environment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../issue.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"// import { MockIssueService } from \u0027../mocks/mock.issue.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../user.service\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../view.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"export function IssueServiceFactory(githubService: GithubService, userService: UserService, viewService: ViewService) {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" // TODO: Write Mocks"},{"lineNumber":10,"author":{"gitId":"-"},"content":" // if (AppConfig.test) {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" // return new MockIssueService(githubService, viewService, dataService);"},{"lineNumber":12,"author":{"gitId":"-"},"content":" // }"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" return new IssueService(githubService, userService, viewService);"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":4,"-":10}},{"path":"src/app/core/services/filters.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Sort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"import { BehaviorSubject, pipe } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { SimpleLabel } from \u0027../models/label.model\u0027;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":"import { Milestone } from \u0027../models/milestone.model\u0027;"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027./milestone.service\u0027;"},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":10,"author":{"gitId":"Arif-Khalid"},"content":"export type Filter \u003d {"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":" title: string;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" status: string[];"},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" type: string;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" sort: Sort;"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" labels: string[];"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":" milestones: string[];"},{"lineNumber":17,"author":{"gitId":"Arif-Khalid"},"content":" hiddenLabels: Set\u003cstring\u003e;"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: Set\u003cstring\u003e;"},{"lineNumber":19,"author":{"gitId":"Arif-Khalid"},"content":"};"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":"@Injectable({"},{"lineNumber":22,"author":{"gitId":"Arif-Khalid"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":23,"author":{"gitId":"Arif-Khalid"},"content":"})"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":"/**"},{"lineNumber":25,"author":{"gitId":"Arif-Khalid"},"content":" * Responsible for centralising filters"},{"lineNumber":26,"author":{"gitId":"Arif-Khalid"},"content":" * Filters are subscribed to and emitted from this service"},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" */"},{"lineNumber":28,"author":{"gitId":"Arif-Khalid"},"content":"export class FiltersService {"},{"lineNumber":29,"author":{"gitId":"Arif-Khalid"},"content":" public static readonly PRESET_VIEW_QUERY_PARAM_KEY \u003d \u0027presetview\u0027;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" readonly presetViews: {"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" [key: string]: () \u003d\u003e Filter;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" } \u003d {"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":" currentlyActive: () \u003d\u003e ({"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":" title: \u0027\u0027,"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" status: [\u0027open pullrequest\u0027, \u0027merged pullrequest\u0027, \u0027open issue\u0027, \u0027closed issue\u0027],"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" type: \u0027all\u0027,"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" sort: { active: \u0027status\u0027, direction: \u0027asc\u0027 },"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" labels: [],"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" milestones: this.getMilestonesForCurrentlyActive().map((milestone) \u003d\u003e milestone.title),"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: new Set\u003cstring\u003e(),"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: new Set\u003cstring\u003e()"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" contributions: () \u003d\u003e ({"},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":" title: \u0027\u0027,"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" status: [\u0027open pullrequest\u0027, \u0027merged pullrequest\u0027, \u0027open issue\u0027, \u0027closed issue\u0027],"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" type: \u0027all\u0027,"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":" sort: { active: \u0027id\u0027, direction: \u0027desc\u0027 },"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" labels: [],"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" milestones: this.milestoneService.milestones.map((milestone) \u003d\u003e milestone.title),"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: new Set\u003cstring\u003e(),"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: new Set\u003cstring\u003e()"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" custom: () \u003d\u003e this.filter$.value"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" // List of keys in the new filter change that causes current filter to not qualify to be a preset view."},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" readonly presetChangingKeys \u003d new Set\u003cstring\u003e([\u0027status\u0027, \u0027type\u0027, \u0027milestones\u0027, \u0027labels\u0027, \u0027deselectedLabels\u0027]);"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" readonly defaultFilter \u003d this.presetViews.currentlyActive;"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" public filter$ \u003d new BehaviorSubject\u003cFilter\u003e(this.defaultFilter());"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" // Either \u0027currentlyActive\u0027, \u0027contributions\u0027, or \u0027custom\u0027."},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" public presetView$ \u003d new BehaviorSubject\u003cstring\u003e(\u0027currentlyActive\u0027);"},{"lineNumber":63,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":64,"author":{"gitId":"Arif-Khalid"},"content":" // Helps in determining whether all milestones were selected from previous repo during sanitization of milestones"},{"lineNumber":65,"author":{"gitId":"Arif-Khalid"},"content":" private previousMilestonesLength \u003d 0;"},{"lineNumber":66,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":67,"author":{"gitId":"Arif-Khalid"},"content":" constructor("},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" private logger: LoggingService,"},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" private router: Router,"},{"lineNumber":70,"author":{"gitId":"Arif-Khalid"},"content":" private route: ActivatedRoute,"},{"lineNumber":71,"author":{"gitId":"Arif-Khalid"},"content":" private milestoneService: MilestoneService"},{"lineNumber":72,"author":{"gitId":"Arif-Khalid"},"content":" ) {}"},{"lineNumber":73,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":74,"author":{"gitId":"Arif-Khalid"},"content":" private pushFiltersToUrl(): void {"},{"lineNumber":75,"author":{"gitId":"Arif-Khalid"},"content":" const queryParams \u003d { ...this.route.snapshot.queryParams };"},{"lineNumber":76,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":77,"author":{"gitId":"Arif-Khalid"},"content":" for (const filterName of Object.keys(this.filter$.value)) {"},{"lineNumber":78,"author":{"gitId":"Arif-Khalid"},"content":" const filterValue \u003d this.filter$.value[filterName];"},{"lineNumber":79,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":80,"author":{"gitId":"Arif-Khalid"},"content":" // Don\u0027t include empty or null filters"},{"lineNumber":81,"author":{"gitId":"Arif-Khalid"},"content":" // Intended behaviour to reset to default if 0 of a certain filter are selected"},{"lineNumber":82,"author":{"gitId":"Arif-Khalid"},"content":" switch (filterName) {"},{"lineNumber":83,"author":{"gitId":"Arif-Khalid"},"content":" // Strings"},{"lineNumber":84,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027title\u0027:"},{"lineNumber":85,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027type\u0027:"},{"lineNumber":86,"author":{"gitId":"Arif-Khalid"},"content":" if (!filterValue) {"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" delete queryParams[filterName];"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":" continue;"},{"lineNumber":89,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":90,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d filterValue;"},{"lineNumber":91,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" // Arrays"},{"lineNumber":93,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027status\u0027:"},{"lineNumber":94,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027labels\u0027:"},{"lineNumber":95,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027milestones\u0027:"},{"lineNumber":96,"author":{"gitId":"Arif-Khalid"},"content":" if (filterValue.length \u003d\u003d\u003d 0) {"},{"lineNumber":97,"author":{"gitId":"Arif-Khalid"},"content":" delete queryParams[filterName];"},{"lineNumber":98,"author":{"gitId":"Arif-Khalid"},"content":" continue;"},{"lineNumber":99,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":100,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d filterValue;"},{"lineNumber":101,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":102,"author":{"gitId":"Arif-Khalid"},"content":" // Sets"},{"lineNumber":103,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027selectedLabels\u0027:"},{"lineNumber":104,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027deselectedLabels\u0027:"},{"lineNumber":105,"author":{"gitId":"Arif-Khalid"},"content":" if (filterValue.size \u003d\u003d\u003d 0) {"},{"lineNumber":106,"author":{"gitId":"Arif-Khalid"},"content":" delete queryParams[filterName];"},{"lineNumber":107,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":108,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d [...filterValue];"},{"lineNumber":109,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":110,"author":{"gitId":"Arif-Khalid"},"content":" // Objects"},{"lineNumber":111,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027sort\u0027:"},{"lineNumber":112,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[filterName] \u003d JSON.stringify(filterValue);"},{"lineNumber":113,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":114,"author":{"gitId":"Arif-Khalid"},"content":" default:"},{"lineNumber":115,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":116,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":117,"author":{"gitId":"Arif-Khalid"},"content":" queryParams[FiltersService.PRESET_VIEW_QUERY_PARAM_KEY] \u003d this.presetView$.value;"},{"lineNumber":118,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":119,"author":{"gitId":"Arif-Khalid"},"content":" this.router.navigate([], {"},{"lineNumber":120,"author":{"gitId":"Arif-Khalid"},"content":" relativeTo: this.route,"},{"lineNumber":121,"author":{"gitId":"Arif-Khalid"},"content":" queryParams,"},{"lineNumber":122,"author":{"gitId":"Arif-Khalid"},"content":" replaceUrl: true"},{"lineNumber":123,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":124,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":125,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":126,"author":{"gitId":"Arif-Khalid"},"content":" clearFilters(): void {"},{"lineNumber":127,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(\u0027currentlyActive\u0027);"},{"lineNumber":128,"author":{"gitId":"Arif-Khalid"},"content":" this.previousMilestonesLength \u003d 0;"},{"lineNumber":129,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":130,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":131,"author":{"gitId":"Arif-Khalid"},"content":" initializeFromURLParams() {"},{"lineNumber":132,"author":{"gitId":"Arif-Khalid"},"content":" const nextFilter: Filter \u003d this.defaultFilter();"},{"lineNumber":133,"author":{"gitId":"Arif-Khalid"},"content":" const queryParams \u003d this.route.snapshot.queryParamMap;"},{"lineNumber":134,"author":{"gitId":"Arif-Khalid"},"content":" try {"},{"lineNumber":135,"author":{"gitId":"Arif-Khalid"},"content":" const presetView \u003d queryParams.get(FiltersService.PRESET_VIEW_QUERY_PARAM_KEY);"},{"lineNumber":136,"author":{"gitId":"Arif-Khalid"},"content":" // Use preset view if set in url"},{"lineNumber":137,"author":{"gitId":"Arif-Khalid"},"content":" if (presetView \u0026\u0026 this.presetViews.hasOwnProperty(presetView) \u0026\u0026 presetView !\u003d\u003d \u0027custom\u0027) {"},{"lineNumber":138,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(presetView);"},{"lineNumber":139,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":140,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":141,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":142,"author":{"gitId":"Arif-Khalid"},"content":" // No preset view and no other filters in params, use default view"},{"lineNumber":143,"author":{"gitId":"Arif-Khalid"},"content":" if (!presetView \u0026\u0026 Object.keys(nextFilter).every((filterName) \u003d\u003e queryParams.get(filterName) \u003d\u003d\u003d null)) {"},{"lineNumber":144,"author":{"gitId":"Arif-Khalid"},"content":" this.updatePresetView(\u0027currentlyActive\u0027);"},{"lineNumber":145,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":146,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":147,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":148,"author":{"gitId":"Arif-Khalid"},"content":" for (const filterName of Object.keys(nextFilter)) {"},{"lineNumber":149,"author":{"gitId":"Arif-Khalid"},"content":" // Check if there is no such param in url"},{"lineNumber":150,"author":{"gitId":"Arif-Khalid"},"content":" if (queryParams.get(filterName) \u003d\u003d\u003d null) {"},{"lineNumber":151,"author":{"gitId":"Arif-Khalid"},"content":" continue;"},{"lineNumber":152,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":153,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":154,"author":{"gitId":"Arif-Khalid"},"content":" const filterData \u003d queryParams.getAll(filterName);"},{"lineNumber":155,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":156,"author":{"gitId":"Arif-Khalid"},"content":" switch (filterName) {"},{"lineNumber":157,"author":{"gitId":"Arif-Khalid"},"content":" // Strings"},{"lineNumber":158,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027title\u0027:"},{"lineNumber":159,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027type\u0027:"},{"lineNumber":160,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d filterData[0];"},{"lineNumber":161,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":162,"author":{"gitId":"Arif-Khalid"},"content":" // Arrays"},{"lineNumber":163,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027status\u0027:"},{"lineNumber":164,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027labels\u0027:"},{"lineNumber":165,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027milestones\u0027:"},{"lineNumber":166,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d filterData;"},{"lineNumber":167,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":168,"author":{"gitId":"Arif-Khalid"},"content":" // Sets"},{"lineNumber":169,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027selectedLabels\u0027:"},{"lineNumber":170,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027deselectedLabels\u0027:"},{"lineNumber":171,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d new Set(filterData);"},{"lineNumber":172,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":173,"author":{"gitId":"Arif-Khalid"},"content":" // Objects"},{"lineNumber":174,"author":{"gitId":"Arif-Khalid"},"content":" case \u0027sort\u0027:"},{"lineNumber":175,"author":{"gitId":"Arif-Khalid"},"content":" nextFilter[filterName] \u003d JSON.parse(filterData[0]);"},{"lineNumber":176,"author":{"gitId":"Arif-Khalid"},"content":" break;"},{"lineNumber":177,"author":{"gitId":"Arif-Khalid"},"content":" default:"},{"lineNumber":178,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":179,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":180,"author":{"gitId":"Arif-Khalid"},"content":" this.updateFilters(nextFilter);"},{"lineNumber":181,"author":{"gitId":"Arif-Khalid"},"content":" } catch (err) {"},{"lineNumber":182,"author":{"gitId":"Arif-Khalid"},"content":" this.logger.info(`FiltersService: Update filters from URL failed with an error: ${err}`);"},{"lineNumber":183,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":184,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":185,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":186,"author":{"gitId":"Arif-Khalid"},"content":" updateFilters(newFilters: Partial\u003cFilter\u003e): void {"},{"lineNumber":187,"author":{"gitId":"nknguyenhc"},"content":" const nextDropdownFilter: Filter \u003d {"},{"lineNumber":188,"author":{"gitId":"Arif-Khalid"},"content":" ...this.filter$.value,"},{"lineNumber":189,"author":{"gitId":"Arif-Khalid"},"content":" ...newFilters"},{"lineNumber":190,"author":{"gitId":"Arif-Khalid"},"content":" };"},{"lineNumber":191,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(nextDropdownFilter);"},{"lineNumber":192,"author":{"gitId":"nknguyenhc"},"content":" this.updatePresetViewFromFilters(newFilters);"},{"lineNumber":193,"author":{"gitId":"Arif-Khalid"},"content":" this.pushFiltersToUrl();"},{"lineNumber":194,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":195,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":196,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":197,"author":{"gitId":"nknguyenhc"},"content":" * Updates the filters without updating the preset view."},{"lineNumber":198,"author":{"gitId":"nknguyenhc"},"content":" * This should only be called when there are new labels/milestones."},{"lineNumber":199,"author":{"gitId":"nknguyenhc"},"content":" * The preset view will be reapplied."},{"lineNumber":200,"author":{"gitId":"nknguyenhc"},"content":" * @param newFilters The filters with new values"},{"lineNumber":201,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":202,"author":{"gitId":"nknguyenhc"},"content":" private updateFiltersWithoutUpdatingPresetView(newFilters: Partial\u003cFilter\u003e): void {"},{"lineNumber":203,"author":{"gitId":"nknguyenhc"},"content":" const nextDropdownFilter: Filter \u003d {"},{"lineNumber":204,"author":{"gitId":"nknguyenhc"},"content":" ...this.filter$.value,"},{"lineNumber":205,"author":{"gitId":"nknguyenhc"},"content":" ...newFilters"},{"lineNumber":206,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":207,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(nextDropdownFilter);"},{"lineNumber":208,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(this.presetViews[this.presetView$.value]());"},{"lineNumber":209,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":210,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":211,"author":{"gitId":"nknguyenhc"},"content":" private updatePresetViewFromFilters(newFilter: Partial\u003cFilter\u003e): void {"},{"lineNumber":212,"author":{"gitId":"nknguyenhc"},"content":" for (const key of Object.keys(newFilter)) {"},{"lineNumber":213,"author":{"gitId":"nknguyenhc"},"content":" if (this.presetChangingKeys.has(key)) {"},{"lineNumber":214,"author":{"gitId":"nknguyenhc"},"content":" this.presetView$.next(\u0027custom\u0027);"},{"lineNumber":215,"author":{"gitId":"nknguyenhc"},"content":" return;"},{"lineNumber":216,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":217,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":218,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":219,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":220,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":221,"author":{"gitId":"nknguyenhc"},"content":" * Updates the filter based on a preset view."},{"lineNumber":222,"author":{"gitId":"nknguyenhc"},"content":" * @param presetViewName The name of the preset view, either \u0027currentlyActive\u0027, \u0027contributions\u0027, or \u0027custom\u0027."},{"lineNumber":223,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":224,"author":{"gitId":"nknguyenhc"},"content":" updatePresetView(presetViewName: string) {"},{"lineNumber":225,"author":{"gitId":"nknguyenhc"},"content":" this.filter$.next(this.presetViews[presetViewName]());"},{"lineNumber":226,"author":{"gitId":"nknguyenhc"},"content":" this.presetView$.next(presetViewName);"},{"lineNumber":227,"author":{"gitId":"Arif-Khalid"},"content":" this.pushFiltersToUrl();"},{"lineNumber":228,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":229,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":230,"author":{"gitId":"Arif-Khalid"},"content":" sanitizeLabels(allLabels: SimpleLabel[]): void {"},{"lineNumber":231,"author":{"gitId":"Arif-Khalid"},"content":" const allLabelsSet \u003d new Set(allLabels.map((label) \u003d\u003e label.name));"},{"lineNumber":232,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":233,"author":{"gitId":"Arif-Khalid"},"content":" const newHiddenLabels: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":234,"author":{"gitId":"Arif-Khalid"},"content":" for (const hiddenLabel of this.filter$.value.hiddenLabels) {"},{"lineNumber":235,"author":{"gitId":"Arif-Khalid"},"content":" if (allLabelsSet.has(hiddenLabel)) {"},{"lineNumber":236,"author":{"gitId":"Arif-Khalid"},"content":" newHiddenLabels.add(hiddenLabel);"},{"lineNumber":237,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":238,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":239,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" const newDeselectedLabels: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":241,"author":{"gitId":"nknguyenhc"},"content":" for (const deselectedLabel of this.filter$.value.deselectedLabels) {"},{"lineNumber":242,"author":{"gitId":"nknguyenhc"},"content":" if (allLabelsSet.has(deselectedLabel)) {"},{"lineNumber":243,"author":{"gitId":"nknguyenhc"},"content":" newDeselectedLabels.add(deselectedLabel);"},{"lineNumber":244,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":245,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":246,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":247,"author":{"gitId":"nknguyenhc"},"content":" const newLabels \u003d this.filter$.value.labels.filter((label) \u003d\u003e allLabelsSet.has(label));"},{"lineNumber":248,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":249,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({"},{"lineNumber":250,"author":{"gitId":"nknguyenhc"},"content":" labels: newLabels,"},{"lineNumber":251,"author":{"gitId":"nknguyenhc"},"content":" hiddenLabels: newHiddenLabels,"},{"lineNumber":252,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: newDeselectedLabels"},{"lineNumber":253,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":254,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":255,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":256,"author":{"gitId":"Arif-Khalid"},"content":" sanitizeMilestones(allMilestones: Milestone[]) {"},{"lineNumber":257,"author":{"gitId":"MadLamprey"},"content":" const milestones \u003d allMilestones.map((milestone) \u003d\u003e milestone.title);"},{"lineNumber":258,"author":{"gitId":"MadLamprey"},"content":" milestones.push(Milestone.IssueWithoutMilestone.title, Milestone.PRWithoutMilestone.title);"},{"lineNumber":259,"author":{"gitId":"MadLamprey"},"content":" const allMilestonesSet \u003d new Set(milestones);"},{"lineNumber":260,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":261,"author":{"gitId":"Arif-Khalid"},"content":" // All previous milestones were selected, reset to all new milestones selected"},{"lineNumber":262,"author":{"gitId":"Arif-Khalid"},"content":" if (this.filter$.value.milestones.length \u003d\u003d\u003d this.previousMilestonesLength) {"},{"lineNumber":263,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({ milestones: [...allMilestonesSet] });"},{"lineNumber":264,"author":{"gitId":"MadLamprey"},"content":" this.previousMilestonesLength \u003d allMilestonesSet.size;"},{"lineNumber":265,"author":{"gitId":"Arif-Khalid"},"content":" return;"},{"lineNumber":266,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":267,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":268,"author":{"gitId":"Arif-Khalid"},"content":" const newMilestones: string[] \u003d [];"},{"lineNumber":269,"author":{"gitId":"Arif-Khalid"},"content":" for (const milestone of this.filter$.value.milestones) {"},{"lineNumber":270,"author":{"gitId":"Arif-Khalid"},"content":" if (allMilestonesSet.has(milestone)) {"},{"lineNumber":271,"author":{"gitId":"Arif-Khalid"},"content":" newMilestones.push(milestone);"},{"lineNumber":272,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":273,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":274,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":275,"author":{"gitId":"Arif-Khalid"},"content":" // No applicable milestones, reset to all milestones selected"},{"lineNumber":276,"author":{"gitId":"Arif-Khalid"},"content":" if (newMilestones.length \u003d\u003d\u003d 0) {"},{"lineNumber":277,"author":{"gitId":"Arif-Khalid"},"content":" newMilestones.push(...allMilestonesSet);"},{"lineNumber":278,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":279,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":280,"author":{"gitId":"nknguyenhc"},"content":" this.updateFiltersWithoutUpdatingPresetView({ milestones: newMilestones });"},{"lineNumber":281,"author":{"gitId":"MadLamprey"},"content":" this.previousMilestonesLength \u003d allMilestonesSet.size;"},{"lineNumber":282,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":283,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":284,"author":{"gitId":"nknguyenhc"},"content":" getMilestonesForCurrentlyActive(): Milestone[] {"},{"lineNumber":285,"author":{"gitId":"nknguyenhc"},"content":" const earliestOpenMilestone \u003d this.milestoneService.getEarliestOpenMilestone();"},{"lineNumber":286,"author":{"gitId":"nknguyenhc"},"content":" if (earliestOpenMilestone) {"},{"lineNumber":287,"author":{"gitId":"NereusWB922"},"content":" return [earliestOpenMilestone, Milestone.PRWithoutMilestone];"},{"lineNumber":288,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":289,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":290,"author":{"gitId":"nknguyenhc"},"content":" const latestClosedMilestone \u003d this.milestoneService.getLatestClosedMilestone();"},{"lineNumber":291,"author":{"gitId":"nknguyenhc"},"content":" if (latestClosedMilestone) {"},{"lineNumber":292,"author":{"gitId":"NereusWB922"},"content":" return [latestClosedMilestone, Milestone.PRWithoutMilestone];"},{"lineNumber":293,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":294,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":295,"author":{"gitId":"NereusWB922"},"content":" return [...this.milestoneService.milestones, Milestone.PRWithoutMilestone];"},{"lineNumber":296,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":297,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"nknguyenhc":97,"Arif-Khalid":192,"NereusWB922":3,"MadLamprey":5}},{"path":"src/app/core/services/github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { ApolloQueryResult } from \u0027@apollo/client/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Apollo, QueryRef } from \u0027apollo-angular\u0027;"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { DocumentNode } from \u0027graphql\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { BehaviorSubject, forkJoin, from, merge, Observable, of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { catchError, filter, flatMap, map, throwIfEmpty } from \u0027rxjs/operators\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" FetchIssue,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" FetchIssueQuery,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" FetchIssuesQuery,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" FetchPullRequests,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" FetchPullRequestsQuery"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} from \u0027../../../../graphql/graphql-types\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { getNumberOfPages } from \u0027../../shared/lib/github-paginator-parser\u0027;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"import { GithubUser, RawGithubUser } from \u0027../models/github-user.model\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { IssueLastModifiedManagerModel } from \u0027../models/github/cache-manager/issue-last-modified-manager.model\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { IssuesCacheManager } from \u0027../models/github/cache-manager/issues-cache-manager.model\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { GithubEvent } from \u0027../models/github/github-event.model\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssue } from \u0027../models/github/github-graphql.issue\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssueOrPr } from \u0027../models/github/github-graphql.issue-or-pr\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { GithubResponse } from \u0027../models/github/github-response.model\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { GithubRelease } from \u0027../models/github/github.release\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { ERRORCODE_NOT_FOUND, ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./error-message.service\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"const { Octokit } \u003d require(\u0027@octokit/rest\u0027);"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"const WATCHER_ORG \u003d \u0027WATcher-org\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"const WATCHER_REPO \u003d \u0027WATcher\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"/** Owner of Repository to watch */"},{"lineNumber":40,"author":{"gitId":"-"},"content":"let ORG_NAME \u003d \u0027\u0027; // repoOrg"},{"lineNumber":41,"author":{"gitId":"-"},"content":"/** Name of Repository to watch */"},{"lineNumber":42,"author":{"gitId":"-"},"content":"let REPO \u003d \u0027\u0027; // repoName"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"/** Owner of Settings repository, currently not used */"},{"lineNumber":45,"author":{"gitId":"-"},"content":"let MOD_ORG \u003d \u0027\u0027;"},{"lineNumber":46,"author":{"gitId":"-"},"content":"/** Name of Settings repository, currently not used */"},{"lineNumber":47,"author":{"gitId":"-"},"content":"let DATA_REPO \u003d \u0027\u0027;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"const MAX_ITEMS_PER_PAGE \u003d 100;"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"let octokit \u003d new Octokit();"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":53,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":54,"author":{"gitId":"-"},"content":"})"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Responsible for communicating with GitHub to create, update, read and delete"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * features related to Github using GitHub API Requests."},{"lineNumber":59,"author":{"gitId":"-"},"content":" * For example, issues, issue labels and repositories."},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":"export class GithubService {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private static readonly IF_NONE_MATCH_EMPTY \u003d { \u0027If-None-Match\u0027: \u0027\u0027 };"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" private issuesCacheManager \u003d new IssuesCacheManager();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private issuesLastModifiedManager \u003d new IssueLastModifiedManagerModel();"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private issueQueryRefs \u003d new Map\u003cnumber, QueryRef\u003cFetchIssueQuery\u003e\u003e();"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" constructor(private errorHandlingService: ErrorHandlingService, private apollo: Apollo, private logger: LoggingService) {}"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(accessToken: string) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" octokit \u003d new Octokit({"},{"lineNumber":72,"author":{"gitId":"-"},"content":" auth() {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return `Token ${accessToken}`;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" },"},{"lineNumber":75,"author":{"gitId":"-"},"content":" log: {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" debug: (message, ...otherInfo) \u003d\u003e this.logger.debug(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // Do not log info for HTTP response 304 due to repeated polling"},{"lineNumber":78,"author":{"gitId":"-"},"content":" info: (message, ...otherInfo) \u003d\u003e"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /304 in \\d+ms$/.test(message) ? undefined : this.logger.info(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" warn: (message, ...otherInfo) \u003d\u003e this.logger.warn(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":81,"author":{"gitId":"-"},"content":" error: (message, ...otherInfo) \u003d\u003e this.logger.error(\u0027GithubService: \u0027 + message, ...otherInfo)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":" });"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets settings repository. Not used."},{"lineNumber":88,"author":{"gitId":"-"},"content":" * @param orgName WATcher organisation"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @param dataRepo WATcher repository"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" storeOrganizationDetails(orgName: string, dataRepo: string) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" MOD_ORG \u003d orgName;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" DATA_REPO \u003d dataRepo;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * Sets repository to watch. This repository is used for fetching from Github."},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" * @param viewRepoOwner Repository owner"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * @param repoName Repository name"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" storeViewDetails(viewRepoOwner: string, repoName: string) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" REPO \u003d repoName;"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" ORG_NAME \u003d viewRepoOwner;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query."},{"lineNumber":108,"author":{"gitId":"-"},"content":" * In WATcher, this includes pull requests."},{"lineNumber":109,"author":{"gitId":"-"},"content":" *"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */"},{"lineNumber":113,"author":{"gitId":"-"},"content":" fetchIssuesGraphql(issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":115,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Github Issues consists of issues and pull requests in WATcher."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" const issueObs \u003d this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":119,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":120,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesQuery, GithubGraphqlIssueOrPr\u003e("},{"lineNumber":122,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO, filter: graphqlFilter },"},{"lineNumber":124,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.issues.edges,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" GithubGraphqlIssueOrPr"},{"lineNumber":126,"author":{"gitId":"-"},"content":" );"},{"lineNumber":127,"author":{"gitId":"-"},"content":" })"},{"lineNumber":128,"author":{"gitId":"-"},"content":" );"},{"lineNumber":129,"author":{"gitId":"-"},"content":" const prObs \u003d this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":130,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":131,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchPullRequestsQuery, GithubGraphqlIssueOrPr\u003e("},{"lineNumber":133,"author":{"gitId":"-"},"content":" FetchPullRequests,"},{"lineNumber":134,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO },"},{"lineNumber":135,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.pullRequests.edges,"},{"lineNumber":136,"author":{"gitId":"-"},"content":" GithubGraphqlIssueOrPr"},{"lineNumber":137,"author":{"gitId":"-"},"content":" );"},{"lineNumber":138,"author":{"gitId":"-"},"content":" })"},{"lineNumber":139,"author":{"gitId":"-"},"content":" );"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" // Concatenate both streams together."},{"lineNumber":142,"author":{"gitId":"-"},"content":" return merge(issueObs, prObs);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * Checks if there are pages of filtered issues that are not cached in the cache model,"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * and updates the model to cache these new pages."},{"lineNumber":148,"author":{"gitId":"-"},"content":" * @param filter - The issue filter."},{"lineNumber":149,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if there are pages that do not exist in the cache model."},{"lineNumber":150,"author":{"gitId":"-"},"content":" */"},{"lineNumber":151,"author":{"gitId":"-"},"content":" private toFetchIssues(filter: RestGithubIssueFilter): Observable\u003cboolean\u003e {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" const pageFetchLimit \u003d 100;"},{"lineNumber":153,"author":{"gitId":"-"},"content":""},{"lineNumber":154,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubIssue[]\u003e;"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return this.getIssuesAPICall(filter, 1).pipe("},{"lineNumber":156,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue[]\u003e) \u003d\u003e {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":158,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":160,"author":{"gitId":"-"},"content":" flatMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e[] \u003d [];"},{"lineNumber":162,"author":{"gitId":"-"},"content":" if (numOfPages \u003e pageFetchLimit) {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" throw new Error(`Repository has too many pages (${numOfPages}), not supported.`);"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":" for (let i \u003d 2; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" apiCalls.push(this.getIssuesAPICall(filter, i));"},{"lineNumber":167,"author":{"gitId":"-"},"content":" }"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":170,"author":{"gitId":"-"},"content":" map((resultArray: GithubResponse\u003cGithubIssue[]\u003e[]) \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" const responses \u003d [responseInFirstPage, ...resultArray];"},{"lineNumber":172,"author":{"gitId":"-"},"content":" const isCached \u003d responses.reduce((result, response) \u003d\u003e {"},{"lineNumber":173,"author":{"gitId":"-"},"content":" return result \u0026\u0026 response.isCached;"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }, true);"},{"lineNumber":175,"author":{"gitId":"-"},"content":" responses.forEach((resp, index) \u003d\u003e this.issuesCacheManager.set(index + 1, resp));"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return !isCached;"},{"lineNumber":177,"author":{"gitId":"-"},"content":" })"},{"lineNumber":178,"author":{"gitId":"-"},"content":" );"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * Checks if the specified repository exists."},{"lineNumber":183,"author":{"gitId":"-"},"content":" * @param owner - Owner of Specified Repository."},{"lineNumber":184,"author":{"gitId":"-"},"content":" * @param repo - Name of Repository."},{"lineNumber":185,"author":{"gitId":"-"},"content":" */"},{"lineNumber":186,"author":{"gitId":"-"},"content":" isRepositoryPresent(owner: string, repo: string): Observable\u003cboolean\u003e {"},{"lineNumber":187,"author":{"gitId":"-"},"content":" return from(octokit.repos.get({ owner: owner, repo: repo, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":188,"author":{"gitId":"-"},"content":" map((rawData: { status: number }) \u003d\u003e {"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return rawData.status !\u003d\u003d ERRORCODE_NOT_FOUND;"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":191,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":194,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.repositoryNotPresentMessage()))"},{"lineNumber":195,"author":{"gitId":"-"},"content":" );"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":199,"author":{"gitId":"-"},"content":" * Fetches information about an issue using GraphQL."},{"lineNumber":200,"author":{"gitId":"-"},"content":" *"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * If the issue is not modified, return a `304 - Not Modified` response."},{"lineNumber":202,"author":{"gitId":"-"},"content":" *"},{"lineNumber":203,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":204,"author":{"gitId":"-"},"content":" * @returns Observable\u003cGithubGraphqlIssue\u003e that represents the response object."},{"lineNumber":205,"author":{"gitId":"-"},"content":" */"},{"lineNumber":206,"author":{"gitId":"-"},"content":" fetchIssueGraphql(id: number): Observable\u003cGithubGraphqlIssue\u003e {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (this.issueQueryRefs.get(id) \u003d\u003d\u003d undefined) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" const newQueryRef \u003d this.apollo.watchQuery\u003cFetchIssueQuery\u003e({"},{"lineNumber":209,"author":{"gitId":"-"},"content":" query: FetchIssue,"},{"lineNumber":210,"author":{"gitId":"-"},"content":" variables: {"},{"lineNumber":211,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" issueId: id"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":" });"},{"lineNumber":216,"author":{"gitId":"-"},"content":" this.issueQueryRefs.set(id, newQueryRef);"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" const queryRef \u003d this.issueQueryRefs.get(id);"},{"lineNumber":220,"author":{"gitId":"-"},"content":" return this.toFetchIssue(id).pipe("},{"lineNumber":221,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":222,"author":{"gitId":"-"},"content":" flatMap(() \u003d\u003e from(queryRef.refetch())),"},{"lineNumber":223,"author":{"gitId":"-"},"content":" map((value: ApolloQueryResult\u003cFetchIssueQuery\u003e) \u003d\u003e {"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return new GithubGraphqlIssue(value.data.repository.issue);"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":226,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e new HttpErrorResponse({ status: 304 }))"},{"lineNumber":227,"author":{"gitId":"-"},"content":" );"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }"},{"lineNumber":229,"author":{"gitId":"-"},"content":""},{"lineNumber":230,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Checks if the issue has been modified since the last query, and"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * updates the model to reflect the last modified time."},{"lineNumber":233,"author":{"gitId":"-"},"content":" *"},{"lineNumber":234,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":235,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if the issue has been modified."},{"lineNumber":236,"author":{"gitId":"-"},"content":" */"},{"lineNumber":237,"author":{"gitId":"-"},"content":" toFetchIssue(id: number): Observable\u003cboolean\u003e {"},{"lineNumber":238,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":239,"author":{"gitId":"-"},"content":" octokit.issues.get({"},{"lineNumber":240,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":241,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":242,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":243,"author":{"gitId":"-"},"content":" headers: { \u0027If-Modified-Since\u0027: this.issuesLastModifiedManager.get(id) }"},{"lineNumber":244,"author":{"gitId":"-"},"content":" })"},{"lineNumber":245,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":246,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":247,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":250,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchIssuesMessage()))"},{"lineNumber":251,"author":{"gitId":"-"},"content":" );"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" fetchAllMilestones(): Observable\u003cArray\u003c{}\u003e\u003e {"},{"lineNumber":255,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":256,"author":{"gitId":"-"},"content":" octokit.issues.listMilestonesForRepo({"},{"lineNumber":257,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":258,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":259,"author":{"gitId":"-"},"content":" state: \u0027all\u0027,"},{"lineNumber":260,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":261,"author":{"gitId":"-"},"content":" headers: GithubService.IF_NONE_MATCH_EMPTY"},{"lineNumber":262,"author":{"gitId":"-"},"content":" })"},{"lineNumber":263,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":264,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":265,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":266,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":267,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchMilestoneMessage()))"},{"lineNumber":268,"author":{"gitId":"-"},"content":" );"},{"lineNumber":269,"author":{"gitId":"-"},"content":" }"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" fetchAllLabels(): Observable\u003cArray\u003c{}\u003e\u003e {"},{"lineNumber":272,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":273,"author":{"gitId":"-"},"content":" octokit.issues.listLabelsForRepo({"},{"lineNumber":274,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":275,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":276,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":277,"author":{"gitId":"-"},"content":" headers: GithubService.IF_NONE_MATCH_EMPTY"},{"lineNumber":278,"author":{"gitId":"-"},"content":" })"},{"lineNumber":279,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":280,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":283,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchLabelsMessage()))"},{"lineNumber":284,"author":{"gitId":"-"},"content":" );"},{"lineNumber":285,"author":{"gitId":"-"},"content":" }"},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":288,"author":{"gitId":"-"},"content":" * Checks if the given list of users are allowed to be assigned to an issue."},{"lineNumber":289,"author":{"gitId":"-"},"content":" * @param assignees - GitHub usernames to be checked"},{"lineNumber":290,"author":{"gitId":"-"},"content":" */"},{"lineNumber":291,"author":{"gitId":"-"},"content":" areUsersAssignable(assignees: string[]): Observable\u003cvoid\u003e {"},{"lineNumber":292,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":293,"author":{"gitId":"-"},"content":" octokit.issues.listAssignees({"},{"lineNumber":294,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":295,"author":{"gitId":"-"},"content":" repo: REPO"},{"lineNumber":296,"author":{"gitId":"-"},"content":" })"},{"lineNumber":297,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":298,"author":{"gitId":"-"},"content":" map(({ data }: { data: { login: string }[] }) \u003d\u003e data.map(({ login }) \u003d\u003e login)),"},{"lineNumber":299,"author":{"gitId":"-"},"content":" map((assignables: string[]) \u003d\u003e"},{"lineNumber":300,"author":{"gitId":"-"},"content":" assignees.forEach((assignee) \u003d\u003e {"},{"lineNumber":301,"author":{"gitId":"-"},"content":" if (!assignables.includes(assignee)) {"},{"lineNumber":302,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.usersUnassignableMessage(assignee));"},{"lineNumber":303,"author":{"gitId":"-"},"content":" }"},{"lineNumber":304,"author":{"gitId":"-"},"content":" })"},{"lineNumber":305,"author":{"gitId":"-"},"content":" )"},{"lineNumber":306,"author":{"gitId":"-"},"content":" );"},{"lineNumber":307,"author":{"gitId":"-"},"content":" }"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":" getUsersAssignable(): Observable\u003cGithubUser[]\u003e {"},{"lineNumber":310,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":311,"author":{"gitId":"-"},"content":" octokit.issues.listAssignees({"},{"lineNumber":312,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":313,"author":{"gitId":"-"},"content":" repo: REPO"},{"lineNumber":314,"author":{"gitId":"-"},"content":" })"},{"lineNumber":315,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":316,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":317,"author":{"gitId":"NereusWB922"},"content":" const data: RawGithubUser[] \u003d response[\u0027data\u0027];"},{"lineNumber":318,"author":{"gitId":"NereusWB922"},"content":" return data.map((rawGithubUser) \u003d\u003e {"},{"lineNumber":319,"author":{"gitId":"NereusWB922"},"content":" return new GithubUser(rawGithubUser);"},{"lineNumber":320,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":321,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":322,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchUsersMessage()))"},{"lineNumber":323,"author":{"gitId":"-"},"content":" );"},{"lineNumber":324,"author":{"gitId":"-"},"content":" }"},{"lineNumber":325,"author":{"gitId":"-"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" fetchEventsForRepo(): Observable\u003cany[]\u003e {"},{"lineNumber":327,"author":{"gitId":"-"},"content":" return from(octokit.issues.listEventsForRepo({ owner: ORG_NAME, repo: REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":328,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":329,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":330,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":331,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchEventsMessage()))"},{"lineNumber":332,"author":{"gitId":"-"},"content":" );"},{"lineNumber":333,"author":{"gitId":"-"},"content":" }"},{"lineNumber":334,"author":{"gitId":"-"},"content":""},{"lineNumber":335,"author":{"gitId":"-"},"content":" fetchEventsForRepoCall(pageNumber: number): Observable\u003cGithubResponse\u003cany[]\u003e\u003e {"},{"lineNumber":336,"author":{"gitId":"-"},"content":" return \u003cObservable\u003cGithubResponse\u003cany[]\u003e\u003e\u003efrom("},{"lineNumber":337,"author":{"gitId":"-"},"content":" octokit.activity.listRepoEvents({"},{"lineNumber":338,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":339,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":340,"author":{"gitId":"-"},"content":" page: pageNumber"},{"lineNumber":341,"author":{"gitId":"-"},"content":" })"},{"lineNumber":342,"author":{"gitId":"-"},"content":" ).pipe(catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchActivityEventsMessage())));"},{"lineNumber":343,"author":{"gitId":"-"},"content":" }"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":346,"author":{"gitId":"-"},"content":" * Fetches all events of current repository for Activity Dashboard."},{"lineNumber":347,"author":{"gitId":"-"},"content":" * Adapted from getIssueApiCalls()."},{"lineNumber":348,"author":{"gitId":"-"},"content":" *"},{"lineNumber":349,"author":{"gitId":"-"},"content":" * @returns GithubEvents observable"},{"lineNumber":350,"author":{"gitId":"-"},"content":" */"},{"lineNumber":351,"author":{"gitId":"-"},"content":" fetchAllEventsForRepo(): Observable\u003cGithubEvent[]\u003e {"},{"lineNumber":352,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubEvent[]\u003e;"},{"lineNumber":353,"author":{"gitId":"-"},"content":" return this.fetchEventsForRepoCall(1).pipe("},{"lineNumber":354,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubEvent[]\u003e) \u003d\u003e {"},{"lineNumber":355,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":356,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":357,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":358,"author":{"gitId":"-"},"content":" flatMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":359,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubEvent[]\u003e\u003e[] \u003d [];"},{"lineNumber":360,"author":{"gitId":"-"},"content":" for (let i \u003d 1; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":361,"author":{"gitId":"-"},"content":" apiCalls.push(this.fetchEventsForRepoCall(i));"},{"lineNumber":362,"author":{"gitId":"-"},"content":" }"},{"lineNumber":363,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":365,"author":{"gitId":"-"},"content":" map((responseArray) \u003d\u003e responseArray.map((x) \u003d\u003e x[\u0027data\u0027]))"},{"lineNumber":366,"author":{"gitId":"-"},"content":" );"},{"lineNumber":367,"author":{"gitId":"-"},"content":" }"},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":370,"author":{"gitId":"-"},"content":" * Not in use. Fetches data csv file from Organization repository."},{"lineNumber":371,"author":{"gitId":"-"},"content":" */"},{"lineNumber":372,"author":{"gitId":"-"},"content":" fetchDataFile(): Observable\u003c{}\u003e {"},{"lineNumber":373,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":374,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027data.csv\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":375,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":376,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e {"},{"lineNumber":377,"author":{"gitId":"-"},"content":" return { data: atob(rawData[\u0027data\u0027][\u0027content\u0027]) };"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":379,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchDataFileMessage()))"},{"lineNumber":380,"author":{"gitId":"-"},"content":" );"},{"lineNumber":381,"author":{"gitId":"-"},"content":" }"},{"lineNumber":382,"author":{"gitId":"-"},"content":""},{"lineNumber":383,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":384,"author":{"gitId":"-"},"content":" * Gets information of latest release of WATcher."},{"lineNumber":385,"author":{"gitId":"-"},"content":" * @returns GithubRelease observable"},{"lineNumber":386,"author":{"gitId":"-"},"content":" */"},{"lineNumber":387,"author":{"gitId":"-"},"content":" fetchLatestRelease(): Observable\u003cGithubRelease\u003e {"},{"lineNumber":388,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":389,"author":{"gitId":"-"},"content":" octokit.repos.getLatestRelease({ owner: WATCHER_ORG, repo: WATCHER_REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":390,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":391,"author":{"gitId":"-"},"content":" map((res) \u003d\u003e res[\u0027data\u0027]),"},{"lineNumber":392,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchLatestReleaseMessage()))"},{"lineNumber":393,"author":{"gitId":"-"},"content":" );"},{"lineNumber":394,"author":{"gitId":"-"},"content":" }"},{"lineNumber":395,"author":{"gitId":"-"},"content":""},{"lineNumber":396,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":397,"author":{"gitId":"-"},"content":" * Fetches the data file that is regulates session information."},{"lineNumber":398,"author":{"gitId":"-"},"content":" * @return Observable\u003cSessionData\u003e representing session information."},{"lineNumber":399,"author":{"gitId":"-"},"content":" */"},{"lineNumber":400,"author":{"gitId":"-"},"content":" fetchSettingsFile(): Observable\u003cSessionData\u003e {"},{"lineNumber":401,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":402,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027settings.json\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":403,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":404,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e JSON.parse(atob(rawData[\u0027data\u0027][\u0027content\u0027]))),"},{"lineNumber":405,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchSettingsFileMessage()))"},{"lineNumber":406,"author":{"gitId":"-"},"content":" );"},{"lineNumber":407,"author":{"gitId":"-"},"content":" }"},{"lineNumber":408,"author":{"gitId":"-"},"content":""},{"lineNumber":409,"author":{"gitId":"-"},"content":" fetchAuthenticatedUser(): Observable\u003cGithubUser\u003e {"},{"lineNumber":410,"author":{"gitId":"-"},"content":" return from(octokit.users.getAuthenticated()).pipe("},{"lineNumber":411,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":412,"author":{"gitId":"NereusWB922"},"content":" const data: RawGithubUser \u003d response[\u0027data\u0027];"},{"lineNumber":413,"author":{"gitId":"NereusWB922"},"content":" return new GithubUser(data);"},{"lineNumber":414,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":415,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(ErrorMessageService.unableToFetchAuthenticatedUsersMessage()))"},{"lineNumber":416,"author":{"gitId":"-"},"content":" );"},{"lineNumber":417,"author":{"gitId":"-"},"content":" }"},{"lineNumber":418,"author":{"gitId":"-"},"content":""},{"lineNumber":419,"author":{"gitId":"-"},"content":" getRepoURL(): string {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" return ORG_NAME.concat(\u0027/\u0027).concat(REPO);"},{"lineNumber":421,"author":{"gitId":"-"},"content":" }"},{"lineNumber":422,"author":{"gitId":"-"},"content":""},{"lineNumber":423,"author":{"gitId":"-"},"content":" viewIssueInBrowser(id: number, event: Event) {"},{"lineNumber":424,"author":{"gitId":"-"},"content":" if (id) {"},{"lineNumber":425,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.getRepoURL()).concat(\u0027/issues/\u0027).concat(String(id)));"},{"lineNumber":426,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":427,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(new Error(ErrorMessageService.unableToOpenInBrowserMessage()));"},{"lineNumber":428,"author":{"gitId":"-"},"content":" }"},{"lineNumber":429,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":430,"author":{"gitId":"-"},"content":" }"},{"lineNumber":431,"author":{"gitId":"-"},"content":""},{"lineNumber":432,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":433,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Resetting issues cache`);"},{"lineNumber":434,"author":{"gitId":"-"},"content":" this.issuesCacheManager.clear();"},{"lineNumber":435,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.clear();"},{"lineNumber":436,"author":{"gitId":"-"},"content":" this.issueQueryRefs.clear();"},{"lineNumber":437,"author":{"gitId":"-"},"content":" }"},{"lineNumber":438,"author":{"gitId":"-"},"content":""},{"lineNumber":439,"author":{"gitId":"-"},"content":" getProfilesData(): Promise\u003cResponse\u003e {"},{"lineNumber":440,"author":{"gitId":"-"},"content":" return fetch(AppConfig.clientDataUrl);"},{"lineNumber":441,"author":{"gitId":"-"},"content":" }"},{"lineNumber":442,"author":{"gitId":"-"},"content":""},{"lineNumber":443,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":444,"author":{"gitId":"-"},"content":" * Performs an API call to fetch a page of filtered issues with a given pageNumber."},{"lineNumber":445,"author":{"gitId":"-"},"content":" *"},{"lineNumber":446,"author":{"gitId":"-"},"content":" * The request is sent with the ETag of the latest cached HTTP response."},{"lineNumber":447,"author":{"gitId":"-"},"content":" * If page requested has the same ETag, or the request results in an error,"},{"lineNumber":448,"author":{"gitId":"-"},"content":" * then the cached page is returned instead."},{"lineNumber":449,"author":{"gitId":"-"},"content":" *"},{"lineNumber":450,"author":{"gitId":"-"},"content":" * @param filter - The issue filter"},{"lineNumber":451,"author":{"gitId":"-"},"content":" * @param pageNumber - The page to be fetched"},{"lineNumber":452,"author":{"gitId":"-"},"content":" * @returns An observable representing the response containing a single page of filtered issues"},{"lineNumber":453,"author":{"gitId":"-"},"content":" */"},{"lineNumber":454,"author":{"gitId":"-"},"content":" private getIssuesAPICall(filter: RestGithubIssueFilter, pageNumber: number): Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e {"},{"lineNumber":455,"author":{"gitId":"-"},"content":" const apiCall: Promise\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e \u003d octokit.issues.listForRepo({"},{"lineNumber":456,"author":{"gitId":"-"},"content":" ...filter,"},{"lineNumber":457,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":458,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":459,"author":{"gitId":"-"},"content":" sort: \u0027created\u0027,"},{"lineNumber":460,"author":{"gitId":"-"},"content":" direction: \u0027desc\u0027,"},{"lineNumber":461,"author":{"gitId":"-"},"content":" per_page: 100,"},{"lineNumber":462,"author":{"gitId":"-"},"content":" page: pageNumber,"},{"lineNumber":463,"author":{"gitId":"-"},"content":" headers: { \u0027If-None-Match\u0027: this.issuesCacheManager.getEtagFor(pageNumber) },"},{"lineNumber":464,"author":{"gitId":"-"},"content":" state: \u0027all\u0027"},{"lineNumber":465,"author":{"gitId":"-"},"content":" });"},{"lineNumber":466,"author":{"gitId":"-"},"content":" const apiCall$ \u003d from("},{"lineNumber":467,"author":{"gitId":"-"},"content":" apiCall.catch((err) \u003d\u003e {"},{"lineNumber":468,"author":{"gitId":"-"},"content":" return this.issuesCacheManager.get(pageNumber);"},{"lineNumber":469,"author":{"gitId":"-"},"content":" })"},{"lineNumber":470,"author":{"gitId":"-"},"content":" );"},{"lineNumber":471,"author":{"gitId":"-"},"content":""},{"lineNumber":472,"author":{"gitId":"-"},"content":" return apiCall$.pipe("},{"lineNumber":473,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":474,"author":{"gitId":"-"},"content":" // catchError does not appear to catch an error on an observable created from a promise..."},{"lineNumber":475,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Error caught in getIssuesAPICall`);"},{"lineNumber":476,"author":{"gitId":"-"},"content":" return of(this.issuesCacheManager.get(pageNumber));"},{"lineNumber":477,"author":{"gitId":"-"},"content":" })"},{"lineNumber":478,"author":{"gitId":"-"},"content":" );"},{"lineNumber":479,"author":{"gitId":"-"},"content":" }"},{"lineNumber":480,"author":{"gitId":"-"},"content":""},{"lineNumber":481,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":482,"author":{"gitId":"-"},"content":" * Fetches a list of items using a GraphQL query that queries for paginated data."},{"lineNumber":483,"author":{"gitId":"-"},"content":" *"},{"lineNumber":484,"author":{"gitId":"-"},"content":" * @param query - The GraphQL query that queries for paginated data."},{"lineNumber":485,"author":{"gitId":"-"},"content":" * @param variables - Additional variables for the GraphQL query."},{"lineNumber":486,"author":{"gitId":"-"},"content":" * @callback pluckEdges A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":487,"author":{"gitId":"-"},"content":" * @callback Model Constructor for the item model."},{"lineNumber":488,"author":{"gitId":"-"},"content":" * @returns A list of items from the query."},{"lineNumber":489,"author":{"gitId":"-"},"content":" */"},{"lineNumber":490,"author":{"gitId":"-"},"content":" private fetchGraphqlList\u003cT, M\u003e("},{"lineNumber":491,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":492,"author":{"gitId":"-"},"content":" variables: {},"},{"lineNumber":493,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":494,"author":{"gitId":"-"},"content":" Model: new (data) \u003d\u003e M"},{"lineNumber":495,"author":{"gitId":"-"},"content":" ): Observable\u003cArray\u003cM\u003e\u003e {"},{"lineNumber":496,"author":{"gitId":"-"},"content":" return this.withPagination\u003cT\u003e(pluckEdges, query, variables, false).pipe("},{"lineNumber":497,"author":{"gitId":"-"},"content":" map((results: ApolloQueryResult\u003cT\u003e[]) \u003d\u003e {"},{"lineNumber":498,"author":{"gitId":"-"},"content":" const issues \u003d results.reduce((accumulated, current) \u003d\u003e accumulated.concat(pluckEdges(current)), []);"},{"lineNumber":499,"author":{"gitId":"-"},"content":" return issues.map((issue) \u003d\u003e new Model(issue.node));"},{"lineNumber":500,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":501,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e {"},{"lineNumber":502,"author":{"gitId":"-"},"content":" return new HttpErrorResponse({ status: 304 });"},{"lineNumber":503,"author":{"gitId":"-"},"content":" })"},{"lineNumber":504,"author":{"gitId":"-"},"content":" );"},{"lineNumber":505,"author":{"gitId":"-"},"content":" }"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":508,"author":{"gitId":"-"},"content":" * Returns an observable that will continually emit the currently accumulated results, until a page that has less"},{"lineNumber":509,"author":{"gitId":"-"},"content":" * than 100 items is found, after which it performs a final emit with the full results array, and completes."},{"lineNumber":510,"author":{"gitId":"-"},"content":" *"},{"lineNumber":511,"author":{"gitId":"-"},"content":" * If `shouldAccumulate` is false, the observable will emit only the latest result, it will still complete on the"},{"lineNumber":512,"author":{"gitId":"-"},"content":" * same condition."},{"lineNumber":513,"author":{"gitId":"-"},"content":" *"},{"lineNumber":514,"author":{"gitId":"-"},"content":" * @callback pluckEdges - A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":515,"author":{"gitId":"-"},"content":" * @params query - The query to be performed."},{"lineNumber":516,"author":{"gitId":"-"},"content":" * @params variables - The variables for the query."},{"lineNumber":517,"author":{"gitId":"-"},"content":" * @params shouldAccumulate - Whether the observable should accumulate the results."},{"lineNumber":518,"author":{"gitId":"-"},"content":" * @returns an observable"},{"lineNumber":519,"author":{"gitId":"-"},"content":" */"},{"lineNumber":520,"author":{"gitId":"-"},"content":" private withPagination\u003cT\u003e("},{"lineNumber":521,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":522,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":523,"author":{"gitId":"-"},"content":" variables: { [key: string]: any } \u003d {},"},{"lineNumber":524,"author":{"gitId":"-"},"content":" shouldAccumulate: boolean \u003d true"},{"lineNumber":525,"author":{"gitId":"-"},"content":" ): Observable\u003cApolloQueryResult\u003cT\u003e[]\u003e {"},{"lineNumber":526,"author":{"gitId":"-"},"content":" const maxResultsCount \u003d 100;"},{"lineNumber":527,"author":{"gitId":"-"},"content":" const apollo \u003d this.apollo;"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" let accumulatedResults: ApolloQueryResult\u003cT\u003e[] \u003d [];"},{"lineNumber":530,"author":{"gitId":"-"},"content":" const behaviorSubject: BehaviorSubject\u003cApolloQueryResult\u003cT\u003e[]\u003e \u003d new BehaviorSubject(accumulatedResults);"},{"lineNumber":531,"author":{"gitId":"-"},"content":""},{"lineNumber":532,"author":{"gitId":"-"},"content":" async function queryWith(cursor: string): Promise\u003cvoid\u003e {"},{"lineNumber":533,"author":{"gitId":"-"},"content":" const graphqlQuery \u003d apollo.watchQuery\u003cT\u003e({ query, variables: { ...variables, cursor } });"},{"lineNumber":534,"author":{"gitId":"-"},"content":""},{"lineNumber":535,"author":{"gitId":"-"},"content":" await graphqlQuery.refetch().then(async (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e {"},{"lineNumber":536,"author":{"gitId":"-"},"content":" const intermediate \u003d Array.isArray(results) ? results : [results];"},{"lineNumber":537,"author":{"gitId":"-"},"content":" const edges \u003d pluckEdges(results);"},{"lineNumber":538,"author":{"gitId":"-"},"content":" const nextCursor \u003d edges.length \u003d\u003d\u003d 0 ? null : edges[edges.length - 1].cursor;"},{"lineNumber":539,"author":{"gitId":"-"},"content":""},{"lineNumber":540,"author":{"gitId":"-"},"content":" if (shouldAccumulate) {"},{"lineNumber":541,"author":{"gitId":"-"},"content":" accumulatedResults \u003d accumulatedResults.concat(intermediate);"},{"lineNumber":542,"author":{"gitId":"-"},"content":" behaviorSubject.next(accumulatedResults);"},{"lineNumber":543,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":544,"author":{"gitId":"-"},"content":" behaviorSubject.next(intermediate);"},{"lineNumber":545,"author":{"gitId":"-"},"content":" }"},{"lineNumber":546,"author":{"gitId":"-"},"content":" if (edges.length \u003c maxResultsCount || !nextCursor) {"},{"lineNumber":547,"author":{"gitId":"-"},"content":" // No more queries to perform."},{"lineNumber":548,"author":{"gitId":"-"},"content":" behaviorSubject.complete();"},{"lineNumber":549,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":550,"author":{"gitId":"-"},"content":" }"},{"lineNumber":551,"author":{"gitId":"-"},"content":""},{"lineNumber":552,"author":{"gitId":"-"},"content":" // Use a chain of await to ensure that all recursive queries are completed before `complete` is called."},{"lineNumber":553,"author":{"gitId":"-"},"content":" await queryWith(nextCursor);"},{"lineNumber":554,"author":{"gitId":"-"},"content":" });"},{"lineNumber":555,"author":{"gitId":"-"},"content":" }"},{"lineNumber":556,"author":{"gitId":"-"},"content":""},{"lineNumber":557,"author":{"gitId":"-"},"content":" queryWith(null);"},{"lineNumber":558,"author":{"gitId":"-"},"content":""},{"lineNumber":559,"author":{"gitId":"-"},"content":" return behaviorSubject.asObservable();"},{"lineNumber":560,"author":{"gitId":"-"},"content":" }"},{"lineNumber":561,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":10,"MadLamprey":2,"-":549}},{"path":"src/app/core/services/grouping/assignee-grouping-strategy.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { GithubUser } from \u0027../../models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" * A GroupingStrategy that groups issues/prs based on their assignees."},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class AssigneeGroupingStrategy implements GroupingStrategy {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific assignee."},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" * If it is the\"No Assignee\" group, unassigned issues are returned."},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * Otherwise, issues assigned to the specified user are returned."},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: GithubUser): Issue[] {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" if (key \u003d\u003d\u003d GithubUser.NO_ASSIGNEE) {"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" return this.getUnassignedData(issues);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" return this.getDataAssignedToUser(issues, key);"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" * Retrieves an Observable emitting users who can be assigned to issues,"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" * including a special \"No Assignee\" option."},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGithubUser[]\u003e {"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" return this.githubService.getUsersAssignable().pipe("},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" map((users) \u003d\u003e {"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" users.push(GithubUser.NO_ASSIGNEE);"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" return users;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" })"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" * Groups other than \"No Assignee\" need to be shown on the"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" * hidden group list if empty."},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: GithubUser): boolean {"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" return group !\u003d\u003d GithubUser.NO_ASSIGNEE;"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" private getDataAssignedToUser(issues: Issue[], user: GithubUser): Issue[] {"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" const filteredIssues \u003d issues.filter((issue) \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" if (this.isPullRequest(issue)) {"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" return this.isPullRequestCreatedByTarget(issue, user);"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" return this.isIssueAssignedToTarget(issue, user);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" return filteredIssues;"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" private getUnassignedData(issues: Issue[]): Issue[] {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" return issues.filter((issue) \u003d\u003e !this.isPullRequest(issue) \u0026\u0026 issue.assignees.length \u003d\u003d\u003d 0);"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" private isPullRequest(issue: Issue): boolean {"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" return issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027;"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" private isPullRequestCreatedByTarget(issue: Issue, target: GithubUser): boolean {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" return issue.author \u003d\u003d\u003d target.login;"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" private isIssueAssignedToTarget(issue: Issue, target: GithubUser): boolean {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" const isAssigneesFieldDefined \u003d !!issue.assignees;"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" return isAssigneesFieldDefined \u0026\u0026 issue.assignees.includes(target.login);"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":81}},{"path":"src/app/core/services/grouping/grouping-context.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable, Injector } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { BehaviorSubject, Observable } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../models/github/group.interface\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { AssigneeGroupingStrategy } from \u0027./assignee-grouping-strategy.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { MilestoneGroupingStrategy } from \u0027./milestone-grouping-strategy.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export enum GroupBy {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" Assignee \u003d \u0027assignee\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" Milestone \u003d \u0027milestone\u0027"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export const DEFAULT_GROUPBY \u003d GroupBy.Assignee;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" * A service responsible for managing the current grouping strategy and providing grouped data."},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":"export class GroupingContextService {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" public static readonly GROUP_BY_QUERY_PARAM_KEY \u003d \u0027groupby\u0027;"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" private currGroupBySubject: BehaviorSubject\u003cGroupBy\u003e;"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" currGroupBy: GroupBy;"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" currGroupBy$: Observable\u003cGroupBy\u003e;"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" private groupingStrategyMap: Map\u003cstring, GroupingStrategy\u003e;"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" constructor(private injector: Injector, private route: ActivatedRoute, private router: Router) {"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy \u003d DEFAULT_GROUPBY;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBySubject \u003d new BehaviorSubject\u003cGroupBy\u003e(this.currGroupBy);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy$ \u003d this.currGroupBySubject.asObservable();"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap \u003d new Map\u003cstring, GroupingStrategy\u003e();"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" // Initialize the grouping strategy map with available strategies"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap.set(GroupBy.Assignee, this.injector.get(AssigneeGroupingStrategy));"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" this.groupingStrategyMap.set(GroupBy.Milestone, this.injector.get(MilestoneGroupingStrategy));"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" * Initializes the service from URL parameters."},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" initializeFromUrlParams() {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" const groupByParam \u003d this.route.snapshot.queryParamMap.get(GroupingContextService.GROUP_BY_QUERY_PARAM_KEY);"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" if (groupByParam \u0026\u0026 Object.values(GroupBy).includes(groupByParam as GroupBy)) {"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(groupByParam as GroupBy);"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" } else {"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(DEFAULT_GROUPBY);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" * Sets the current grouping type and updates the corresponding query parameter in the URL."},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" * @param groupBy The grouping type to set."},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" setCurrentGroupingType(groupBy: GroupBy): void {"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBy \u003d groupBy;"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" this.currGroupBySubject.next(this.currGroupBy);"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" this.router.navigate([], {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" relativeTo: this.route,"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" queryParams: {"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" [GroupingContextService.GROUP_BY_QUERY_PARAM_KEY]: groupBy"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" },"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" replaceUrl: true"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific group."},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" * @param issues - An array of issues to be grouped."},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group by which issues are to be grouped."},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" * @returns An array of issues belonging to the specified group."},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], group: Group): Issue[] {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" return strategy.getDataForGroup(issues, group);"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" * Retrieves all groups available for current grouping strategy."},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" * @returns An Observable emitting an array of groups."},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGroup[]\u003e {"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" return strategy.getGroups();"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" * Determines whether a group should be shown on hidden list if it contains no issues."},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group to check."},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" * @returns A boolean indicating whether the group should be shown on hidden list if empty."},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Group): boolean {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" const strategy \u003d this.groupingStrategyMap.get(this.currGroupBy);"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" return strategy.isInHiddenList(group);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" * Resets the current grouping type to the default."},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" reset(): void {"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" this.setCurrentGroupingType(DEFAULT_GROUPBY);"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":110}},{"path":"src/app/core/services/grouping/grouping-strategy.interface.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../models/github/group.interface\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" * Represent a strategy for grouping issues/prs."},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" * This interface follows the Strategy Pattern, allowing for different"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" * strategies to be implemented for grouping issues/prs based on different criteria."},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export interface GroupingStrategy {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a specific group."},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" * @param issues - An array of issues to be grouped."},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" * @param key - The group by which issues are to be grouped."},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" * @returns An array of issues belonging to the specified group."},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: Group): Issue[];"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" * Retrieves observable emitting groups available for the grouping strategy."},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" * @returns An Observable emitting an array of groups."},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cGroup[]\u003e;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Determines whether a group should be shown on hidden list if it contains no issues."},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" * @param group - The group to check."},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" * @returns A boolean indicating whether the group should be shown on hidden list if empty."},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Group): boolean;"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":31}},{"path":"src/app/core/services/grouping/milestone-grouping-strategy.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Issue } from \u0027../../models/issue.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Milestone } from \u0027../../models/milestone.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { MilestoneService } from \u0027../milestone.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GroupingStrategy } from \u0027./grouping-strategy.interface\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" * A GroupingStrategy that groups issues/prs based on their milestones."},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class MilestoneGroupingStrategy implements GroupingStrategy {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(private milestoneService: MilestoneService) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" * Retrieves data for a milestone."},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" getDataForGroup(issues: Issue[], key: Milestone): Issue[] {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" return issues.filter((issue) \u003d\u003e issue.milestone.equals(key));"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Retrieves an Observable emitting milestones available for grouping issues."},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" getGroups(): Observable\u003cMilestone[]\u003e {"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneService.fetchMilestones().pipe("},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" map((milestones) \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" const parseMilestone \u003d this.milestoneService.parseMilestoneData(milestones);"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" parseMilestone.push(Milestone.IssueWithoutMilestone);"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" parseMilestone.push(Milestone.PRWithoutMilestone);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" return parseMilestone;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" })"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" * Groups other than Default Milestone need to be shown on the"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" * hidden group list if empty."},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" isInHiddenList(group: Milestone): boolean {"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" return group !\u003d\u003d Milestone.IssueWithoutMilestone \u0026\u0026 group !\u003d\u003d Milestone.PRWithoutMilestone;"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":45,"MadLamprey":1}},{"path":"src/app/core/services/issue.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { BehaviorSubject, Observable, of, Subscription, throwError, timer } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { catchError, exhaustMap, finalize, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue, Issues, IssuesFilter } from \u0027../models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./user.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027./view.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Responsible for creating and updating issues, and periodically fetching issues"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * using GitHub."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class IssueService {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" static readonly POLL_INTERVAL \u003d 5000; // 5 seconds"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" issues: Issues;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" issues$: BehaviorSubject\u003cIssue[]\u003e;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private sessionId: string;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private issueTeamFilter \u003d \u0027All Teams\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private issuesPollSubscription: Subscription;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /** Whether the IssueService is downloading the data from Github*/"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public isLoading \u003d new BehaviorSubject\u003cboolean\u003e(false);"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" constructor(private githubService: GithubService, private userService: UserService, private viewService: ViewService) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.issues$ \u003d new BehaviorSubject(new Array\u003cIssue\u003e());"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" startPollIssues() {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (this.issuesPollSubscription \u003d\u003d\u003d undefined) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (this.issues$.getValue().length \u003d\u003d\u003d 0) {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.isLoading.next(true);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.issuesPollSubscription \u003d timer(0, IssueService.POLL_INTERVAL)"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":44,"author":{"gitId":"-"},"content":" exhaustMap(() \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return this.reloadAllIssues().pipe("},{"lineNumber":46,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(err)),"},{"lineNumber":47,"author":{"gitId":"-"},"content":" finalize(() \u003d\u003e this.isLoading.next(false))"},{"lineNumber":48,"author":{"gitId":"-"},"content":" );"},{"lineNumber":49,"author":{"gitId":"-"},"content":" })"},{"lineNumber":50,"author":{"gitId":"-"},"content":" )"},{"lineNumber":51,"author":{"gitId":"-"},"content":" .subscribe();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" stopPollIssues() {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (this.issuesPollSubscription) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.issuesPollSubscription.unsubscribe();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" this.issuesPollSubscription \u003d undefined;"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":" reloadAllIssues() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this.initializeData();"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" getIssue(id: number): Observable\u003cIssue\u003e {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return this.getLatestIssue(id);"},{"lineNumber":69,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return of(this.issues[id]);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" getLatestIssue(id: number): Observable\u003cIssue\u003e {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this.githubService.fetchIssueGraphql(id).pipe("},{"lineNumber":76,"author":{"gitId":"-"},"content":" map((response: GithubIssue) \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.createAndSaveIssueModels([response]);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return this.issues[id];"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return of(this.issues[id]);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" );"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * This function will update the issue\u0027s state of the application. This function needs to be called whenever a issue is added/updated."},{"lineNumber":88,"author":{"gitId":"-"},"content":" *"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @params issuesToUpdate - An array of issues to update the state of the application with."},{"lineNumber":90,"author":{"gitId":"-"},"content":" */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private updateLocalStore(issuesToUpdate: Issue[]) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" const newIssues \u003d { ...this.issues };"},{"lineNumber":93,"author":{"gitId":"-"},"content":" issuesToUpdate.forEach((issue) \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" newIssues[issue.id] \u003d issue;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" });"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.issues \u003d newIssues;"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" this.issues$.next(Object.values(this.issues));"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" reset(resetSessionId: boolean) {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (resetSessionId) {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.sessionId \u003d undefined;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" this.issues \u003d undefined;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" this.issues$.next(new Array\u003cIssue\u003e());"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.stopPollIssues();"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" private initializeData(): Observable\u003cIssue[]\u003e {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" let issuesAPICallsByFilter: Observable\u003cArray\u003cGithubIssue\u003e\u003e;"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" switch (IssuesFilter[this.viewService.currentView][this.userService.currentUser.role]) {"},{"lineNumber":116,"author":{"gitId":"-"},"content":" case \u0027FILTER_BY_CREATOR\u0027:"},{"lineNumber":117,"author":{"gitId":"-"},"content":" issuesAPICallsByFilter \u003d this.githubService.fetchIssuesGraphql("},{"lineNumber":118,"author":{"gitId":"-"},"content":" new RestGithubIssueFilter({ creator: this.userService.currentUser.loginId })"},{"lineNumber":119,"author":{"gitId":"-"},"content":" );"},{"lineNumber":120,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" case \u0027NO_FILTER\u0027:"},{"lineNumber":122,"author":{"gitId":"-"},"content":" issuesAPICallsByFilter \u003d this.githubService.fetchIssuesGraphql(new RestGithubIssueFilter({}));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":124,"author":{"gitId":"-"},"content":" case \u0027NO_ACCESS\u0027:"},{"lineNumber":125,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return of([]);"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" const fetchedIssueIds: number[] \u003d [];"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" return issuesAPICallsByFilter.pipe("},{"lineNumber":132,"author":{"gitId":"-"},"content":" map((githubIssues: GithubIssue[]) \u003d\u003e {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" const issues \u003d this.createAndSaveIssueModels(githubIssues);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" for (const issue of issues) {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" fetchedIssueIds.push(issue.id);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" const outdatedIssueIds: number[] \u003d this.getOutdatedIssueIds(fetchedIssueIds);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" this.deleteIssuesFromLocalStore(outdatedIssueIds);"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined) {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" return [];"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return Object.values(this.issues);"},{"lineNumber":145,"author":{"gitId":"-"},"content":" })"},{"lineNumber":146,"author":{"gitId":"-"},"content":" );"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" private createAndSaveIssueModels(githubIssues: GithubIssue[]): Issue[] {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" const issues: Issue[] \u003d [];"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (const githubIssue of githubIssues) {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" const issue \u003d this.createIssueModel(githubIssue);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" issues.push(issue);"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":" this.updateLocalStore(issues);"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" return issues;"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" private deleteIssuesFromLocalStore(ids: number[]): void {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" const withoutIssuesToRemove \u003d { ...this.issues };"},{"lineNumber":163,"author":{"gitId":"-"},"content":" for (const id of ids) {"},{"lineNumber":164,"author":{"gitId":"-"},"content":" delete withoutIssuesToRemove[id];"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" this.issues \u003d withoutIssuesToRemove;"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.issues$.next(Object.values(this.issues));"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":173,"author":{"gitId":"-"},"content":" * Returns an array of outdated issue ids by comparing the ids of the recently"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * fetched issues with the current issue ids in the local store"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */"},{"lineNumber":176,"author":{"gitId":"-"},"content":" private getOutdatedIssueIds(fetchedIssueIds: number[]): number[] {"},{"lineNumber":177,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Ignore for first fetch or ignore if there is no fetch result"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" We also have to ignore for no fetch result as the cache might return a"},{"lineNumber":181,"author":{"gitId":"-"},"content":" 304 reponse with no differences in issues, resulting in the fetchIssueIds"},{"lineNumber":182,"author":{"gitId":"-"},"content":" to be empty"},{"lineNumber":183,"author":{"gitId":"-"},"content":" */"},{"lineNumber":184,"author":{"gitId":"-"},"content":" if (this.issues \u003d\u003d\u003d undefined || !fetchedIssueIds.length) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" return [];"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" const fetchedIssueIdsSet \u003d new Set\u003cnumber\u003e(fetchedIssueIds);"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" const result \u003d Object.keys(this.issues)"},{"lineNumber":191,"author":{"gitId":"-"},"content":" .map((x) \u003d\u003e +x)"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .filter((issueId) \u003d\u003e !fetchedIssueIdsSet.has(issueId));"},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" private createIssueModel(githubIssue: GithubIssue): Issue {"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" switch (this.viewService.currentView) {"},{"lineNumber":199,"author":{"gitId":"NereusWB922"},"content":" case View.issuesViewer:"},{"lineNumber":200,"author":{"gitId":"-"},"content":" return Issue.createPhaseBugReportingIssue(githubIssue);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":202,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" setIssueTeamFilter(filterValue: string) {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (filterValue) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" this.issueTeamFilter \u003d filterValue;"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" setSessionId(sessionId: string) {"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.sessionId \u003d sessionId;"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" getIssueTeamFilter(): string {"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return this.issueTeamFilter;"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }"},{"lineNumber":219,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":6,"-":213}},{"path":"src/app/core/services/label.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { BehaviorSubject, EMPTY, Observable, of, Subject, Subscription, timer } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { catchError, exhaustMap, finalize, map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Label, SimpleLabel } from \u0027../models/label.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/* The threshold to decide if color is dark or light."},{"lineNumber":8,"author":{"gitId":"-"},"content":"A higher threshold value will result in more colors determined to be \"dark\"."},{"lineNumber":9,"author":{"gitId":"-"},"content":"W3C recommendation is 0.179, but 0.184 is chosen so that some colors (like bright red)"},{"lineNumber":10,"author":{"gitId":"-"},"content":"are considered dark (Github too consider them dark) */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"const COLOR_DARKNESS_THRESHOLD \u003d 0.184;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"const COLOR_BLACK \u003d \u0027000000\u0027; // Dark color for text with light background"},{"lineNumber":14,"author":{"gitId":"-"},"content":"const COLOR_WHITE \u003d \u0027ffffff\u0027; // Light color for text with dark background"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":18,"author":{"gitId":"-"},"content":"})"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Responsible for retrieval and parsing of label data"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * from the GitHub repository for the WATcher application."},{"lineNumber":23,"author":{"gitId":"-"},"content":" */"},{"lineNumber":24,"author":{"gitId":"-"},"content":"export class LabelService {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" static readonly POLL_INTERVAL \u003d 5000; // 5 seconds"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" labels: Label[];"},{"lineNumber":28,"author":{"gitId":"-"},"content":" simpleLabels: SimpleLabel[];"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" private labelsPollSubscription: Subscription;"},{"lineNumber":31,"author":{"gitId":"Arif-Khalid"},"content":" private labelsSubject \u003d new Subject\u003cSimpleLabel[]\u003e();"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" startPollLabels() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (this.labelsPollSubscription) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.labelsPollSubscription \u003d timer(0, LabelService.POLL_INTERVAL)"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":41,"author":{"gitId":"-"},"content":" exhaustMap(() \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return this.fetchLabels().pipe("},{"lineNumber":43,"author":{"gitId":"-"},"content":" catchError(() \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return EMPTY;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" );"},{"lineNumber":47,"author":{"gitId":"-"},"content":" })"},{"lineNumber":48,"author":{"gitId":"-"},"content":" )"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .subscribe(() \u003d\u003e {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" this.labelsSubject.next(this.simpleLabels);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" stopPollLabels() {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (this.labelsPollSubscription) {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.labelsPollSubscription.unsubscribe();"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.labelsPollSubscription \u003d undefined;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" connect(): Observable\u003cSimpleLabel[]\u003e {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return this.labelsSubject.asObservable();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Fetch labels from Github."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public fetchLabels(): Observable\u003cany\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return this.githubService.fetchAllLabels().pipe("},{"lineNumber":70,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.labels \u003d this.parseLabelData(response);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.simpleLabels \u003d this.labels;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.labelsSubject.next(this.simpleLabels);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return response;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" })"},{"lineNumber":76,"author":{"gitId":"-"},"content":" );"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Parses label information and returns an array of Label objects."},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param labels - Label Information from API."},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" parseLabelData(labels: Array\u003cany\u003e): Label[] {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" const labelData: Label[] \u003d [];"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" for (const label of labels) {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" labelData.push(new Label(label));"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return labelData;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Returns true if the given color is considered \"dark\""},{"lineNumber":94,"author":{"gitId":"-"},"content":" * The color is considered \"dark\" if its luminance is less than COLOR_DARKNESS_THRESHOLD"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @param inputColor: the color"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */"},{"lineNumber":97,"author":{"gitId":"-"},"content":" isDarkColor(inputColor: string): boolean {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" const COLOR \u003d inputColor.charAt(0) \u003d\u003d\u003d \u0027#\u0027 ? inputColor.substring(1, 7) : inputColor;"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const R \u003d parseInt(COLOR.substring(0, 2), 16);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" const G \u003d parseInt(COLOR.substring(2, 4), 16);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" const B \u003d parseInt(COLOR.substring(4, 6), 16);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" const RGB \u003d [R / 255, G / 255, B / 255];"},{"lineNumber":103,"author":{"gitId":"-"},"content":" const LINEAR_RGB \u003d RGB.map((col) \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (col \u003c\u003d 0.03928) {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return col / 12.92;"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return Math.pow((col + 0.055) / 1.055, 2.4);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":" // Calculate the luminance of the color"},{"lineNumber":110,"author":{"gitId":"-"},"content":" const LUMINANCE \u003d 0.2126 * LINEAR_RGB[0] + 0.7152 * LINEAR_RGB[1] + 0.0722 * LINEAR_RGB[2];"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // The color is \"dark\" if the luminance is lower than the threshold"},{"lineNumber":112,"author":{"gitId":"-"},"content":" return LUMINANCE \u003c COLOR_DARKNESS_THRESHOLD;"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Returns a css style for the background and text color of the label"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * @param color: the color of the label"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @return the style with background-color in rgb"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @throws exception if input is an invalid color code"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */"},{"lineNumber":121,"author":{"gitId":"-"},"content":" setLabelStyle(color: string) {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" let textColor: string;"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" textColor \u003d this.isDarkColor(color) ? COLOR_WHITE : COLOR_BLACK;"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" const styles \u003d {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${color}`,"},{"lineNumber":128,"author":{"gitId":"-"},"content":" color: `#${textColor}`"},{"lineNumber":129,"author":{"gitId":"-"},"content":" };"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" return styles;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" reset() {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.labels \u003d undefined;"},{"lineNumber":136,"author":{"gitId":"-"},"content":" this.simpleLabels \u003d undefined;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" this.stopPollLabels();"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"-":137}},{"path":"src/app/core/services/milestone.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Milestone } from \u0027../models/milestone.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":8,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":9,"author":{"gitId":"-"},"content":"})"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Responsible for retrieval and parsing and syncing of milestone data"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * from the GitHub repository for the WATcher application."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class MilestoneService {"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" milestones: Milestone[] \u003d [];"},{"lineNumber":17,"author":{"gitId":"-"},"content":" hasNoMilestones: boolean;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Fetch all milestones from github."},{"lineNumber":23,"author":{"gitId":"-"},"content":" */"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public fetchMilestones(): Observable\u003cany\u003e {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return this.githubService.fetchAllMilestones().pipe("},{"lineNumber":26,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.milestones \u003d this.parseMilestoneData(response);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.hasNoMilestones \u003d response.length \u003d\u003d\u003d 0;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return response;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" })"},{"lineNumber":31,"author":{"gitId":"-"},"content":" );"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Parses milestone information and returns an array of Milestone objects."},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param milestones - Milestone Information from API."},{"lineNumber":37,"author":{"gitId":"-"},"content":" */"},{"lineNumber":38,"author":{"gitId":"-"},"content":" parseMilestoneData(milestones: Array\u003cany\u003e): Milestone[] {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" const milestoneData: Milestone[] \u003d [];"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" for (const milestone of milestones) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" milestoneData.push(new Milestone(milestone));"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }"},{"lineNumber":44,"author":{"gitId":"-"},"content":" milestoneData.sort((a: Milestone, b: Milestone) \u003d\u003e a.title.localeCompare(b.title));"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" return milestoneData;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" * Gets the open milestone with the earliest deadline."},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" * Returns null if there is no open milestone with deadline."},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" getEarliestOpenMilestone(): Milestone {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" let earliestOpenMilestone: Milestone \u003d null;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" for (const milestone of this.milestones) {"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" if (!milestone.deadline || milestone.state !\u003d\u003d \u0027open\u0027) {"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" continue;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" if (earliestOpenMilestone \u003d\u003d\u003d null) {"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" earliestOpenMilestone \u003d milestone;"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" } else if (milestone.deadline \u003c earliestOpenMilestone.deadline) {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" earliestOpenMilestone \u003d milestone;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":" return earliestOpenMilestone;"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" * Gets the closed milestone with the latest deadline."},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" * Returns null if there is no closed milestone with deadline."},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" getLatestClosedMilestone(): Milestone {"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" let latestClosedMilestone: Milestone \u003d null;"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" for (const milestone of this.milestones) {"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" if (!milestone.deadline || milestone.state !\u003d\u003d \u0027closed\u0027) {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" continue;"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" if (latestClosedMilestone \u003d\u003d\u003d null) {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" latestClosedMilestone \u003d milestone;"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" } else if (milestone.deadline \u003e latestClosedMilestone.deadline) {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" latestClosedMilestone \u003d milestone;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":" return latestClosedMilestone;"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":39,"-":47}},{"path":"src/app/core/services/view.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { BehaviorSubject, Observable, of, Subject } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../constants/storage-keys.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../models/repo.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../models/view.model\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./error-message.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027./repo-url-cache.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"export const SESSION_AVALIABILITY_FIX_FAILED \u003d \u0027Session Availability Fix failed.\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" * The title of each view that appears in the header bar."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"export const ViewDescription \u003d {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" [View.issuesViewer]: \u0027Issues Dashboard\u0027,"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" [View.activityDashboard]: \u0027Activity Dashboard\u0027"},{"lineNumber":22,"author":{"gitId":"-"},"content":"};"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * All data of the session."},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" * Add accessible views here."},{"lineNumber":27,"author":{"gitId":"-"},"content":" */"},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const STARTING_SESSION_DATA: SessionData \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sessionRepo: ["},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" { view: View.issuesViewer, repos: [] }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" // { view: View.activityDashboard, repos: [] }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":33,"author":{"gitId":"-"},"content":"};"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":"export const STARTING_VIEW \u003d View.issuesViewer;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":38,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":39,"author":{"gitId":"-"},"content":"})"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Responsible for managing the current selected feature of WATcher as well as the"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * current session data and repository details related to the session."},{"lineNumber":44,"author":{"gitId":"-"},"content":" */"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":"export class ViewService {"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" public static readonly REPO_QUERY_PARAM_KEY \u003d \u0027repo\u0027;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" public currentView: View \u003d STARTING_VIEW;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" public currentRepo: Repo; // current or main repository of current view"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" public otherRepos: Repo[]; // more repositories relevant to this view"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" repoSetSource \u003d new BehaviorSubject(false);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" repoSetState \u003d this.repoSetSource.asObservable();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Expose an observable to track changes to currentRepo"},{"lineNumber":57,"author":{"gitId":"-"},"content":" *"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * TODO - replace all references to currentRepo to have"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * dependencies subscribe to this observable?"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public repoChanged$: Subject\u003cRepo | null\u003e \u003d new Subject();"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" /** Whether the ViewService is changing the repository */"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public isChangingRepo \u003d new BehaviorSubject\u003cboolean\u003e(false);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" public sessionData \u003d STARTING_SESSION_DATA; // stores session data for the session"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" constructor("},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" private githubService: GithubService,"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" private repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" public logger: LoggingService,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" private route: ActivatedRoute,"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" private router: Router"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" ) {}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Sets the current main repository and additional repos if any."},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" * Updates session data in View Service and local storage."},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Updates Github Service with current repository."},{"lineNumber":80,"author":{"gitId":"-"},"content":" * @param repo Main current repository"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param repos Additional repositories"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" setRepository(repo: Repo, repos?: Repo[]): void {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" this.currentRepo \u003d repo;"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.otherRepos \u003d repos ? repos : [];"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" this.sessionData.sessionRepo.find((x) \u003d\u003e x.view \u003d\u003d\u003d this.currentView).repos \u003d this.getRepository();"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" this.githubService.storeViewDetails(this.currentRepo.owner, this.currentRepo.name);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" localStorage.setItem(\u0027sessionData\u0027, JSON.stringify(this.sessionData));"},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" this.router.navigate([\u0027issuesViewer\u0027], {"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" queryParams: {"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" [ViewService.REPO_QUERY_PARAM_KEY]: repo.toString()"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" },"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Changes current respository to a new repository."},{"lineNumber":99,"author":{"gitId":"-"},"content":" * @param repo New current repository"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private changeCurrentRepository(repo: Repo): void {"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: Changing current repository to \u0027${repo}\u0027`);"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" if (this.currentView \u003d\u003d\u003d View.issuesViewer) {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" /** Adds past repositories to view */"},{"lineNumber":106,"author":{"gitId":"-"},"content":" (this.otherRepos || []).push(this.currentRepo);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":" this.setRepository(repo, this.otherRepos);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" this.repoUrlCacheService.cache(repo.toString());"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" this.repoChanged$.next(repo);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Change repository if a valid repository is provided"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * @param repo New repository"},{"lineNumber":118,"author":{"gitId":"-"},"content":" */"},{"lineNumber":119,"author":{"gitId":"-"},"content":" async changeRepositoryIfValid(repo: Repo) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(true);"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" const isValidRepository \u003d await this.githubService.isRepositoryPresent(repo.owner, repo.name).toPromise();"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(false);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" this.changeCurrentRepository(repo);"},{"lineNumber":129,"author":{"gitId":"-"},"content":" this.isChangingRepo.next(false);"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Returns the full repository array of the current feature."},{"lineNumber":134,"author":{"gitId":"-"},"content":" */"},{"lineNumber":135,"author":{"gitId":"-"},"content":" getRepository(): Repo[] {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return [this.currentRepo].concat(this.otherRepos);"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Retrieves the repository url from local storage and sets to current repository."},{"lineNumber":141,"author":{"gitId":"-"},"content":" */"},{"lineNumber":142,"author":{"gitId":"-"},"content":" async initializeCurrentRepository() {"},{"lineNumber":143,"author":{"gitId":"-"},"content":" const org \u003d window.localStorage.getItem(STORAGE_KEYS.ORG);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" const repoName \u003d window.localStorage.getItem(STORAGE_KEYS.DATA_REPO);"},{"lineNumber":145,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: received initial org (${org}) and initial name (${repoName})`);"},{"lineNumber":146,"author":{"gitId":"-"},"content":" let repo: Repo;"},{"lineNumber":147,"author":{"gitId":"-"},"content":" if (!org || !repoName) {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" repo \u003d Repo.ofEmptyRepo();"},{"lineNumber":149,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" repo \u003d new Repo(org, repoName);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" const isValidRepository \u003d await this.githubService.isRepositoryPresent(repo.owner, repo.name).toPromise();"},{"lineNumber":153,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" this.logger.info(`ViewService: Repo is ${repo}`);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" this.setRepository(repo);"},{"lineNumber":158,"author":{"gitId":"-"},"content":" this.repoSetSource.next(true);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":162,"author":{"gitId":"nknguyenhc"},"content":" * Set items in the local storage corresponding to the next URL."},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" * This includes checking if the view is valid, and if the repo is of the correct format."},{"lineNumber":164,"author":{"gitId":"nknguyenhc"},"content":" * @param url The partial URL without the host, e.g. `/issuesViewer?repo\u003dCATcher%2FWATcher."},{"lineNumber":165,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":166,"author":{"gitId":"nknguyenhc"},"content":" setupFromUrl(url: string): Observable\u003cvoid\u003e {"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" return of(this.getViewAndRepoFromUrl(url)).pipe("},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":" map(([viewName, repoName]) \u003d\u003e {"},{"lineNumber":169,"author":{"gitId":"NereusWB922"},"content":" if (!this.isViewAllowed(viewName)) {"},{"lineNumber":170,"author":{"gitId":"nknguyenhc"},"content":" throw new Error(ErrorMessageService.invalidUrlMessage());"},{"lineNumber":171,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":172,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":173,"author":{"gitId":"nknguyenhc"},"content":" if (repoName \u003d\u003d\u003d null) {"},{"lineNumber":174,"author":{"gitId":"nknguyenhc"},"content":" throw new Error(ErrorMessageService.invalidUrlMessage());"},{"lineNumber":175,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":176,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":177,"author":{"gitId":"nknguyenhc"},"content":" const newRepo \u003d Repo.of(repoName);"},{"lineNumber":178,"author":{"gitId":"nknguyenhc"},"content":" if (newRepo) {"},{"lineNumber":179,"author":{"gitId":"nknguyenhc"},"content":" window.localStorage.setItem(STORAGE_KEYS.ORG, newRepo.owner);"},{"lineNumber":180,"author":{"gitId":"nknguyenhc"},"content":" window.localStorage.setItem(STORAGE_KEYS.DATA_REPO, newRepo.name);"},{"lineNumber":181,"author":{"gitId":"nknguyenhc"},"content":" this.repoUrlCacheService.cache(newRepo.toString());"},{"lineNumber":182,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":183,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":184,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":185,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":186,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":187,"author":{"gitId":"NereusWB922"},"content":" /**"},{"lineNumber":188,"author":{"gitId":"NereusWB922"},"content":" * Initializes a repo based on the URL parameters and changes the repo if valid."},{"lineNumber":189,"author":{"gitId":"NereusWB922"},"content":" */"},{"lineNumber":190,"author":{"gitId":"NereusWB922"},"content":" initializeRepoFromUrlParams(): void {"},{"lineNumber":191,"author":{"gitId":"NereusWB922"},"content":" const repoParams \u003d this.route.snapshot.queryParamMap.get(ViewService.REPO_QUERY_PARAM_KEY);"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":193,"author":{"gitId":"NereusWB922"},"content":" const newRepo \u003d Repo.of(repoParams);"},{"lineNumber":194,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" this.changeRepositoryIfValid(newRepo);"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" getViewAndRepoFromUrl(url: string): [string, string] {"},{"lineNumber":199,"author":{"gitId":"nknguyenhc"},"content":" const urlObject \u003d new URL(`${location.protocol}//${location.host}${url}`);"},{"lineNumber":200,"author":{"gitId":"nknguyenhc"},"content":" const pathname \u003d urlObject.pathname;"},{"lineNumber":201,"author":{"gitId":"NereusWB922"},"content":" const reponame \u003d urlObject.searchParams.get(ViewService.REPO_QUERY_PARAM_KEY);"},{"lineNumber":202,"author":{"gitId":"nknguyenhc"},"content":" return [pathname, reponame];"},{"lineNumber":203,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":204,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":205,"author":{"gitId":"NereusWB922"},"content":" isViewAllowed(viewName: string) {"},{"lineNumber":206,"author":{"gitId":"NereusWB922"},"content":" return viewName \u003d\u003d\u003d \u0027/\u0027 + View.issuesViewer;"},{"lineNumber":207,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":208,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" isRepoSet(): boolean {"},{"lineNumber":210,"author":{"gitId":"-"},"content":" return this.repoSetSource.getValue();"},{"lineNumber":211,"author":{"gitId":"-"},"content":" }"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":214,"author":{"gitId":"NereusWB922"},"content":" * Changes view and updates View Service\u0027s properties."},{"lineNumber":215,"author":{"gitId":"NereusWB922"},"content":" * @param view New view"},{"lineNumber":216,"author":{"gitId":"-"},"content":" */"},{"lineNumber":217,"author":{"gitId":"NereusWB922"},"content":" changeView(view: View) {"},{"lineNumber":218,"author":{"gitId":"NereusWB922"},"content":" this.currentView \u003d view;"},{"lineNumber":219,"author":{"gitId":"-"},"content":""},{"lineNumber":220,"author":{"gitId":"-"},"content":" // For now, assumes repository stays the same"},{"lineNumber":221,"author":{"gitId":"NereusWB922"},"content":" this.githubService.storeViewDetails(this.currentRepo.owner, this.currentRepo.name);"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" public getCurrentRepositoryURL() {"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return this.currentRepo.owner.concat(\u0027/\u0027).concat(this.currentRepo.name);"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" reset() {"},{"lineNumber":229,"author":{"gitId":"NereusWB922"},"content":" this.currentView \u003d STARTING_VIEW;"},{"lineNumber":230,"author":{"gitId":"-"},"content":" }"},{"lineNumber":231,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":42,"NereusWB922":52,"-":137}},{"path":"src/app/issues-viewer/card-view/card-view.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".card-column {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" height: 77vh;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: column;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"}"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":".card {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" margin: 8px 0px 8px 0px;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":".mat-card-title {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" font-size: 12px;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" text-align: center;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" overflow: auto;"},{"lineNumber":18,"author":{"gitId":"-"},"content":" word-break: break-word;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":".column-header .mat-card-title {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":".mat-card {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" padding: 10px;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":":host ::ng-deep div.mat-card-header-text {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" margin: 2px;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"}"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"div.column-header .mat-card-title {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" margin: 0;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"div.column-header {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":40,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" z-index: 5;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"div.column-header .mat-card-header {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":".scrollable-container {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: 2px;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":56,"author":{"gitId":"-"},"content":".scrollable-container::before {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":59,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":60,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" height: 6px;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":65,"author":{"gitId":"-"},"content":"}"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":".scrollable-container::after {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" position: sticky;"},{"lineNumber":71,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" top: 100%;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" height: 6px;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":77,"author":{"gitId":"-"},"content":"}"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":".scrollable-container-wrapper {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" scrollbar-width: none;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" overflow: auto;"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" flex-grow: 1;"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container-wrapper::-webkit-scrollbar {"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" display: none;"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":94,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" top: 0;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":99,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":100,"author":{"gitId":"-"},"content":"}"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":105,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":106,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" bottom: 0;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":109,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":111,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":112,"author":{"gitId":"-"},"content":"}"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":".loading-spinner {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":116,"author":{"gitId":"-"},"content":" justify-content: center;"},{"lineNumber":117,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":118,"author":{"gitId":"-"},"content":"}"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":".mat-card-subtitle {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":123,"author":{"gitId":"-"},"content":" font-size: 11px;"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-align: left;"},{"lineNumber":125,"author":{"gitId":"-"},"content":" overflow: auto;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" margin: 6px 0;"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":".row-count {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":131,"author":{"gitId":"-"},"content":" border-radius: 3px;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" cursor: default;"},{"lineNumber":133,"author":{"gitId":"-"},"content":" padding: 6px;"},{"lineNumber":134,"author":{"gitId":"-"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" font-weight: 410;"},{"lineNumber":136,"author":{"gitId":"-"},"content":" display: inline-flex;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":138,"author":{"gitId":"-"},"content":"}"},{"lineNumber":139,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":140,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .pagination-hide-arrow .mat-paginator-navigation-previous {"},{"lineNumber":141,"author":{"gitId":"nknguyenhc"},"content":" display: none !important;"},{"lineNumber":142,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":143,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":144,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .pagination-hide-arrow .mat-paginator-navigation-next {"},{"lineNumber":145,"author":{"gitId":"nknguyenhc"},"content":" display: none !important;"},{"lineNumber":146,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":147,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":148,"author":{"gitId":"nknguyenhc"},"content":":host ::ng-deep .pagination-hide-arrow .mat-paginator-range-actions {"},{"lineNumber":149,"author":{"gitId":"nknguyenhc"},"content":" display: none !important;"},{"lineNumber":150,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":22,"-":128}},{"path":"src/app/issues-viewer/card-view/card-view.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"card-column\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" [ngTemplateOutlet]\u003d\"getHeaderTemplate() || defaultHeader\""},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" [ngTemplateOutletContext]\u003d\"{ $implicit: this.group }\""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/ng-container\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"issue-pr-cards\" *ngFor\u003d\"let issue of this.issues$ | async; index as i\"\u003e"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" \u003capp-issue-pr-card [issue]\u003d\"issue\" [filter]\u003d\"issues.filter\" [milestoneService]\u003d\"milestoneService\"\u003e\u003c/app-issue-pr-card\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-card class\u003d\"loading-spinner\" *ngIf\u003d\"this.issues.isLoading$ | async\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-paginator"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" [pageSize]\u003d\"pageSize\""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" [pageSizeOptions]\u003d\"[10, 20, 50]\""},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" [class]\u003d\"pageSize \u003e\u003d issueLength ? \u0027pagination-hide-arrow\u0027 : \u0027\u0027\""},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" (page)\u003d\"updatePageSize($event.pageSize)\""},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" \u003e\u003c/mat-paginator\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"\u003c!-- Template --\u003e"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #defaultHeader\u003e"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"loading-spinner\"\u003e"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #assigneeHeader let-assignee\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column-header\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-card\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-card-header [ngStyle]\u003d\"{ height: \u002740px\u0027 }\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":36,"author":{"gitId":"-"},"content":" mat-card-avatar"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"assignee\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + assignee.avatar_url + \u0027)\u0027,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cmat-card-title\u003e"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" {{ assignee.login }}"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ this.issues.count }}\u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/mat-card-header\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #milestoneHeader let-milestone\u003e"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"column-header\"\u003e"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-header [ngStyle]\u003d\"{ height: \u002740px\u0027 }\"\u003e"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" {{ milestone.title }}"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ this.issues.count }}\u003c/div\u003e"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-header\u003e"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":28,"MadLamprey":1,"-":28}},{"path":"src/app/issues-viewer/card-view/card-view.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" AfterViewInit,"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" Component,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" ElementRef,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" EventEmitter,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" Input,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" OnDestroy,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" OnInit,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" Output,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" TemplateRef,"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" ViewChild"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"} from \u0027@angular/core\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":"import { FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { FilterableComponent, FilterableSource } from \u0027../../shared/issue-tables/filterableTypes\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { IssuesDataTable } from \u0027../../shared/issue-tables/IssuesDataTable\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":25,"author":{"gitId":"-"},"content":" selector: \u0027app-card-view\u0027,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" templateUrl: \u0027./card-view.component.html\u0027,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./card-view.component.css\u0027]"},{"lineNumber":28,"author":{"gitId":"-"},"content":"})"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Displays issues as Cards."},{"lineNumber":32,"author":{"gitId":"-"},"content":" */"},{"lineNumber":33,"author":{"gitId":"-"},"content":"export class CardViewComponent implements OnInit, AfterViewInit, OnDestroy, FilterableComponent {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() headers: string[];"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" @Input() group?: Group \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027defaultHeader\u0027) defaultHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027assigneeHeader\u0027) assigneeHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027milestoneHeader\u0027) milestoneHeaderTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" issues: IssuesDataTable;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" issues$: Observable\u003cIssue[]\u003e;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" private timeoutId: NodeJS.Timeout | null \u003d null;"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private issuesLengthSubscription: Subscription;"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private issuesLoadingStateSubscription: Subscription;"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"Arif-Khalid"},"content":" isLoading \u003d true;"},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" issueLength \u003d 0;"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" pageSize \u003d 20;"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" @Output() issueLengthChange: EventEmitter\u003cNumber\u003e \u003d new EventEmitter\u003cNumber\u003e();"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" constructor("},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" public element: ElementRef,"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" public issueService: IssueService,"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" private filtersService: FiltersService,"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" private milestoneService: MilestoneService"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" ) {}"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" this.issues \u003d new IssuesDataTable("},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" this.issueService,"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService,"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" this.filtersService,"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" this.milestoneService,"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" this.paginator,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" this.headers,"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" this.group,"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" this.filters"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" this.timeoutId \u003d setTimeout(() \u003d\u003e {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.issues.loadIssues();"},{"lineNumber":81,"author":{"gitId":"-"},"content":" this.issues$ \u003d this.issues.connect();"},{"lineNumber":82,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":83,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when issues change"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" this.issuesLengthSubscription \u003d this.issues$.subscribe(() \u003d\u003e {"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":" this.issueLength \u003d this.issues.count;"},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" this.issueLengthChange.emit(this.issueLength);"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":89,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when loading state changes"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" this.issuesLoadingStateSubscription \u003d this.issues.isLoading$.subscribe((isLoadingUpdate) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"Arif-Khalid"},"content":" this.isLoading \u003d isLoadingUpdate;"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":93,"author":{"gitId":"-"},"content":" });"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" getHeaderTemplate(): TemplateRef\u003cany\u003e {"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" switch (this.groupingContextService.currGroupBy) {"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Assignee:"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" return this.assigneeHeaderTemplate;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Milestone:"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneHeaderTemplate;"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" default:"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" return this.defaultHeaderTemplate;"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" if (this.timeoutId) {"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" clearTimeout(this.timeoutId);"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" if (this.issues) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" this.issues.disconnect();"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" if (this.issuesLengthSubscription) {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" this.issuesLengthSubscription.unsubscribe();"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" if (this.issuesLoadingStateSubscription) {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" this.issuesLoadingStateSubscription.unsubscribe();"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" retrieveFilterable(): FilterableSource {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return this.issues;"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":129,"author":{"gitId":"nknguyenhc"},"content":" updatePageSize(newPageSize: number) {"},{"lineNumber":130,"author":{"gitId":"nknguyenhc"},"content":" this.pageSize \u003d newPageSize;"},{"lineNumber":131,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":21,"NereusWB922":59,"Arif-Khalid":10,"-":42}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".hidden-groups {"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" min-width: 150px;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" max-width: 300px;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":".row-count {"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 3px;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" cursor: default;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" padding: 6px;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" font-weight: 410;"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" display: inline-flex;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header {"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":".mat-card {"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 0px;"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" padding: 10px;"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" justify-content: center;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":".mat-card-title {"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" text-align: center;"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" margin: 0;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" flex-grow: 1;"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" margin: 2px;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" word-break: break-word;"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":".mat-card-avatar {"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" height: 30px;"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" width: 30px;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header .mat-card-title {"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" font-size: 12px;"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" height: 67vh;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" overflow: auto;"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" scrollbar-width: none;"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" -ms-overflow-style: none;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":".scrollable-containers::-webkit-scrollbar {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" display: none;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before,"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" pointer-events: none;"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" content: \u0027\u0027;"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" z-index: 2;"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" height: 6px;"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" display: block;"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before {"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" position: sticky;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":81,"NereusWB922":1}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv *ngIf\u003d\"groups.length \u003e 0\" class\u003d\"hidden-groups\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card matTooltip\u003d\"Users that have no Issues/PRs pertaining to the current filter\" matTooltipShowDelay\u003d\"0\" matTooltipHideDelay\u003d\"0\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003eHidden {{ this.groupingContextService.currGroupBy }}s\u003c/mat-card-title\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ groups.length }}\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv *ngFor\u003d\"let group of groups\"\u003e"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container [ngTemplateOutlet]\u003d\"getCardTemplate()\" [ngTemplateOutletContext]\u003d\"{ $implicit: group }\"\u003e\u003c/ng-container\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c!-- Templates --\u003e"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #defaultCard let-group\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"loading-spinner\"\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #assigneeCard let-assignee\u003e"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + assignee.avatar_url + \u0027)\u0027,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002730px\u0027"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e{{ assignee.login }}\u003c/mat-card-title\u003e"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":"\u003cng-template #milestoneCard let-milestone\u003e"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card\u003e"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title\u003e{{ milestone.title }}\u003c/mat-card-title\u003e"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":"\u003c/ng-template\u003e"}],"authorContributionMap":{"NereusWB922":41}},{"path":"src/app/issues-viewer/hidden-groups/hidden-groups.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Input, TemplateRef, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-hidden-groups\u0027,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./hidden-groups.component.html\u0027,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./hidden-groups.component.css\u0027]"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export class HiddenGroupsComponent {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" @Input() groups: Group[] \u003d [];"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027defaultCard\u0027) defaultCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027assigneeCard\u0027) assigneeCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" @ViewChild(\u0027milestoneCard\u0027) milestoneCardTemplate: TemplateRef\u003cany\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" constructor(public groupingContextService: GroupingContextService) {}"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" getCardTemplate(): TemplateRef\u003cany\u003e {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" switch (this.groupingContextService.currGroupBy) {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Assignee:"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" return this.assigneeCardTemplate;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" case GroupBy.Milestone:"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" return this.milestoneCardTemplate;"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" default:"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" return this.defaultCardTemplate;"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":29}},{"path":"src/app/issues-viewer/issues-viewer.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"loading-spinner\" *ngIf\u003d\"(this.viewService.isChangingRepo | async) || this.groups.length \u003d\u003d\u003d 0; else elseBlock\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e \u003c/mat-progress-spinner\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cng-template #elseBlock\u003e"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-filter-bar [views$]\u003d\"views\"\u003e\u003c/app-filter-bar\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"wrapper\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003capp-card-view"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" *ngFor\u003d\"let group of groups\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" [group]\u003d\"group\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" (issueLengthChange)\u003d\"updateHiddenGroups($event, group)\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003e\u003c/app-card-view\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003capp-hidden-groups [groups]\u003d\"this.hiddenGroups\"\u003e\u003c/app-hidden-groups\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":5,"Arif-Khalid":3,"-":14}},{"path":"src/app/issues-viewer/issues-viewer.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { NavigationEnd, NavigationStart, Router } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, of, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { filter } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../core/models/github/group.interface\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../core/models/repo.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../core/services/filters.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../core/services/issue.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../core/services/label.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../core/services/milestone.service\u0027;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../core/services/view.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":19,"author":{"gitId":"-"},"content":" selector: \u0027app-issues-viewer\u0027,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issues-viewer.component.html\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issues-viewer.component.css\u0027]"},{"lineNumber":22,"author":{"gitId":"-"},"content":"})"},{"lineNumber":23,"author":{"gitId":"-"},"content":"export class IssuesViewerComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" /** Observes for any change in repo*/"},{"lineNumber":27,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" groupByChangeSubscription: Subscription;"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /** Observes for any change in the cardviews */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" viewChange: Subscription;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" popStateEventSubscription: Subscription;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" availableGroupsSubscription: Subscription;"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" popStateNavigationId: number;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" /** Users to show as columns */"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" groups: Group[] \u003d [];"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" /** The list of users with 0 issues (hidden) */"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" hiddenGroups: Group[] \u003d [];"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" @ViewChildren(CardViewComponent) cardViews: QueryList\u003cCardViewComponent\u003e;"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" views \u003d new BehaviorSubject\u003cQueryList\u003cCardViewComponent\u003e\u003e(undefined);"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" public viewService: ViewService,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public githubService: GithubService,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public issueService: IssueService,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" public milestoneService: MilestoneService,"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" private router: Router,"},{"lineNumber":58,"author":{"gitId":"Arif-Khalid"},"content":" private filtersService: FiltersService"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" this.repoChangeSubscription \u003d this.viewService.repoChanged$.subscribe((newRepo) \u003d\u003e {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":64,"author":{"gitId":"-"},"content":" });"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" this.groupByChangeSubscription \u003d this.groupingContextService.currGroupBy$.subscribe((newGroupBy) \u003d\u003e {"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" this.initialize();"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" this.popStateEventSubscription \u003d this.router.events"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" .pipe(filter((event) \u003d\u003e event instanceof NavigationEnd || event instanceof NavigationStart))"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" .subscribe((event) \u003d\u003e {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" if (event instanceof NavigationStart \u0026\u0026 event.navigationTrigger \u003d\u003d\u003d \u0027popstate\u0027) {"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" this.popStateNavigationId \u003d event.id;"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" if (event instanceof NavigationEnd \u0026\u0026 event.id \u003d\u003d\u003d this.popStateNavigationId) {"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" this.viewService.initializeRepoFromUrlParams();"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.initializeFromUrlParams();"},{"lineNumber":80,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.initializeFromURLParams();"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.initializeFromUrlParams();"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.initializeFromURLParams();"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" this.viewChange \u003d this.cardViews.changes.subscribe((x) \u003d\u003e this.views.next(x));"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":97,"author":{"gitId":"-"},"content":" this.viewChange.unsubscribe();"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.popStateEventSubscription.unsubscribe();"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":103,"author":{"gitId":"-"},"content":" */"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private initialize() {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" if (this.availableGroupsSubscription) {"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" this.availableGroupsSubscription.unsubscribe();"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.checkIfValidRepository().subscribe((isValidRepository) \u003d\u003e {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":" });"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" // Fetch assignees"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" this.groups \u003d [];"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups \u003d [];"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" this.availableGroupsSubscription \u003d this.groupingContextService.getGroups().subscribe((x) \u003d\u003e (this.groups \u003d x));"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" // Fetch issues"},{"lineNumber":122,"author":{"gitId":"-"},"content":" this.issueService.reloadAllIssues();"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" * Checks if our current repository available on view service is indeed a valid repository"},{"lineNumber":127,"author":{"gitId":"-"},"content":" */"},{"lineNumber":128,"author":{"gitId":"-"},"content":" private checkIfValidRepository() {"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" const currentRepo \u003d this.viewService.currentRepo;"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" if (Repo.isInvalidRepoName(currentRepo)) {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" return this.githubService.isRepositoryPresent(currentRepo.owner, currentRepo.name);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":138,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" * Update the list of hidden group based on the new info."},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" * @param issueLength The number of issues under this group."},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" * @param group The group."},{"lineNumber":142,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":143,"author":{"gitId":"NereusWB922"},"content":" updateHiddenGroups(issueLength: number, target: Group) {"},{"lineNumber":144,"author":{"gitId":"NereusWB922"},"content":" if (issueLength \u003d\u003d\u003d 0 \u0026\u0026 this.groupingContextService.isInHiddenList(target)) {"},{"lineNumber":145,"author":{"gitId":"NereusWB922"},"content":" this.addToHiddenGroups(target);"},{"lineNumber":146,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":147,"author":{"gitId":"NereusWB922"},"content":" this.removeFromHiddenGroups(target);"},{"lineNumber":148,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":149,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":150,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":151,"author":{"gitId":"NereusWB922"},"content":" private addToHiddenGroups(target: Group) {"},{"lineNumber":152,"author":{"gitId":"NereusWB922"},"content":" const isGroupPresent \u003d this.hiddenGroups.some((group) \u003d\u003e group.equals(target));"},{"lineNumber":153,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":154,"author":{"gitId":"NereusWB922"},"content":" if (!isGroupPresent) {"},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups.push(target);"},{"lineNumber":156,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":157,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":158,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":" private removeFromHiddenGroups(target: Group) {"},{"lineNumber":160,"author":{"gitId":"NereusWB922"},"content":" this.hiddenGroups \u003d this.hiddenGroups.filter((group) \u003d\u003e !group.equals(target));"},{"lineNumber":161,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":12,"NereusWB922":62,"Arif-Khalid":5,"-":83}},{"path":"src/app/issues-viewer/issues-viewer.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FilterBarModule } from \u0027../shared/filter-bar/filter-bar.module\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssuesPrCardModule } from \u0027../shared/issue-pr-card/issue-pr-card.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { HiddenGroupsComponent } from \u0027./hidden-groups/hidden-groups.component\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerRoutingModule } from \u0027./issues-viewer-routing.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { IssuesViewerComponent } from \u0027./issues-viewer.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [FilterBarModule, IssuesViewerRoutingModule, IssuesPrCardModule, SharedModule],"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" declarations: [IssuesViewerComponent, CardViewComponent, HiddenGroupsComponent],"},{"lineNumber":13,"author":{"gitId":"-"},"content":" exports: [IssuesViewerComponent, CardViewComponent]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class IssuesViewerModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":13}},{"path":"src/app/shared/filter-bar/filter-bar.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".dropdown-filters .mat-form-field {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":4,"author":{"gitId":"-"},"content":" max-width: 20%;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" width: 17%; /* depends on number of filters*/"},{"lineNumber":6,"author":{"gitId":"-"},"content":"}"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":".search-bar {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" width: 90%;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":".dropdown-filters {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":".label-filter-grid-tile {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":".submit-button {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" margin-left: 8px;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":21}},{"path":"src/app/shared/filter-bar/filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-grid-list cols\u003d\"7\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile colspan\u003d\"3\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-form-field class\u003d\"search-bar\"\u003e"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":" \u003cinput"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" matInput"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":" value\u003d\"{{ this.filtersService.filter$.value.title }}\""},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" (keyup)\u003d\"this.filtersService.updateFilters({ title: $event.target.value })\""},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":" placeholder\u003d\"Search\""},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":" /\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile colspan\u003d\"3\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"dropdown-filters\"\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-label\u003eGroup by\u003c/mat-label\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-select"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" [value]\u003d\"this.groupingContextService.currGroupBy$ | async\""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" (selectionChange)\u003d\"this.groupingContextService.setCurrentGroupingType($event.value)\""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" \u003e"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-option *ngFor\u003d\"let option of this.groupByEnum | keyvalue\" [value]\u003d\"option.value\"\u003e{{ option.key }}\u003c/mat-option\u003e"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-select\u003e"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStatus\u003c/mat-label\u003e"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-select [value]\u003d\"this.filter.status\" (selectionChange)\u003d\"this.filtersService.updateFilters({ status: $event.value })\" multiple\u003e"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"open pullrequest\"\u003eOpen Pull Requests\u003c/mat-option\u003e"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"merged pullrequest\"\u003eMerged Pull Requests\u003c/mat-option\u003e"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" value\u003d\"closed pullrequest\"\u003eClosed Pull Request\u003c/mat-option\u003e"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" value\u003d\"open issue\"\u003eOpen Issues\u003c/mat-option\u003e"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" value\u003d\"closed issue\"\u003eClosed Issues\u003c/mat-option\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eType\u003c/mat-label\u003e"},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-select [value]\u003d\"this.filter.type\" (selectionChange)\u003d\"this.filtersService.updateFilters({ type: $event.value })\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"all\"\u003eAll\u003c/mat-option\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"issue\"\u003eIssue\u003c/mat-option\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"pullrequest\"\u003ePull Request\u003c/mat-option\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":42,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-form-field"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" appearance\u003d\"standard\""},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" matSort"},{"lineNumber":45,"author":{"gitId":"Arif-Khalid"},"content":" [matSortDisableClear]\u003d\"true\""},{"lineNumber":46,"author":{"gitId":"Arif-Khalid"},"content":" (matSortChange)\u003d\"this.filtersService.updateFilters({ sort: $event })\""},{"lineNumber":47,"author":{"gitId":"Arif-Khalid"},"content":" \u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eSort\u003c/mat-label\u003e"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-select [value]\u003d\"this.filter.sort.active\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"id\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"id\"\u003eID\u003c/span\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"title\"\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"title\"\u003eTitle\u003c/span\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cmat-option value\u003d\"date\"\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cspan mat-sort-header\u003d\"date\"\u003eDate Updated\u003c/span\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":59,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option value\u003d\"status\"\u003e"},{"lineNumber":60,"author":{"gitId":"MadLamprey"},"content":" \u003cspan mat-sort-header\u003d\"status\"\u003eStatus\u003c/span\u003e"},{"lineNumber":61,"author":{"gitId":"MadLamprey"},"content":" \u003c/mat-option\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\"\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eMilestone\u003c/mat-label\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-select"},{"lineNumber":67,"author":{"gitId":"-"},"content":" #milestoneSelectorRef"},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" [value]\u003d\"this.filter.milestones\""},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" (selectionChange)\u003d\"this.filtersService.updateFilters({ milestones: $event.value })\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" [disabled]\u003d\"this.milestoneService.hasNoMilestones\""},{"lineNumber":71,"author":{"gitId":"-"},"content":" multiple"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003cmat-select-trigger *ngIf\u003d\"this.milestoneService.hasNoMilestones\"\u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003cspan\u003eNo Milestones\u003c/span\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003c/mat-select-trigger\u003e"},{"lineNumber":76,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-option *ngFor\u003d\"let milestone of this.milestoneService.milestones\" [value]\u003d\"milestone.title\"\u003e"},{"lineNumber":77,"author":{"gitId":"-"},"content":" {{ milestone.title }}"},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":79,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option *ngIf\u003d\"isFilterIssue()\" [value]\u003d\"\u0027Issue without a milestone\u0027\"\u003eIssues without a milestone\u003c/mat-option\u003e"},{"lineNumber":80,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-option *ngIf\u003d\"isFilterPullRequest()\" [value]\u003d\"\u0027PR without a milestone\u0027\"\u003ePRs without a milestone\u003c/mat-option\u003e"},{"lineNumber":81,"author":{"gitId":"-"},"content":" \u003c/mat-select\u003e"},{"lineNumber":82,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":83,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile class\u003d\"label-filter-grid-tile\" colspan\u003d\"1\"\u003e"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-label-filter-bar\u003e\u003c/app-label-filter-bar\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":"\u003c/mat-grid-list\u003e"}],"authorContributionMap":{"nknguyenhc":6,"Arif-Khalid":18,"NereusWB922":9,"MadLamprey":5,"-":51}},{"path":"src/app/shared/filter-bar/filter-bar.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnDestroy, OnInit, QueryList, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatSelect } from \u0027@angular/material/select\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"import { Filter, FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { GroupBy, GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../../core/services/view.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { FilterableComponent } from \u0027../issue-tables/filterableTypes\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { LabelFilterBarComponent } from \u0027./label-filter-bar/label-filter-bar.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This component is abstracted out filterbar used by both detailed-viewer page"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * and Issues-viewer"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */"},{"lineNumber":16,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":17,"author":{"gitId":"-"},"content":" selector: \u0027app-filter-bar\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" templateUrl: \u0027./filter-bar.component.html\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./filter-bar.component.css\u0027]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"})"},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":"export class FilterBarComponent implements OnInit, OnDestroy {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Input() views$: BehaviorSubject\u003cQueryList\u003cFilterableComponent\u003e\u003e;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" /** Selected dropdown filter value */"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" filter: Filter \u003d this.filtersService.defaultFilter();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" groupByEnum: typeof GroupBy \u003d GroupBy;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /** Milestone subscription */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" milestoneSubscription: Subscription;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @ViewChild(LabelFilterBarComponent, { static: true }) labelFilterBar: LabelFilterBarComponent;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" @ViewChild(\u0027milestoneSelectorRef\u0027, { static: false }) milestoneSelectorRef: MatSelect;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"Arif-Khalid"},"content":" constructor("},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" public milestoneService: MilestoneService,"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" public filtersService: FiltersService,"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" private viewService: ViewService,"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" public groupingContextService: GroupingContextService,"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" private logger: LoggingService"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" ) {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" this.repoChangeSubscription \u003d this.viewService.repoChanged$.subscribe((newRepo) \u003d\u003e this.newRepoInitialize());"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" this.newRepoInitialize();"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" // One-time initializations"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.filter$.subscribe((filter) \u003d\u003e {"},{"lineNumber":53,"author":{"gitId":"Arif-Khalid"},"content":" this.filter \u003d filter;"},{"lineNumber":54,"author":{"gitId":"Arif-Khalid"},"content":" this.applyFilter();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" });"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" this.views$.subscribe(() \u003d\u003e this.applyFilter());"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.milestoneSubscription.unsubscribe();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Signals to IssuesDataTable that a change has occurred in filter."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"Arif-Khalid"},"content":" applyFilter() {"},{"lineNumber":69,"author":{"gitId":"Arif-Khalid"},"content":" this.views$?.value?.forEach((v) \u003d\u003e (v.retrieveFilterable().filter \u003d this.filter));"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Checks if program is filtering by type issue."},{"lineNumber":74,"author":{"gitId":"-"},"content":" */"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" isFilterIssue() {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" return this.filter.type \u003d\u003d\u003d \u0027issue\u0027 || this.filter.type \u003d\u003d\u003d \u0027all\u0027;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" isFilterPullRequest() {"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" return this.filter.type \u003d\u003d\u003d \u0027pullrequest\u0027 || this.filter.type \u003d\u003d\u003d \u0027all\u0027;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":85,"author":{"gitId":"Arif-Khalid"},"content":" * Re-called when repo has changed"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" private newRepoInitialize() {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // Fetch milestones and update dropdown filter"},{"lineNumber":89,"author":{"gitId":"-"},"content":" this.milestoneSubscription \u003d this.milestoneService.fetchMilestones().subscribe("},{"lineNumber":90,"author":{"gitId":"-"},"content":" (response) \u003d\u003e {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027IssuesViewerComponent: Fetched milestones from Github\u0027);"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.sanitizeMilestones(this.milestoneService.milestones);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" },"},{"lineNumber":94,"author":{"gitId":"-"},"content":" (err) \u003d\u003e {},"},{"lineNumber":95,"author":{"gitId":"-"},"content":" () \u003d\u003e {}"},{"lineNumber":96,"author":{"gitId":"-"},"content":" );"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":6,"Arif-Khalid":17,"-":69}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"::ng-deep.mat-menu-content:not(:empty) {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" /* Override mat-menu-content\u0027s non-empty default CSS. */"},{"lineNumber":3,"author":{"gitId":"-"},"content":" padding-top: 0px !important;"},{"lineNumber":4,"author":{"gitId":"-"},"content":" padding-bottom: 0px !important;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"}"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"::ng-deep.mat-menu-panel {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Override mat-menu-panel\u0027s default CSS. */"},{"lineNumber":9,"author":{"gitId":"-"},"content":" width: 280px;"},{"lineNumber":10,"author":{"gitId":"-"},"content":" max-width: none !important;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":".popup-container {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" flex-direction: column;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":".popupmenu {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" width: max-content;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":".scroll-container {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" max-height: 400px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" overflow-y: auto;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -ms-overflow-style: none; /* IE and Edge */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" scrollbar-width: none; /* Firefox */"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":31,"author":{"gitId":"-"},"content":".scroll-container::before {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" height: 7px;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":40,"author":{"gitId":"-"},"content":"}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":".scroll-container::after {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" position: sticky;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" z-index: 2;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" top: 100%;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" height: 7px;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" display: block;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":".scroll-container-wrapper {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" position: relative;"},{"lineNumber":56,"author":{"gitId":"-"},"content":"}"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":".scroll-container-wrapper::before {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":60,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" top: 0;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":66,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":67,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.7), transparent);"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":".scroll-container-wrapper::after {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" pointer-events: none;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" content: \u0027\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" position: absolute;"},{"lineNumber":74,"author":{"gitId":"-"},"content":" z-index: 1;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" bottom: 0;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" left: 0;"},{"lineNumber":77,"author":{"gitId":"-"},"content":" right: 0;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" height: 5px;"},{"lineNumber":79,"author":{"gitId":"-"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.7), transparent);"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":".scroll-container::-webkit-scrollbar {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" display: none; /* Hide scrollbar for Chrome, Safari and Opera */"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":".flexbox-container {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" flex-direction: row;"},{"lineNumber":89,"author":{"gitId":"-"},"content":" justify-content: flex-start;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" align-items: center;"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 10px;"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" padding: 0px 12px;"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 4px;"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" box-sizing: border-box;"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":".flexbox-container:hover {"},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgba(0, 0, 0, 0.04);"},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":".flexbox-container-strikethrough {"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" top: 50%;"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" width: 90%;"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":" left: 50%;"},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" transform: translate(-50%, -50%);"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" height: 2px;"},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":" background-color: black;"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":".input-field {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" width: calc(100% - (2 * 15px)); /* To account for left and right padding. */"},{"lineNumber":115,"author":{"gitId":"-"},"content":" padding: 0 15px;"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":".mat-chip {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" height: auto;"},{"lineNumber":120,"author":{"gitId":"-"},"content":" padding: 5.5px 7px;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" line-height: 1.1em;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" position: inherit;"},{"lineNumber":123,"author":{"gitId":"-"},"content":" border-radius: 6px;"},{"lineNumber":124,"author":{"gitId":"-"},"content":" font-size: 12px;"},{"lineNumber":125,"author":{"gitId":"-"},"content":" min-height: 16px;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" max-height: 42px;"},{"lineNumber":127,"author":{"gitId":"-"},"content":" margin: 0px;"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":".mat-stroked-button {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" font-weight: normal;"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":".hidden {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" display: none !important;"},{"lineNumber":136,"author":{"gitId":"-"},"content":"}"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":"mat-list-option {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" width: max-content;"},{"lineNumber":140,"author":{"gitId":"-"},"content":"}"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":".no-labels {"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /* Chosen to look similar to button above. */"},{"lineNumber":144,"author":{"gitId":"-"},"content":" padding: 0 16px;"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-size: 14px;"},{"lineNumber":146,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":20,"-":126}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button *ngIf\u003d\"loaded\" [matMenuTriggerFor]\u003d\"menu\"\u003e"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" {{ selectedLabelNames.size \u003d\u003d\u003d 0 ? \u0027All\u0027 : selectedLabelNames.size }} Selected | {{ hiddenLabelNames?.size || 0 }} Hidden â–¾"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button disabled *ngIf\u003d\"!loaded\" color\u003d\"accent\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cmat-progress-bar mode\u003d\"query\"\u003e\u003c/mat-progress-bar\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003cmat-menu #menu\u003d\"matMenu\" class\u003d\"popupmenu\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv (click)\u003d\"$event.stopPropagation()\" class\u003d\"popup-container\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\" class\u003d\"input-field\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eLabels\u003c/mat-label\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cinput #input matInput placeholder\u003d\"Find labels\" /\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"removeAllSelection()\"\u003eRemove all\u003c/button\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!hasLabels(input.value)\" class\u003d\"no-labels\"\u003eNo Labels Found!\u003c/div\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container-wrapper\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container\"\u003e"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":" *ngFor\u003d\"let label of this.allLabels\""},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":" class\u003d\"flexbox-container\""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"changeLabelState(label)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" [class.hidden]\u003d\"filter(input.value, label.name)\""},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" [style]\u003d\"{ border: \u00272px solid \u0027 + getColor(label) }\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"!hiddenLabelNames.has(label.name)\" (click)\u003d\"hide(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility\u003c/mat-icon\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"hiddenLabelNames.has(label.name)\" (click)\u003d\"show(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility_off\u003c/mat-icon\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":36,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"labelService.setLabelStyle(label.color)\""},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" [disabled]\u003d\"hiddenLabelNames.has(label.name)\""},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"changeLabelState(label)\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" {{ label.name }}"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngIf\u003d\"deselectedLabelNames.has(label.name)\" class\u003d\"flexbox-container-strikethrough\"\u003e\u003c/div\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003c/mat-menu\u003e"}],"authorContributionMap":{"nknguyenhc":12,"-":35}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SimpleLabel } from \u0027../../../core/models/label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../../../core/services/filters.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-label-filter-bar\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./label-filter-bar.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./label-filter-bar.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class LabelFilterBarComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DEFAULT_LABEL_COLOR: string \u003d \u0027transparent\u0027;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" private static readonly DESELECTED_LABEL_COLOR: string \u003d \u0027#b00020\u0027;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" private static readonly SELECTED_LABEL_COLOR: string \u003d \u0027#41c300\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" labels$: Observable\u003cSimpleLabel[]\u003e;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" allLabels: SimpleLabel[];"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" selectedLabelNames: Set\u003cstring\u003e \u003d new Set\u003cstring\u003e();"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabelNames: Set\u003cstring\u003e \u003d new Set\u003cstring\u003e();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" hiddenLabelNames: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":23,"author":{"gitId":"-"},"content":" loaded \u003d false;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" labelSubscription: Subscription;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" constructor(private labelService: LabelService, private logger: LoggingService, private filtersService: FiltersService) {}"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.loaded \u003d false;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.load();"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.labels$ \u003d this.labelService.connect();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.labels$.subscribe((labels) \u003d\u003e {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.allLabels \u003d labels;"},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.sanitizeLabels(this.allLabels);"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames \u003d new Set\u003cstring\u003e(this.filtersService.filter$.value.labels);"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames \u003d this.filtersService.filter$.value.deselectedLabels;"},{"lineNumber":42,"author":{"gitId":"Arif-Khalid"},"content":" this.hiddenLabelNames \u003d this.filtersService.filter$.value.hiddenLabels;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" });"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.labelSubscription?.unsubscribe();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" hide(label: string): void {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (this.hiddenLabelNames.has(label)) {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.add(label);"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.updateFilters({ hiddenLabels: this.hiddenLabelNames });"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" /** Show labels that were hidden */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" show(label: string): void {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!this.hiddenLabelNames.has(label)) {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.delete(label);"},{"lineNumber":66,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.updateFilters({ hiddenLabels: this.hiddenLabelNames });"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" * Change label to the next state."},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" * Label has the following state rotation: default -\u003e selected -\u003e deselected."},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" * @param label The label to change state"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":" changeLabelState(label: SimpleLabel) {"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":" if (this.selectedLabelNames.has(label.name)) {"},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames.delete(label.name);"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames.add(label.name);"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":" } else if (this.deselectedLabelNames.has(label.name)) {"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames.delete(label.name);"},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames.add(label.name);"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":83,"author":{"gitId":"nknguyenhc"},"content":" this.updateSelection();"},{"lineNumber":84,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":85,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":86,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"nknguyenhc"},"content":" * Returns the border color of the label."},{"lineNumber":88,"author":{"gitId":"nknguyenhc"},"content":" * The border color represents the state of the label."},{"lineNumber":89,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" getColor(label: SimpleLabel): string {"},{"lineNumber":91,"author":{"gitId":"nknguyenhc"},"content":" if (this.selectedLabelNames.has(label.name)) {"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.SELECTED_LABEL_COLOR;"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" } else if (this.deselectedLabelNames.has(label.name)) {"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.DESELECTED_LABEL_COLOR;"},{"lineNumber":95,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":96,"author":{"gitId":"nknguyenhc"},"content":" return LabelFilterBarComponent.DEFAULT_LABEL_COLOR;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" /** loads in the labels in the repository */"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public load() {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" this.labelService.startPollLabels();"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.labelSubscription \u003d this.labelService.fetchLabels().subscribe("},{"lineNumber":104,"author":{"gitId":"-"},"content":" (response) \u003d\u003e {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027LabelFilterBarComponent: Fetched labels from Github\u0027);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" },"},{"lineNumber":107,"author":{"gitId":"-"},"content":" (err) \u003d\u003e {},"},{"lineNumber":108,"author":{"gitId":"-"},"content":" () \u003d\u003e {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.loaded \u003d true;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" );"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" filter(filter: string, target: string): boolean {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return !target.toLowerCase().includes(filter.toLowerCase());"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" hasLabels(filter: string): boolean {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (this.allLabels \u003d\u003d\u003d undefined || this.allLabels.length \u003d\u003d\u003d 0) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" return this.allLabels.some((label) \u003d\u003e !this.filter(filter, label.name));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" updateSelection(): void {"},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" this.filtersService.updateFilters({"},{"lineNumber":127,"author":{"gitId":"nknguyenhc"},"content":" labels: Array.from(this.selectedLabelNames),"},{"lineNumber":128,"author":{"gitId":"nknguyenhc"},"content":" deselectedLabels: this.deselectedLabelNames"},{"lineNumber":129,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" removeAllSelection(): void {"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" this.selectedLabelNames \u003d new Set\u003cstring\u003e();"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" this.deselectedLabelNames \u003d new Set\u003cstring\u003e();"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.updateSelection();"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":39,"Arif-Khalid":9,"-":89}},{"path":"src/app/shared/issue-pr-card/issue-pr-card-labels/issue-pr-card-labels.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { GithubLabel } from \u0027../../../core/models/github/github-label.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":6,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card-labels\u0027,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card-labels.component.html\u0027,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card-labels.component.css\u0027]"},{"lineNumber":9,"author":{"gitId":"-"},"content":"})"},{"lineNumber":10,"author":{"gitId":"-"},"content":"export class IssuePrCardLabelsComponent {"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" @Input() labels: GithubLabel[];"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" @Input() labelSet: Set\u003cstring\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" constructor(public labelService: LabelService) {}"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":3,"-":11}},{"path":"src/app/shared/issue-pr-card/issue-pr-card-milestone/issue-pr-card-milestone.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"\u003cdiv *ngIf\u003d\"repoHasMilestones\" class\u003d\"milestone\" [ngStyle]\u003d\"{ color: milestone.state ? \u0027grey\u0027 : \u0027red\u0027 }\"\u003e"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":" \u003cspan class\u003d\"octicon-milestone\" octicon\u003d\"milestone\" [color]\u003d\"milestone.state ? \u0027grey\u0027 : \u0027red\u0027\" size\u003d\"8\"\u003e \u003c/span\u003e"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":" {{ milestone.state ? milestone.title : \u0027???\u0027 }}"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"MadLamprey":3,"-":1}},{"path":"src/app/shared/issue-pr-card/issue-pr-card-milestone/issue-pr-card-milestone.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Milestone } from \u0027../../../core/models/milestone.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":""},{"lineNumber":4,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":5,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card-milestone\u0027,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card-milestone.component.html\u0027,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card-milestone.component.css\u0027]"},{"lineNumber":8,"author":{"gitId":"-"},"content":"})"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export class IssuePrCardMilestoneComponent {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Input() milestone: Milestone;"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" @Input() repoHasMilestones: boolean;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":" constructor() {}"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"MadLamprey":1,"-":13}},{"path":"src/app/shared/issue-pr-card/issue-pr-card.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-card class\u003d\"card\" [ngClass]\u003d\"getIssueOpenOrCloseColorCSSClass()\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ca class\u003d\"no-underline link-grey-dark\" (click)\u003d\"viewIssueInBrowser($event)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cspan [matTooltip]\u003d\"this.issue.updated_at\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003capp-issue-pr-card-header [issue]\u003d\"issue\"\u003e\u003c/app-issue-pr-card-header\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cmat-card-content\u003e"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":" \u003capp-issue-pr-card-milestone"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" [milestone]\u003d\"issue.milestone\""},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" [repoHasMilestones]\u003d\"!milestoneService.hasNoMilestones\""},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" \u003e\u003c/app-issue-pr-card-milestone\u003e"},{"lineNumber":10,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-issue-pr-card-labels [labels]\u003d\"issue.githubLabels\" [labelSet]\u003d\"filter?.hiddenLabels\"\u003e\u003c/app-issue-pr-card-labels\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003c/mat-card-content\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/a\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003c/mat-card\u003e"}],"authorContributionMap":{"Arif-Khalid":1,"MadLamprey":4,"-":9}},{"path":"src/app/shared/issue-pr-card/issue-pr-card.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":10,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card.component.html\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card.component.css\u0027]"},{"lineNumber":13,"author":{"gitId":"-"},"content":"})"},{"lineNumber":14,"author":{"gitId":"-"},"content":"export class IssuePrCardComponent {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Input() issue: Issue;"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":" @Input() filter?: Filter;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":" constructor("},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":" private logger: LoggingService,"},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":" private githubService: GithubService,"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":" public labelService: LabelService,"},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":" public milestoneService: MilestoneService"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" ) {}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" /** Opens issue in new window */"},{"lineNumber":26,"author":{"gitId":"-"},"content":" viewIssueInBrowser(event: Event) {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.logger.info(`CardViewComponent: Opening Issue ${this.issue.id} on Github`);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.githubService.viewIssueInBrowser(this.issue.id, event);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /** Returns CSS class for border color */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" getIssueOpenOrCloseColorCSSClass() {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" if (this.issue.state \u003d\u003d\u003d \u0027OPEN\u0027) {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" if (this.issue.isDraft) {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return \u0027grey\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return \u0027border-green\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }"},{"lineNumber":39,"author":{"gitId":"-"},"content":" } else if (this.issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027 \u0026\u0026 this.issue.state \u003d\u003d\u003d \u0027CLOSED\u0027) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return \u0027border-red\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" } else if (this.issue.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027 \u0026\u0026 this.issue.stateReason \u003d\u003d\u003d \u0027NOT_PLANNED\u0027) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return \u0027border-gray\u0027;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return \u0027border-purple\u0027;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Truncates description to fit in card content."},{"lineNumber":50,"author":{"gitId":"-"},"content":" * @param description - Description of Issue that is to be displayed."},{"lineNumber":51,"author":{"gitId":"-"},"content":" */"},{"lineNumber":52,"author":{"gitId":"-"},"content":" fitDescriptionText(): string {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":54,"author":{"gitId":"-"},"content":" const MAX_CHARACTER_LENGTH \u003d 72;"},{"lineNumber":55,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" return this.issue.description.slice(0, MAX_CHARACTER_LENGTH) + ELLIPSES;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"MadLamprey":7,"-":50}},{"path":"src/app/shared/issue-tables/IssuesDataTable.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { DataSource } from \u0027@angular/cdk/table\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, merge, Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { map } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { Group } from \u0027../../core/models/github/group.interface\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":"import { Filter, FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":"import { MilestoneService } from \u0027../../core/services/milestone.service\u0027;"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":"import { applyDropdownFilter } from \u0027./dropdownfilter\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { FilterableSource } from \u0027./filterableTypes\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027./issue-paginator\u0027;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":"import { applySort } from \u0027./issue-sorter\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027./search-filter\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"export class IssuesDataTable extends DataSource\u003cIssue\u003e implements FilterableSource {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public count \u003d 0;"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" private filterChange \u003d new BehaviorSubject(this.filtersService.defaultFilter());"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private issuesSubject \u003d new BehaviorSubject\u003cIssue[]\u003e([]);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private issueSubscription: Subscription;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" public isLoading$ \u003d this.issueService.isLoading.asObservable();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":26,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" private groupingContextService: GroupingContextService,"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" private filtersService: FiltersService,"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" private milestoneService: MilestoneService,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private paginator: MatPaginator,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private displayedColumn: string[],"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" private group?: Group,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private defaultFilter?: (issue: Issue) \u003d\u003e boolean"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" super();"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" connect(): Observable\u003cIssue[]\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return this.issuesSubject.asObservable();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" disconnect() {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.filterChange.complete();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.issuesSubject.complete();"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" if (this.issueSubscription) {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.issueSubscription.unsubscribe();"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.issueService.stopPollIssues();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" loadIssues() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" let page;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (this.paginator !\u003d\u003d undefined) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" page \u003d this.paginator.page;"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" const displayDataChanges \u003d [this.issueService.issues$, page, this.filterChange].filter((x) \u003d\u003e x !\u003d\u003d undefined);"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" this.issueService.startPollIssues();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.issueSubscription \u003d merge(...displayDataChanges)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":62,"author":{"gitId":"-"},"content":" // maps each change in display value to new issue ordering or filtering"},{"lineNumber":63,"author":{"gitId":"-"},"content":" map(() \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" let data \u003d \u003cIssue[]\u003eObject.values(this.issueService.issues$.getValue()).reverse();"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (this.defaultFilter) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" data \u003d data.filter(this.defaultFilter);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Filter by assignee of issue"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" data \u003d this.groupingContextService.getDataForGroup(data, this.group);"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"Arif-Khalid"},"content":" // Apply Filters"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" data \u003d applyDropdownFilter(this.filter, data, !this.milestoneService.hasNoMilestones);"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"Arif-Khalid"},"content":" data \u003d applySearchFilter(this.filter.title, this.displayedColumn, this.issueService, data);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" this.count \u003d data.length;"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"Arif-Khalid"},"content":" data \u003d applySort(this.filter.sort, data);"},{"lineNumber":78,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (this.paginator !\u003d\u003d undefined) {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" data \u003d paginateData(this.paginator, data);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":83,"author":{"gitId":"-"},"content":" })"},{"lineNumber":84,"author":{"gitId":"-"},"content":" )"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .subscribe((issues) \u003d\u003e {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.issuesSubject.next(issues);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" });"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"Arif-Khalid"},"content":" get filter(): Filter {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this.filterChange.value;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"Arif-Khalid"},"content":" set filter(filter: Filter) {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.filterChange.next(filter);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":6,"NereusWB922":7,"Arif-Khalid":9,"-":75}},{"path":"src/app/shared/issue-tables/dropdownfilter.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":""},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"type StatusInfo \u003d {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" type: string;"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" status: string;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"};"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":"/**"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" * Converts a status string into an info object"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":"const infoFromStatus \u003d (statusString: string): StatusInfo \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" const [status, type] \u003d statusString.split(\u0027 \u0027);"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" return { status, type };"},{"lineNumber":15,"author":{"gitId":"-"},"content":"};"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * This module serves to improve separation of concerns in IssuesDataTable.ts and IssueList.ts module by containing the logic for"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * applying dropdownFilter to the issues data table in this module."},{"lineNumber":20,"author":{"gitId":"-"},"content":" * This module exports a single function applyDropDownFilter which is called by IssueList."},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":" * This functions returns the data passed in after all the filters of dropdownFilters are applied"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"export function applyDropdownFilter(filter: Filter, data: Issue[], isFilteringByMilestone: boolean): Issue[] {"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" const filteredData: Issue[] \u003d data.filter((issue) \u003d\u003e {"},{"lineNumber":25,"author":{"gitId":"-"},"content":" let ret \u003d true;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" // status can either be \u0027open\u0027, \u0027closed\u0027, or \u0027merged\u0027"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" ret \u0026\u0026"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" filter.status.some((item) \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" const statusInfo \u003d infoFromStatus(item);"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" return statusInfo.status \u003d\u003d\u003d issue.state.toLowerCase() \u0026\u0026 statusInfo.type \u003d\u003d\u003d issue.issueOrPr.toLowerCase();"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":" });"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"Arif-Khalid"},"content":" if (filter.type \u003d\u003d\u003d \u0027issue\u0027) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" ret \u003d ret \u0026\u0026 issue.issueOrPr \u003d\u003d\u003d \u0027Issue\u0027;"},{"lineNumber":37,"author":{"gitId":"Arif-Khalid"},"content":" } else if (filter.type \u003d\u003d\u003d \u0027pullrequest\u0027) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ret \u003d ret \u0026\u0026 issue.issueOrPr \u003d\u003d\u003d \u0027PullRequest\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d ret \u0026\u0026 (!isFilteringByMilestone || filter.milestones.some((milestone) \u003d\u003e issue.milestone.title \u003d\u003d\u003d milestone));"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" ret \u003d ret \u0026\u0026 issue.labels.every((label) \u003d\u003e !filter.deselectedLabels.has(label));"},{"lineNumber":43,"author":{"gitId":"Arif-Khalid"},"content":" return ret \u0026\u0026 filter.labels.every((label) \u003d\u003e issue.labels.includes(label));"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":45,"author":{"gitId":"Arif-Khalid"},"content":" return filteredData;"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":18,"Arif-Khalid":8,"-":20}},{"path":"src/app/shared/issue-tables/filterableTypes.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"-"},"content":" * This module aims to abstract out classes that can be filtered"},{"lineNumber":3,"author":{"gitId":"-"},"content":" */"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { Filter } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * FilterableSource is an interface that contains a source that can be filtered"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * by a string filter or dropdownFilter."},{"lineNumber":10,"author":{"gitId":"-"},"content":" * The source should set filter and dropdownFilter as a getter and setter"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * and applies the filter when these variables are changed."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export interface FilterableSource {"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" filter: Filter;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * FilterComponent is a component that contains a FilterableSource"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export interface FilterableComponent {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" retrieveFilterable: () \u003d\u003e FilterableSource;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":3,"-":19}},{"path":"src/app/shared/issue-tables/issue-sorter.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { Sort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"export function applySort(sort: Sort, data: Issue[]): Issue[] {"},{"lineNumber":6,"author":{"gitId":"-"},"content":" if (!sort.active) {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":8,"author":{"gitId":"-"},"content":" }"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":" const direction: number \u003d sort.direction \u003d\u003d\u003d \u0027asc\u0027 ? 1 : -1;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" switch (sort.active) {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" case \u0027id\u0027:"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByIntegerValue(a.id, b.id));"},{"lineNumber":15,"author":{"gitId":"-"},"content":" case \u0027date\u0027:"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByDateValue(a.updated_at, b.updated_at));"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" case \u0027status\u0027:"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByIssueType(a, b));"},{"lineNumber":19,"author":{"gitId":"-"},"content":" default:"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // title, responseTag are string values"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":" return data.sort((a, b) \u003d\u003e direction * compareByStringValue(a[sort.active], b[sort.active]));"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"function compareByStringValue(valueA: string, valueB: string): number {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" const orderA \u003d String(valueA || \u0027\u0027).toUpperCase();"},{"lineNumber":27,"author":{"gitId":"-"},"content":" const orderB \u003d String(valueB || \u0027\u0027).toUpperCase();"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return orderA \u003c orderB ? -1 : 1;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":"function compareByIntegerValue(valueA: number, valueB: number): number {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return valueA \u003c valueB ? -1 : 1;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":"function compareByDateValue(valueA: string, valueB: string): number {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return moment(valueA).isBefore(valueB) ? -1 : 1;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"}"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":"function compareByIssueType(valueA: Issue, valueB: Issue): number {"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":" const sortOrder \u003d {"},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" \u0027OPEN PullRequest\u0027: 0,"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" \u0027OPEN Issue\u0027: 1,"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" \u0027MERGED PullRequest\u0027: 2,"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" \u0027CLOSED Issue\u0027: 3,"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":" \u0027CLOSED PullRequest\u0027: 4"},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" };"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" const aOrder \u003d sortOrder[valueA.state + \u0027 \u0027 + valueA.issueOrPr] || -1;"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" const bOrder \u003d sortOrder[valueB.state + \u0027 \u0027 + valueB.issueOrPr] || -1;"},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" if (aOrder \u003d\u003d\u003d bOrder) {"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":" return compareByStringValue(valueA.title, valueB.title);"},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" } else if (aOrder \u003e bOrder) {"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":" return 1;"},{"lineNumber":55,"author":{"gitId":"MadLamprey"},"content":" } else {"},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" return -1;"},{"lineNumber":57,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":58,"author":{"gitId":"MadLamprey"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":2,"MadLamprey":26,"-":30}},{"path":"src/app/shared/layout/header.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".repo-menu-footer {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" justify-content: space-between;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" position: sticky;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" bottom: 0;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" padding: 10px;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":".new-repo-button {"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" flex-grow: 1;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":".keep-filter-button {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" margin-left: 2px;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":".repo-options {"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" max-height: 300px;"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" overflow-y: auto;"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":".repo-options button {"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" font-size: 17px;"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":"/* Overwrite the width of the menu */"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"::ng-deep .repo-menu {"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" width: fit-content !important;"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" min-width: 320px !important;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":32}},{"path":"src/app/shared/layout/header.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-toolbar color\u003d\"primary\" style\u003d\"position: sticky; position: -webkit-sticky; top: 0; z-index: 1000\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":3,"author":{"gitId":"-"},"content":" *ngIf\u003d\"isBackButtonShown()\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" mat-icon-button"},{"lineNumber":5,"author":{"gitId":"-"},"content":" class\u003d\"mat-toolbar mat-primary back-button\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.9)\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (click)\u003d\"goBack()\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003earrow_back_ios\u003c/mat-icon\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003ca class\u003d\"mat-toolbar mat-primary\" style\u003d\"text-decoration: none\" [routerLink]\u003d\"viewService.isRepoSet() ? viewService.currentView : null\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003eWATcher v{{ this.getVersion() }}\u003c/a"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" \u003cspan id\u003d\"view-descriptor\" *ngIf\u003d\"auth.isAuthenticated()\" style\u003d\"margin-left: 70px\"\u003e"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" {{ this.presetViews[this.filtersService.presetView$.value] }}"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" \u003c!-- Gateway to activity dashboard, do not delete --\u003e"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" \u003c!--div *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 this.viewService.sessionData.sessionRepo.length \u003e 1\"\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mat-menu-item"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" *ngFor\u003d\"let sessionRepo of this.viewService.sessionData.sessionRepo\""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"this.routeToSelectedView(sessionRepo.view)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cspan\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-icon [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.viewService.currentView \u003d\u003d\u003d sessionRepo.view ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" {{ this.getViewDescription(sessionRepo.view) }}"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div--\u003e"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated()\"\u003e"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngFor\u003d\"let presetView of this.presetViews | keyvalue\"\u003e"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton mat-menu-item *ngIf\u003d\"presetView.key !\u003d\u003d \u0027custom\u0027\" (click)\u003d\"this.filtersService.updatePresetView(presetView.key)\"\u003e"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" \u003cspan\u003e"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-icon"},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":" [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.filtersService.presetView$.value \u003d\u003d\u003d presetView.key ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" \u003e"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":" {{ presetView.value }}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" \u003c/span\u003e"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" \u003c/button\u003e"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c!-- everything else --\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet()\"\u003e"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" \u003cspan id\u003d\"view-descriptor\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" {{ this.currentRepo || \u0027No Repository Set\u0027 }}"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" mat-icon-button"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" matTooltip\u003d\"{{ viewService.isRepoSet() ? \u0027Change Repository\u0027 : \u0027Select Repository\u0027 }}\""},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" [matMenuTriggerFor]\u003d\"repoMenu\""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eedit\u003c/mat-icon\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-menu #repoMenu xPosition\u003d\"before\" class\u003d\"repo-menu\"\u003e"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"repo-options\"\u003e"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv *ngFor\u003d\"let repo of this.repoUrlCacheService.suggestions\"\u003e"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" \u003cbutton mat-menu-item *ngIf\u003d\"repo !\u003d\u003d this.currentRepo\" (click)\u003d\"this.applyRepoDropdown(repo, true)\"\u003e"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" {{ repo }}"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" \u003c/button\u003e"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"repo-menu-footer\"\u003e"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" \u003cbutton mat-flat-button color\u003d\"primary\" class\u003d\"new-repo-button\" (click)\u003d\"this.openChangeRepoDialog()\" matTooltip\u003d\"Add new repository\"\u003e"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-icon\u003eadd\u003c/mat-icon\u003e"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" \u003c/button\u003e"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" \u003cbutton"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" mat-icon-button"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"toggleKeepFilters($event)\""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" class\u003d\"keep-filter-button\""},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" matTooltip\u003d\"{{ keepFilters ? \u0027Keep filter on\u0027 : \u0027Keep filter off\u0027 }}\""},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" color\u003d\"{{ keepFilters ? \u0027primary\u0027 : \u0027warn\u0027 }}\""},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" \u003e"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-icon\u003e{{ keepFilters ? \u0027filter_alt\u0027 : \u0027filter_alt_off\u0027 }}\u003c/mat-icon\u003e"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" \u003c/button\u003e"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Download WATcher Log\" (click)\u003d\"this.exportLogFile()\"\u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003ereceipt\u003c/mat-icon\u003e"},{"lineNumber":101,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":102,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Give feedback about WATcher\" (click)\u003d\"openIssueTracker()\"\u003e"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003email\u003c/mat-icon\u003e"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet() \u0026\u0026 isOpenUrlButtonShown()\""},{"lineNumber":108,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":109,"author":{"gitId":"-"},"content":" matTooltip\u003d\"View current page on GitHub\""},{"lineNumber":110,"author":{"gitId":"-"},"content":" (click)\u003d\"viewBrowser()\""},{"lineNumber":111,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eopen_in_new\u003c/mat-icon\u003e"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 (this.isLoading$ | async); else notLoading\"\u003e"},{"lineNumber":116,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":117,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" \u003cng-template #notLoading\u003e"},{"lineNumber":120,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet() \u0026\u0026 isReloadButtonShown() \u0026\u0026 !this.isReloadButtonDisabled\""},{"lineNumber":122,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":123,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Synchronize with Github data\""},{"lineNumber":124,"author":{"gitId":"-"},"content":" (click)\u003d\"reload()\""},{"lineNumber":125,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Sync"},{"lineNumber":127,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003erefresh\u003c/mat-icon\u003e"},{"lineNumber":128,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":129,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 isReloadButtonShown() \u0026\u0026 this.isReloadButtonDisabled\"\u003e"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"font-size: 14px; margin-right: 7px\"\u003eSync\u003c/span\u003e"},{"lineNumber":131,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":133,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" \u003cbutton *ngIf\u003d\"auth.isAuthenticated()\" mat-button matTooltip\u003d\"Log out\" (click)\u003d\"openLogOutDialog(); $event.stopPropagation()\"\u003e"},{"lineNumber":136,"author":{"gitId":"-"},"content":" ({{ userService.currentUser.loginId }})"},{"lineNumber":137,"author":{"gitId":"-"},"content":" \u003cmat-icon style\u003d\"margin-left: 2px\"\u003eexit_to_app\u003c/mat-icon\u003e"},{"lineNumber":138,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":139,"author":{"gitId":"-"},"content":"\u003c/mat-toolbar\u003e"}],"authorContributionMap":{"nknguyenhc":21,"NereusWB922":38,"-":80}},{"path":"src/app/shared/layout/header.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Location } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Component, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router, RoutesRecognized } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { filter, pairwise, switchMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { STORAGE_KEYS } from \u0027../../core/constants/storage-keys.constants\u0027;"},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":"import { RepoChangeResponse } from \u0027../../core/models/repo-change-response.model\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../../core/models/repo.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../core/models/view.model\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../../core/services/auth.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { DialogService } from \u0027../../core/services/dialog.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":"import { FiltersService } from \u0027../../core/services/filters.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"import { GroupingContextService } from \u0027../../core/services/grouping/grouping-context.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027../../core/services/repo-session-storage.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027../../core/services/repo-url-cache.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../core/services/user.service\u0027;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":"import { ViewDescription, ViewService } from \u0027../../core/services/view.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"const ISSUE_TRACKER_URL \u003d \u0027https://github.com/CATcher-org/WATcher/issues\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":29,"author":{"gitId":"-"},"content":" selector: \u0027app-layout-header\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./header.component.html\u0027,"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./header.component.css\u0027]"},{"lineNumber":32,"author":{"gitId":"-"},"content":"})"},{"lineNumber":33,"author":{"gitId":"-"},"content":"export class HeaderComponent implements OnInit {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private prevUrl;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" isReloadButtonDisabled \u003d false;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" ISSUE_FILTER \u003d \u0027/issues?q\u003dis:issue+is:all\u0027; // the filtered list must be an issue and must be open"},{"lineNumber":37,"author":{"gitId":"-"},"content":" TUTORIAL_LABEL \u003d \u0027+label:tutorial.\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" TEAM_LABEL \u003d \u0027+label:team.\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" EXCLUDE_DUPLICATE \u003d \u0027+-label:duplicate\u0027; // exclude duplicate issues"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" public isLoading$: Observable\u003cboolean\u003e;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" // Messages for the modal popup window upon logging out"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private readonly logOutDialogMessages \u003d [\u0027Do you wish to log out?\u0027];"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private readonly yesButtonDialogMessage \u003d \u0027Yes, I wish to log out\u0027;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private readonly noButtonDialogMessage \u003d \"No, I don\u0027t wish to log out\";"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" readonly presetViews: {"},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":" [key: string]: string;"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" } \u003d {"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":" currentlyActive: \u0027Currently active\u0027,"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":" contributions: \u0027Contributions\u0027,"},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":" custom: \u0027Custom\u0027"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" };"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" /** Model for the displayed repository name */"},{"lineNumber":57,"author":{"gitId":"-"},"content":" currentRepo \u003d \u0027\u0027;"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" keepFilters \u003d false;"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":62,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public auth: AuthService,"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" public viewService: ViewService,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public userService: UserService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public logger: LoggingService,"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" public repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private location: Location,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private githubEventService: GithubEventService,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private labelService: LabelService,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private dialogService: DialogService,"},{"lineNumber":75,"author":{"gitId":"Arif-Khalid"},"content":" private repoSessionStorageService: RepoSessionStorageService,"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" private filtersService: FiltersService,"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" private groupingContextService: GroupingContextService"},{"lineNumber":78,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" router.events"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":81,"author":{"gitId":"-"},"content":" filter((e: any) \u003d\u003e e instanceof RoutesRecognized),"},{"lineNumber":82,"author":{"gitId":"-"},"content":" pairwise()"},{"lineNumber":83,"author":{"gitId":"-"},"content":" )"},{"lineNumber":84,"author":{"gitId":"-"},"content":" .subscribe((e) \u003d\u003e {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.prevUrl \u003d e[0].urlAfterRedirects;"},{"lineNumber":86,"author":{"gitId":"-"},"content":" });"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.auth.currentAuthState.subscribe(() \u003d\u003e {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (auth.isAuthenticated() \u0026\u0026 !repoSessionStorageService.hasRepoLocation()) {"},{"lineNumber":90,"author":{"gitId":"nknguyenhc"},"content":" if (!this.auth.hasNext()) {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.openChangeRepoDialog();"},{"lineNumber":92,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":93,"author":{"gitId":"nknguyenhc"},"content":" this.auth.redirectToNext();"},{"lineNumber":94,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":" });"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.viewService.repoSetState.subscribe((state) \u003d\u003e {"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" if (auth.isAuthenticated() \u0026\u0026 viewService.isRepoSet()) {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" this.initializeRepoNameInTitle();"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }"},{"lineNumber":102,"author":{"gitId":"-"},"content":" });"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" this.viewService.repoChanged$.subscribe((repo) \u003d\u003e {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" this.initializeRepoNameInTitle();"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" this.isLoading$ \u003d this.issueService.isLoading.asObservable();"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" ngOnInit() {}"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":" * Replaces and resets the current view data and routes the app to the"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" * newly selected view."},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" * @param selectedView - Selected View that is selected by the user."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":" routeToSelectedView(selectedView: string): void {"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" // Do nothing if the selected view is the current view."},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.currentView \u003d\u003d\u003d View[selectedView]) {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" // Replace Current View Data."},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" this.viewService.changeView(View[selectedView]);"},{"lineNumber":126,"author":{"gitId":"-"},"content":""},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" // Remove current view issues and load selected view issues."},{"lineNumber":128,"author":{"gitId":"-"},"content":" this.githubService.reset();"},{"lineNumber":129,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":130,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":131,"author":{"gitId":"-"},"content":" this.reload();"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" // Route app to new view."},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":" this.router.navigateByUrl(this.viewService.currentView);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" isBackButtonShown(): boolean {"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" return `/${this.viewService.currentView}` !\u003d\u003d this.router.url \u0026\u0026 this.router.url !\u003d\u003d \u0027/\u0027 \u0026\u0026 !this.router.url.startsWith(\u0027/?code\u0027);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" isReloadButtonShown(): boolean {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" return this.router.url !\u003d\u003d \u0027/phaseBugReporting/issues/new\u0027;"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" isOpenUrlButtonShown(): boolean {"},{"lineNumber":146,"author":{"gitId":"NereusWB922"},"content":" return this.viewService.currentView \u003d\u003d\u003d View.issuesViewer || this.viewService.currentView \u003d\u003d\u003d View.activityDashboard;"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" getVersion(): string {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" return AppConfig.version;"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"NereusWB922"},"content":" getViewDescription(openView: string): string {"},{"lineNumber":154,"author":{"gitId":"NereusWB922"},"content":" return ViewDescription[openView];"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" goBack() {"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" if (this.prevUrl \u003d\u003d\u003d `/${this.viewService.currentView}/issues/new`) {"},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":" this.router.navigateByUrl(this.viewService.currentView);"},{"lineNumber":160,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" this.location.back();"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" viewBrowser() {"},{"lineNumber":166,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.currentView \u003d\u003d\u003d View.activityDashboard) {"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" window.open(`https://github.com/${this.viewService.currentRepo.owner}/${this.viewService.currentRepo.name}/pulse`);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" const routerUrl \u003d this.router.url.substring(1); // remove the first \u0027/\u0027 from string"},{"lineNumber":172,"author":{"gitId":"-"},"content":" const issueUrlIndex \u003d routerUrl.indexOf(\u0027/\u0027); // find the index of second \u0027/\u0027"},{"lineNumber":173,"author":{"gitId":"-"},"content":" let issueUrl: string;"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" // If can\u0027t find the index of second \u0027/\u0027, then router is at the /issues (table list) page"},{"lineNumber":176,"author":{"gitId":"-"},"content":" if (issueUrlIndex \u003c 0) {"},{"lineNumber":177,"author":{"gitId":"-"},"content":" // Apply filters to the issueUrl"},{"lineNumber":178,"author":{"gitId":"-"},"content":" issueUrl \u003d this.ISSUE_FILTER;"},{"lineNumber":179,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // issueUrl will be from the second \u0027/\u0027"},{"lineNumber":181,"author":{"gitId":"-"},"content":" issueUrl \u003d routerUrl.substring(issueUrlIndex);"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":" // Open the url in user\u0027s preferred browser"},{"lineNumber":184,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.githubService.getRepoURL()).concat(issueUrl));"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":" openIssueTracker() {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" window.open(ISSUE_TRACKER_URL);"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d true;"},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" this.githubEventService.reloadPage().subscribe("},{"lineNumber":195,"author":{"gitId":"-"},"content":" (success) \u003d\u003e success,"},{"lineNumber":196,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":197,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error, () \u003d\u003e this.githubEventService.reloadPage());"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":" );"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":" this.labelService.fetchLabels().subscribe("},{"lineNumber":202,"author":{"gitId":"-"},"content":" (success) \u003d\u003e success,"},{"lineNumber":203,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":204,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error, () \u003d\u003e this.labelService.fetchLabels());"},{"lineNumber":205,"author":{"gitId":"-"},"content":" }"},{"lineNumber":206,"author":{"gitId":"-"},"content":" );"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":" // Prevent user from spamming the reload button"},{"lineNumber":209,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":210,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d false;"},{"lineNumber":211,"author":{"gitId":"-"},"content":" }, 3000);"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" logOut() {"},{"lineNumber":215,"author":{"gitId":"-"},"content":" this.auth.logOut();"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" openLogOutDialog() {"},{"lineNumber":219,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openUserConfirmationModal("},{"lineNumber":220,"author":{"gitId":"-"},"content":" this.logOutDialogMessages,"},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.yesButtonDialogMessage,"},{"lineNumber":222,"author":{"gitId":"-"},"content":" this.noButtonDialogMessage"},{"lineNumber":223,"author":{"gitId":"-"},"content":" );"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" dialogRef.afterClosed().subscribe((res) \u003d\u003e {"},{"lineNumber":226,"author":{"gitId":"-"},"content":" if (res) {"},{"lineNumber":227,"author":{"gitId":"-"},"content":" this.logger.info(`HeaderComponent: Logging out from ${this.userService.currentUser.loginId}`);"},{"lineNumber":228,"author":{"gitId":"-"},"content":" this.logOut();"},{"lineNumber":229,"author":{"gitId":"-"},"content":" }"},{"lineNumber":230,"author":{"gitId":"-"},"content":" });"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":" exportLogFile() {"},{"lineNumber":234,"author":{"gitId":"-"},"content":" this.logger.exportLogFile();"},{"lineNumber":235,"author":{"gitId":"-"},"content":" }"},{"lineNumber":236,"author":{"gitId":"-"},"content":""},{"lineNumber":237,"author":{"gitId":"-"},"content":" initializeRepoNameInTitle() {"},{"lineNumber":238,"author":{"gitId":"NereusWB922"},"content":" if (Repo.isInvalidRepoName(this.viewService.currentRepo)) {"},{"lineNumber":239,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }"},{"lineNumber":241,"author":{"gitId":"NereusWB922"},"content":" const currentRepoString \u003d this.viewService.currentRepo.toString();"},{"lineNumber":242,"author":{"gitId":"-"},"content":" this.logger.info(`HeaderComponent: initializing current repository name as ${currentRepoString}`);"},{"lineNumber":243,"author":{"gitId":"-"},"content":" this.currentRepo \u003d currentRepoString;"},{"lineNumber":244,"author":{"gitId":"-"},"content":" }"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Change repository viewed on Issue Dashboard, if a valid repository is provided."},{"lineNumber":248,"author":{"gitId":"-"},"content":" * Re-open dialog to prompt for another repository if an invalid one is provided."},{"lineNumber":249,"author":{"gitId":"-"},"content":" */"},{"lineNumber":250,"author":{"gitId":"Arif-Khalid"},"content":" changeRepositoryIfValid(repo: Repo, newRepoString: string, keepFilters: boolean) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" if (newRepoString \u003d\u003d\u003d this.currentRepo) {"},{"lineNumber":252,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }"},{"lineNumber":254,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":255,"author":{"gitId":"NereusWB922"},"content":" this.viewService"},{"lineNumber":256,"author":{"gitId":"-"},"content":" .changeRepositoryIfValid(repo)"},{"lineNumber":257,"author":{"gitId":"-"},"content":" .then(() \u003d\u003e {"},{"lineNumber":258,"author":{"gitId":"NereusWB922"},"content":" this.auth.setTitleWithViewDetail();"},{"lineNumber":259,"author":{"gitId":"-"},"content":" this.currentRepo \u003d newRepoString;"},{"lineNumber":260,"author":{"gitId":"NereusWB922"},"content":" if (!keepFilters) {"},{"lineNumber":261,"author":{"gitId":"NereusWB922"},"content":" this.groupingContextService.reset();"},{"lineNumber":262,"author":{"gitId":"Arif-Khalid"},"content":" this.filtersService.clearFilters();"},{"lineNumber":263,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":264,"author":{"gitId":"-"},"content":" })"},{"lineNumber":265,"author":{"gitId":"-"},"content":" .catch((error) \u003d\u003e {"},{"lineNumber":266,"author":{"gitId":"-"},"content":" this.openChangeRepoDialog();"},{"lineNumber":267,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":268,"author":{"gitId":"-"},"content":" });"},{"lineNumber":269,"author":{"gitId":"-"},"content":" }"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"NereusWB922"},"content":" applyRepoDropdown(repoString: string) {"},{"lineNumber":272,"author":{"gitId":"NereusWB922"},"content":" const newRepo \u003d Repo.of(repoString);"},{"lineNumber":273,"author":{"gitId":"NereusWB922"},"content":" this.changeRepositoryIfValid(newRepo, newRepo.toString(), this.keepFilters);"},{"lineNumber":274,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":275,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":276,"author":{"gitId":"NereusWB922"},"content":" toggleKeepFilters(event: MouseEvent) {"},{"lineNumber":277,"author":{"gitId":"NereusWB922"},"content":" event.stopPropagation();"},{"lineNumber":278,"author":{"gitId":"NereusWB922"},"content":" this.keepFilters \u003d !this.keepFilters;"},{"lineNumber":279,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":280,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":281,"author":{"gitId":"-"},"content":" openChangeRepoDialog() {"},{"lineNumber":282,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openChangeRepoDialog(this.currentRepo);"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"Arif-Khalid"},"content":" dialogRef.afterClosed().subscribe((res: RepoChangeResponse | null) \u003d\u003e {"},{"lineNumber":285,"author":{"gitId":"-"},"content":" if (!res) {"},{"lineNumber":286,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":287,"author":{"gitId":"-"},"content":" }"},{"lineNumber":288,"author":{"gitId":"Arif-Khalid"},"content":" const newRepo \u003d Repo.of(res.repo);"},{"lineNumber":289,"author":{"gitId":"-"},"content":""},{"lineNumber":290,"author":{"gitId":"NereusWB922"},"content":" if (this.viewService.isRepoSet()) {"},{"lineNumber":291,"author":{"gitId":"Arif-Khalid"},"content":" this.changeRepositoryIfValid(newRepo, newRepo.toString(), res.keepFilters);"},{"lineNumber":292,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":293,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":294,"author":{"gitId":"-"},"content":" * From session-selection.component.ts"},{"lineNumber":295,"author":{"gitId":"-"},"content":" *"},{"lineNumber":296,"author":{"gitId":"-"},"content":" * Persist repo information in local browser storage"},{"lineNumber":297,"author":{"gitId":"-"},"content":" * To retrieve after authentication redirects back to WATcher"},{"lineNumber":298,"author":{"gitId":"-"},"content":" *"},{"lineNumber":299,"author":{"gitId":"-"},"content":" * Since localStorage::setItem with an undefined value can result in"},{"lineNumber":300,"author":{"gitId":"-"},"content":" * the subsequent value being stored as a string being \u0027undefined\u0027, check"},{"lineNumber":301,"author":{"gitId":"-"},"content":" * if undefined before storing it. Let\u0027s reset the items before setting them."},{"lineNumber":302,"author":{"gitId":"-"},"content":" */"},{"lineNumber":303,"author":{"gitId":"-"},"content":" window.localStorage.removeItem(STORAGE_KEYS.ORG);"},{"lineNumber":304,"author":{"gitId":"-"},"content":" window.localStorage.removeItem(STORAGE_KEYS.DATA_REPO);"},{"lineNumber":305,"author":{"gitId":"-"},"content":""},{"lineNumber":306,"author":{"gitId":"-"},"content":" if (newRepo) {"},{"lineNumber":307,"author":{"gitId":"-"},"content":" window.localStorage.setItem(STORAGE_KEYS.ORG, newRepo.owner);"},{"lineNumber":308,"author":{"gitId":"-"},"content":" window.localStorage.setItem(STORAGE_KEYS.DATA_REPO, newRepo.name);"},{"lineNumber":309,"author":{"gitId":"-"},"content":""},{"lineNumber":310,"author":{"gitId":"-"},"content":" this.repoUrlCacheService.cache(newRepo.toString());"},{"lineNumber":311,"author":{"gitId":"-"},"content":" }"},{"lineNumber":312,"author":{"gitId":"-"},"content":" this.auth.setRepo().subscribe();"},{"lineNumber":313,"author":{"gitId":"-"},"content":" }"},{"lineNumber":314,"author":{"gitId":"-"},"content":" });"},{"lineNumber":315,"author":{"gitId":"-"},"content":" }"},{"lineNumber":316,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":12,"Arif-Khalid":9,"NereusWB922":54,"-":241}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".change-repo-form-title {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":".mat-dialog-content {"},{"lineNumber":6,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":".mat-form-field {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":".mat-dialog-actions {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" justify-content: flex-end;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":17,"author":{"gitId":"Arif-Khalid"},"content":".change-repo-form-header {"},{"lineNumber":18,"author":{"gitId":"Arif-Khalid"},"content":" display: flex;"},{"lineNumber":19,"author":{"gitId":"Arif-Khalid"},"content":" justify-content: space-between;"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":5,"-":15}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"\u003cdiv class\u003d\"change-repo-form-header\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ch1 mat-dialog-title class\u003d\"change-repo-form-title\"\u003e{{ data.repoName ? \u0027Change repository\u0027 : \u0027Select repository\u0027 }}\u003c/h1\u003e"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" \u003cmat-checkbox *ngIf\u003d\"data.repoName\" [(ngModel)]\u003d\"this.keepFilters\"\u003eKeep Filters\u003c/mat-checkbox\u003e"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-content\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cform (ngSubmit)\u003d\"onYesClick()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eRepository Location (Github Link or Org/Repo)\u003c/mat-label\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cinput matInput [(ngModel)]\u003d\"this.repoName\" [formControl]\u003d\"repoChangeForm\" [matAutocomplete]\u003d\"auto\" /\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-autocomplete #auto\u003d\"matAutocomplete\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-option *ngFor\u003d\"let suggestion of filteredSuggestions | async\" [value]\u003d\"suggestion\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" {{ suggestion }}"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-option\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-autocomplete\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/form\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-actions\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"onNoClick()\" color\u003d\"warn\"\u003eCancel\u003c/button\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"onYesClick()\" color\u003d\"primary\"\u003e{{ data.repoName ? \u0027Change Repo\u0027 : \u0027Select Repo\u0027 }}\u003c/button\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"Arif-Khalid":3,"-":18}},{"path":"src/app/shared/repo-change-form/repo-change-form.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Inject, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FormControl } from \u0027@angular/forms\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { MatDialogRef, MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"import { RepoChangeResponse } from \u0027../../core/models/repo-change-response.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { RepoUrlCacheService } from \u0027../../core/services/repo-url-cache.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-repo-change-form\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./repo-change-form.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./repo-change-form.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class RepoChangeFormComponent implements OnInit {"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" public repoName: string;"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" public keepFilters: boolean;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" filteredSuggestions: Observable\u003cstring[]\u003e;"},{"lineNumber":17,"author":{"gitId":"-"},"content":" repoChangeForm \u003d new FormControl();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":20,"author":{"gitId":"-"},"content":" public dialogRef: MatDialogRef\u003cRepoChangeFormComponent\u003e,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private repoUrlCacheService: RepoUrlCacheService,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Inject(MAT_DIALOG_DATA) public data"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" this.repoName \u003d data.repoName;"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.initRepoChangeForm();"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" private initRepoChangeForm() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.filteredSuggestions \u003d this.repoUrlCacheService.getFilteredSuggestions(this.repoChangeForm);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" onYesClick(): void {"},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" const response: RepoChangeResponse \u003d {"},{"lineNumber":37,"author":{"gitId":"Arif-Khalid"},"content":" repo: this.repoName,"},{"lineNumber":38,"author":{"gitId":"Arif-Khalid"},"content":" keepFilters: this.keepFilters"},{"lineNumber":39,"author":{"gitId":"Arif-Khalid"},"content":" };"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" this.dialogRef.close(response);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" onNoClick(): void {"},{"lineNumber":44,"author":{"gitId":"Arif-Khalid"},"content":" this.dialogRef.close(null);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":9,"-":37}},{"path":"src/test.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"// This file is required by karma.conf.js and loads recursively all the .spec and framework files"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"// tslint:disable:ordered-imports"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"// Ordered-imports rule is disabled here because the import statement for \u0027zone-testing\u0027 must be"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"// at the top to prevent test setup breakage in \u0027npm run test\u0027."},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import \u0027zone.js/dist/zone-testing\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { getTestBed } from \u0027@angular/core/testing\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from \u0027@angular/platform-browser-dynamic/testing\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"declare const require: any;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"// First, initialize the Angular testing environment."},{"lineNumber":13,"author":{"gitId":"-"},"content":"getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());"},{"lineNumber":14,"author":{"gitId":"-"},"content":"// Then we find all the tests."},{"lineNumber":15,"author":{"gitId":"-"},"content":"const context \u003d require.context(\u0027../tests\u0027, true, /\\.spec\\.ts$/);"},{"lineNumber":16,"author":{"gitId":"-"},"content":"// And load the modules."},{"lineNumber":17,"author":{"gitId":"-"},"content":"context.keys().map(context);"}],"authorContributionMap":{"NereusWB922":4,"-":13}},{"path":"tests/app/auth/login/login.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { ComponentFixture, TestBed, waitForAsync } from \u0027@angular/core/testing\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { LoginComponent } from \u0027../../../../src/app/auth/login/login.component\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { AuthService, AuthState } from \u0027../../../../src/app/core/services/auth.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027LoginComponent\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" let authServiceSpy: jasmine.SpyObj\u003cAuthService\u003e;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" let errorHandlingServiceSpy: jasmine.SpyObj\u003cErrorHandlingService\u003e;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" let component: LoginComponent;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" let fixture: ComponentFixture\u003cLoginComponent\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" beforeEach("},{"lineNumber":15,"author":{"gitId":"-"},"content":" waitForAsync(() \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy \u003d jasmine.createSpyObj\u003cAuthService\u003e(\u0027AuthService\u0027, [\u0027startOAuthProcess\u0027, \u0027changeAuthState\u0027]);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj\u003cLoggingService\u003e(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" errorHandlingServiceSpy \u003d jasmine.createSpyObj\u003cErrorHandlingService\u003e(\u0027ErrorHandlingService\u0027, [\u0027handleError\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" TestBed.configureTestingModule({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" { provide: AuthService, useValue: authServiceSpy },"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" { provide: ErrorHandlingService, useValue: errorHandlingServiceSpy }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":26,"author":{"gitId":"-"},"content":" declarations: [LoginComponent]"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }).compileComponents();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" fixture \u003d TestBed.createComponent(LoginComponent);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fixture.detectChanges();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" })"},{"lineNumber":33,"author":{"gitId":"-"},"content":" );"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expect(component).toBeTruthy();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startPublicOnlyLoginProcess should call startLoginProcess with false\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" component.startPublicOnlyLoginProcess();"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(false);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startIncludePrivateLoginProcess should call startLoginProcess with true\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" component.startIncludePrivateLoginProcess();"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(true);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call authService.startOAuthProcess on startLoginProcess\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.startOAuthProcess).toHaveBeenCalledWith(hasPrivateConsent);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027LoginComponent: Beginning login process\u0027);"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call error handling methods when error is thrown\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const errorMessage \u003d \u0027Error!\u0027;"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" const error: Error \u003d new Error(errorMessage);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy.startOAuthProcess.and.throwError(error);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.changeAuthState).toHaveBeenCalledWith(AuthState.NotAuthenticated);"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" expect(errorHandlingServiceSpy.handleError).toHaveBeenCalledWith(error);"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info.calls.allArgs()).toEqual(["},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" [\u0027LoginComponent: Beginning login process\u0027],"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" [`LoginComponent: Login process failed with an error: ${error}`]"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":49,"-":31}},{"path":"tests/app/core/models/session-model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" assertSessionDataIntegrity,"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" NO_VALID_OPEN_VIEWS,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" OPENED_VIEW_REPO_UNDEFINED,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" SESSION_DATA_MISSING_FIELDS,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" SESSION_DATA_UNAVAILABLE"},{"lineNumber":8,"author":{"gitId":"-"},"content":"} from \u0027../../../../src/app/core/models/session.model\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../../../src/app/core/models/view.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { VALID_SESSION_DATA, WATCHER_REPO } from \u0027../../../constants/session.constants\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"describe(\u0027Session Model\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" describe(\u0027assertSessionDataIntegrity()\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" it(\u0027should throw error on unavailable session\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" of(undefined)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":17,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":18,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":19,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_UNAVAILABLE))"},{"lineNumber":20,"author":{"gitId":"-"},"content":" });"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid session\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: null })"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [] })"},{"lineNumber":31,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":33,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" });"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: \u0027repo\u0027 })"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":39,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":" });"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session with invalid views\u0027, () \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: \u0027invalidView\u0027 as View, repos: [WATCHER_REPO] }] })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":48,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(NO_VALID_OPEN_VIEWS))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid repo\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: undefined }] })"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":57,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: null }] })"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":63,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: \u0027\u0027 }] })"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":69,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ view: View.issuesViewer, repo: [] }] })"},{"lineNumber":73,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_VIEW_REPO_UNDEFINED))"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should pass for valid session data\u0027, () \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" of(VALID_SESSION_DATA)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" .subscribe((el) \u003d\u003e expect(el).toEqual(VALID_SESSION_DATA));"},{"lineNumber":84,"author":{"gitId":"-"},"content":" });"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":28,"-":58}},{"path":"tests/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { NO_ERRORS_SCHEMA } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ComponentFixture, fakeAsync, TestBed, tick } from \u0027@angular/core/testing\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatSelectionList } from \u0027@angular/material/list\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { MatMenuModule } from \u0027@angular/material/menu\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { BehaviorSubject, of } from \u0027rxjs\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { SimpleLabel } from \u0027../../../../../src/app/core/models/label.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { FiltersService } from \u0027../../../../../src/app/core/services/filters.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { LabelService } from \u0027../../../../../src/app/core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { LabelFilterBarComponent } from \u0027../../../../../src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"import { LABEL_NAME_SEVERITY_HIGH, LABEL_NAME_SEVERITY_LOW, SEVERITY_SIMPLE_LABELS } from \u0027../../../../constants/label.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027LabelFilterBarComponent\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" let component: LabelFilterBarComponent;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" let fixture: ComponentFixture\u003cLabelFilterBarComponent\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" let labelServiceSpy: jasmine.SpyObj\u003cLabelService\u003e;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" let filtersServiceSpy: jasmine.SpyObj\u003cFiltersService\u003e;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" let labelsSubject: BehaviorSubject\u003cSimpleLabel[]\u003e;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" beforeEach(async () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy \u003d jasmine.createSpyObj(\u0027LabelService\u0027, [\u0027connect\u0027, \u0027startPollLabels\u0027, \u0027fetchLabels\u0027]);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027, \u0027debug\u0027]);"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" filtersServiceSpy \u003d jasmine.createSpyObj(\u0027FiltersService\u0027, [\u0027updateFilters\u0027, \u0027sanitizeLabels\u0027]);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" TestBed.configureTestingModule({"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" providers: ["},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" { provide: LabelService, useValue: labelServiceSpy },"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" { provide: FiltersService, useValue: filtersServiceSpy }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" ],"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" imports: [MatMenuModule],"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" declarations: [LabelFilterBarComponent],"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" schemas: [NO_ERRORS_SCHEMA]"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" }).compileComponents();"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" fixture \u003d TestBed.createComponent(LabelFilterBarComponent);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" fixture.detectChanges();"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" expect(component).toBeTruthy();"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027ngAfterViewInit\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" // Setup labels observable"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" labelsSubject \u003d new BehaviorSubject\u003cSimpleLabel[]\u003e([]);"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy.fetchLabels.and.returnValue(of([]));"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" labelServiceSpy.connect.and.returnValue(labelsSubject.asObservable());"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":" filtersServiceSpy.sanitizeLabels.and.callThrough();"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"Arif-Khalid"},"content":" // it(\u0027should update allLabels with latest emmitted value after ngAfterViewInit\u0027, fakeAsync(() \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"Arif-Khalid"},"content":" // component.ngAfterViewInit();"},{"lineNumber":57,"author":{"gitId":"Arif-Khalid"},"content":" // tick();"},{"lineNumber":58,"author":{"gitId":"Arif-Khalid"},"content":" // labelsSubject.next(SEVERITY_SIMPLE_LABELS);"},{"lineNumber":59,"author":{"gitId":"Arif-Khalid"},"content":" // expect(component.allLabels).toEqual(SEVERITY_SIMPLE_LABELS);"},{"lineNumber":60,"author":{"gitId":"Arif-Khalid"},"content":" // }));"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027hide(label)\u0027, () \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should add label to hidden labels set and update filter\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const label \u003d LABEL_NAME_SEVERITY_HIGH;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).not.toContain(label);"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" component.hide(label);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).toContain(label);"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ hiddenLabels: component.hiddenLabelNames });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027show(label)\u0027, () \u003d\u003e {"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should remove label from hidden labels set and update filter\u0027, () \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" const label \u003d LABEL_NAME_SEVERITY_HIGH;"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" component.hide(label);"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).toContain(label);"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" component.show(label);"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" expect(component.hiddenLabelNames).not.toContain(label);"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ hiddenLabels: component.hiddenLabelNames });"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027hasLabels\u0027, () \u003d\u003e {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" component.allLabels \u003d SEVERITY_SIMPLE_LABELS;"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return true if any label match the filter\u0027, () \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027low\u0027;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeTrue();"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return false if no label match the filter\u0027, () \u003d\u003e {"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027priority\u0027;"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeFalse();"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return false if no label exists\u0027, () \u003d\u003e {"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" const filter \u003d \u0027low\u0027;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" component.allLabels \u003d [];"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" const result \u003d component.hasLabels(filter);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" expect(result).toBeFalse();"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027updateSelection\u0027, () \u003d\u003e {"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should update filters service with selected labels\u0027, () \u003d\u003e {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" const selectedLabels \u003d [LABEL_NAME_SEVERITY_HIGH, LABEL_NAME_SEVERITY_LOW];"},{"lineNumber":122,"author":{"gitId":"nknguyenhc"},"content":" component.selectedLabelNames \u003d new Set\u003cstring\u003e(selectedLabels);"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":124,"author":{"gitId":"nknguyenhc"},"content":" component.updateSelection();"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":126,"author":{"gitId":"nknguyenhc"},"content":" expect(filtersServiceSpy.updateFilters).toHaveBeenCalledWith({ labels: selectedLabels, deselectedLabels: new Set\u003cstring\u003e() });"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027removeAllSelection\u0027, () \u003d\u003e {"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should deselect all labels and update the filter\u0027, () \u003d\u003e {"},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":" component.removeAllSelection();"},{"lineNumber":133,"author":{"gitId":"nknguyenhc"},"content":" expect(component.selectedLabelNames).toEqual(new Set\u003cstring\u003e());"},{"lineNumber":134,"author":{"gitId":"nknguyenhc"},"content":" expect(component.deselectedLabelNames).toEqual(new Set\u003cstring\u003e());"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":"});"}],"authorContributionMap":{"nknguyenhc":5,"NereusWB922":124,"Arif-Khalid":8}},{"path":"tests/app/shared/issue-tables/issue-paginator.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027../../../../src/app/shared/issue-tables/issue-paginator\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issue-paginator\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027paginateData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" let dataSet_7: Issue[];"},{"lineNumber":14,"author":{"gitId":"-"},"content":" let paginator: MatPaginator;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" dataSet_7 \u003d ["},{"lineNumber":22,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" paginator \u003d { pageSize: 3 } as MatPaginator;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" });"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" it(\u0027should set the length of paginator to the length of data\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" paginateData(paginator, dataSet_7);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" expect(paginator.length).toEqual(7);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues according to page index\u0027, () \u003d\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 0;"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" // Returns issues index 0 to 2"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([mediumSeverityIssueWithResponse, mediumSeverityIssueWithAssigneee, lowSeverityFeatureFlawIssue]);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues in the previous page if there are no issues on the current page\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 3;"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Returns issues index 6 on page 2"},{"lineNumber":50,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([highSeverityDocumentationBugIssue]);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" });"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":4,"-":50}},{"path":"tests/app/shared/issue-tables/issue-sorter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { applySort } from \u0027../../../../src/app/shared/issue-tables/issue-sorter\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_EARLIER,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_LATER,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issuer-sorter\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027applySort()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" const dummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" const otherDummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d [dummyIssue, otherDummyIssue];"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedEarlier: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_EARLIER);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedLater: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_LATER);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const issuesWithDifferentUpdatedDate: Issue[] \u003d [issueUpdatedEarlier, issueUpdatedLater];"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" const matSort: MatSort \u003d new MatSort();"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return the same data if sort.active is not set\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" const sortedData \u003d applySort(matSort, issuesList);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(sortedData).toEqual(issuesList);"},{"lineNumber":26,"author":{"gitId":"-"},"content":" });"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their string fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027title\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuesByTitleAsc \u003d applySort(matSort, issuesList);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuesByTitleDesc \u003d applySort(matSort, issuesList);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their id fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027id\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByIdAsc \u003d applySort(matSort, issuesList);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdAsc, otherDummyIssue, dummyIssue);"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByIdDesc \u003d applySort(matSort, issuesList);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdDesc, dummyIssue, otherDummyIssue);"},{"lineNumber":48,"author":{"gitId":"-"},"content":" });"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their updated date fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" matSort.active \u003d \u0027date\u0027;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateAsc \u003d applySort(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateAsc, issueUpdatedEarlier, issueUpdatedLater);"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateDesc \u003d applySort(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateDesc, issueUpdatedLater, issueUpdatedEarlier);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" });"},{"lineNumber":61,"author":{"gitId":"-"},"content":" });"},{"lineNumber":62,"author":{"gitId":"-"},"content":"});"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * This helper method helps to check if the sorted issues are in their"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * correct order based on the variable arguments provided."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":"function assertOrder(sortedIssues: Issue[], ...expectedSortedIssues: Issue[]) {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" for (let i \u003d 0; i \u003c sortedIssues.length; i++) {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expect(sortedIssues[i].id).toBe(expectedSortedIssues[i].id);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":28,"-":44}},{"path":"tests/app/shared/issue-tables/search-filter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../../../src/app/core/services/issue.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../../../../src/app/shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027../../../../src/app/shared/issue-tables/search-filter\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV } from \u0027../../../constants/data.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import { GITHUB_LABEL_FEATURE_FLAW } from \u0027../../../constants/githublabel.constants\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"describe(\u0027search-filter\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" describe(\u0027applySearchFilter()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" let searchKey: string;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" const displayedColumns: string[] \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" const issueService: IssueService \u003d new IssueService(null, null, null);"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues which are assigned to a specific user\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" searchKey \u003d USER_ANUBHAV.loginId;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" it(\u0027can filter for issues using label\u0027, () \u003d\u003e {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" searchKey \u003d GITHUB_LABEL_FEATURE_FLAW.name;"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([lowSeverityFeatureFlawIssue]);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" });"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues that contain the search key in any other column\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // Search by id of issue"},{"lineNumber":43,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithResponse.id.toString();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithResponse]);"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Search by title of issue"},{"lineNumber":47,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithAssigneee.title;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":9,"-":42}},{"path":"tests/constants/data.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { UserRole } from \u0027../../src/app/core/models/user.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const csvString \u003d"},{"lineNumber":4,"author":{"gitId":"-"},"content":" `"},{"lineNumber":5,"author":{"gitId":"-"},"content":"role,name,team"},{"lineNumber":6,"author":{"gitId":"-"},"content":"student,JunWei96,CS2103T-W12-3"},{"lineNumber":7,"author":{"gitId":"-"},"content":"admin,damithc,"},{"lineNumber":8,"author":{"gitId":"-"},"content":"tutor,anubh-v,CS2103T-W12-3"},{"lineNumber":9,"author":{"gitId":"-"},"content":"admin,geshuming,"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-3"},{"lineNumber":12,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-3"},{"lineNumber":13,"author":{"gitId":"-"},"content":"tutor,jj-lim,CS2103T-W12-4"},{"lineNumber":14,"author":{"gitId":"-"},"content":"tutor,q ,CS2103T-W12-4"},{"lineNumber":15,"author":{"gitId":"-"},"content":"student,003-samuel,CS2103T-W12-3"},{"lineNumber":16,"author":{"gitId":"-"},"content":"student,damithc,CS2103T-W12-3"},{"lineNumber":17,"author":{"gitId":"-"},"content":"student,RonakLakhotia,CS2103T-W12-4"},{"lineNumber":18,"author":{"gitId":"-"},"content":"student,ptvrajsk,CS2103T-W12-3` + ` `;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"// jsonData is a json representation of csvString"},{"lineNumber":21,"author":{"gitId":"-"},"content":"export const jsonData \u003d {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" roles: {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" students: {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" junwei96: \u0027true\u0027,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: \u0027true\u0027,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" damithc: \u0027true\u0027,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ronaklakhotia: \u0027true\u0027,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ptvrajsk: \u0027true\u0027"},{"lineNumber":29,"author":{"gitId":"-"},"content":" },"},{"lineNumber":30,"author":{"gitId":"-"},"content":" tutors: { \u0027anubh-v\u0027: \u0027true\u0027, \u0027jj-lim\u0027: \u0027true\u0027, q: \u0027true\u0027 },"},{"lineNumber":31,"author":{"gitId":"-"},"content":" admins: { damithc: \u0027true\u0027, geshuming: \u0027true\u0027 }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" },"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u0027team-structure\u0027: {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u0027CS2103T-W12-3\u0027: {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" junwei96: \u0027JunWei96\u0027,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: \u0027003-samuel\u0027,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" damithc: \u0027damithc\u0027,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ptvrajsk: \u0027ptvrajsk\u0027"},{"lineNumber":39,"author":{"gitId":"-"},"content":" },"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u0027CS2103T-W12-4\u0027: { ronaklakhotia: \u0027RonakLakhotia\u0027 }"},{"lineNumber":41,"author":{"gitId":"-"},"content":" },"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u0027students-allocation\u0027: {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" junwei96: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u0027003-samuel\u0027: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":45,"author":{"gitId":"-"},"content":" damithc: { teamId: \u0027CS2103T-W12-3\u0027 },"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ronaklakhotia: { teamId: \u0027CS2103T-W12-4\u0027 },"},{"lineNumber":47,"author":{"gitId":"-"},"content":" ptvrajsk: { teamId: \u0027CS2103T-W12-3\u0027 }"},{"lineNumber":48,"author":{"gitId":"-"},"content":" },"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u0027tutors-allocation\u0027: {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u0027anubh-v\u0027: { \u0027CS2103T-W12-3\u0027: \u0027true\u0027 },"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u0027jj-lim\u0027: { \u0027CS2103T-W12-3\u0027: \u0027true\u0027, \u0027CS2103T-W12-4\u0027: \u0027true\u0027 },"},{"lineNumber":52,"author":{"gitId":"-"},"content":" q: { \u0027CS2103T-W12-4\u0027: \u0027true\u0027 }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" },"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u0027admins-allocation\u0027: { damithc: {}, geshuming: {} }"},{"lineNumber":55,"author":{"gitId":"-"},"content":"};"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"export const USER_JUNWEI \u003d {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" loginId: \u0027JunWei96\u0027,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Student"},{"lineNumber":60,"author":{"gitId":"-"},"content":"};"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":"export const USER_ANUBHAV \u003d {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" loginId: \u0027anubh-v\u0027,"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Student"},{"lineNumber":65,"author":{"gitId":"-"},"content":"};"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"export const USER_Q \u003d {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" loginId: \u0027q\u0027,"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Tutor"},{"lineNumber":70,"author":{"gitId":"-"},"content":"};"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":"export const USER_SHUMING \u003d {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" loginId: \u0027geshuming\u0027,"},{"lineNumber":74,"author":{"gitId":"-"},"content":" role: UserRole.Admin,"},{"lineNumber":75,"author":{"gitId":"-"},"content":" allocatedTeams: []"},{"lineNumber":76,"author":{"gitId":"-"},"content":"};"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":"export const USER_WITH_TWO_ROLES \u003d {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" loginId: \u0027damithc\u0027,"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" role: UserRole.Admin"},{"lineNumber":81,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":4,"-":77}},{"path":"tests/constants/error.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { RequestError } from \u0027@octokit/request-error\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"export const STANDARD_ERROR \u003d new Error(\u0027This is a normal error\u0027);"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"export const ERROR_WITH_NO_MESSAGE \u003d new Error();"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_304_ERROR \u003d new HttpErrorResponse({ status: 304 });"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_422_ERROR \u003d new HttpErrorResponse({ status: 422 });"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_500_ERROR \u003d new HttpErrorResponse({ status: 500 });"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_400_ERROR \u003d new HttpErrorResponse({ status: 400 });"},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_401_ERROR \u003d new HttpErrorResponse({ status: 401 });"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_404_ERROR \u003d new HttpErrorResponse({ status: 404 });"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":"export const HTTP_UNKNOWN_ERROR \u003d new HttpErrorResponse({ status: 999 });"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":"export const OCTOKIT_REQUEST_ERROR \u003d new RequestError(\u0027This is an octokit request error\u0027, 400, {"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" request: { method: \u0027GET\u0027, url: \u0027\u0027, headers: {} }"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":24}},{"path":"tests/constants/githubissue.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { IssueState, IssueStateReason } from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../../src/app/core/models/github/github-issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_ANUBHAV } from \u0027./data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { EMPTY_TEAM_RESPONSE } from \u0027./githubcomment.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" GITHUB_LABEL_DOCUMENTATION_BUG,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FEATURE_FLAW,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GITHUB_LABEL_HIGH_SEVERITY,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" GITHUB_LABEL_LOW_SEVERITY,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":15,"author":{"gitId":"-"},"content":"} from \u0027./githublabel.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"const randomId: () \u003d\u003e string \u003d () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return Math.floor(Math.random() * 1000000000).toString();"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"const randomIssueNumber: () \u003d\u003e number \u003d () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Math.round(Math.random() * 1000);"},{"lineNumber":23,"author":{"gitId":"-"},"content":"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"const randomISODate: (startDate?: Date, endDate?: Date) \u003d\u003e string \u003d ("},{"lineNumber":26,"author":{"gitId":"-"},"content":" startDate: Date \u003d new Date(2020, 1, 1),"},{"lineNumber":27,"author":{"gitId":"-"},"content":" endDate: Date \u003d new Date()"},{"lineNumber":28,"author":{"gitId":"-"},"content":") \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return new Date(startDate.getTime() + Math.random() * (startDate.getTime() - endDate.getTime())).toISOString();"},{"lineNumber":30,"author":{"gitId":"-"},"content":"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_DETAILS \u003d {"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" login: USER_ANUBHAV.loginId"},{"lineNumber":34,"author":{"gitId":"-"},"content":"};"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"export const MILESTONE_ONE \u003d {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" number: \u00271\u0027,"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" title: \u0027Milestone 1\u0027,"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" state: \u0027Open\u0027"},{"lineNumber":40,"author":{"gitId":"-"},"content":"};"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":43,"author":{"gitId":"-"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" number: 92,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":46,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":49,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":"export const CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" number: 92,"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Closed,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Completed,"},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u00272020-03-22T15:37:32Z\u0027,"},{"lineNumber":74,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_EARLIER \u003d new GithubIssue({"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000001\u0027,"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" number: 1,"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-09-02T16:19:02Z\u0027,"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-09-03T13:37:32Z\u0027,"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/93\u0027,"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_LATER \u003d new GithubIssue({"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000002\u0027,"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" number: 2,"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-10-02T16:19:02Z\u0027,"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-10-22T13:37:32Z\u0027,"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/94\u0027,"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":120,"author":{"gitId":"-"},"content":"});"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY \u003d new GithubIssue({"},{"lineNumber":123,"author":{"gitId":"-"},"content":" id: \u0027384830567\u0027,"},{"lineNumber":124,"author":{"gitId":"-"},"content":" number: 130,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":126,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":127,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":128,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":129,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":130,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":131,"author":{"gitId":"-"},"content":" title: \u0027App is sometimes slow\u0027,"},{"lineNumber":132,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":134,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":140,"author":{"gitId":"-"},"content":"});"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":143,"author":{"gitId":"-"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":144,"author":{"gitId":"-"},"content":" number: 32,"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":146,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":147,"author":{"gitId":"-"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":148,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":149,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":150,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":151,"author":{"gitId":"-"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":152,"author":{"gitId":"-"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":153,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":154,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":157,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":160,"author":{"gitId":"-"},"content":"});"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_WITHOUT_MILESTONE \u003d new GithubIssue({"},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":164,"author":{"gitId":"NereusWB922"},"content":" number: 32,"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":166,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":168,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":169,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":171,"author":{"gitId":"NereusWB922"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":172,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":173,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":175,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":176,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":177,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":178,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":179,"author":{"gitId":"-"},"content":"});"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_ASSIGNEES \u003d new GithubIssue({"},{"lineNumber":182,"author":{"gitId":"-"},"content":" id: \u0027551732011\u0027,"},{"lineNumber":183,"author":{"gitId":"-"},"content":" number: 91,"},{"lineNumber":184,"author":{"gitId":"NereusWB922"},"content":" assignees: [USER_ANUBHAV_DETAILS],"},{"lineNumber":185,"author":{"gitId":"-"},"content":" body: \u0027Screen freezes every few minutes\u0027,"},{"lineNumber":186,"author":{"gitId":"-"},"content":" created_at: \u00272020-01-18T07:01:45Z\u0027,"},{"lineNumber":187,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":188,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":190,"author":{"gitId":"-"},"content":" title: \u0027Screen freezes\u0027,"},{"lineNumber":191,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-02T12:50:02Z\u0027,"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":" closed_at: \u0027\u0027,"},{"lineNumber":193,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/91\u0027,"},{"lineNumber":194,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" milestone: MILESTONE_ONE,"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" comments: [EMPTY_TEAM_RESPONSE],"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":" issueOrPr: \u0027Issue\u0027,"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" isDraft: false"},{"lineNumber":199,"author":{"gitId":"-"},"content":"});"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":"export const generateIssueWithRandomData: () \u003d\u003e GithubIssue \u003d () \u003d\u003e {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" const created_and_updated_date: string \u003d randomISODate();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" const issueNumber: number \u003d randomIssueNumber();"},{"lineNumber":204,"author":{"gitId":"-"},"content":" const severityLabels: GithubLabel[] \u003d [GITHUB_LABEL_LOW_SEVERITY, GITHUB_LABEL_MEDIUM_SEVERITY, GITHUB_LABEL_HIGH_SEVERITY];"},{"lineNumber":205,"author":{"gitId":"-"},"content":" const typeLabels: GithubLabel[] \u003d [GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_DOCUMENTATION_BUG];"},{"lineNumber":206,"author":{"gitId":"-"},"content":" return new GithubIssue({"},{"lineNumber":207,"author":{"gitId":"-"},"content":" id: randomId(),"},{"lineNumber":208,"author":{"gitId":"-"},"content":" number: issueNumber,"},{"lineNumber":209,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":210,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":211,"author":{"gitId":"-"},"content":" body: `Issue No.: ${issueNumber}\\nSample Content.`,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" created_at: created_and_updated_date,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, typeLabels[issueNumber % 3], severityLabels[issueNumber % 3]],"},{"lineNumber":214,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":215,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":216,"author":{"gitId":"-"},"content":" title: `Random Issue: ${issueNumber}`,"},{"lineNumber":217,"author":{"gitId":"-"},"content":" updated_at: created_and_updated_date,"},{"lineNumber":218,"author":{"gitId":"-"},"content":" url: `https://api.github.com/repos/CATcher-org/pe-results/issues/${issueNumber}`,"},{"lineNumber":219,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":220,"author":{"gitId":"-"},"content":" });"},{"lineNumber":221,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":99,"-":122}},{"path":"tests/constants/githublabel.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FUNCTIONALITY_BUG \u003d {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" color: \u00279900cc\u0027,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FunctionalityBug\u0027"},{"lineNumber":6,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FEATURE_FLAW \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FeatureFlaw\u0027"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_DOCUMENTATION_BUG \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.DocumentationBug\u0027"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_LOW_SEVERITY \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ffcccc\u0027,"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Low\u0027"},{"lineNumber":21,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_HIGH_SEVERITY \u003d {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ff6666\u0027,"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.High\u0027"},{"lineNumber":26,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_MEDIUM_SEVERITY \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color: \u0027ff9999\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Medium\u0027"},{"lineNumber":31,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TUTORIAL_LABEL \u003d {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" color: \u0027c2e0c6\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" name: \u0027tutorial.CS2103T-W12\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TEAM_LABEL \u003d {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d4c5f9\u0027,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" name: \u0027team.3\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":"} as GithubLabel;"}],"authorContributionMap":{"NereusWB922":13,"-":28}},{"path":"tests/constants/label.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { SimpleLabel } from \u0027../../src/app/core/models/label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"// Label name constants"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_VERY_LOW \u003d \u0027veryLow\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_LOW \u003d \u0027low\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_MEDIUM \u003d \u0027medium\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_HIGH \u003d \u0027high\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"// Label category constants"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"export const CATEGORY_SEVERITY \u003d \u0027severity\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"// Label name constants"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_VERY_LOW \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_VERY_LOW;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_LOW \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_LOW;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_MEDIUM \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_MEDIUM;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"export const LABEL_NAME_SEVERITY_HIGH \u003d CATEGORY_SEVERITY + \u0027.\u0027 + SEVERITY_HIGH;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"// Label definition constants"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_VERY_LOW \u003d"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that is \u003cmark\u003epurely cosmetic\u003c/mark\u003e and \u003cmark\u003edoes not affect usage\u003c/mark\u003e. For example, \u0027 +"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cul\u003e\u0027 +"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003etypo issues\u003c/li\u003e\u0027 +"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003espacing issues\u003c/li\u003e\u0027 +"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003elayout issues\u003c/li\u003e\u0027 +"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003ecolor issues\u003c/li\u003e\u0027 +"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cli\u003efont issues\u003c/li\u003e\u0027 +"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003c/ul\u003e\u0027 +"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \"in the docs or the UI that doesn\u0027t affect usage.\u003c/p\u003e\";"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_LOW \u003d"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that is unlikely to affect normal operations of the product. \u0027 +"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" \u0027Appears only in very rare situations and causes a minor inconvenience only.\u003c/p\u003e\u0027;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_MEDIUM \u003d"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that causes occasional inconvenience to some users but they can \u0027 + \u0027continue to use the product.\u003c/p\u003e\u0027;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":"export const DEFINITION_SEVERITY_HIGH \u003d"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" \u0027\u003cp\u003eA flaw that affects most users and causes major problems for users.\u0027 + \u0027i.e., makes the product almost unusable for most users.\u003c/p\u003e\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":"// Label color constants"},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const COLOR_BLACK \u003d \u0027000000\u0027;"},{"lineNumber":39,"author":{"gitId":"-"},"content":"export const COLOR_WHITE \u003d \u0027ffffff\u0027;"},{"lineNumber":40,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_VERY_LOW \u003d \u0027ffe0e0\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_LOW \u003d \u0027ffcccc\u0027;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_MEDIUM \u003d \u0027ff9999\u0027;"},{"lineNumber":43,"author":{"gitId":"-"},"content":"export const COLOR_SEVERITY_HIGH \u003d \u0027ff6666\u0027;"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":"// CSS style constants"},{"lineNumber":46,"author":{"gitId":"-"},"content":"export const DARK_BG_LIGHT_TEXT \u003d {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${COLOR_BLACK}`,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" color: `#${COLOR_WHITE}`"},{"lineNumber":49,"author":{"gitId":"-"},"content":"};"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":"export const LIGHT_BG_DARK_TEXT \u003d {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u0027background-color\u0027: `#${COLOR_WHITE}`,"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: `#${COLOR_BLACK}`"},{"lineNumber":54,"author":{"gitId":"-"},"content":"};"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_LABELS \u003d ["},{"lineNumber":57,"author":{"gitId":"-"},"content":" {"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_VERY_LOW,"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_VERY_LOW,"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_VERY_LOW"},{"lineNumber":61,"author":{"gitId":"-"},"content":" },"},{"lineNumber":62,"author":{"gitId":"-"},"content":" {"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_LOW,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" color: COLOR_SEVERITY_LOW,"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_LOW"},{"lineNumber":66,"author":{"gitId":"-"},"content":" },"},{"lineNumber":67,"author":{"gitId":"-"},"content":" {"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_MEDIUM,"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_MEDIUM,"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_MEDIUM"},{"lineNumber":71,"author":{"gitId":"-"},"content":" },"},{"lineNumber":72,"author":{"gitId":"-"},"content":" {"},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" name: LABEL_NAME_SEVERITY_HIGH,"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" color: COLOR_SEVERITY_HIGH,"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" definition: DEFINITION_SEVERITY_HIGH"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":"];"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":"export const SEVERITY_SIMPLE_LABELS: SimpleLabel[] \u003d SEVERITY_LABELS.map((label) \u003d\u003e ({"},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" name: label.name,"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" color: label.color"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"}));"}],"authorContributionMap":{"NereusWB922":49,"-":33}},{"path":"tests/constants/session.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { SessionData, SessionRepo } from \u0027../../src/app/core/models/session.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../src/app/core/models/view.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const WATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/WATcher\u0027);"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"export const CATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/CATcher\u0027);"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"const ISSUES_VIEWER_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" view: View.issuesViewer,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":11,"author":{"gitId":"-"},"content":"};"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"const ACTIVITY_DASHBOARD_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" view: View.activityDashboard,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":16,"author":{"gitId":"-"},"content":"};"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"export const VALID_SESSION_DATA: SessionData \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" sessionRepo: [ISSUES_VIEWER_SESSION_REPO, ACTIVITY_DASHBOARD_SESSION_REPO]"},{"lineNumber":20,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":13,"-":7}},{"path":"tests/model/issue.model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { Milestone } from \u0027../../src/app/core/models/milestone.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_ANUBHAV } from \u0027../constants/data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITHOUT_MILESTONE,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" MILESTONE_ONE"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../constants/githublabel.constants\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"describe(\u0027Issue model class\u0027, () \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" describe(\u0027.createPhaseBugReportIssue(githubIssue)\u0027, () \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should correctly create a issue that has an empty description\u0027, async () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" expect(issue.globalId).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.id);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(issue.id).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.number);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" expect(issue.created_at).toEqual(moment(ISSUE_WITH_EMPTY_DESCRIPTION.created_at).format(\u0027lll\u0027));"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" expect(issue.title).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.title);"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" expect(issue.description).toEqual(\u0027No details provided by bug reporter.\u0027);"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" expect(issue.updated_at).toEqual(moment(ISSUE_WITH_EMPTY_DESCRIPTION.updated_at).format(\u0027lll\u0027));"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" expect(issue.closed_at).toEqual(\u0027Invalid date\u0027);"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" expect(issue.milestone).toEqual(new Milestone(MILESTONE_ONE));"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" expect(issue.state).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.state);"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" expect(issue.stateReason).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.stateReason);"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" expect(issue.issueOrPr).toEqual(\u0027Issue\u0027);"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" expect(issue.author).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.user.login);"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" expect(issue.isDraft).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.isDraft);"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" expect(issue.assignees).toEqual([]);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(issue.labels).toEqual(["},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TEAM_LABEL.name,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_TUTORIAL_LABEL.name,"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG.name,"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY.name"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(issue.githubLabels).toEqual(ISSUE_WITH_EMPTY_DESCRIPTION.labels);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set close date correctly for closed issue\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" expect(issue.closed_at).toEqual(moment(CLOSED_ISSUE_WITH_EMPTY_DESCRIPTION.closed_at).format(\u0027lll\u0027));"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set milestone to default milestone for issue without milestone\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITHOUT_MILESTONE);"},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" expect(issue.milestone).toEqual(Milestone.IssueWithoutMilestone);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" });"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set assignees correctly for issue with assignees\u0027, () \u003d\u003e {"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" const issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" expect(issue.assignees).toEqual([USER_ANUBHAV.loginId]);"},{"lineNumber":63,"author":{"gitId":"-"},"content":" });"},{"lineNumber":64,"author":{"gitId":"-"},"content":" });"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027.updateDescription(description)\u0027, () \u003d\u003e {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" it(\u0027correctly clean strings obtained from users\u0027, () \u003d\u003e {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" const noDetailsFromBugReporter \u003d \u0027No details provided by bug reporter.\u0027;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(\u0027\u0027)).toBe(noDetailsFromBugReporter);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(null)).toBe(noDetailsFromBugReporter);"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" const typicalDescription \u003d \u0027The app crashes after parsing config files.\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(typicalDescription)).toBe(typicalDescription + \u0027\\n\\n\u0027);"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" const inputWithSpecialChars \u003d \u0027$%^!@\u0026-_test\u0027;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" expect(Issue.updateDescription(inputWithSpecialChars)).toBe(inputWithSpecialChars + \u0027\\n\\n\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":"});"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":"describe(\u0027Issue\u0027, () \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" const dummyIssue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":83,"author":{"gitId":"-"},"content":" const otherDummyIssue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" const noReportedDescriptionString \u003d \u0027No details provided by bug reporter.\\n\u0027;"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" it(\u0027.createGithubIssueDescription() forms the correct GitHub Issue description for the issue\u0027, () \u003d\u003e {"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" expect(dummyIssue.createGithubIssueDescription()).toEqual(noReportedDescriptionString);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" expect(otherDummyIssue.createGithubIssueDescription()).toEqual(`${otherDummyIssue.description}\\n`);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" });"},{"lineNumber":92,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":57,"MadLamprey":1,"-":34}},{"path":"tests/services/error-handling.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { ErrorHandlingService } from \u0027../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { FormErrorComponent } from \u0027../../src/app/shared/error-toasters/form-error/form-error.component\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { GeneralMessageErrorComponent } from \u0027../../src/app/shared/error-toasters/general-message-error/general-message-error.component\u0027;"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":" ERROR_WITH_NO_MESSAGE,"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":" HTTP_304_ERROR,"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" HTTP_400_ERROR,"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" HTTP_401_ERROR,"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" HTTP_404_ERROR,"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" HTTP_422_ERROR,"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" HTTP_500_ERROR,"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" HTTP_UNKNOWN_ERROR,"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" OCTOKIT_REQUEST_ERROR,"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" STANDARD_ERROR"},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":"} from \u0027../constants/error.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":"let errorHandlingService: ErrorHandlingService;"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":"let mockLoggingService;"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":"let mockSnackBar;"},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":"describe(\u0027ErrorHandlingService\u0027, () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" mockLoggingService \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027error\u0027, \u0027debug\u0027]);"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":" mockSnackBar \u003d jasmine.createSpyObj(\u0027MatSnackBar\u0027, [\u0027openFromComponent\u0027]);"},{"lineNumber":25,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService \u003d new ErrorHandlingService(mockSnackBar, mockLoggingService);"},{"lineNumber":26,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":27,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":28,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027ErrorHandlingService: handleError()\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should log errors when handling errors\u0027, () \u003d\u003e {"},{"lineNumber":30,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(STANDARD_ERROR);"},{"lineNumber":31,"author":{"gitId":"MadLamprey"},"content":" expect(mockLoggingService.error).toHaveBeenCalledWith(STANDARD_ERROR);"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":33,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":34,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the GeneralMessageErrorComponent when handling Errors\u0027, () \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(STANDARD_ERROR);"},{"lineNumber":36,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, {"},{"lineNumber":37,"author":{"gitId":"MadLamprey"},"content":" data: { message: STANDARD_ERROR.message }"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should stringify Errors if there is no message before displaying\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(ERROR_WITH_NO_MESSAGE);"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, {"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" data: { message: JSON.stringify(ERROR_WITH_NO_MESSAGE) }"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should not open the snackbar when handling http status 304 errors\u0027, () \u003d\u003e {"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_304_ERROR);"},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).not.toHaveBeenCalled();"},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the FormErrorComponent when handling http status 422 errors\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_422_ERROR);"},{"lineNumber":55,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(FormErrorComponent, { data: HTTP_422_ERROR });"},{"lineNumber":56,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":57,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":58,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should use the GeneralMessageErrorComponent when handling other http errors\u0027, () \u003d\u003e {"},{"lineNumber":59,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_500_ERROR);"},{"lineNumber":60,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_500_ERROR });"},{"lineNumber":61,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_400_ERROR);"},{"lineNumber":62,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_400_ERROR });"},{"lineNumber":63,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_401_ERROR);"},{"lineNumber":64,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_401_ERROR });"},{"lineNumber":65,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_404_ERROR);"},{"lineNumber":66,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_404_ERROR });"},{"lineNumber":67,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(HTTP_UNKNOWN_ERROR);"},{"lineNumber":68,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: HTTP_UNKNOWN_ERROR });"},{"lineNumber":69,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledTimes(5);"},{"lineNumber":70,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":71,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":72,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should treat octokit request errors as http errors\u0027, () \u003d\u003e {"},{"lineNumber":73,"author":{"gitId":"MadLamprey"},"content":" errorHandlingService.handleError(OCTOKIT_REQUEST_ERROR);"},{"lineNumber":74,"author":{"gitId":"MadLamprey"},"content":" expect(mockSnackBar.openFromComponent).toHaveBeenCalledWith(GeneralMessageErrorComponent, { data: OCTOKIT_REQUEST_ERROR });"},{"lineNumber":75,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":76,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":77,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":77}},{"path":"tests/services/label.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Label } from \u0027../../src/app/core/models/label.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { LabelService } from \u0027../../src/app/core/services/label.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import * as LabelConstant from \u0027../constants/label.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"let labelService: LabelService;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"let labelList: Label[];"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027LabelService: fetchLabels()\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAllLabels\u0027]);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" labelService \u003d new LabelService(githubServiceSpy);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" });"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should fetch labels successfully\u0027, () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mockLabels \u003d LabelConstant.SEVERITY_LABELS;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const parsedLabels \u003d labelService.parseLabelData(mockLabels);"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.fetchAllLabels.and.returnValue(of(mockLabels));"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" labelService.fetchLabels().subscribe((response) \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" expect(response).toEqual(mockLabels);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(labelService.labels).toEqual(parsedLabels);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" expect(labelService.simpleLabels).toEqual(parsedLabels);"},{"lineNumber":27,"author":{"gitId":"-"},"content":" });"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" expect(githubServiceSpy.fetchAllLabels).toHaveBeenCalled();"},{"lineNumber":30,"author":{"gitId":"-"},"content":" });"},{"lineNumber":31,"author":{"gitId":"-"},"content":"});"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: parseLabelData()\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" beforeAll(() \u003d\u003e {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" labelList \u003d labelService.parseLabelData(LabelConstant.SEVERITY_LABELS);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" afterAll(() \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity very low label\u0027, () \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_VERY_LOW);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].color).toBe(LabelConstant.COLOR_SEVERITY_VERY_LOW);"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[0].definition).toBe(LabelConstant.DEFINITION_SEVERITY_VERY_LOW);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" });"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity low label\u0027, () \u003d\u003e {"},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_LOW);"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].color).toBe(LabelConstant.COLOR_SEVERITY_LOW);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[1].definition).toBe(LabelConstant.DEFINITION_SEVERITY_LOW);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity medium label\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_MEDIUM);"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].color).toBe(LabelConstant.COLOR_SEVERITY_MEDIUM);"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[2].definition).toBe(LabelConstant.DEFINITION_SEVERITY_MEDIUM);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should be severity high label\u0027, () \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].name).toBe(LabelConstant.LABEL_NAME_SEVERITY_HIGH);"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].color).toBe(LabelConstant.COLOR_SEVERITY_HIGH);"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" expect(labelList[3].definition).toBe(LabelConstant.DEFINITION_SEVERITY_HIGH);"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"-"},"content":"});"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: isDarkColor()\u0027, () \u003d\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" afterEach(() \u003d\u003e {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" });"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" it(\u0027should be true for dark color\u0027, () \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" expect(labelService.isDarkColor(LabelConstant.COLOR_BLACK)).toBeTruthy();"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" it(\u0027should be false for light color\u0027, () \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" expect(labelService.isDarkColor(LabelConstant.COLOR_WHITE)).toBeFalsy();"},{"lineNumber":83,"author":{"gitId":"-"},"content":" });"},{"lineNumber":84,"author":{"gitId":"-"},"content":"});"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":"describe(\u0027LabelService: setLabelStyle()\u0027, () \u003d\u003e {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" labelService \u003d new LabelService(null);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" });"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" afterEach(() \u003d\u003e {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" labelService \u003d null;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" });"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" it(\u0027should be dark color background with light color text\u0027, () \u003d\u003e {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" expect(labelService.setLabelStyle(LabelConstant.COLOR_BLACK)).toEqual(LabelConstant.DARK_BG_LIGHT_TEXT);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" });"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" it(\u0027should be light color background with dark color text\u0027, () \u003d\u003e {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" expect(labelService.setLabelStyle(LabelConstant.COLOR_WHITE)).toEqual(LabelConstant.LIGHT_BG_DARK_TEXT);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":34,"-":68}},{"path":"tests/services/milestone.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":"import { Milestone } from \u0027../../src/app/core/models/milestone.model\u0027;"},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":"import { MilestoneService } from \u0027../../src/app/core/services/milestone.service\u0027;"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":"let milestoneService: MilestoneService;"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"describe(\u0027MilestoneService\u0027, () \u003d\u003e {"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAllMilestones\u0027]);"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" milestoneService \u003d new MilestoneService(githubServiceSpy);"},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":15,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027MilestoneService: fetchMilestones()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should fetch all milestones\u0027, (done) \u003d\u003e {"},{"lineNumber":17,"author":{"gitId":"MadLamprey"},"content":" const mockMilestones \u003d [{ title: \u0027Milestone 1\u0027 }, { title: \u0027Milestone 2\u0027 }];"},{"lineNumber":18,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy.fetchAllMilestones.and.returnValue(of(mockMilestones));"},{"lineNumber":19,"author":{"gitId":"MadLamprey"},"content":" milestoneService.fetchMilestones().subscribe((response) \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"MadLamprey"},"content":" expect(githubServiceSpy.fetchAllMilestones).toHaveBeenCalled();"},{"lineNumber":21,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones.length).toBe(2);"},{"lineNumber":22,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones[0].title).toBe(\u0027Milestone 1\u0027);"},{"lineNumber":23,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.hasNoMilestones).toBeFalse();"},{"lineNumber":24,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":25,"author":{"gitId":"MadLamprey"},"content":" done();"},{"lineNumber":26,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":27,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":28,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":29,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should handle no milestones\u0027, (done) \u003d\u003e {"},{"lineNumber":30,"author":{"gitId":"MadLamprey"},"content":" githubServiceSpy.fetchAllMilestones.and.returnValue(of([]));"},{"lineNumber":31,"author":{"gitId":"MadLamprey"},"content":" milestoneService.fetchMilestones().subscribe((response) \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" expect(githubServiceSpy.fetchAllMilestones).toHaveBeenCalled();"},{"lineNumber":33,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.milestones.length).toBe(0);"},{"lineNumber":34,"author":{"gitId":"MadLamprey"},"content":" expect(milestoneService.hasNoMilestones).toBeTrue();"},{"lineNumber":35,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":36,"author":{"gitId":"MadLamprey"},"content":" done();"},{"lineNumber":37,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":38,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":39,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":40,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":41,"author":{"gitId":"MadLamprey"},"content":" describe(\u0027MilestoneService: parseMilestoneData()\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"MadLamprey"},"content":" it(\u0027should parse milestone data correctly\u0027, () \u003d\u003e {"},{"lineNumber":43,"author":{"gitId":"MadLamprey"},"content":" const mockMilestones \u003d [{ title: \u0027Milestone 2\u0027 }, { title: \u0027Milestone 1\u0027 }];"},{"lineNumber":44,"author":{"gitId":"MadLamprey"},"content":" const parsedMilestones \u003d milestoneService.parseMilestoneData(mockMilestones);"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":46,"author":{"gitId":"MadLamprey"},"content":" for (const milestone of parsedMilestones) {"},{"lineNumber":47,"author":{"gitId":"MadLamprey"},"content":" expect(milestone).toBeInstanceOf(Milestone);"},{"lineNumber":48,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":49,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":50,"author":{"gitId":"MadLamprey"},"content":" expect(parsedMilestones.length).toBe(2);"},{"lineNumber":51,"author":{"gitId":"MadLamprey"},"content":" expect(parsedMilestones[0].title).toBe(\u0027Milestone 1\u0027);"},{"lineNumber":52,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":53,"author":{"gitId":"MadLamprey"},"content":" });"},{"lineNumber":54,"author":{"gitId":"MadLamprey"},"content":"});"}],"authorContributionMap":{"MadLamprey":54}},{"path":"tests/services/user.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../src/app/core/services/logging.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../src/app/core/services/user.service\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { USER_JUNWEI } from \u0027../constants/data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"let userService: UserService;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"describe(\u0027UserService\u0027, () \u003d\u003e {"},{"lineNumber":11,"author":{"gitId":"-"},"content":" beforeAll(() \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027fetchAuthenticatedUser\u0027]);"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" userService \u003d new UserService(githubServiceSpy, loggingServiceSpy);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" });"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027createUserModel(loginId)\u0027, () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should create a user correctly\u0027, async () \u003d\u003e {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const createdUser \u003d await userService.createUserModel(USER_JUNWEI.loginId).toPromise();"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" expect(createdUser).toEqual(USER_JUNWEI);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":" });"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027reset()\u0027, () \u003d\u003e {"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set current user as undefined\u0027, async () \u003d\u003e {"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" await userService.createUserModel(USER_JUNWEI.loginId).toPromise();"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" expect(userService.currentUser).toEqual(USER_JUNWEI);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" userService.reset();"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027UserService: Clearing current user\u0027);"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" expect(userService.currentUser).toEqual(undefined);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" });"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":20,"-":15}},{"path":"tests/services/view.service.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { ActivatedRoute, Router } from \u0027@angular/router\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { STORAGE_KEYS } from \u0027../../src/app/core/constants/storage-keys.constants\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"import { View } from \u0027../../src/app/core/models/view.model\u0027;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"import { ErrorMessageService } from \u0027../../src/app/core/services/error-message.service\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { GithubService } from \u0027../../src/app/core/services/github.service\u0027;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"import { LoggingService } from \u0027../../src/app/core/services/logging.service\u0027;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"import { RepoUrlCacheService } from \u0027../../src/app/core/services/repo-url-cache.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { ViewService } from \u0027../../src/app/core/services/view.service\u0027;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"import { CATCHER_REPO, WATCHER_REPO } from \u0027../constants/session.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"let viewService: ViewService;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"let githubServiceSpy: jasmine.SpyObj\u003cGithubService\u003e;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"let repoUrlCacheServiceSpy: jasmine.SpyObj\u003cRepoUrlCacheService\u003e;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"let routerSpy: jasmine.SpyObj\u003cRouter\u003e;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":"let activatedRouteSpy: jasmine.SpyObj\u003cActivatedRoute\u003e;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"describe(\u0027ViewService\u0027, () \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy \u003d jasmine.createSpyObj(\u0027GithubService\u0027, [\u0027isRepositoryPresent\u0027, \u0027storeViewDetails\u0027]);"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" activatedRouteSpy \u003d jasmine.createSpyObj(\u0027ActivatedRoute\u0027, [\u0027snapshot\u0027]);"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" routerSpy \u003d jasmine.createSpyObj(\u0027Router\u0027, [\u0027navigate\u0027]);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" repoUrlCacheServiceSpy \u003d jasmine.createSpyObj(\u0027RepoUrlCacheService\u0027, [\u0027cache\u0027]);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" viewService \u003d new ViewService(githubServiceSpy, repoUrlCacheServiceSpy, loggingServiceSpy, activatedRouteSpy, routerSpy);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" });"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027setRepository(Repo, Repo[])\u0027, () \u003d\u003e {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set the current repositories and update session data\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" const repos: Repo[] \u003d [CATCHER_REPO];"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO, repos);"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.otherRepos).toEqual(repos);"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" const currentSessionRepo \u003d viewService.sessionData.sessionRepo.find((x) \u003d\u003e x.view \u003d\u003d\u003d viewService.currentView);"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" expect(currentSessionRepo?.repos).toEqual([WATCHER_REPO, CATCHER_REPO]);"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should store view details via githubService and update localStorage\u0027, () \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" const localStorageSetItem \u003d spyOn(localStorage, \u0027setItem\u0027);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" expect(githubServiceSpy.storeViewDetails).toHaveBeenCalledWith(WATCHER_REPO.owner, WATCHER_REPO.name);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItem).toHaveBeenCalledWith(\u0027sessionData\u0027, JSON.stringify(viewService.sessionData));"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should navigate to the new repository\u0027, () \u003d\u003e {"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":60,"author":{"gitId":"-"},"content":" });"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027changeRepositoryIfValid(Repo)\u0027, () \u003d\u003e {"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set isChangingRepo to true at the start and false at the end\u0027, async () \u003d\u003e {"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const isChangingRepoNextSpy \u003d spyOn(viewService.isChangingRepo, \u0027next\u0027);"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":" spyOn(viewService, \u0027setRepository\u0027);"},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" await viewService.changeRepositoryIfValid(WATCHER_REPO);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" expect(isChangingRepoNextSpy.calls.first().args[0]).toBe(true);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(isChangingRepoNextSpy.calls.mostRecent().args[0]).toBe(false);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" });"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error if repository is not valid\u0027, async () \u003d\u003e {"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(false));"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":" await expectAsync(viewService.changeRepositoryIfValid(WATCHER_REPO)).toBeRejectedWithError("},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" ErrorMessageService.repositoryNotPresentMessage()"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" );"},{"lineNumber":82,"author":{"gitId":"-"},"content":" });"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set and navigate to new repo if repo is valid\u0027, async () \u003d\u003e {"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" const repoChanged$Spy \u003d spyOn(viewService.repoChanged$, \u0027next\u0027);"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" await viewService.changeRepositoryIfValid(WATCHER_REPO);"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(`ViewService: Changing current repository to \u0027${WATCHER_REPO}\u0027`);"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" expect(repoUrlCacheServiceSpy.cache).toHaveBeenCalledWith(WATCHER_REPO.toString());"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" expect(repoChanged$Spy).toHaveBeenCalledWith(WATCHER_REPO);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" });"},{"lineNumber":100,"author":{"gitId":"-"},"content":" });"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027initializeCurrentRepository()\u0027, () \u003d\u003e {"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" const org \u003d WATCHER_REPO.owner;"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" const repoName \u003d WATCHER_REPO.name;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" const localStorageGetItemSpy \u003d spyOn(window.localStorage, \u0027getItem\u0027);"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" localStorageGetItemSpy.withArgs(STORAGE_KEYS.ORG).and.returnValue(org);"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" localStorageGetItemSpy.withArgs(STORAGE_KEYS.DATA_REPO).and.returnValue(repoName);"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set and navigate to new repo if repo is valid\u0027, async () \u003d\u003e {"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(true));"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":" const repoSetSourceNext \u003d spyOn(viewService.repoSetSource, \u0027next\u0027);"},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" await viewService.initializeCurrentRepository();"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(`ViewService: Repo is ${WATCHER_REPO}`);"},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentRepo).toEqual(WATCHER_REPO);"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" expect(routerSpy.navigate).toHaveBeenCalledWith([\u0027issuesViewer\u0027], {"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" queryParams: { repo: WATCHER_REPO.toString() },"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" queryParamsHandling: \u0027merge\u0027"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" expect(repoSetSourceNext).toHaveBeenCalledWith(true);"},{"lineNumber":126,"author":{"gitId":"-"},"content":" });"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error if repository is invalid\u0027, async () \u003d\u003e {"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" githubServiceSpy.isRepositoryPresent.and.returnValue(of(false));"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":" await expectAsync(viewService.initializeCurrentRepository()).toBeRejectedWithError(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027changeView(View)\u0027, () \u003d\u003e {"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set current view\u0027, () \u003d\u003e {"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" viewService.setRepository(WATCHER_REPO);"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toEqual(View.issuesViewer);"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" viewService.changeView(View.activityDashboard);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":143,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toEqual(View.activityDashboard);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" });"},{"lineNumber":145,"author":{"gitId":"-"},"content":" });"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" describe(\u0027.reset()\u0027, () \u003d\u003e {"},{"lineNumber":148,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should reset the currentView of the ViewService\u0027, () \u003d\u003e {"},{"lineNumber":149,"author":{"gitId":"NereusWB922"},"content":" viewService.currentView \u003d View.activityDashboard;"},{"lineNumber":150,"author":{"gitId":"NereusWB922"},"content":" viewService.reset();"},{"lineNumber":151,"author":{"gitId":"NereusWB922"},"content":" expect(viewService.currentView).toBe(View.issuesViewer);"},{"lineNumber":152,"author":{"gitId":"-"},"content":" });"},{"lineNumber":153,"author":{"gitId":"-"},"content":" });"},{"lineNumber":154,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":155,"author":{"gitId":"NereusWB922"},"content":" describe(\u0027setupFromUrl(url)\u0027, () \u003d\u003e {"},{"lineNumber":156,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should set items in local storage if url is valid\u0027, async () \u003d\u003e {"},{"lineNumber":157,"author":{"gitId":"NereusWB922"},"content":" const validUrl \u003d `/issuesViewer?repo\u003d${WATCHER_REPO.owner}%2F${WATCHER_REPO.name}`;"},{"lineNumber":158,"author":{"gitId":"NereusWB922"},"content":" const localStorageSetItemSpy \u003d spyOn(window.localStorage, \u0027setItem\u0027);"},{"lineNumber":159,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":160,"author":{"gitId":"NereusWB922"},"content":" await viewService.setupFromUrl(validUrl).toPromise();"},{"lineNumber":161,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":162,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItemSpy).toHaveBeenCalledWith(STORAGE_KEYS.ORG, WATCHER_REPO.owner);"},{"lineNumber":163,"author":{"gitId":"NereusWB922"},"content":" expect(localStorageSetItemSpy).toHaveBeenCalledWith(STORAGE_KEYS.DATA_REPO, WATCHER_REPO.name);"},{"lineNumber":164,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":165,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":166,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for url without repo paramater\u0027, (done) \u003d\u003e {"},{"lineNumber":167,"author":{"gitId":"NereusWB922"},"content":" const urlWithoutRepo \u003d \u0027/issuesViewer\u0027;"},{"lineNumber":168,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":169,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(urlWithoutRepo).subscribe({"},{"lineNumber":170,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.invalidUrlMessage()));"},{"lineNumber":172,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":173,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":174,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":175,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":176,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":177,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for empty url\u0027, (done) \u003d\u003e {"},{"lineNumber":178,"author":{"gitId":"NereusWB922"},"content":" const emptyUrl \u003d \u0027\u0027;"},{"lineNumber":179,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":180,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(emptyUrl).subscribe({"},{"lineNumber":181,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":182,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.invalidUrlMessage()));"},{"lineNumber":183,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":184,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":185,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":186,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":187,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":188,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error for url with invalid repo format\u0027, (done) \u003d\u003e {"},{"lineNumber":189,"author":{"gitId":"NereusWB922"},"content":" const urlWithInvalidRepoFormat \u003d \u0027/issuesViewer?repo\u003dInvalidRepo\u0027;"},{"lineNumber":190,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":191,"author":{"gitId":"NereusWB922"},"content":" viewService.setupFromUrl(urlWithInvalidRepoFormat).subscribe({"},{"lineNumber":192,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e {"},{"lineNumber":193,"author":{"gitId":"NereusWB922"},"content":" expect(err).toEqual(new Error(ErrorMessageService.repositoryNotPresentMessage()));"},{"lineNumber":194,"author":{"gitId":"NereusWB922"},"content":" done();"},{"lineNumber":195,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":196,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":197,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":198,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":199,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":175,"-":24}}] diff --git a/CATcher-org_WATcher_main/commits.json b/CATcher-org_WATcher_main/commits.json index 5c72e55..e24b0d5 100644 --- a/CATcher-org_WATcher_main/commits.json +++ b/CATcher-org_WATcher_main/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-02-06","commitResults":[{"hash":"043311b90c12118a4d9d8468a64e1fc7021ad64d","isMergeCommit":false,"messageTitle":"Fix label filter not working (#230)","messageBody":"Fix label filter not working\r\n\r\nFilters takes the value of `label.formattedName` instead of `label.name`.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":5}}}]},{"date":"2024-02-13","commitResults":[{"hash":"64a68624b77c88cee70cd870e2966c1c27b89eb8","isMergeCommit":false,"messageTitle":"Add column of hidden users (#235)","messageBody":"After #192, assignees of a repo without any issues or PRs\r\nare hidden. Now, add the column to display such users\r\nwith 0 PRs and issues.\r\n\r\nCo-authored-by: Gabriel Goh \u003c77230723+gycgabriel@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"css":{"insertions":82,"deletions":0},"html":{"insertions":24,"deletions":0},"ts":{"insertions":44,"deletions":2}}}]},{"date":"2024-02-19","commitResults":[{"hash":"d6dadf4a49a6fc19e2eaa99bb37c7fe89f458a81","isMergeCommit":false,"messageTitle":"Refactor Label model (#254)","messageBody":"Previously, label full names are separated into label name\r\nand label category. However, this is not necessary for WATcher.\r\n\r\nLet\u0027s remove the separation so that filters only make use\r\nof the full name.","fileTypesAndContributionMap":{"html":{"insertions":6,"deletions":14},"ts":{"insertions":6,"deletions":14}}}]},{"date":"2024-02-26","commitResults":[{"hash":"3db1c8aa33942114acfd55af87da3d7c8d751390","isMergeCommit":false,"messageTitle":"Add shareable repo-specific URL (#255)","messageBody":"Previously, URLs are fixed upon repo change, hence URLs are not shareable.\r\n\r\nLet\u0027s make the current repo visible in the URL, so that it shareable.\r\n\r\nFurthermore, login is automated when there is such next route to be redirected to.","fileTypesAndContributionMap":{"ts":{"insertions":163,"deletions":9}}}]},{"date":"2024-03-21","commitResults":[{"hash":"6fb348ea31d05320af1ecc2e7c83dcfecf95e2f7","isMergeCommit":false,"messageTitle":"Hide redundant column pagination (#309)","messageBody":"Column pagination arrows cause unnecessary clogs\r\nif they are disabled.\r\n\r\nWe hide arrows on columns that only has one page.","fileTypesAndContributionMap":{"css":{"insertions":12,"deletions":0},"html":{"insertions":6,"deletions":1},"ts":{"insertions":8,"deletions":2}}}]},{"date":"2024-03-22","commitResults":[{"hash":"e3d4a3464879414ab4724dde0f9b4cc24aebf7df","isMergeCommit":false,"messageTitle":"Three-state labels (#282)","messageBody":"Previously, each label only has 2 states, either selected or\r\nnot selected. However, with such design,\r\nthe feature of hiding labels can be confused\r\nwith hiding issues/PRs with the label.\r\n\r\nWe implement the three-state label filters,\r\nso that each label can also be used to hide\r\nissues/PRs with the label.","fileTypesAndContributionMap":{"css":{"insertions":20,"deletions":5},"html":{"insertions":22,"deletions":26},"ts":{"insertions":48,"deletions":36}}}]},{"date":"2024-03-25","commitResults":[{"hash":"a65bb59578c4157be05f3c38fd712e411e43a155","isMergeCommit":false,"messageTitle":"Status filter checkboxes (#310)","messageBody":"We implement checkboxes for status, so that\r\nmultiple types of PRs/issues can be viewed concurrently.","fileTypesAndContributionMap":{"html":{"insertions":6,"deletions":5},"ts":{"insertions":39,"deletions":39}}}]},{"date":"2024-03-29","commitResults":[{"hash":"c3418d8d50071cde7ea19040df0ec411a0f49786","isMergeCommit":false,"messageTitle":"Add preset views (#320)","messageBody":"Currently, there are a lot of options of filters,\r\nbut there are no suggested useful preset views.\r\n\r\nWe add preset views for users to choose from,\r\nand via a button on the header.","fileTypesAndContributionMap":{"html":{"insertions":22,"deletions":2},"ts":{"insertions":156,"deletions":23}}}]},{"date":"2024-03-30","commitResults":[{"hash":"3ce551efd72e12ec9b43698d84e293892d1e4964","isMergeCommit":false,"messageTitle":"Fix for no milestone case (#326)","messageBody":"When there are no milestones in the repo,\r\nthe issue viewer shows nothing.\r\n\r\nChange is made so that if there is no milestone\r\nin the milestone service, do not apply the milestone filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":4}}}]},{"date":"2024-04-01","commitResults":[{"hash":"e7fb0f992c82b05cd5418a1e747351b4a8af254a","isMergeCommit":false,"messageTitle":"Fix preset view selection appearance (#338)","messageBody":"For the preset view selection, brackets are removed\r\nand left margin is added to increase visibility.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":15}}}]}],"Arif-Khalid":[{"date":"2024-01-25","commitResults":[{"hash":"79602d69bd13e2ab8c06ab6d9a6eca8b4a61e8b0","isMergeCommit":false,"messageTitle":"Hide 0 issue columns (#223)","messageBody":"Hide 0 issue columns.\r\n\r\n0 Issue columns are shown.\r\n\r\nHiding issues with 0 columns reduces the clutter on screen, \r\ncreating a better user experience. \r\nIllogical columns such as issues that are unassigned when sorting by\r\npull requests are also removed inherently.\r\n\r\nLet\u0027s add logic to hide the columns when they have no issues \r\nassociated to them.","fileTypesAndContributionMap":{"html":{"insertions":10,"deletions":1},"ts":{"insertions":15,"deletions":2}}}]},{"date":"2024-02-06","commitResults":[{"hash":"cd0d7e9f2a5169307c0c92a89a33e24610381839","isMergeCommit":false,"messageTitle":"Remove unused services (#238)","messageBody":"Couple of unused services copied from CATcher.\r\n\r\nUnused code should be removed to simplify code base \r\nand improve developer experience.\r\n\r\nLet\u0027s remove these unused services.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":359}}}]},{"date":"2024-02-14","commitResults":[{"hash":"5031ee2e33b49d0275892849703b81a1fc028a3d","isMergeCommit":false,"messageTitle":"Remove unused models in WATcher","messageBody":"There are a few of unused models ported from CATcher.\r\n\r\nUnnecessary models contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove these unused models from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":40}}},{"hash":"09ef51d1e360350d0d73a4a66063df59f805d3e2","isMergeCommit":false,"messageTitle":"Remove unused session-fix-confirmation component in WATcher","messageBody":"This is a component only used in CATcher.\r\n\r\nUnnecessary components contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove this unused component from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"css":{"insertions":0,"deletions":0},"html":{"insertions":0,"deletions":9},"ts":{"insertions":1,"deletions":27}}}]},{"date":"2024-02-22","commitResults":[{"hash":"7dbc28230cf4e6d2aa3d95448a0e247b03a5fcee","isMergeCommit":false,"messageTitle":"Refactor certain filters into its own service (#259)","messageBody":"Filters are observed, subscribed and emitted in many different \r\ncomponents.\r\n\r\nThis makes the code base hard to understand\r\nand adapt for filtering in future components.\r\n\r\nLet\u0027s refactor the filters into its own centralised service.","fileTypesAndContributionMap":{"html":{"insertions":3,"deletions":3},"ts":{"insertions":73,"deletions":35}}}]},{"date":"2024-02-28","commitResults":[{"hash":"ad94663e1ac524b83b022a622544181209881c1f","isMergeCommit":false,"messageTitle":"Refactor sorting (#261)","messageBody":"MatSort is passed by reference into IssueDataTables,\r\nlifted up from filter-bar component. Changes to \r\nMatSort are detected and handled in IssueDataTables.\r\n\r\nMatSort reference in IssueDataTables performs the \r\nresponsibility of a dropdown filter outside of the \r\nfilters service.\r\nThis violates good programming practices.\r\n\r\nLet\u0027s refactor the sort filter into the filters service.","fileTypesAndContributionMap":{"html":{"insertions":8,"deletions":5},"ts":{"insertions":19,"deletions":40}}},{"hash":"ac150e0c2c69d668481bd6594339618a59ebde7c","isMergeCommit":false,"messageTitle":"Refactor milestone filters (#264)","messageBody":"","fileTypesAndContributionMap":{"html":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"06260a9f2baada4cff35e536143ce6adae1d2c42","isMergeCommit":false,"messageTitle":"Refactor title filter (#265)","messageBody":"Title filter is handled outside of filters service\r\n\r\nThis violates the responsibility of the filters service\r\n\r\nLet\u0027s refactor the search filter to use the filters service","fileTypesAndContributionMap":{"html":{"insertions":7,"deletions":7},"ts":{"insertions":61,"deletions":83}}}]},{"date":"2024-03-12","commitResults":[{"hash":"f6a8f236d9d0b0dde9f0f97db3997e983b2b85a1","isMergeCommit":false,"messageTitle":"Refactor milestones to save by name (#289)","messageBody":"We store milestones by number.\r\n\r\nThis works when filters are confined to one repo, but\r\ndoesn\u0027t make sense when saving filters across repos.\r\n\r\nLet\u0027s refactor the milestones to save by title instead\r\nof number","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1},"ts":{"insertions":5,"deletions":7}}}]},{"date":"2024-03-20","commitResults":[{"hash":"8817ca32edd30d76509d0f3134c3d47b90a42d92","isMergeCommit":false,"messageTitle":"Keep filters when switching repos (#281)","messageBody":"No way to keep filters when changing repos.\r\n\r\nAn option to keep the common filters will be useful for anyone\r\nmanaging multiple repositories without the hassle of reapplying \r\nthe same filters.\r\n\r\nLet\u0027s add a checkbox to the change repo dialog allowing \r\nusers to keep their filters.","fileTypesAndContributionMap":{"css":{"insertions":5,"deletions":0},"html":{"insertions":11,"deletions":3},"ts":{"insertions":89,"deletions":41}}}]},{"date":"2024-03-27","commitResults":[{"hash":"b226977751a2300b470958e5fa248edcbeb4922a","isMergeCommit":false,"messageTitle":"Keep milestones when switching repo (#311)","messageBody":"Milestones are not saved even when filters are kept.\r\n\r\nThis is inconsistent with the meaning of keeping filters.\r\n\r\nLet\u0027s implement keeping milestones across repos.","fileTypesAndContributionMap":{"ts":{"insertions":32,"deletions":1}}}]},{"date":"2024-03-30","commitResults":[{"hash":"fa69625226c3b95b08251b51d254c606d6ed888c","isMergeCommit":false,"messageTitle":"Add filters to url (#314)","messageBody":"Filters cannot be shared to among users.\r\n\r\nUsers might want to share their current view\r\nto others, consisting of their current filters.\r\n\r\nLet\u0027s pull and store filters in the URL to allow\r\nsharing of filter combinations.","fileTypesAndContributionMap":{"ts":{"insertions":71,"deletions":11}}}]},{"date":"2024-04-01","commitResults":[{"hash":"44fd3ca4c69dfd50ee8d825c5c318255530b3963","isMergeCommit":false,"messageTitle":"Fix default preset view (#334)","messageBody":"The default view is custom instead of currently active.\r\n\r\nThe default view should show the most relevant information\r\nto users. This should be the currently active preset view.\r\n\r\nLet\u0027s change the default view to be currently active.","fileTypesAndContributionMap":{"ts":{"insertions":6,"deletions":0}}}]}],"NereusWB922":[{"date":"2024-02-06","commitResults":[{"hash":"552868032ec6a8340d1f8c8d662ad22189d134f1","isMergeCommit":false,"messageTitle":"Improve activity dashboard design (#233)","messageBody":"Improve activity dashboard design\r\n\r\nThe ID column in the event table is not useful for the user.\r\n\r\nThe design of the dashboard is too simple. The event table\u0027s height is\r\nnot fixed, and the expanded event details might cause the table to be\r\ntoo long, which is very inconvenient.\r\n\r\nTo address this, let\u0027s hide the ID column, add some information about\r\nthe actor, fix the event table height and make it scrollable, and\r\nimplement a dialog to display event details.","fileTypesAndContributionMap":{"css":{"insertions":129,"deletions":10},"html":{"insertions":72,"deletions":67},"ts":{"insertions":48,"deletions":18}}}]},{"date":"2024-02-08","commitResults":[{"hash":"a6efcb9a2fa9bcd321c37a824e4d2aafa8d07a81","isMergeCommit":false,"messageTitle":"Refactor test cases","messageBody":"The test cases for the Login Component and Session Model are outdated. \r\n\r\nAdditionally, the Conflict Model has been removed. \r\n\r\nLet\u0027s refactor the test cases for the Login Component and Session Model \r\nand remove the test cases for the Conflict Model.\r\n","fileTypesAndContributionMap":{"ts":{"insertions":86,"deletions":106}}},{"hash":"339b319aaa87913d2109774f1fc6826d37992172","isMergeCommit":false,"messageTitle":"Refactor test cases for issue paginator","messageBody":"The test cases for the issue paginator are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue paginator.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":9}}},{"hash":"6dc82ffeb34973054ecfb3a10ea107f2c653c7cc","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter","messageBody":"The test cases for the issue sorter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue sorter.","fileTypesAndContributionMap":{"ts":{"insertions":57,"deletions":15}}},{"hash":"aefd63e82bad15390696d3aa88c9cbe93cdecaf4","isMergeCommit":false,"messageTitle":"Refactor github label constants","messageBody":"GithubLabel model\u0027s properties have been changed.\r\n\r\nLet\u0027s refactor the github label constants.","fileTypesAndContributionMap":{"ts":{"insertions":13,"deletions":29}}},{"hash":"bb4cb781ae5ba81e77cd83d789277530d37aaea6","isMergeCommit":false,"messageTitle":"Refactor test cases for search filter","messageBody":"The test cases for the search filter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the search filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":48}}}]},{"date":"2024-02-22","commitResults":[{"hash":"ba39c0647b5d9064fc9ccd0c4714d2eb03c9e862","isMergeCommit":false,"messageTitle":"Remove test cases for permissions service","messageBody":"The permission service has been removed. \r\n\r\nLet\u0027s remove the test cases for the permission service.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":74}}}]},{"date":"2024-02-26","commitResults":[{"hash":"70c883ae370d033a6ceb5edb4e42aa39e8df2b60","isMergeCommit":false,"messageTitle":"Remove constants for DataFile and Team model","messageBody":"DataFile and Team model are removed.\r\n\r\nLet\u0027s remove the constants of these models.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":44}}},{"hash":"2c36a3846be3987bf96ec5e482e05b96a69a1f57","isMergeCommit":false,"messageTitle":"Refactor test cases for label service","messageBody":"The test cases for the label service are outdated. \r\n\r\nLet\u0027s refactor the test cases for the label service and\r\nadd test case for fetchLabels method.","fileTypesAndContributionMap":{"ts":{"insertions":74,"deletions":241}}}]},{"date":"2024-03-02","commitResults":[{"hash":"121795c9f92a508d69c0d3490f92e161c5017eee","isMergeCommit":false,"messageTitle":"Refactor test cases for issue model","messageBody":"The GithubIssue constants and the test cases\r\nfor the issue model are outdated. \r\n\r\nLet\u0027s refactor the GithubIssue constants and the\r\ntest cases for the issue model.","fileTypesAndContributionMap":{"ts":{"insertions":133,"deletions":210}}},{"hash":"dfa05628791716d3341e4ac0f96699dca2f5362f","isMergeCommit":false,"messageTitle":"Refactor test cases for phase service","messageBody":"The test cases for the phase service are outdated. \r\n\r\nLet\u0027s refactor old test cases and add test cases for new methods.","fileTypesAndContributionMap":{"ts":{"insertions":126,"deletions":39}}}]},{"date":"2024-03-04","commitResults":[{"hash":"518ea791f4f838009c79aabed6db12d94d9ebce5","isMergeCommit":false,"messageTitle":"Fix zone testing import error (#269)","messageBody":"Npm run test will break if the import statement \r\nfor zone-testing is not at the top of test.ts file. \r\n\r\nLet\u0027s reorder the import statement and disable\r\ntslint rule for test.ts file.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":1}}},{"hash":"00f64fbecc6030c83f2fda114bb2a6a09e15dad2","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter (#270)","messageBody":"The method in issue sorter has been updated.\r\n\r\nLet\u0027s refactor the test cases to match the changes.","fileTypesAndContributionMap":{"ts":{"insertions":11,"deletions":11}}},{"hash":"48b63155ba859ba7362b118740c4e40cb7785c7c","isMergeCommit":false,"messageTitle":"Refactor test cases for user service (#271)","messageBody":"The test cases for the user service are outdated. \r\n\r\nLet\u0027s refactor test cases for user service.","fileTypesAndContributionMap":{"ts":{"insertions":23,"deletions":50}}},{"hash":"8c36423a20ad868f665ef65e30d1c73cf1b2428a","isMergeCommit":false,"messageTitle":"Refactor test cases for label filter bar component (#274)","messageBody":"The test cases for the label filter bar component are outdated. \r\n\r\nLet\u0027s refactor test cases for label filter bar component","fileTypesAndContributionMap":{"ts":{"insertions":151,"deletions":60}}}]},{"date":"2024-03-08","commitResults":[{"hash":"f435ca142f7d92bcbe8651e8f4c437f13c833a50","isMergeCommit":false,"messageTitle":"Update test cases for phase service (#275)","messageBody":"Refactor and add test cases for phase service\r\n\r\nPhase service has been updated. \r\n\r\nLet\u0027s refactor and add test cases to match the changes.","fileTypesAndContributionMap":{"ts":{"insertions":71,"deletions":27}}}]},{"date":"2024-03-20","commitResults":[{"hash":"663dec3e90481c31c1411b2cd3f1829795c686f2","isMergeCommit":false,"messageTitle":"Refactor Phase Service and remove Phase (#291)","messageBody":"The concept of \"Phase\" is inherited from CATcher. Instead of \"Phase\", \r\nWATcher provides different \"Views\" of contributions in a repository.\r\n\r\nLet\u0027s replace \"Phase\" with \"View\".","fileTypesAndContributionMap":{"html":{"insertions":14,"deletions":17},"ts":{"insertions":189,"deletions":199}}}]},{"date":"2024-03-22","commitResults":[{"hash":"caadd668b7142b6efcd99080c87ac7855fc76b25","isMergeCommit":false,"messageTitle":"Setup grouping strategy and service (#308)","messageBody":"Implement GroupBy feature to allow users to group the issues/prs\r\nbased on different criteria such as milestone, status and etc.\r\n\r\nLet\u0027s set up the Grouping Strategy and Service.","fileTypesAndContributionMap":{"ts":{"insertions":259,"deletions":4}}}]},{"date":"2024-03-25","commitResults":[{"hash":"3420a738482dfb852ca23a69849b74c9c378be0e","isMergeCommit":false,"messageTitle":"Integrate Grouping Service (#313)","messageBody":"Implement GroupBy feature to allow users to group the issues/prs\r\nbased on different criteria such as milestone, status and etc.\r\n\r\nLet\u0027s integrate the grouping service in the components.","fileTypesAndContributionMap":{"css":{"insertions":2,"deletions":2},"html":{"insertions":79,"deletions":53},"ts":{"insertions":103,"deletions":58}}}]},{"date":"2024-03-29","commitResults":[{"hash":"cd4614f34a1d0707271d1782a97b3537ed32b1e5","isMergeCommit":false,"messageTitle":"Implement group by milestone (#316)","messageBody":"WATcher\u0027s default view displays issues and pull requests based solely on\r\ntheir assignees. Grouping issues and pull requests based on their\r\nassociated milestones may provide another useful view for the user.\r\n\r\nLet\u0027s implement the \"Group by Milestone\" feature.","fileTypesAndContributionMap":{"html":{"insertions":21,"deletions":0},"ts":{"insertions":61,"deletions":4}}},{"hash":"83dcdae8faa8c5ae4f8a4e73eb4ea419e88d251b","isMergeCommit":false,"messageTitle":"Include groupby params in url (#319)","messageBody":"With groupby parameters in the URL, users can easily share \r\nthe current grouping by using the URL.\r\n\r\nLet\u0027s implement initialization with URL parameters and \r\nthe ability to set groupby parameters.","fileTypesAndContributionMap":{"ts":{"insertions":93,"deletions":17}}},{"hash":"8ddcdcdb9759da81986d0d0bdb35b45b5ba39bdc","isMergeCommit":false,"messageTitle":"Reset GroupingContextService only if \"keep filter\" is selected. (#324)","messageBody":"GroupingContextService is being reset when the \"keep filter\" \r\noption is selected.\r\n\r\nLet\u0027s check if the \"keep filter\" option is selected before\r\nresetting the service.","fileTypesAndContributionMap":{"ts":{"insertions":3,"deletions":1}}},{"hash":"70bae914be0b1aae5a4ceb6a8fb1273c022797c7","isMergeCommit":false,"messageTitle":"Refactor MilestoneGroupingStrategy to match the changes in #315 (#323)","messageBody":"Special milestone groups are not added in the parseMilestoneData\r\nmethod.\r\n\r\nLet\u0027s add the special milestone groups to the result of the getGroups\r\nmethod.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":1}}},{"hash":"2eb2aba8980fb39dd9cfd9cd704873ed48aed0d4","isMergeCommit":false,"messageTitle":"Update repo on back and forward navigation (#322)","messageBody":"IssueViewer\u0027s repository is not updated when navigating back or forward\r\nin the URL history. This will lead to inconsistency between the URL\r\nparameters and the application state.\r\n\r\nLet\u0027s ensure that IssueViewer\u0027s repository is updated on back and forward\r\nnavigation.","fileTypesAndContributionMap":{"ts":{"insertions":18,"deletions":1}}}]},{"date":"2024-03-30","commitResults":[{"hash":"3f0aa1fac438fdc1ba505494a4b75ad1b364fa86","isMergeCommit":false,"messageTitle":"Enable npm run test in GitHub Action (#325)","messageBody":"Enabling automate testing in GitHub Actions with enhanced \r\ncode quality of the codebase.\r\n\r\nLet\u0027s enable automate testing.","fileTypesAndContributionMap":{"ts":{"insertions":8,"deletions":5}}}]},{"date":"2024-04-01","commitResults":[{"hash":"b603307a9e30e8bb74773c354fc41e1c36983df9","isMergeCommit":false,"messageTitle":"Show PRs without milestone in \"Currently Active\"","messageBody":"PRs without milestone requires urgent action from the user.\r\n\r\nLet\u0027s show it in the \"Currently Active\" preset view.","fileTypesAndContributionMap":{"ts":{"insertions":3,"deletions":3}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-27","commitResults":[{"hash":"bb4a7f4063c0aa33b80188a83bfc610fe147950a","isMergeCommit":false,"messageTitle":"Prevent redirection when repo not set (#228)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":4,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"db460275c3952308858654140b7ccdbe93b33a12","isMergeCommit":false,"messageTitle":"Upgrade to Angular 11 (#252)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: Chee Hong \u003cc.h.wong2606@gmail.com\u003e","fileTypesAndContributionMap":{"ts":{"insertions":17,"deletions":13}}}]},{"date":"2024-03-12","commitResults":[{"hash":"7e68bbdaeceb5bdfcc8c09e0f3f7cbd9bd3000f4","isMergeCommit":false,"messageTitle":"Remove sorting by assignees in Issue Sorter (#286)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":24}}}]},{"date":"2024-03-21","commitResults":[{"hash":"63ed6a2329d9343bdf18afc39b44653809e3370a","isMergeCommit":false,"messageTitle":"Add tool tip for hidden users (#307)","messageBody":"Currently, there is no tool tip for the Hidden Users mat-card.\r\nIt is not immediately obvious what the column is referring to.\r\n\r\nLet\u0027s add a tool tip to make it more explanatory.\r\n\r\nCo-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-25","commitResults":[{"hash":"43ea689bd406857d7dae518ab089bf4d3029b564","isMergeCommit":false,"messageTitle":"Create tests for Error Handling service (#304)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":101,"deletions":0}}},{"hash":"1fa6138cd5d66d33203fcab810011e9eaefab9c9","isMergeCommit":false,"messageTitle":"Create tests for Milestone service (#303)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":55,"deletions":0}}}]},{"date":"2024-03-29","commitResults":[{"hash":"0867e1cbf2725df92870a321f91dd328af09e19c","isMergeCommit":false,"messageTitle":"Add sorting by Status (#318)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: Nguyen \u003c87511888+nknguyenhc@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"html":{"insertions":3,"deletions":0},"ts":{"insertions":23,"deletions":0}}},{"hash":"b1f3eed7d98e8fb6589e5bcde167f03d5942fe98","isMergeCommit":false,"messageTitle":"Split \u0027Without a milestone\u0027 option (#315)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: nknguyenhc \u003c87511888+nknguyenhc@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"html":{"insertions":2,"deletions":0},"ts":{"insertions":17,"deletions":14}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":113,"html":45,"ts":405},"Arif-Khalid":{"js":0,"css":5,"html":26,"ts":242},"NereusWB922":{"js":0,"css":131,"html":129,"ts":1410},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":5,"ts":212},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":1004.7561,"Arif-Khalid":1624.469,"NereusWB922":8588.161,"dishenggg":0.0,"MadLamprey":237.19215,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} +{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-02-06","commitResults":[{"hash":"043311b90c12118a4d9d8468a64e1fc7021ad64d","isMergeCommit":false,"messageTitle":"Fix label filter not working (#230)","messageBody":"Fix label filter not working\r\n\r\nFilters takes the value of `label.formattedName` instead of `label.name`.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":5}}}]},{"date":"2024-02-13","commitResults":[{"hash":"64a68624b77c88cee70cd870e2966c1c27b89eb8","isMergeCommit":false,"messageTitle":"Add column of hidden users (#235)","messageBody":"After #192, assignees of a repo without any issues or PRs\r\nare hidden. Now, add the column to display such users\r\nwith 0 PRs and issues.\r\n\r\nCo-authored-by: Gabriel Goh \u003c77230723+gycgabriel@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"css":{"insertions":82,"deletions":0},"html":{"insertions":24,"deletions":0},"ts":{"insertions":44,"deletions":2}}}]},{"date":"2024-02-19","commitResults":[{"hash":"d6dadf4a49a6fc19e2eaa99bb37c7fe89f458a81","isMergeCommit":false,"messageTitle":"Refactor Label model (#254)","messageBody":"Previously, label full names are separated into label name\r\nand label category. However, this is not necessary for WATcher.\r\n\r\nLet\u0027s remove the separation so that filters only make use\r\nof the full name.","fileTypesAndContributionMap":{"html":{"insertions":6,"deletions":14},"ts":{"insertions":6,"deletions":14}}}]},{"date":"2024-02-26","commitResults":[{"hash":"3db1c8aa33942114acfd55af87da3d7c8d751390","isMergeCommit":false,"messageTitle":"Add shareable repo-specific URL (#255)","messageBody":"Previously, URLs are fixed upon repo change, hence URLs are not shareable.\r\n\r\nLet\u0027s make the current repo visible in the URL, so that it shareable.\r\n\r\nFurthermore, login is automated when there is such next route to be redirected to.","fileTypesAndContributionMap":{"ts":{"insertions":163,"deletions":9}}}]},{"date":"2024-03-21","commitResults":[{"hash":"6fb348ea31d05320af1ecc2e7c83dcfecf95e2f7","isMergeCommit":false,"messageTitle":"Hide redundant column pagination (#309)","messageBody":"Column pagination arrows cause unnecessary clogs\r\nif they are disabled.\r\n\r\nWe hide arrows on columns that only has one page.","fileTypesAndContributionMap":{"css":{"insertions":12,"deletions":0},"html":{"insertions":6,"deletions":1},"ts":{"insertions":8,"deletions":2}}}]},{"date":"2024-03-22","commitResults":[{"hash":"e3d4a3464879414ab4724dde0f9b4cc24aebf7df","isMergeCommit":false,"messageTitle":"Three-state labels (#282)","messageBody":"Previously, each label only has 2 states, either selected or\r\nnot selected. However, with such design,\r\nthe feature of hiding labels can be confused\r\nwith hiding issues/PRs with the label.\r\n\r\nWe implement the three-state label filters,\r\nso that each label can also be used to hide\r\nissues/PRs with the label.","fileTypesAndContributionMap":{"css":{"insertions":20,"deletions":5},"html":{"insertions":22,"deletions":26},"ts":{"insertions":48,"deletions":36}}}]},{"date":"2024-03-25","commitResults":[{"hash":"a65bb59578c4157be05f3c38fd712e411e43a155","isMergeCommit":false,"messageTitle":"Status filter checkboxes (#310)","messageBody":"We implement checkboxes for status, so that\r\nmultiple types of PRs/issues can be viewed concurrently.","fileTypesAndContributionMap":{"html":{"insertions":6,"deletions":5},"ts":{"insertions":39,"deletions":39}}}]},{"date":"2024-03-29","commitResults":[{"hash":"c3418d8d50071cde7ea19040df0ec411a0f49786","isMergeCommit":false,"messageTitle":"Add preset views (#320)","messageBody":"Currently, there are a lot of options of filters,\r\nbut there are no suggested useful preset views.\r\n\r\nWe add preset views for users to choose from,\r\nand via a button on the header.","fileTypesAndContributionMap":{"html":{"insertions":22,"deletions":2},"ts":{"insertions":156,"deletions":23}}}]},{"date":"2024-03-30","commitResults":[{"hash":"3ce551efd72e12ec9b43698d84e293892d1e4964","isMergeCommit":false,"messageTitle":"Fix for no milestone case (#326)","messageBody":"When there are no milestones in the repo,\r\nthe issue viewer shows nothing.\r\n\r\nChange is made so that if there is no milestone\r\nin the milestone service, do not apply the milestone filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":4}}}]},{"date":"2024-04-01","commitResults":[{"hash":"e7fb0f992c82b05cd5418a1e747351b4a8af254a","isMergeCommit":false,"messageTitle":"Fix preset view selection appearance (#338)","messageBody":"For the preset view selection, brackets are removed\r\nand left margin is added to increase visibility.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":15}}}]},{"date":"2024-04-03","commitResults":[{"hash":"d356fbe192b4b4761a512afbb9ba7409cc4b1362","isMergeCommit":false,"messageTitle":"Hide column issue count (#346)","messageBody":"We hide the issue column count when there is only one page,\r\nto make space for the issues.","fileTypesAndContributionMap":{"css":{"insertions":12,"deletions":9}}}]}],"Arif-Khalid":[{"date":"2024-01-25","commitResults":[{"hash":"79602d69bd13e2ab8c06ab6d9a6eca8b4a61e8b0","isMergeCommit":false,"messageTitle":"Hide 0 issue columns (#223)","messageBody":"Hide 0 issue columns.\r\n\r\n0 Issue columns are shown.\r\n\r\nHiding issues with 0 columns reduces the clutter on screen, \r\ncreating a better user experience. \r\nIllogical columns such as issues that are unassigned when sorting by\r\npull requests are also removed inherently.\r\n\r\nLet\u0027s add logic to hide the columns when they have no issues \r\nassociated to them.","fileTypesAndContributionMap":{"html":{"insertions":10,"deletions":1},"ts":{"insertions":15,"deletions":2}}}]},{"date":"2024-02-06","commitResults":[{"hash":"cd0d7e9f2a5169307c0c92a89a33e24610381839","isMergeCommit":false,"messageTitle":"Remove unused services (#238)","messageBody":"Couple of unused services copied from CATcher.\r\n\r\nUnused code should be removed to simplify code base \r\nand improve developer experience.\r\n\r\nLet\u0027s remove these unused services.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":359}}}]},{"date":"2024-02-14","commitResults":[{"hash":"5031ee2e33b49d0275892849703b81a1fc028a3d","isMergeCommit":false,"messageTitle":"Remove unused models in WATcher","messageBody":"There are a few of unused models ported from CATcher.\r\n\r\nUnnecessary models contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove these unused models from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":40}}},{"hash":"09ef51d1e360350d0d73a4a66063df59f805d3e2","isMergeCommit":false,"messageTitle":"Remove unused session-fix-confirmation component in WATcher","messageBody":"This is a component only used in CATcher.\r\n\r\nUnnecessary components contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove this unused component from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"css":{"insertions":0,"deletions":0},"html":{"insertions":0,"deletions":9},"ts":{"insertions":1,"deletions":27}}}]},{"date":"2024-02-22","commitResults":[{"hash":"7dbc28230cf4e6d2aa3d95448a0e247b03a5fcee","isMergeCommit":false,"messageTitle":"Refactor certain filters into its own service (#259)","messageBody":"Filters are observed, subscribed and emitted in many different \r\ncomponents.\r\n\r\nThis makes the code base hard to understand\r\nand adapt for filtering in future components.\r\n\r\nLet\u0027s refactor the filters into its own centralised service.","fileTypesAndContributionMap":{"html":{"insertions":3,"deletions":3},"ts":{"insertions":73,"deletions":35}}}]},{"date":"2024-02-28","commitResults":[{"hash":"ad94663e1ac524b83b022a622544181209881c1f","isMergeCommit":false,"messageTitle":"Refactor sorting (#261)","messageBody":"MatSort is passed by reference into IssueDataTables,\r\nlifted up from filter-bar component. Changes to \r\nMatSort are detected and handled in IssueDataTables.\r\n\r\nMatSort reference in IssueDataTables performs the \r\nresponsibility of a dropdown filter outside of the \r\nfilters service.\r\nThis violates good programming practices.\r\n\r\nLet\u0027s refactor the sort filter into the filters service.","fileTypesAndContributionMap":{"html":{"insertions":8,"deletions":5},"ts":{"insertions":19,"deletions":40}}},{"hash":"ac150e0c2c69d668481bd6594339618a59ebde7c","isMergeCommit":false,"messageTitle":"Refactor milestone filters (#264)","messageBody":"","fileTypesAndContributionMap":{"html":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"06260a9f2baada4cff35e536143ce6adae1d2c42","isMergeCommit":false,"messageTitle":"Refactor title filter (#265)","messageBody":"Title filter is handled outside of filters service\r\n\r\nThis violates the responsibility of the filters service\r\n\r\nLet\u0027s refactor the search filter to use the filters service","fileTypesAndContributionMap":{"html":{"insertions":7,"deletions":7},"ts":{"insertions":61,"deletions":83}}}]},{"date":"2024-03-12","commitResults":[{"hash":"f6a8f236d9d0b0dde9f0f97db3997e983b2b85a1","isMergeCommit":false,"messageTitle":"Refactor milestones to save by name (#289)","messageBody":"We store milestones by number.\r\n\r\nThis works when filters are confined to one repo, but\r\ndoesn\u0027t make sense when saving filters across repos.\r\n\r\nLet\u0027s refactor the milestones to save by title instead\r\nof number","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1},"ts":{"insertions":5,"deletions":7}}}]},{"date":"2024-03-20","commitResults":[{"hash":"8817ca32edd30d76509d0f3134c3d47b90a42d92","isMergeCommit":false,"messageTitle":"Keep filters when switching repos (#281)","messageBody":"No way to keep filters when changing repos.\r\n\r\nAn option to keep the common filters will be useful for anyone\r\nmanaging multiple repositories without the hassle of reapplying \r\nthe same filters.\r\n\r\nLet\u0027s add a checkbox to the change repo dialog allowing \r\nusers to keep their filters.","fileTypesAndContributionMap":{"css":{"insertions":5,"deletions":0},"html":{"insertions":11,"deletions":3},"ts":{"insertions":89,"deletions":41}}}]},{"date":"2024-03-27","commitResults":[{"hash":"b226977751a2300b470958e5fa248edcbeb4922a","isMergeCommit":false,"messageTitle":"Keep milestones when switching repo (#311)","messageBody":"Milestones are not saved even when filters are kept.\r\n\r\nThis is inconsistent with the meaning of keeping filters.\r\n\r\nLet\u0027s implement keeping milestones across repos.","fileTypesAndContributionMap":{"ts":{"insertions":32,"deletions":1}}}]},{"date":"2024-03-30","commitResults":[{"hash":"fa69625226c3b95b08251b51d254c606d6ed888c","isMergeCommit":false,"messageTitle":"Add filters to url (#314)","messageBody":"Filters cannot be shared to among users.\r\n\r\nUsers might want to share their current view\r\nto others, consisting of their current filters.\r\n\r\nLet\u0027s pull and store filters in the URL to allow\r\nsharing of filter combinations.","fileTypesAndContributionMap":{"ts":{"insertions":71,"deletions":11}}}]},{"date":"2024-04-01","commitResults":[{"hash":"44fd3ca4c69dfd50ee8d825c5c318255530b3963","isMergeCommit":false,"messageTitle":"Fix default preset view (#334)","messageBody":"The default view is custom instead of currently active.\r\n\r\nThe default view should show the most relevant information\r\nto users. This should be the currently active preset view.\r\n\r\nLet\u0027s change the default view to be currently active.","fileTypesAndContributionMap":{"ts":{"insertions":6,"deletions":0}}}]},{"date":"2024-04-03","commitResults":[{"hash":"99d2c72e7b7ce4ccffc190e918fb0639ffe020f9","isMergeCommit":false,"messageTitle":"Remove quotation marks from url (#345)","messageBody":"Quotation marks and null parameters are present for\r\nfilters saved in url.\r\n\r\nQuotation marks are unnecessary and empty filters\r\ncan be removed from the URL in order to make it\r\nmore readable and editable by advanced users.\r\n\r\nLet\u0027s remove null params and remove quotation marks\r\nfrom the url.","fileTypesAndContributionMap":{"ts":{"insertions":65,"deletions":14}}}]}],"NereusWB922":[{"date":"2024-02-06","commitResults":[{"hash":"552868032ec6a8340d1f8c8d662ad22189d134f1","isMergeCommit":false,"messageTitle":"Improve activity dashboard design (#233)","messageBody":"Improve activity dashboard design\r\n\r\nThe ID column in the event table is not useful for the user.\r\n\r\nThe design of the dashboard is too simple. The event table\u0027s height is\r\nnot fixed, and the expanded event details might cause the table to be\r\ntoo long, which is very inconvenient.\r\n\r\nTo address this, let\u0027s hide the ID column, add some information about\r\nthe actor, fix the event table height and make it scrollable, and\r\nimplement a dialog to display event details.","fileTypesAndContributionMap":{"css":{"insertions":129,"deletions":10},"html":{"insertions":72,"deletions":67},"ts":{"insertions":48,"deletions":18}}}]},{"date":"2024-02-08","commitResults":[{"hash":"a6efcb9a2fa9bcd321c37a824e4d2aafa8d07a81","isMergeCommit":false,"messageTitle":"Refactor test cases","messageBody":"The test cases for the Login Component and Session Model are outdated. \r\n\r\nAdditionally, the Conflict Model has been removed. \r\n\r\nLet\u0027s refactor the test cases for the Login Component and Session Model \r\nand remove the test cases for the Conflict Model.\r\n","fileTypesAndContributionMap":{"ts":{"insertions":86,"deletions":106}}},{"hash":"339b319aaa87913d2109774f1fc6826d37992172","isMergeCommit":false,"messageTitle":"Refactor test cases for issue paginator","messageBody":"The test cases for the issue paginator are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue paginator.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":9}}},{"hash":"6dc82ffeb34973054ecfb3a10ea107f2c653c7cc","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter","messageBody":"The test cases for the issue sorter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue sorter.","fileTypesAndContributionMap":{"ts":{"insertions":57,"deletions":15}}},{"hash":"aefd63e82bad15390696d3aa88c9cbe93cdecaf4","isMergeCommit":false,"messageTitle":"Refactor github label constants","messageBody":"GithubLabel model\u0027s properties have been changed.\r\n\r\nLet\u0027s refactor the github label constants.","fileTypesAndContributionMap":{"ts":{"insertions":13,"deletions":29}}},{"hash":"bb4cb781ae5ba81e77cd83d789277530d37aaea6","isMergeCommit":false,"messageTitle":"Refactor test cases for search filter","messageBody":"The test cases for the search filter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the search filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":48}}}]},{"date":"2024-02-22","commitResults":[{"hash":"ba39c0647b5d9064fc9ccd0c4714d2eb03c9e862","isMergeCommit":false,"messageTitle":"Remove test cases for permissions service","messageBody":"The permission service has been removed. \r\n\r\nLet\u0027s remove the test cases for the permission service.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":74}}}]},{"date":"2024-02-26","commitResults":[{"hash":"70c883ae370d033a6ceb5edb4e42aa39e8df2b60","isMergeCommit":false,"messageTitle":"Remove constants for DataFile and Team model","messageBody":"DataFile and Team model are removed.\r\n\r\nLet\u0027s remove the constants of these models.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":44}}},{"hash":"2c36a3846be3987bf96ec5e482e05b96a69a1f57","isMergeCommit":false,"messageTitle":"Refactor test cases for label service","messageBody":"The test cases for the label service are outdated. \r\n\r\nLet\u0027s refactor the test cases for the label service and\r\nadd test case for fetchLabels method.","fileTypesAndContributionMap":{"ts":{"insertions":74,"deletions":241}}}]},{"date":"2024-03-02","commitResults":[{"hash":"121795c9f92a508d69c0d3490f92e161c5017eee","isMergeCommit":false,"messageTitle":"Refactor test cases for issue model","messageBody":"The GithubIssue constants and the test cases\r\nfor the issue model are outdated. \r\n\r\nLet\u0027s refactor the GithubIssue constants and the\r\ntest cases for the issue model.","fileTypesAndContributionMap":{"ts":{"insertions":133,"deletions":210}}},{"hash":"dfa05628791716d3341e4ac0f96699dca2f5362f","isMergeCommit":false,"messageTitle":"Refactor test cases for phase service","messageBody":"The test cases for the phase service are outdated. \r\n\r\nLet\u0027s refactor old test cases and add test cases for new methods.","fileTypesAndContributionMap":{"ts":{"insertions":126,"deletions":39}}}]},{"date":"2024-03-04","commitResults":[{"hash":"518ea791f4f838009c79aabed6db12d94d9ebce5","isMergeCommit":false,"messageTitle":"Fix zone testing import error (#269)","messageBody":"Npm run test will break if the import statement \r\nfor zone-testing is not at the top of test.ts file. \r\n\r\nLet\u0027s reorder the import statement and disable\r\ntslint rule for test.ts file.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":1}}},{"hash":"00f64fbecc6030c83f2fda114bb2a6a09e15dad2","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter (#270)","messageBody":"The method in issue sorter has been updated.\r\n\r\nLet\u0027s refactor the test cases to match the changes.","fileTypesAndContributionMap":{"ts":{"insertions":11,"deletions":11}}},{"hash":"48b63155ba859ba7362b118740c4e40cb7785c7c","isMergeCommit":false,"messageTitle":"Refactor test cases for user service (#271)","messageBody":"The test cases for the user service are outdated. \r\n\r\nLet\u0027s refactor test cases for user service.","fileTypesAndContributionMap":{"ts":{"insertions":23,"deletions":50}}},{"hash":"8c36423a20ad868f665ef65e30d1c73cf1b2428a","isMergeCommit":false,"messageTitle":"Refactor test cases for label filter bar component (#274)","messageBody":"The test cases for the label filter bar component are outdated. \r\n\r\nLet\u0027s refactor test cases for label filter bar component","fileTypesAndContributionMap":{"ts":{"insertions":151,"deletions":60}}}]},{"date":"2024-03-08","commitResults":[{"hash":"f435ca142f7d92bcbe8651e8f4c437f13c833a50","isMergeCommit":false,"messageTitle":"Update test cases for phase service (#275)","messageBody":"Refactor and add test cases for phase service\r\n\r\nPhase service has been updated. \r\n\r\nLet\u0027s refactor and add test cases to match the changes.","fileTypesAndContributionMap":{"ts":{"insertions":71,"deletions":27}}}]},{"date":"2024-03-20","commitResults":[{"hash":"663dec3e90481c31c1411b2cd3f1829795c686f2","isMergeCommit":false,"messageTitle":"Refactor Phase Service and remove Phase (#291)","messageBody":"The concept of \"Phase\" is inherited from CATcher. Instead of \"Phase\", \r\nWATcher provides different \"Views\" of contributions in a repository.\r\n\r\nLet\u0027s replace \"Phase\" with \"View\".","fileTypesAndContributionMap":{"html":{"insertions":14,"deletions":17},"ts":{"insertions":189,"deletions":199}}}]},{"date":"2024-03-22","commitResults":[{"hash":"caadd668b7142b6efcd99080c87ac7855fc76b25","isMergeCommit":false,"messageTitle":"Setup grouping strategy and service (#308)","messageBody":"Implement GroupBy feature to allow users to group the issues/prs\r\nbased on different criteria such as milestone, status and etc.\r\n\r\nLet\u0027s set up the Grouping Strategy and Service.","fileTypesAndContributionMap":{"ts":{"insertions":259,"deletions":4}}}]},{"date":"2024-03-25","commitResults":[{"hash":"3420a738482dfb852ca23a69849b74c9c378be0e","isMergeCommit":false,"messageTitle":"Integrate Grouping Service (#313)","messageBody":"Implement GroupBy feature to allow users to group the issues/prs\r\nbased on different criteria such as milestone, status and etc.\r\n\r\nLet\u0027s integrate the grouping service in the components.","fileTypesAndContributionMap":{"css":{"insertions":2,"deletions":2},"html":{"insertions":79,"deletions":53},"ts":{"insertions":103,"deletions":58}}}]},{"date":"2024-03-29","commitResults":[{"hash":"cd4614f34a1d0707271d1782a97b3537ed32b1e5","isMergeCommit":false,"messageTitle":"Implement group by milestone (#316)","messageBody":"WATcher\u0027s default view displays issues and pull requests based solely on\r\ntheir assignees. Grouping issues and pull requests based on their\r\nassociated milestones may provide another useful view for the user.\r\n\r\nLet\u0027s implement the \"Group by Milestone\" feature.","fileTypesAndContributionMap":{"html":{"insertions":21,"deletions":0},"ts":{"insertions":61,"deletions":4}}},{"hash":"83dcdae8faa8c5ae4f8a4e73eb4ea419e88d251b","isMergeCommit":false,"messageTitle":"Include groupby params in url (#319)","messageBody":"With groupby parameters in the URL, users can easily share \r\nthe current grouping by using the URL.\r\n\r\nLet\u0027s implement initialization with URL parameters and \r\nthe ability to set groupby parameters.","fileTypesAndContributionMap":{"ts":{"insertions":93,"deletions":17}}},{"hash":"8ddcdcdb9759da81986d0d0bdb35b45b5ba39bdc","isMergeCommit":false,"messageTitle":"Reset GroupingContextService only if \"keep filter\" is selected. (#324)","messageBody":"GroupingContextService is being reset when the \"keep filter\" \r\noption is selected.\r\n\r\nLet\u0027s check if the \"keep filter\" option is selected before\r\nresetting the service.","fileTypesAndContributionMap":{"ts":{"insertions":3,"deletions":1}}},{"hash":"70bae914be0b1aae5a4ceb6a8fb1273c022797c7","isMergeCommit":false,"messageTitle":"Refactor MilestoneGroupingStrategy to match the changes in #315 (#323)","messageBody":"Special milestone groups are not added in the parseMilestoneData\r\nmethod.\r\n\r\nLet\u0027s add the special milestone groups to the result of the getGroups\r\nmethod.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":1}}},{"hash":"2eb2aba8980fb39dd9cfd9cd704873ed48aed0d4","isMergeCommit":false,"messageTitle":"Update repo on back and forward navigation (#322)","messageBody":"IssueViewer\u0027s repository is not updated when navigating back or forward\r\nin the URL history. This will lead to inconsistency between the URL\r\nparameters and the application state.\r\n\r\nLet\u0027s ensure that IssueViewer\u0027s repository is updated on back and forward\r\nnavigation.","fileTypesAndContributionMap":{"ts":{"insertions":18,"deletions":1}}}]},{"date":"2024-03-30","commitResults":[{"hash":"3f0aa1fac438fdc1ba505494a4b75ad1b364fa86","isMergeCommit":false,"messageTitle":"Enable npm run test in GitHub Action (#325)","messageBody":"Enabling automate testing in GitHub Actions with enhanced \r\ncode quality of the codebase.\r\n\r\nLet\u0027s enable automate testing.","fileTypesAndContributionMap":{"ts":{"insertions":8,"deletions":5}}}]},{"date":"2024-04-01","commitResults":[{"hash":"b603307a9e30e8bb74773c354fc41e1c36983df9","isMergeCommit":false,"messageTitle":"Show PRs without milestone in \"Currently Active\"","messageBody":"PRs without milestone requires urgent action from the user.\r\n\r\nLet\u0027s show it in the \"Currently Active\" preset view.","fileTypesAndContributionMap":{"ts":{"insertions":3,"deletions":3}}}]},{"date":"2024-04-03","commitResults":[{"hash":"775e59ce6371251c8ae2cb075f75ccb29ad8b6d2","isMergeCommit":false,"messageTitle":"Implement dropdown menu for repo change (#347)","messageBody":"Introduce a dropdown menu for repository selection,\r\nsimplifying the process of switching between repositories. \r\n\r\nThis enhancement offers users a quicker and more\r\nintuitive method to navigate to previously visited repositories.","fileTypesAndContributionMap":{"css":{"insertions":32,"deletions":0},"html":{"insertions":28,"deletions":2},"ts":{"insertions":15,"deletions":2}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-27","commitResults":[{"hash":"bb4a7f4063c0aa33b80188a83bfc610fe147950a","isMergeCommit":false,"messageTitle":"Prevent redirection when repo not set (#228)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":4,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"db460275c3952308858654140b7ccdbe93b33a12","isMergeCommit":false,"messageTitle":"Upgrade to Angular 11 (#252)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: Chee Hong \u003cc.h.wong2606@gmail.com\u003e","fileTypesAndContributionMap":{"ts":{"insertions":17,"deletions":13}}}]},{"date":"2024-03-12","commitResults":[{"hash":"7e68bbdaeceb5bdfcc8c09e0f3f7cbd9bd3000f4","isMergeCommit":false,"messageTitle":"Remove sorting by assignees in Issue Sorter (#286)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":24}}}]},{"date":"2024-03-21","commitResults":[{"hash":"63ed6a2329d9343bdf18afc39b44653809e3370a","isMergeCommit":false,"messageTitle":"Add tool tip for hidden users (#307)","messageBody":"Currently, there is no tool tip for the Hidden Users mat-card.\r\nIt is not immediately obvious what the column is referring to.\r\n\r\nLet\u0027s add a tool tip to make it more explanatory.\r\n\r\nCo-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-25","commitResults":[{"hash":"43ea689bd406857d7dae518ab089bf4d3029b564","isMergeCommit":false,"messageTitle":"Create tests for Error Handling service (#304)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":101,"deletions":0}}},{"hash":"1fa6138cd5d66d33203fcab810011e9eaefab9c9","isMergeCommit":false,"messageTitle":"Create tests for Milestone service (#303)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"ts":{"insertions":55,"deletions":0}}}]},{"date":"2024-03-29","commitResults":[{"hash":"0867e1cbf2725df92870a321f91dd328af09e19c","isMergeCommit":false,"messageTitle":"Add sorting by Status (#318)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: Nguyen \u003c87511888+nknguyenhc@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"html":{"insertions":3,"deletions":0},"ts":{"insertions":23,"deletions":0}}},{"hash":"b1f3eed7d98e8fb6589e5bcde167f03d5942fe98","isMergeCommit":false,"messageTitle":"Split \u0027Without a milestone\u0027 option (#315)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e\r\nCo-authored-by: nknguyenhc \u003c87511888+nknguyenhc@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"html":{"insertions":2,"deletions":0},"ts":{"insertions":17,"deletions":14}}}]},{"date":"2024-04-03","commitResults":[{"hash":"d92079ba532ffc56283da245efe295f5edb4f203","isMergeCommit":false,"messageTitle":"Add icon for PRs without milestones (#337)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":8,"deletions":5},"ts":{"insertions":8,"deletions":1}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":123,"html":45,"ts":405},"Arif-Khalid":{"js":0,"css":5,"html":25,"ts":293},"NereusWB922":{"js":0,"css":163,"html":157,"ts":1425},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":13,"ts":220},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":990.60297,"Arif-Khalid":1638.1758,"NereusWB922":8478.256,"dishenggg":0.0,"MadLamprey":236.52007,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} diff --git a/archive.zip b/archive.zip index 22d96c51ddde3e06e6020b202bb4c15cfa9c96c0..4b0795f4992648843ab46e785965801729c6fa92 100644 GIT binary patch delta 98044 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�Wram>FxO>`hETgs;8dDJtt+ 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%0A7L@EIDB&- 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�e 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 G@Ba_D#(`@9 diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 32838f2..c21eea3 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,1546 +1,1546 @@ -Apr 03, 2024 12:02:15 AM reposense.system.LogsManager addFileHandler +Apr 04, 2024 12:02:15 AM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Apr 03, 2024 12:02:15 AM reposense.parser.CsvParser validateHeader +Apr 04, 2024 12:02:15 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, repo-config.csv, and recognized columns: Ignore Standalone Config, Repository's Location, Branch, Shallow Cloning, File formats, Ignore Glob List, Ignore Authors List, Find Previous Authors, Ignore Commits List -Apr 03, 2024 12:02:15 AM reposense.parser.CsvParser validateHeader +Apr 04, 2024 12:02:15 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, author-config.csv, and recognized columns: Author's Emails, Repository's Location, Author's GitHub ID, Branch, Author's Display Name, Ignore Glob List, Author's Git Author Name -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:15 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Apr 04, 2024 12:02:16 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Apr 03, 2024 12:02:16 AM reposense.git.GitConfig getGlobalGitLfsConfig +Apr 04, 2024 12:02:16 AM reposense.git.GitConfig getGlobalGitLfsConfig WARNING: Could not get global git lfs config java.lang.RuntimeException: reposense.system.CommandRunnerProcessException: Error returned from command git config --global --list on path . : fatal: unable to read config file '/home/runner/.gitconfig': No such file or directory @@ -1556,115 +1556,115 @@ fatal: unable to read config file '/home/runner/.gitconfig': No such file or dir at reposense.system.CommandRunner.runCommand(CommandRunner.java:21) ... 3 more -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/TEAMMATES/teammates.git... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/markbind/markbind.git... +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/reposense/reposense.git... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/CATcher-org/WATcher.git... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/markbind/markbind.git... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/reposense/reposense.git to complete... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/CATcher-org/WATcher.git to complete... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/markbind/markbind.git to complete... -Apr 03, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/TEAMMATES/teammates.git to complete... -Apr 03, 2024 12:02:17 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/markbind/markbind.git to complete... +Apr 04, 2024 12:02:17 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/CATcher-org/WATcher.git completed! -Apr 03, 2024 12:02:17 AM reposense.report.RepoCloner spawnCloneProcess +Apr 04, 2024 12:02:17 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/CATcher-org/CATcher.git... -Apr 03, 2024 12:02:17 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:17 AM reposense.report.ReportGenerator analyzeRepos INFO: [1/6] Analyzing https://github.com/CATcher-org/WATcher.git (main)... -Apr 03, 2024 12:02:17 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:17 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/CATcher-org/CATcher.git to complete... -Apr 03, 2024 12:02:17 AM reposense.report.ReportGenerator updateRepoConfig +Apr 04, 2024 12:02:17 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/CATcher-org/WATcher.git (main) does not contain a standalone config file. -Apr 03, 2024 12:02:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Apr 04, 2024 12:02:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/CATcher-org/WATcher.git (main)... -Apr 03, 2024 12:02:19 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:19 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/CATcher-org/CATcher.git completed! -Apr 03, 2024 12:02:19 AM reposense.report.RepoCloner spawnCloneProcess +Apr 04, 2024 12:02:19 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/se-edu/addressbook-level3.git... -Apr 03, 2024 12:02:19 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:19 AM reposense.report.ReportGenerator analyzeRepos INFO: [2/6] Analyzing https://github.com/CATcher-org/CATcher.git (master)... -Apr 03, 2024 12:02:19 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:19 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/se-edu/addressbook-level3.git to complete... -Apr 03, 2024 12:02:19 AM reposense.report.ReportGenerator updateRepoConfig +Apr 04, 2024 12:02:19 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/CATcher-org/CATcher.git (master) does not contain a standalone config file. -Apr 03, 2024 12:02:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Apr 04, 2024 12:02:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/CATcher-org/CATcher.git (master)... -Apr 03, 2024 12:02:21 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/se-edu/addressbook-level3.git completed! -Apr 03, 2024 12:02:21 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:21 AM reposense.report.ReportGenerator analyzeRepos INFO: [3/6] Analyzing https://github.com/se-edu/addressbook-level3.git (master)... -Apr 03, 2024 12:02:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/CATcher-org/WATcher.git (main)... -Apr 03, 2024 12:02:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/CATcher-org/CATcher.git (master)... -Apr 03, 2024 12:02:21 AM reposense.report.ReportGenerator updateRepoConfig +Apr 04, 2024 12:02:21 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/se-edu/addressbook-level3.git (master) does not contain a standalone config file. -Apr 03, 2024 12:02:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Apr 04, 2024 12:02:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/se-edu/addressbook-level3.git (master)... -Apr 03, 2024 12:02:22 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/markbind/markbind.git completed! -Apr 03, 2024 12:02:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/se-edu/addressbook-level3.git (master)... -Apr 03, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:21 AM reposense.report.ReportGenerator analyzeRepos INFO: [4/6] Analyzing https://github.com/markbind/markbind.git (master)... -Apr 03, 2024 12:02:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Apr 04, 2024 12:02:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/se-edu/addressbook-level3.git (master)... +Apr 04, 2024 12:02:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/CATcher-org/CATcher.git (master)... +Apr 04, 2024 12:02:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/CATcher-org/WATcher.git (main)... +Apr 04, 2024 12:02:22 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/markbind/markbind.git (master) does not contain a standalone config file. +Apr 04, 2024 12:02:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/markbind/markbind.git (master)... +Apr 04, 2024 12:02:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/se-edu/addressbook-level3.git (master)... +Apr 04, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/se-edu/addressbook-level3.git (master) completed! +Apr 04, 2024 12:02:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/CATcher-org/CATcher.git (master)... -Apr 03, 2024 12:02:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/CATcher-org/WATcher.git (main)... -Apr 03, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepo +Apr 04, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/CATcher-org/CATcher.git (master) completed! -Apr 03, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepo +Apr 04, 2024 12:02:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/CATcher-org/WATcher.git (main)... +Apr 04, 2024 12:02:23 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/CATcher-org/WATcher.git (main) completed! -Apr 03, 2024 12:02:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/se-edu/addressbook-level3.git (master)... -Apr 03, 2024 12:02:22 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/se-edu/addressbook-level3.git (master) completed! -Apr 03, 2024 12:02:23 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/markbind/markbind.git (master) does not contain a standalone config file. -Apr 03, 2024 12:02:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/markbind/markbind.git (master)... -Apr 03, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:26 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/reposense/reposense.git completed! -Apr 03, 2024 12:02:25 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:26 AM reposense.report.ReportGenerator analyzeRepos INFO: [5/6] Analyzing https://github.com/reposense/reposense.git (master)... -Apr 03, 2024 12:02:25 AM reposense.report.ReportGenerator updateRepoConfig +Apr 04, 2024 12:02:26 AM reposense.report.ReportGenerator updateRepoConfig INFO: Ignoring standalone config file in https://github.com/reposense/reposense.git (master). -Apr 03, 2024 12:02:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Apr 04, 2024 12:02:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/reposense/reposense.git (master)... -Apr 03, 2024 12:02:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Apr 04, 2024 12:02:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/markbind/markbind.git (master)... -Apr 03, 2024 12:02:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Apr 04, 2024 12:02:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/markbind/markbind.git (master)... -Apr 03, 2024 12:02:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/reposense/reposense.git (master)... -Apr 03, 2024 12:02:30 AM reposense.report.ReportGenerator analyzeRepo +Apr 04, 2024 12:02:30 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/markbind/markbind.git (master) completed! -Apr 03, 2024 12:02:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Apr 04, 2024 12:02:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/reposense/reposense.git (master)... +Apr 04, 2024 12:02:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/reposense/reposense.git (master)... -Apr 03, 2024 12:02:31 AM reposense.report.ReportGenerator analyzeRepo +Apr 04, 2024 12:02:32 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/reposense/reposense.git (master) completed! -Apr 03, 2024 12:02:37 AM reposense.report.RepoCloner waitForCloneProcess +Apr 04, 2024 12:02:37 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/TEAMMATES/teammates.git completed! -Apr 03, 2024 12:02:37 AM reposense.report.ReportGenerator analyzeRepos +Apr 04, 2024 12:02:37 AM reposense.report.ReportGenerator analyzeRepos INFO: [6/6] Analyzing https://github.com/TEAMMATES/teammates.git (master)... -Apr 03, 2024 12:02:37 AM reposense.report.ReportGenerator updateRepoConfig +Apr 04, 2024 12:02:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/TEAMMATES/teammates.git (master) does not contain a standalone config file. -Apr 03, 2024 12:02:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Apr 04, 2024 12:02:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/TEAMMATES/teammates.git (master)... -Apr 03, 2024 12:03:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Apr 04, 2024 12:03:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/TEAMMATES/teammates.git (master)... -Apr 03, 2024 12:03:14 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Apr 04, 2024 12:03:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/TEAMMATES/teammates.git (master)... -Apr 03, 2024 12:03:14 AM reposense.report.ReportGenerator analyzeRepo +Apr 04, 2024 12:03:15 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/TEAMMATES/teammates.git (master) completed! -Apr 03, 2024 12:03:15 AM reposense.report.ReportGenerator generateReposReport +Apr 04, 2024 12:03:15 AM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/2024-dashboard/2024-dashboard/reposense-report -Apr 03, 2024 12:03:15 AM reposense.RepoSense main -INFO: Elapsed processing time: 59.50 second(s) +Apr 04, 2024 12:03:15 AM reposense.RepoSense main +INFO: Elapsed processing time: 1 minute(s) 0.04 second(s) diff --git a/summary.json b/summary.json index 599bc56..0614411 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"5cd529fb46","reportGeneratedTime":"Wed Apr 3 08:02:16 2024 UTC+08:00","reportGenerationTime":" 59.30 second(s)","zoneId":"UTC+08:00","reportTitle":"RepoSense Report","repos":[{"location":{"location":"https://github.com/markbind/markbind.git","repoName":"markbind","organization":"markbind","domainName":"github"},"branch":"master","displayName":"markbind/markbind[master]","outputFolderName":"markbind_markbind_master"},{"location":{"location":"https://github.com/reposense/reposense.git","repoName":"reposense","organization":"reposense","domainName":"github"},"branch":"master","displayName":"reposense/reposense[master]","outputFolderName":"reposense_reposense_master"},{"location":{"location":"https://github.com/se-edu/addressbook-level3.git","repoName":"addressbook-level3","organization":"se-edu","domainName":"github"},"branch":"master","displayName":"se-edu/addressbook-level3[master]","outputFolderName":"se-edu_addressbook-level3_master"},{"location":{"location":"https://github.com/TEAMMATES/teammates.git","repoName":"teammates","organization":"TEAMMATES","domainName":"github"},"branch":"master","displayName":"TEAMMATES/teammates[master]","outputFolderName":"TEAMMATES_teammates_master"},{"location":{"location":"https://github.com/CATcher-org/CATcher.git","repoName":"CATcher","organization":"CATcher-org","domainName":"github"},"branch":"master","displayName":"CATcher-org/CATcher[master]","outputFolderName":"CATcher-org_CATcher_master"},{"location":{"location":"https://github.com/CATcher-org/WATcher.git","repoName":"WATcher","organization":"CATcher-org","domainName":"github"},"branch":"main","displayName":"CATcher-org/WATcher[main]","outputFolderName":"CATcher-org_WATcher_main"}],"errorSet":[],"sinceDate":"2023-12-01","untilDate":"2024-04-03","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}} +{"repoSenseVersion":"5cd529fb46","reportGeneratedTime":"Thu Apr 4 08:02:16 2024 UTC+08:00","reportGenerationTime":" 59.85 second(s)","zoneId":"UTC+08:00","reportTitle":"RepoSense Report","repos":[{"location":{"location":"https://github.com/markbind/markbind.git","repoName":"markbind","organization":"markbind","domainName":"github"},"branch":"master","displayName":"markbind/markbind[master]","outputFolderName":"markbind_markbind_master"},{"location":{"location":"https://github.com/reposense/reposense.git","repoName":"reposense","organization":"reposense","domainName":"github"},"branch":"master","displayName":"reposense/reposense[master]","outputFolderName":"reposense_reposense_master"},{"location":{"location":"https://github.com/se-edu/addressbook-level3.git","repoName":"addressbook-level3","organization":"se-edu","domainName":"github"},"branch":"master","displayName":"se-edu/addressbook-level3[master]","outputFolderName":"se-edu_addressbook-level3_master"},{"location":{"location":"https://github.com/TEAMMATES/teammates.git","repoName":"teammates","organization":"TEAMMATES","domainName":"github"},"branch":"master","displayName":"TEAMMATES/teammates[master]","outputFolderName":"TEAMMATES_teammates_master"},{"location":{"location":"https://github.com/CATcher-org/CATcher.git","repoName":"CATcher","organization":"CATcher-org","domainName":"github"},"branch":"master","displayName":"CATcher-org/CATcher[master]","outputFolderName":"CATcher-org_CATcher_master"},{"location":{"location":"https://github.com/CATcher-org/WATcher.git","repoName":"WATcher","organization":"CATcher-org","domainName":"github"},"branch":"main","displayName":"CATcher-org/WATcher[main]","outputFolderName":"CATcher-org_WATcher_main"}],"errorSet":[],"sinceDate":"2023-12-01","untilDate":"2024-04-04","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}}