├── .gitignore ├── LICENSE ├── README.md ├── angular.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── dashboard │ │ ├── enterprise-level │ │ │ ├── enterprise-level.component.html │ │ │ ├── enterprise-level.component.scss │ │ │ ├── enterprise-level.component.spec.ts │ │ │ └── enterprise-level.component.ts │ │ ├── impact-analysis │ │ │ ├── impact-analysis.component.html │ │ │ ├── impact-analysis.component.scss │ │ │ ├── impact-analysis.component.spec.ts │ │ │ └── impact-analysis.component.ts │ │ ├── org-level │ │ │ ├── org-level.component.html │ │ │ ├── org-level.component.scss │ │ │ ├── org-level.component.spec.ts │ │ │ └── org-level.component.ts │ │ ├── org-seats │ │ │ ├── org-seats.component.html │ │ │ ├── org-seats.component.scss │ │ │ ├── org-seats.component.spec.ts │ │ │ └── org-seats.component.ts │ │ └── sample-api-response │ │ │ ├── sample-api-response.component.html │ │ │ ├── sample-api-response.component.scss │ │ │ ├── sample-api-response.component.spec.ts │ │ │ └── sample-api-response.component.ts │ ├── footer │ │ ├── footer.component.html │ │ ├── footer.component.scss │ │ ├── footer.component.spec.ts │ │ └── footer.component.ts │ ├── header │ │ ├── header.component.html │ │ ├── header.component.scss │ │ ├── header.component.spec.ts │ │ └── header.component.ts │ └── services │ │ ├── enterprise-level.service.ts │ │ ├── impact.service.ts │ │ └── organization-level.service.ts ├── assets │ ├── .gitkeep │ ├── copilot_seats_data.json │ └── copilot_usage_data.json ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── polyfills.ts ├── styles.scss └── test.ts ├── test.json ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/* 3 | .angular/* 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Ambily 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Copilot Usage Dashboard 2 | This Angular application is designed to provide insights into GitHub Copilot usage within an organization. It utilizes the Copilot Usage Metrics API (private Beta) and Copilot Seat Management API to fetch and display relevant data. 3 | 4 | > **Note:** This solution was developed to demonstrate potential use cases and is not intended for production use. If you plan to deploy it in a production environment, please customize it to meet your non-functional requirements (NFRs). This repository is not regularly maintained or updated. 5 | 6 | ## Features 7 | 1. **Home/Organization Tab:** Displays Copilot usage data for the organization. 8 | 2. **Impact Tab:** Planned feature to showcase GitHub-specific metrics indicating the impact of Copilot, such as lines of code committed per day, overall issue counts, etc. (Pending implementation) 9 | 3. **Sample Response Tab:** Provides a sample API response schema for reference. 10 | 4. **Org Seats Tab:** Shows seat assignment details for the organization. 11 | 5. **Enterprise Tab:** Planned feature to capture Copilot usage at the enterprise level. (Pending implementation) 12 | 13 | ## Getting Started 14 | 15 | 1. Clone the Repository to Visual Studio Code 16 | 2. Install the required dependencies using `npm install` 17 | 3. Run the app using `npm start` 18 | 4. Access the application in your browser at http://localhost:4200. 19 | 20 | Above steps will start the app on `localhost:4200` using sample data from `src/assets` folder. 21 | 22 | If you want to use your own data, follow the below steps: 23 | 1. Create a GitHub Personal Access Token with Copilot for Business Scope 24 | 2. Modify the token in `src/environments/environment.ts` file 25 | 3. Modify the organization name in `src/environments/environment.ts` file 26 | 4. Comment the sample data loading code in `src/app/services/organization-level.service.ts` file and uncomment the code to load data from API 27 | 5. Install the required dependencies using `npm install` 28 | 6. Run the app using `npm start` 29 | 30 | ## References 31 | 1. [GitHub Copilot Usage Metrics API](#) - Yet to be published (Private Beta) 32 | 2. [GitHub Copilot Seat Management API](https://docs.github.com/en/rest/copilot?apiVersion=2022-11-28) 33 | 34 | ### Status: 15-Jan 35 | 36 | 37 | 38 | https://github.com/octodemo/Copilot-Usage-Dashboard/assets/10282550/20db62a2-b020-4318-9ed8-f2ef488d7dc2 39 | 40 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "DashboardApp": { 7 | "projectType": "application", 8 | "schematics": { 9 | "@schematics/angular:component": { 10 | "style": "scss" 11 | } 12 | }, 13 | "root": "", 14 | "sourceRoot": "src", 15 | "prefix": "app", 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:browser", 19 | "options": { 20 | "outputPath": "dist/dashboard-app", 21 | "index": "src/index.html", 22 | "main": "src/main.ts", 23 | "polyfills": "src/polyfills.ts", 24 | "tsConfig": "tsconfig.app.json", 25 | "inlineStyleLanguage": "scss", 26 | "assets": [ 27 | "src/favicon.ico", 28 | "src/assets" 29 | ], 30 | "styles": [ 31 | "src/styles.scss" 32 | ], 33 | "scripts": [] 34 | }, 35 | "configurations": { 36 | "production": { 37 | "budgets": [ 38 | { 39 | "type": "initial", 40 | "maximumWarning": "500kb", 41 | "maximumError": "1mb" 42 | }, 43 | { 44 | "type": "anyComponentStyle", 45 | "maximumWarning": "2kb", 46 | "maximumError": "4kb" 47 | } 48 | ], 49 | "fileReplacements": [ 50 | { 51 | "replace": "src/environments/environment.ts", 52 | "with": "src/environments/environment.prod.ts" 53 | } 54 | ], 55 | "outputHashing": "all" 56 | }, 57 | "development": { 58 | "buildOptimizer": false, 59 | "optimization": false, 60 | "vendorChunk": true, 61 | "extractLicenses": false, 62 | "sourceMap": true, 63 | "namedChunks": true 64 | } 65 | }, 66 | "defaultConfiguration": "production" 67 | }, 68 | "serve": { 69 | "builder": "@angular-devkit/build-angular:dev-server", 70 | "configurations": { 71 | "production": { 72 | "browserTarget": "DashboardApp:build:production" 73 | }, 74 | "development": { 75 | "browserTarget": "DashboardApp:build:development" 76 | } 77 | }, 78 | "defaultConfiguration": "development" 79 | }, 80 | "extract-i18n": { 81 | "builder": "@angular-devkit/build-angular:extract-i18n", 82 | "options": { 83 | "browserTarget": "DashboardApp:build" 84 | } 85 | }, 86 | "test": { 87 | "builder": "@angular-devkit/build-angular:karma", 88 | "options": { 89 | "main": "src/test.ts", 90 | "polyfills": "src/polyfills.ts", 91 | "tsConfig": "tsconfig.spec.json", 92 | "karmaConfig": "karma.conf.js", 93 | "inlineStyleLanguage": "scss", 94 | "assets": [ 95 | "src/favicon.ico", 96 | "src/assets" 97 | ], 98 | "styles": [ 99 | "src/styles.scss" 100 | ], 101 | "scripts": [] 102 | } 103 | }, 104 | "lint": { 105 | "builder": "@angular-eslint/builder:lint", 106 | "options": { 107 | "lintFilePatterns": [ 108 | "src/**/*.ts", 109 | "src/**/*.html" 110 | ] 111 | } 112 | } 113 | } 114 | } 115 | }, 116 | "cli": { 117 | "schematicCollections": [ 118 | "@angular-eslint/schematics" 119 | ], 120 | "analytics": false 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | jasmine: { 17 | // you can add configuration options for Jasmine here 18 | // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html 19 | // for example, you can disable the random execution with `random: false` 20 | // or set a specific seed with `seed: 4321` 21 | }, 22 | clearContext: false // leave Jasmine Spec Runner output visible in browser 23 | }, 24 | jasmineHtmlReporter: { 25 | suppressAll: true // removes the duplicated traces 26 | }, 27 | coverageReporter: { 28 | dir: require('path').join(__dirname, './coverage/dashboard-app'), 29 | subdir: '.', 30 | reporters: [ 31 | { type: 'html' }, 32 | { type: 'text-summary' } 33 | ] 34 | }, 35 | reporters: ['progress', 'kjhtml'], 36 | port: 9876, 37 | colors: true, 38 | logLevel: config.LOG_INFO, 39 | autoWatch: true, 40 | browsers: ['Chrome'], 41 | singleRun: false, 42 | restartOnFileChange: true 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dashboard-app", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test", 10 | "lint": "ng lint" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^15.1.4", 15 | "@angular/cdk": "^7.0.0", 16 | "@angular/common": "^15.1.4", 17 | "@angular/compiler": "^15.1.4", 18 | "@angular/core": "^15.1.4", 19 | "@angular/forms": "^15.1.4", 20 | "@angular/material": "^7.0.0", 21 | "@angular/platform-browser": "^15.1.4", 22 | "@angular/platform-browser-dynamic": "^15.1.4", 23 | "@angular/router": "^15.1.4", 24 | "chart.js": "^4.2.1", 25 | "ngx-pagination": "^6.0.3", 26 | "rxjs": "~7.5.0", 27 | "tslib": "^2.3.0", 28 | "zone.js": "~0.11.4" 29 | }, 30 | "devDependencies": { 31 | "@angular-devkit/build-angular": "^15.1.5", 32 | "@angular-eslint/builder": "15.2.1", 33 | "@angular-eslint/eslint-plugin": "15.2.1", 34 | "@angular-eslint/eslint-plugin-template": "15.2.1", 35 | "@angular-eslint/schematics": "15.2.1", 36 | "@angular-eslint/template-parser": "15.2.1", 37 | "@angular/cli": "^15.2.10", 38 | "@angular/compiler-cli": "^15.1.4", 39 | "@types/jasmine": "~4.0.0", 40 | "@typescript-eslint/eslint-plugin": "5.48.2", 41 | "@typescript-eslint/parser": "5.48.2", 42 | "eslint": "^8.33.0", 43 | "jasmine-core": "~4.2.0", 44 | "karma": "~6.4.0", 45 | "karma-chrome-launcher": "~3.1.0", 46 | "karma-coverage": "~2.2.0", 47 | "karma-jasmine": "~5.1.0", 48 | "karma-jasmine-html-reporter": "~2.0.0", 49 | "typescript": "~4.9.5" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { OrgLevelComponent } from './dashboard/org-level/org-level.component'; 4 | import { EnterpriseLevelComponent } from './dashboard/enterprise-level/enterprise-level.component'; 5 | import { ImpactAnalysisComponent } from './dashboard/impact-analysis/impact-analysis.component'; 6 | import { SampleApiResponseComponent } from './dashboard/sample-api-response/sample-api-response.component'; 7 | import { OrgSeatsComponent } from './dashboard/org-seats/org-seats.component'; 8 | 9 | const routes: Routes = [ 10 | { path: '', component: OrgLevelComponent }, 11 | { path: 'organization-level', component: OrgLevelComponent }, 12 | { path: 'enterprise-level', component: EnterpriseLevelComponent }, 13 | { path: 'impact', component: ImpactAnalysisComponent }, 14 | { path: 'sample-response', component: SampleApiResponseComponent }, 15 | { path: 'org-seats', component: OrgSeatsComponent }, 16 | ]; 17 | 18 | @NgModule({ 19 | imports: [RouterModule.forRoot(routes)], 20 | exports: [RouterModule] 21 | }) 22 | export class AppRoutingModule { } 23 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | } 4 | 5 | .main-content { 6 | flex-grow: 1; 7 | } -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async () => { 7 | await TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | }); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'Copilot Usage Dashboard'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.componentInstance; 26 | expect(app.title).toEqual('DashboardApp'); 27 | }); 28 | 29 | it('should render title', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.nativeElement as HTMLElement; 33 | expect(compiled.querySelector('.content span')?.textContent).toContain('DashboardApp app is running!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'DashboardApp'; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HttpClientModule } from '@angular/common/http'; 3 | import { BrowserModule } from '@angular/platform-browser'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatToolbarModule } from '@angular/material/toolbar'; 6 | import { MatIconModule} from '@angular/material/icon'; 7 | import { MatCardModule} from '@angular/material/card'; 8 | import { MatFormFieldModule} from '@angular/material/form-field'; 9 | import { MatInputModule } from '@angular/material/input'; 10 | import { MatSelectModule} from '@angular/material/select'; 11 | import { MatTableModule } from '@angular/material/table'; 12 | import { FormsModule } from '@angular/forms'; 13 | import { MatDialogModule } from '@angular/material/dialog'; 14 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 15 | import {MatSortModule} from '@angular/material/sort'; 16 | import { ReactiveFormsModule } from '@angular/forms'; 17 | import { NgxPaginationModule } from 'ngx-pagination'; 18 | 19 | import { AppRoutingModule } from './app-routing.module'; 20 | import { AppComponent } from './app.component'; 21 | import { HeaderComponent } from './header/header.component'; 22 | import { FooterComponent } from './footer/footer.component'; 23 | import { OrgLevelComponent } from './dashboard/org-level/org-level.component'; 24 | import { MatSidenavModule } from '@angular/material/sidenav'; 25 | import { MatListModule } from '@angular/material/list'; 26 | import { EnterpriseLevelComponent } from './dashboard/enterprise-level/enterprise-level.component'; 27 | import { ImpactAnalysisComponent } from './dashboard/impact-analysis/impact-analysis.component'; 28 | import { SampleApiResponseComponent } from './dashboard/sample-api-response/sample-api-response.component'; 29 | import { OrgSeatsComponent } from './dashboard/org-seats/org-seats.component'; 30 | 31 | 32 | @NgModule({ 33 | declarations: [ 34 | AppComponent, 35 | HeaderComponent, 36 | FooterComponent, 37 | OrgLevelComponent, 38 | EnterpriseLevelComponent, 39 | ImpactAnalysisComponent, 40 | SampleApiResponseComponent, 41 | OrgSeatsComponent 42 | ], 43 | imports: [ 44 | BrowserModule, 45 | HttpClientModule, 46 | BrowserAnimationsModule, 47 | AppRoutingModule, 48 | MatButtonModule, 49 | MatToolbarModule, 50 | MatIconModule, 51 | MatCardModule, 52 | MatFormFieldModule, 53 | MatInputModule, 54 | MatSelectModule, 55 | MatTableModule, 56 | NgxPaginationModule, 57 | FormsModule, 58 | MatDialogModule, 59 | MatSortModule, 60 | ReactiveFormsModule, 61 | MatSidenavModule, 62 | MatListModule 63 | ], 64 | providers: [], 65 | bootstrap: [AppComponent] 66 | }) 67 | export class AppModule { } 68 | -------------------------------------------------------------------------------- /src/app/dashboard/enterprise-level/enterprise-level.component.html: -------------------------------------------------------------------------------- 1 |

enterprise-level works!

2 | -------------------------------------------------------------------------------- /src/app/dashboard/enterprise-level/enterprise-level.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octodemo/Copilot-Usage-Dashboard/457e2490a4b25023aa7da300797abc0ee70b7a88/src/app/dashboard/enterprise-level/enterprise-level.component.scss -------------------------------------------------------------------------------- /src/app/dashboard/enterprise-level/enterprise-level.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EnterpriseLevelComponent } from './enterprise-level.component'; 4 | 5 | describe('EnterpriseLevelComponent', () => { 6 | let component: EnterpriseLevelComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ EnterpriseLevelComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(EnterpriseLevelComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/dashboard/enterprise-level/enterprise-level.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-enterprise-level', 5 | templateUrl: './enterprise-level.component.html', 6 | styleUrls: ['./enterprise-level.component.scss'] 7 | }) 8 | export class EnterpriseLevelComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/dashboard/impact-analysis/impact-analysis.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Impact Analysis: {{orgName}} 6 | Copilot Usage data at organization level 7 | 8 | 9 | 10 |
11 | 12 | 13 | {{card.title}} 14 | 15 |

{{card.subtitle}}

16 |
17 |
18 | 19 |

20 | {{card.content}} 21 |

22 |
23 |
24 |
25 | 26 | 27 | 28 | Cognitive load - Completion rate (%) 29 | Efficiency in completion without context switching (e.g. suggestions from other sources) 30 | 31 | 32 |
33 | {{ chart }} 34 |
35 |
36 |
37 | 38 | 39 | Flow state - Engagement volume (stacked) 40 | Interactions with users to solve problem 41 | 42 | 43 |
44 | {{ chart }} 45 |
46 |
47 |
48 | 49 | 50 | Feedback loops - Adaptability rate (%) 51 | Progressive learning and adjusting 52 | 53 | 54 |
55 | {{ chart }} 56 |
57 |
58 |
59 |
60 |
61 |
-------------------------------------------------------------------------------- /src/app/dashboard/impact-analysis/impact-analysis.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | margin-bottom: 20px; 3 | } 4 | 5 | .mainCard { 6 | height: fit-content; 7 | } 8 | 9 | .header { 10 | color: darkblue; 11 | font-size: 30px; 12 | font-weight: bold; 13 | } 14 | 15 | mat-card { 16 | width: 96.5% !important; 17 | margin: 4px; 18 | } 19 | 20 | #cognitive-impact-chart { 21 | max-height: 520px; 22 | width: 95%; 23 | padding: 10px; 24 | } 25 | 26 | .pie-container { 27 | display: flex; 28 | justify-content: space-between; 29 | } 30 | 31 | #lang-pie-chart { 32 | max-height: 520px; 33 | width: 50% !important; 34 | height: auto !important; 35 | } 36 | 37 | #editor-pie-chart { 38 | max-height: 520px; 39 | width: 50% !important; 40 | height: auto !important; 41 | } 42 | 43 | .card-container { 44 | display: flex; 45 | justify-content: space-between; 46 | } 47 | 48 | .summary-card { 49 | width: 300px; 50 | border: 0.4px solid #ccc; 51 | } 52 | 53 | .summary-card p { 54 | font-weight: lighter; 55 | } 56 | 57 | body { 58 | margin-bottom: 20px; 59 | } 60 | -------------------------------------------------------------------------------- /src/app/dashboard/impact-analysis/impact-analysis.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ImpactAnalysisComponent } from './impact-analysis.component'; 4 | 5 | describe('ImpactAnalysisComponent', () => { 6 | let component: ImpactAnalysisComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ImpactAnalysisComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ImpactAnalysisComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/dashboard/impact-analysis/impact-analysis.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ImpactService } from '../../services/impact.service'; 3 | import Chart from 'chart.js/auto'; 4 | import { environment } from 'src/environments/environment'; 5 | 6 | @Component({ 7 | selector: 'app-impact-analysis', 8 | templateUrl: './impact-analysis.component.html', 9 | styleUrls: ['./impact-analysis.component.scss'], 10 | 11 | }) 12 | 13 | export class ImpactAnalysisComponent implements OnInit { 14 | 15 | orgName: any = ""; 16 | data: any = []; 17 | public chart: any; 18 | public langChart: any; 19 | public langUserChart: any; 20 | public editorChart: any; 21 | public editorUserChart: any; 22 | xlabel: string[] = []; 23 | total_suggestions_count: any = []; 24 | total_acceptances_count: any = []; 25 | total_lines_suggested: any = []; 26 | total_lines_accepted: any = []; 27 | total_active_users: any = []; 28 | total_chat_acceptances: any = []; 29 | total_chat_turns: any = []; 30 | total_active_chat_users: any = []; 31 | 32 | cards: any; 33 | 34 | constructor(private impactService: ImpactService) { } 35 | 36 | ngOnInit(): void { 37 | this.orgName = environment.orgName; 38 | // create chart 39 | this.getData(); 40 | } 41 | 42 | getData() { 43 | 44 | // get data from service 45 | this.impactService.getCopilotUsageData().subscribe((data: any) => { 46 | // console.log(data); 47 | this.data = data; 48 | sessionStorage.setItem('orgData', JSON.stringify(data)); 49 | this.createChart(); 50 | }); 51 | } 52 | 53 | createChart() { 54 | let avgActiveUsers=0; 55 | let totalSuggestions=0; 56 | let totalAccepted=0; 57 | let totalChats=0; 58 | let count=0; 59 | 60 | // extract the day field from the data 61 | this.data.forEach((element: any) => { 62 | this.xlabel.push(element.day); 63 | this.total_suggestions_count.push(element.total_suggestions_count); 64 | this.total_acceptances_count.push(element.total_acceptances_count); 65 | this.total_lines_suggested.push(element.total_lines_suggested); 66 | this.total_lines_accepted.push(element.total_lines_accepted); 67 | this.total_active_users.push(element.total_active_users); 68 | this.total_chat_acceptances.push(element.total_chat_acceptances); 69 | this.total_chat_turns.push(element.total_chat_turns); 70 | this.total_active_chat_users.push(element.total_active_chat_users); 71 | count+=1; 72 | avgActiveUsers += element.total_active_users; 73 | totalSuggestions += element.total_suggestions_count; 74 | totalAccepted += element.total_acceptances_count; 75 | totalChats += element.total_chat_turns; 76 | }); 77 | 78 | this.cards = [ 79 | {title: 'Average Active Users', subtitle: Math.round(avgActiveUsers/count), content: 'Average number of Active Users for the last 28 days'}, 80 | {title: 'Total Suggestions', subtitle: totalSuggestions, content: 'The total number of suggestions offered by Copilot for all developers in last 28 days'}, 81 | {title: 'Total Acceptance', subtitle: totalAccepted, content: 'The total number of suggestions accepted by users in last 28 days'}, 82 | {title: 'Total Chats', subtitle: totalChats, content: 'The total number of chats interact with users in last 28 days'} 83 | ]; 84 | 85 | // Code Completion 86 | this.chart = new Chart("cognitive-impact-chart", { 87 | type: 'line', //this denotes tha type of chart 88 | 89 | data: {// values on X-Axis 90 | labels: this.xlabel, 91 | datasets: [ 92 | { 93 | label: "Acceptance Count / Suggestion Count", 94 | data: this.total_acceptances_count.map((value: number, index: number) => value / this.total_suggestions_count[index] * 100) 95 | }, 96 | { 97 | label: "Lines Accepted / Lines Suggested", 98 | data: this.total_lines_accepted.map((value: number, index: number) => value / this.total_lines_suggested[index] * 100) 99 | } 100 | ] 101 | } 102 | 103 | }); 104 | 105 | // Engagement 106 | this.chart = new Chart("flow-impact-chart", { 107 | type: 'bar', 108 | 109 | data: { 110 | labels: this.xlabel, 111 | datasets: [ 112 | { 113 | label: "Suggestions Count / Active Users", 114 | data: this.total_suggestions_count.map((value: number, index: number) => value / this.total_active_users[index]) 115 | } 116 | // ,{ 117 | // label: "Lines Suggested / Active Users", 118 | // data: this.total_lines_suggested.map((value: number, index: number) => value / this.total_active_users[index]) 119 | // } 120 | ,{ 121 | label: "Chat Turns / Active Chat Users", 122 | data: this.total_chat_turns.map((value: number, index: number) => value / this.total_active_chat_users[index]) 123 | } 124 | ] 125 | }, 126 | options: { 127 | scales: { 128 | x: { 129 | stacked: true 130 | }, 131 | y: { 132 | stacked: true 133 | } 134 | } 135 | } 136 | }); 137 | 138 | // Adaptability 139 | this.chart = new Chart("feedback-impact-chart", { 140 | type: 'line', 141 | 142 | data: { 143 | labels: this.xlabel, 144 | datasets: [ 145 | // { 146 | // label: "Chat Turns", 147 | // data: this.total_chat_turns 148 | // }, 149 | { 150 | label: "Chats Accepted / Chat Turns", 151 | data: this.total_chat_acceptances.map((value: number, index: number) => value / this.total_chat_turns[index] * 100) 152 | } 153 | ] 154 | } 155 | }); 156 | 157 | } 158 | 159 | } 160 | -------------------------------------------------------------------------------- /src/app/dashboard/org-level/org-level.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Organization: {{orgName}} 6 | Copilot Usage data at organization level 7 | 8 | 9 | 10 |
11 | 12 | 13 | {{card.title}} 14 |

{{card.subtitle}}

15 |
16 | 17 |

18 | {{card.content}} 19 |

20 |
21 |
22 |
23 | 24 | 25 | 26 | Number of Lines Suggested vs Accepted 27 | Double click the bar to drill down 28 | 29 | 30 |
31 | {{ chart }} 32 |
33 |
34 |
35 | 36 | 37 | Active Users 38 | 39 | 40 |
41 | {{ chart }} 42 |
43 |
44 |
45 | 46 | 47 | {{langTitle}} 48 | {{dateSelected}} 49 | 50 | 51 |
52 | {{ chart }} 53 |
54 |
55 |
56 | 69 | 70 | 71 | {{editorTitle}} 72 | {{dateSelected}} 73 | 74 | 75 |
76 | {{ chart }} 77 |
78 |
79 |
80 |
81 |
82 |
-------------------------------------------------------------------------------- /src/app/dashboard/org-level/org-level.component.scss: -------------------------------------------------------------------------------- 1 | .container{ 2 | 3 | margin-bottom: 20px; 4 | } 5 | .mainCard{ 6 | height:fit-content; 7 | } 8 | .header{ 9 | color:darkblue; 10 | font-size: 30px; 11 | font-weight: bold; 12 | } 13 | mat-card{ 14 | width: 96.5% !important; 15 | margin: 4px; 16 | } 17 | #org-summary-chart { 18 | max-height: 520px; 19 | width: 95%; 20 | padding: 10px; 21 | } 22 | .pie-container { 23 | display: flex; 24 | justify-content: space-between; 25 | } 26 | 27 | #lang-pie-chart { 28 | max-height: 520px; 29 | width: 50% !important; 30 | height: auto !important; 31 | } 32 | 33 | #editor-pie-chart{ 34 | max-height: 520px; 35 | width: 50% !important; 36 | height: auto !important; 37 | } 38 | 39 | .card-container { 40 | display: flex; 41 | justify-content: space-between; 42 | } 43 | 44 | .summary-card { 45 | width: 300px; 46 | border: 0.4px solid #ccc; 47 | } 48 | .summary-card p{ 49 | font-weight: lighter; 50 | } 51 | 52 | body { 53 | margin-bottom: 20px; 54 | } -------------------------------------------------------------------------------- /src/app/dashboard/org-level/org-level.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { OrgLevelComponent } from './org-level.component'; 4 | 5 | describe('OrgLevelComponent', () => { 6 | let component: OrgLevelComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ OrgLevelComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(OrgLevelComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/dashboard/org-level/org-level.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { OrganizationLevelService } from '../../services/organization-level.service'; 3 | import Chart from 'chart.js/auto'; 4 | import { environment } from 'src/environments/environment'; 5 | 6 | @Component({ 7 | selector: 'app-org-level', 8 | templateUrl: './org-level.component.html', 9 | styleUrls: ['./org-level.component.scss'] 10 | }) 11 | export class OrgLevelComponent implements OnInit { 12 | 13 | orgName: any = ""; 14 | data: any = []; 15 | public chart: any; 16 | public langChart: any; 17 | public langUserChart: any; 18 | public editorChart: any; 19 | public editorUserChart: any; 20 | xlabel: any = []; 21 | total_lines_suggested: any = []; 22 | total_lines_accepted: any = []; 23 | total_active_users: any = []; 24 | 25 | dateSelected: any = ""; 26 | langTitle: any = ""; 27 | editorTitle: any = ""; 28 | pieChartTitle: any = ""; 29 | 30 | cards: any; 31 | 32 | constructor(private organizationLevelService: OrganizationLevelService) { } 33 | 34 | ngOnInit(): void { 35 | this.orgName = environment.orgName; 36 | // create chart 37 | this.getData(); 38 | } 39 | 40 | getData() { 41 | 42 | // get data from service 43 | this.organizationLevelService.getCopilotUsageData().subscribe((data: any) => { 44 | // console.log(data); 45 | this.data = data; 46 | sessionStorage.setItem('orgData', JSON.stringify(data)); 47 | this.createChart(); 48 | }); 49 | } 50 | 51 | createChart() { 52 | var avgActiveUsers=0; 53 | var totalSuggestions=0; 54 | var totalAccepted=0; 55 | var count=0; 56 | 57 | // extract the day field from the data 58 | this.data.forEach((element: any) => { 59 | this.xlabel.push(element.day); 60 | this.total_lines_suggested.push(element.total_lines_suggested); 61 | this.total_lines_accepted.push(element.total_lines_accepted); 62 | this.total_active_users.push(element.total_active_users); 63 | count+=1; 64 | avgActiveUsers += element.total_active_users; 65 | totalSuggestions += element.total_suggestions_count; 66 | totalAccepted += element.total_acceptances_count; 67 | }); 68 | 69 | this.cards = [ 70 | {title: 'Average Active Users', subtitle: Math.round(avgActiveUsers/count), content: 'Average number of Active Users for the last 28 days'}, 71 | {title: 'Total Suggestions', subtitle: totalSuggestions, content: 'The total number of suggestions offered by Copilot for all developers in last 28 days'}, 72 | {title: 'Total Acceptance', subtitle: totalAccepted, content: 'The total number of suggestions accepted by users in last 28 days'}, 73 | {title: 'Acceptance Rate', subtitle: Number((totalAccepted/totalSuggestions*100).toFixed(2))+"%", content: 'Percentage of suggestions that were accepted by users in the last 28 days'} 74 | ]; 75 | this.chart = new Chart("org-summary-chart", { 76 | type: 'bar', //this denotes tha type of chart 77 | 78 | data: {// values on X-Axis 79 | labels: this.xlabel, 80 | datasets: [ 81 | { 82 | label: "Lines Suggested", 83 | data: this.total_lines_suggested 84 | }, 85 | { 86 | label: "Lines Accepted", 87 | data: this.total_lines_accepted 88 | } 89 | ] 90 | }, 91 | options: { 92 | aspectRatio: 2.5, 93 | onClick: this.handleClick 94 | } 95 | 96 | }); 97 | 98 | this.chart = new Chart("org-users-chart", { 99 | type: 'line', 100 | 101 | data: { 102 | labels: this.xlabel, 103 | datasets: [ 104 | { 105 | label: "Active Users", 106 | data: this.total_active_users 107 | } 108 | ] 109 | } 110 | }); 111 | } 112 | 113 | handleClick = (evt: any): void => { 114 | var points = evt.chart.getElementsAtEventForMode(evt, 'nearest', { 115 | intersect: true 116 | }, true); 117 | if (points.length) { 118 | const firstPoint = points[0]; 119 | const label = evt.chart.data.labels[firstPoint.index]; 120 | this.dateSelected = "Selected Date: " + label ; 121 | 122 | // find the data for the selected label 123 | var orgData = JSON.parse(sessionStorage.getItem('orgData') || '{}'); 124 | var innerData: any = ""; 125 | 126 | for (let element of orgData) { 127 | if (element.day == label) { 128 | innerData = element.breakdown; 129 | break; 130 | } 131 | } 132 | 133 | var xLangLabel: any = []; 134 | var lang_lines_suggested: any = []; 135 | var lang_lines_accepted: any = []; 136 | var lang_active_users: any = []; 137 | 138 | var xEditorLabel: any = []; 139 | var editor_lines_suggested: any = []; 140 | var editor_lines_accepted: any = []; 141 | var editor_active_users: any = []; 142 | 143 | innerData.forEach((element: any) => { 144 | if (xLangLabel.indexOf(element.language) == -1) { 145 | xLangLabel.push(element.language); 146 | lang_lines_suggested.push(element.lines_suggested); 147 | lang_lines_accepted.push(element.lines_accepted); 148 | lang_active_users.push(element.active_users); 149 | } else { 150 | lang_lines_suggested[xLangLabel.indexOf(element.language)] += element.lines_suggested; 151 | lang_lines_accepted[xLangLabel.indexOf(element.language)] += element.lines_accepted; 152 | lang_active_users[xLangLabel.indexOf(element.language)] += element.active_users; 153 | } 154 | }); 155 | 156 | innerData.forEach((element: any) => { 157 | if (xEditorLabel.indexOf(element.editor) == -1) { 158 | xEditorLabel.push(element.editor); 159 | editor_lines_suggested.push(element.lines_suggested); 160 | editor_lines_accepted.push(element.lines_accepted); 161 | editor_active_users.push(element.active_users); 162 | } else { 163 | editor_lines_suggested[xEditorLabel.indexOf(element.editor)] += element.lines_suggested; 164 | editor_lines_accepted[xEditorLabel.indexOf(element.editor)] += element.lines_accepted; 165 | editor_active_users[xEditorLabel.indexOf(element.editor)] += element.active_users; 166 | } 167 | 168 | }); 169 | 170 | // chart for language breakdown 171 | this.languageChart(xLangLabel, lang_lines_suggested, lang_lines_accepted); 172 | 173 | // chart for Active Users breakdown - language wise and editor wise 174 | //this.langAndEditorUserChart(xLangLabel, lang_active_users, xEditorLabel, editor_active_users); 175 | 176 | // chart for editor breakdown 177 | this.editorDetChart(xEditorLabel, editor_lines_suggested, editor_lines_accepted); 178 | 179 | } 180 | 181 | } 182 | 183 | languageChart(xLangLabel: any,lang_lines_suggested:any,lang_lines_accepted:any ): void { 184 | 185 | this.langTitle=" Language: Number of Lines Suggested vs Accepted"; 186 | if (this.langChart) { this.langChart.destroy(); } 187 | this.langChart = new Chart("lang-chart", { 188 | type: 'bar', //this denotes tha type of chart 189 | 190 | data: {// values on X-Axis 191 | labels: xLangLabel, 192 | datasets: [ 193 | { 194 | label: "Lines Suggested", 195 | data: lang_lines_suggested 196 | }, 197 | { 198 | label: "Lines Accepted", 199 | data: lang_lines_accepted 200 | } 201 | ] 202 | }, 203 | options: { 204 | aspectRatio: 2.5 205 | } 206 | 207 | }); 208 | } 209 | 210 | editorDetChart(xEditorLabel: any,editor_lines_suggested:any, editor_lines_accepted:any ): void { 211 | 212 | this.editorTitle= "Editor: Number of Lines Suggested vs Accepted"; 213 | // add stacked bar chart using xEditorLabel, total_lines_suggested and total_lines_accepted 214 | if (this.editorChart) { this.editorChart.destroy(); } 215 | this.editorChart = new Chart("editor-chart", { 216 | type: 'bar', //this denotes tha type of chart 217 | 218 | data: {// values on X-Axis 219 | labels: xEditorLabel, 220 | datasets: [ 221 | { 222 | label: "Lines Suggested", 223 | data: editor_lines_suggested 224 | }, 225 | { 226 | label: "Lines Accepted", 227 | data: editor_lines_accepted 228 | } 229 | ] 230 | }, 231 | options: { 232 | aspectRatio: 2.5 233 | } 234 | 235 | }); 236 | } 237 | 238 | langAndEditorUserChart(xLangLabel: any,lang_active_users:any ,xEditorLabel: any,editor_active_users:any): void { 239 | 240 | this.pieChartTitle="Active Users: Language & Editor"; 241 | // add a pie chart using xLangLabel and total_active_users 242 | if (this.langUserChart) { this.langUserChart.destroy(); } 243 | this.langUserChart = new Chart("lang-pie-chart", { 244 | type: 'pie', //this denotes tha type of chart 245 | 246 | data: {// values on X-Axis 247 | labels: xLangLabel, 248 | datasets: [ 249 | { 250 | label: "Active Users", 251 | data: lang_active_users 252 | } 253 | ] 254 | } 255 | }); 256 | 257 | // add a pie chart using xEditorLabel and total_active_users 258 | if (this.editorUserChart) { this.editorUserChart.destroy(); } 259 | this.editorUserChart = new Chart("editor-pie-chart", { 260 | type: 'pie', //this denotes tha type of chart 261 | 262 | data: {// values on X-Axis 263 | labels: xEditorLabel, 264 | datasets: [ 265 | { 266 | label: "Active Users", 267 | data: editor_active_users 268 | } 269 | ] 270 | }, 271 | options: { 272 | aspectRatio: 2.5, 273 | scales: { 274 | x: { 275 | stacked: true 276 | }, 277 | y: { 278 | stacked: true 279 | } 280 | } 281 | } 282 | 283 | }); 284 | } 285 | 286 | } -------------------------------------------------------------------------------- /src/app/dashboard/org-seats/org-seats.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | {{seat.category}} 6 | 7 |

{{seat.value}}

8 |
9 |
10 | 11 |

12 | {{seat.desc}} 13 |

14 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
UserCreate DateUpdated DateLast Activity DateLast Activity EditorPending Cancellation
{{ seat.assignee.login }}{{ seat.created_at | date:'dd-MMM-yyyy' }}{{ seat.updated_at | date:'dd-MMM-yyyy'}}{{ seat.last_activity_at | date:'dd-MMM-yyyy'}}{{ seat.last_activity_editor }}{{ seat.pending_cancellation_date| date:'dd-MMM-yyyy' }}
37 | 38 | 39 | 40 |
-------------------------------------------------------------------------------- /src/app/dashboard/org-seats/org-seats.component.scss: -------------------------------------------------------------------------------- 1 | 2 | .container{ 3 | margin-bottom: 20px; 4 | } 5 | .card-container { 6 | display: flex; 7 | justify-content: space-between; 8 | margin-bottom: 10px; 9 | } 10 | 11 | .summary-card { 12 | width: 300px; 13 | height: fit-content; 14 | border: 0.4px solid #ccc; 15 | margin: 5px; 16 | } 17 | .summary-card p{ 18 | font-weight: lighter; 19 | } 20 | 21 | /* Table formatting */ 22 | table { 23 | width: 100%; 24 | border-collapse: collapse; 25 | margin-bottom: 20px; 26 | } 27 | 28 | th, td { 29 | border: 1px solid #ddd; 30 | padding: 8px; 31 | text-align: left; 32 | } 33 | 34 | th { 35 | background-color: rgb(20, 20, 40); 36 | color: white; 37 | font-size:large; 38 | } 39 | 40 | tr:nth-child(even) { 41 | background-color: #f2f2f2; 42 | } -------------------------------------------------------------------------------- /src/app/dashboard/org-seats/org-seats.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { OrgSeatsComponent } from './org-seats.component'; 4 | 5 | describe('OrgSeatsComponent', () => { 6 | let component: OrgSeatsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ OrgSeatsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(OrgSeatsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/dashboard/org-seats/org-seats.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import Chart from 'chart.js/auto'; 3 | import { Sort } from '@angular/material/sort'; 4 | import { environment } from 'src/environments/environment'; 5 | import { OrganizationLevelService } from '../../services/organization-level.service'; 6 | 7 | 8 | @Component({ 9 | selector: 'app-org-seats', 10 | templateUrl: './org-seats.component.html', 11 | styleUrls: ['./org-seats.component.scss'] 12 | }) 13 | export class OrgSeatsComponent implements OnInit { 14 | 15 | public chart: any; 16 | orgName: any = ""; 17 | data: any = []; 18 | seatDetails: any ; 19 | 20 | // data source for table 21 | seatInformation: any; 22 | page:number = 1; 23 | 24 | constructor(private organizationLevelService: OrganizationLevelService) { } 25 | 26 | ngOnInit(): void { 27 | this.orgName = environment.orgName; 28 | // create chart 29 | this.createChart(); 30 | } 31 | 32 | createChart(){ 33 | 34 | var xLabel=['Active','Inactive']; 35 | var users=[0,0]; 36 | 37 | // get data from service 38 | this.organizationLevelService.getCopilotSeatsData().subscribe((data: any) => { 39 | // console.log(data); 40 | this.data = data; 41 | sessionStorage.setItem('orgData', JSON.stringify(data)); 42 | this.seatInformation = data.seats; 43 | // calculate active and inactive users 44 | this.data.seats.forEach((element: any) => { 45 | if (element.last_activity_at && element.last_activity_at.trim() !== '') { 46 | users[1]++; 47 | } 48 | else{ 49 | users[0]++; 50 | } 51 | }); 52 | 53 | this.seatDetails=[ 54 | {category: 'Total Seat', value: this.data.total_seats, desc: 'Total number of seats purchased'}, 55 | {category: 'Active Users', value: users[1], desc: 'Total number of active users'}, 56 | {category: 'Inactive Users', value: users[0], desc: 'Total number of inactive users'} 57 | ]; 58 | 59 | }); 60 | } 61 | 62 | compare(a: number | string, b: number | string, isAsc: boolean) { 63 | if (a === null) return isAsc ? -1 : 1; 64 | if (b === null) return isAsc ? 1 : -1; 65 | return (a < b ? -1 : 1) * (isAsc ? 1 : -1); 66 | } 67 | 68 | sortData(sort: Sort) { 69 | const data = this.seatInformation.slice(); 70 | if (!sort.active || sort.direction === '') { 71 | this.seatInformation = data; 72 | return; 73 | } 74 | 75 | this.seatInformation = data.sort((a: any, b: any) => { 76 | const isAsc = sort.direction === 'asc'; 77 | switch (sort.active) { 78 | case 'user': return this.compare(a.assignee.login, b.assignee.login, isAsc); 79 | case 'createDate': return this.compare(a.created_at, b.created_at, isAsc); 80 | case 'updatedDate': return this.compare(a.updated_at, b.updated_at, isAsc); 81 | case 'lastActivityDate': return this.compare(a.last_activity_at, b.last_activity_at, isAsc); 82 | case 'lastActivityEditor': return this.compare(a.last_activity_editor, b.last_activity_editor, isAsc); 83 | case 'pendingCancellation': return this.compare(a.pending_cancellation_date, b.pending_cancellation_date, isAsc); 84 | default: return 0; 85 | } 86 | }); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/app/dashboard/sample-api-response/sample-api-response.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Sample Copilot Usage API Response (alpha) 6 | 7 | 8 |
{{ sample_usage_api_response | json }}
9 |
10 |
11 | 12 | 13 | 14 | Sample Copilot Seats Assignments API Response (beta) 15 | Copilot for Business APIs 16 | 17 | 18 |
{{ sample_seats_api_response | json }}
19 |
20 |
21 | 22 |
-------------------------------------------------------------------------------- /src/app/dashboard/sample-api-response/sample-api-response.component.scss: -------------------------------------------------------------------------------- 1 | .mainCard{ 2 | scroll-behavior: smooth; 3 | height: 60%; 4 | overflow-y: scroll; 5 | border: 2px solid #e6e6e6; 6 | margin: 8px; 7 | } -------------------------------------------------------------------------------- /src/app/dashboard/sample-api-response/sample-api-response.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SampleApiResponseComponent } from './sample-api-response.component'; 4 | 5 | describe('SampleApiResponseComponent', () => { 6 | let component: SampleApiResponseComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ SampleApiResponseComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SampleApiResponseComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/dashboard/sample-api-response/sample-api-response.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-sample-api-response', 5 | templateUrl: './sample-api-response.component.html', 6 | styleUrls: ['./sample-api-response.component.scss'] 7 | }) 8 | export class SampleApiResponseComponent { 9 | sample_usage_api_response: any; 10 | sample_seats_api_response: any; 11 | 12 | ngOnInit(): void { 13 | this.sample_usage_api_response = [ 14 | { 15 | "total_suggestions_count": 10305, 16 | "total_acceptances_count": 2515, 17 | "total_lines_suggested": 21604, 18 | "total_lines_accepted": 4885, 19 | "total_active_users": 120, 20 | "day": "2023-12-07", 21 | "breakdown": [ 22 | { 23 | "language": "bat", 24 | "editor": "vscode", 25 | "suggestions_count": 3, 26 | "acceptances_count": 0, 27 | "lines_suggested": 3, 28 | "lines_accepted": 0, 29 | "active_users": 1 30 | }, 31 | { 32 | "language": "gdscript", 33 | "editor": "vscode", 34 | "suggestions_count": 83, 35 | "acceptances_count": 9, 36 | "lines_suggested": 333, 37 | "lines_accepted": 9, 38 | "active_users": 2 39 | } 40 | ] 41 | }, 42 | { 43 | "total_suggestions_count": 6378, 44 | "total_acceptances_count": 1716, 45 | "total_lines_suggested": 15311, 46 | "total_lines_accepted": 3507, 47 | "total_active_users": 99, 48 | "day": "2023-12-08", 49 | "breakdown": [ 50 | { 51 | "language": "gdscript", 52 | "editor": "vscode", 53 | "suggestions_count": 56, 54 | "acceptances_count": 4, 55 | "lines_suggested": 129, 56 | "lines_accepted": 5, 57 | "active_users": 2 58 | }, 59 | { 60 | "language": "git-commit", 61 | "editor": "vscode", 62 | "suggestions_count": 7, 63 | "acceptances_count": 1, 64 | "lines_suggested": 9, 65 | "lines_accepted": 1, 66 | "active_users": 2 67 | } 68 | ] 69 | } 70 | ]; 71 | 72 | this.sample_seats_api_response={ 73 | "total_seats": 2, 74 | "seats": [ 75 | { 76 | "created_at": "2023-08-29T05:20:55+05:30", 77 | "assignee": { 78 | "login": "user1", 79 | "id": 3992, 80 | "node_id": "MDQ6VXNlcHHMM", 81 | "avatar_url": "https://avatars.githubusercontent.com/u/3992?v=4", 82 | "gravatar_id": "", 83 | "url": "https://api.github.com/users/user1", 84 | "html_url": "https://github.com/user1", 85 | "followers_url": "https://api.github.com/users/user1/followers", 86 | "following_url": "https://api.github.com/users/user1/following{/other_user}", 87 | "gists_url": "https://api.github.com/users/user1/gists{/gist_id}", 88 | "starred_url": "https://api.github.com/users/user1/starred{/owner}{/repo}", 89 | "subscriptions_url": "https://api.github.com/users/user1/subscriptions", 90 | "organizations_url": "https://api.github.com/users/user1/orgs", 91 | "repos_url": "https://api.github.com/users/user1/repos", 92 | "events_url": "https://api.github.com/users/user1/events{/privacy}", 93 | "received_events_url": "https://api.github.com/users/user1/received_events", 94 | "type": "User", 95 | "site_admin": true 96 | }, 97 | "updated_at": "2024-01-03T13:30:00+05:30", 98 | "pending_cancellation_date": null, 99 | "last_activity_at": "2023-12-23T14:26:03+05:30", 100 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2023122001" 101 | }, 102 | { 103 | "created_at": "2023-08-29T05:20:55+05:30", 104 | "assignee": { 105 | "login": "user2", 106 | "id": 4215, 107 | "node_id": "MDJJFNXNlQyMTU=", 108 | "avatar_url": "https://avatars.githubusercontent.com/u/4215?v=4", 109 | "gravatar_id": "", 110 | "url": "https://api.github.com/users/user2", 111 | "html_url": "https://github.com/user2", 112 | "followers_url": "https://api.github.com/users/user2/followers", 113 | "following_url": "https://api.github.com/users/user2/following{/other_user}", 114 | "gists_url": "https://api.github.com/users/user2/gists{/gist_id}", 115 | "starred_url": "https://api.github.com/users/user2/starred{/owner}{/repo}", 116 | "subscriptions_url": "https://api.github.com/users/user2/subscriptions", 117 | "organizations_url": "https://api.github.com/users/user2/orgs", 118 | "repos_url": "https://api.github.com/users/user2/repos", 119 | "events_url": "https://api.github.com/users/user2/events{/privacy}", 120 | "received_events_url": "https://api.github.com/users/user2/received_events", 121 | "type": "User", 122 | "site_admin": true 123 | }, 124 | "updated_at": "2024-01-03T13:30:00+05:30", 125 | "pending_cancellation_date": null, 126 | "last_activity_at": "2024-01-10T11:37:16+05:30", 127 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 128 | } 129 | ] 130 | }; 131 | 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /src/app/footer/footer.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/footer/footer.component.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | position: fixed; 3 | left: 0; 4 | bottom: 0; 5 | width: 100%; 6 | background-color: #f8f9fa; 7 | text-align: center; 8 | } -------------------------------------------------------------------------------- /src/app/footer/footer.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FooterComponent } from './footer.component'; 4 | 5 | describe('FooterComponent', () => { 6 | let component: FooterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ FooterComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(FooterComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | templateUrl: './footer.component.html', 6 | styleUrls: ['./footer.component.scss'] 7 | }) 8 | export class FooterComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/header/header.component.html: -------------------------------------------------------------------------------- 1 |

2 | 3 | 6 | Copilot Usage Dashboard 7 | 8 | 15 | 16 |

21 | 22 | -------------------------------------------------------------------------------- /src/app/header/header.component.scss: -------------------------------------------------------------------------------- 1 | .example-spacer { 2 | flex: 0.8 1 auto; 3 | } 4 | 5 | nav a{ 6 | margin-right: 3%; 7 | color: white; 8 | font-size: medium; 9 | } 10 | nav a:active{ 11 | color: yellow; 12 | } -------------------------------------------------------------------------------- /src/app/header/header.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HeaderComponent } from './header.component'; 4 | 5 | describe('HeaderComponent', () => { 6 | let component: HeaderComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ HeaderComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(HeaderComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/header/header.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { MatDialog } from '@angular/material/dialog'; 4 | 5 | @Component({ 6 | selector: 'app-header', 7 | templateUrl: './header.component.html', 8 | styleUrls: ['./header.component.scss'] 9 | }) 10 | export class HeaderComponent { 11 | 12 | constructor(private router: Router, public dialog: MatDialog) { } 13 | 14 | links = [ 15 | {label: 'Organization', path: '/organization-level'}, 16 | {label: 'impact', path: '/impact'}, 17 | {label: 'Sample Response', path: '/sample-response'}, 18 | {label: 'Org Seats', path: '/org-seats'}, 19 | {label: 'Enterprise', path: '/enterprise-level'}, 20 | ]; 21 | 22 | ngOnInit(): void { 23 | } 24 | gotoHome() { 25 | this.router.navigate(['']); 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/app/services/enterprise-level.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { Observable } from 'rxjs'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class EnterpriseLevelService { 9 | 10 | private dataUrl = 'copilot_usage_data.json'; // URL to JSON data 11 | 12 | constructor(private http: HttpClient) { } 13 | 14 | getData(): Observable { 15 | return this.http.get(this.dataUrl); 16 | } 17 | } -------------------------------------------------------------------------------- /src/app/services/impact.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders } from '@angular/common/http'; 3 | import { Observable } from 'rxjs'; 4 | import { environment } from './../../environments/environment'; 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class ImpactService { 10 | 11 | private copilotUsageDataUrl = 'assets/copilot_usage_data.json'; // URL to JSON data 12 | private copilotSeatsDataUrl = 'assets/copilot_seats_data.json'; // URL to JSON data 13 | 14 | constructor(private http: HttpClient) { } 15 | 16 | getCopilotUsageData(): Observable { 17 | // sample dta loaded from local file 18 | return this.http.get(this.copilotUsageDataUrl); 19 | // uncomment below line to invoke API 20 | // modify the environment file to add your token 21 | // modify the organization name to your organization 22 | // return this.invokeCopilotUsageApi(); 23 | } 24 | 25 | getCopilotSeatsData(): Observable { 26 | // sample dta loaded from local file 27 | return this.http.get(this.copilotSeatsDataUrl); 28 | // uncomment below line to invoke API 29 | // modify the environment file to add your token 30 | // modify the organization name to your organization 31 | // return this.invokeCopilotSeatApi(); 32 | } 33 | 34 | invokeCopilotUsageApi(): Observable { 35 | const orgName = environment.orgName; 36 | const apiUrl = `${environment.ghBaseUrl}/${orgName}/${environment.copilotUsageApiUrl}`; 37 | const token = environment.token; 38 | 39 | const headers = new HttpHeaders({ 40 | 'Accept': 'application/vnd.github+json', 41 | 'Authorization': `Bearer ${token}`, 42 | 'X-GitHub-Api-Version': '2022-11-28' 43 | }); 44 | 45 | return this.http.get(apiUrl, { headers }); 46 | } 47 | 48 | invokeCopilotSeatApi(): Observable { 49 | const orgName = environment.orgName; 50 | const apiUrl = `${environment.ghBaseUrl}/${orgName}/${environment.copilotSeatApiUrl}`; 51 | var data:any; 52 | var firstPage=true; 53 | var pageNo=1; 54 | var totalPages=1; 55 | 56 | // get the paginated Copilot Seat allocation data 57 | do{ 58 | var response = this.getPaginatedSeatsData(apiUrl, pageNo); 59 | response.subscribe((data: any) => { 60 | if(firstPage){ 61 | data=data; 62 | firstPage=false; 63 | totalPages=data.total_pages; 64 | } 65 | else{ 66 | data.seats=data.seats.concat(data.seats); 67 | } 68 | }); 69 | pageNo=pageNo+1; 70 | }while(pageNo < totalPages); 71 | 72 | return data; 73 | } 74 | 75 | getPaginatedSeatsData(apiUrl:any, pageNo:any): Observable { 76 | const token = environment.token; 77 | 78 | const headers = new HttpHeaders({ 79 | 'Accept': 'application/vnd.github+json', 80 | 'Authorization': `Bearer ${token}`, 81 | 'X-GitHub-Api-Version': '2022-11-28' 82 | }); 83 | 84 | return this.http.get(apiUrl+"?page="+pageNo, { headers }); 85 | 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /src/app/services/organization-level.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders } from '@angular/common/http'; 3 | import { Observable } from 'rxjs'; 4 | import { environment } from './../../environments/environment'; 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class OrganizationLevelService { 10 | 11 | private copilotUsageDataUrl = 'assets/copilot_usage_data.json'; // URL to JSON data 12 | private copilotSeatsDataUrl = 'assets/copilot_seats_data.json'; // URL to JSON data 13 | 14 | constructor(private http: HttpClient) { } 15 | 16 | getCopilotUsageData(): Observable { 17 | // sample dta loaded from local file 18 | return this.http.get(this.copilotUsageDataUrl); 19 | // uncomment below line to invoke API 20 | // modify the environment file to add your token 21 | // modify the organization name to your organization 22 | // return this.invokeCopilotUsageApi(); 23 | } 24 | 25 | getCopilotSeatsData(): Observable { 26 | // sample dta loaded from local file 27 | return this.http.get(this.copilotSeatsDataUrl); 28 | // uncomment below line to invoke API 29 | // modify the environment file to add your token 30 | // modify the organization name to your organization 31 | // return this.invokeCopilotSeatApi(); 32 | } 33 | 34 | invokeCopilotUsageApi(): Observable { 35 | const orgName = environment.orgName; 36 | const apiUrl = `${environment.ghBaseUrl}/${orgName}/${environment.copilotUsageApiUrl}`; 37 | const token = environment.token; 38 | 39 | const headers = new HttpHeaders({ 40 | 'Accept': 'application/vnd.github+json', 41 | 'Authorization': `Bearer ${token}`, 42 | 'X-GitHub-Api-Version': '2022-11-28' 43 | }); 44 | 45 | return this.http.get(apiUrl, { headers }); 46 | } 47 | 48 | invokeCopilotSeatApi(): Observable { 49 | const orgName = environment.orgName; 50 | const apiUrl = `${environment.ghBaseUrl}/${orgName}/${environment.copilotSeatApiUrl}`; 51 | var data:any; 52 | var firstPage=true; 53 | var pageNo=1; 54 | var totalPages=1; 55 | 56 | // get the paginated Copilot Seat allocation data 57 | do{ 58 | var response = this.getPaginatedSeatsData(apiUrl, pageNo); 59 | response.subscribe((data: any) => { 60 | if(firstPage){ 61 | data=data; 62 | firstPage=false; 63 | totalPages=data.total_pages; 64 | } 65 | else{ 66 | data.seats=data.seats.concat(data.seats); 67 | } 68 | }); 69 | pageNo=pageNo+1; 70 | }while(pageNo < totalPages); 71 | 72 | return data; 73 | } 74 | 75 | getPaginatedSeatsData(apiUrl:any, pageNo:any): Observable { 76 | const token = environment.token; 77 | 78 | const headers = new HttpHeaders({ 79 | 'Accept': 'application/vnd.github+json', 80 | 'Authorization': `Bearer ${token}`, 81 | 'X-GitHub-Api-Version': '2022-11-28' 82 | }); 83 | 84 | return this.http.get(apiUrl+"?page="+pageNo, { headers }); 85 | 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octodemo/Copilot-Usage-Dashboard/457e2490a4b25023aa7da300797abc0ee70b7a88/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/copilot_seats_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "total_seats": 50, 3 | "seats": [ 4 | { 5 | "created_at": "2023-08-29T05:20:55+05:30", 6 | "assignee": { 7 | "login": "mam201", 8 | "id": 3992, 9 | "node_id": "MDQ6VXNlcjM5OTI=", 10 | "avatar_url": "https://avatars.githubusercontent.com/u/3992?v=4", 11 | "gravatar_id": "", 12 | "url": "https://api.github.com/users/mam201", 13 | "html_url": "https://github.com/mam201", 14 | "followers_url": "https://api.github.com/users/mam201/followers", 15 | "following_url": "https://api.github.com/users/mam201/following{/other_user}", 16 | "gists_url": "https://api.github.com/users/mam201/gists{/gist_id}", 17 | "starred_url": "https://api.github.com/users/mam201/starred{/owner}{/repo}", 18 | "subscriptions_url": "https://api.github.com/users/mam201/subscriptions", 19 | "organizations_url": "https://api.github.com/users/mam201/orgs", 20 | "repos_url": "https://api.github.com/users/mam201/repos", 21 | "events_url": "https://api.github.com/users/mam201/events{/privacy}", 22 | "received_events_url": "https://api.github.com/users/mam201/received_events", 23 | "type": "User", 24 | "site_admin": true 25 | }, 26 | "updated_at": "2024-01-03T13:30:00+05:30", 27 | "pending_cancellation_date": null, 28 | "last_activity_at": "2023-12-23T14:26:03+05:30", 29 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2023122001" 30 | }, 31 | { 32 | "created_at": "2023-08-29T05:20:55+05:30", 33 | "assignee": { 34 | "login": "nath200", 35 | "id": 4215, 36 | "node_id": "MDQ6VXNlcjQyMTU=", 37 | "avatar_url": "https://avatars.githubusercontent.com/u/4215?v=4", 38 | "gravatar_id": "", 39 | "url": "https://api.github.com/users/nath200", 40 | "html_url": "https://github.com/nath200", 41 | "followers_url": "https://api.github.com/users/nath200/followers", 42 | "following_url": "https://api.github.com/users/nath200/following{/other_user}", 43 | "gists_url": "https://api.github.com/users/nath200/gists{/gist_id}", 44 | "starred_url": "https://api.github.com/users/nath200/starred{/owner}{/repo}", 45 | "subscriptions_url": "https://api.github.com/users/nath200/subscriptions", 46 | "organizations_url": "https://api.github.com/users/nath200/orgs", 47 | "repos_url": "https://api.github.com/users/nath200/repos", 48 | "events_url": "https://api.github.com/users/nath200/events{/privacy}", 49 | "received_events_url": "https://api.github.com/users/nath200/received_events", 50 | "type": "User", 51 | "site_admin": true 52 | }, 53 | "updated_at": "2024-01-03T13:30:00+05:30", 54 | "pending_cancellation_date": null, 55 | "last_activity_at": "2024-01-10T11:37:16+05:30", 56 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 57 | }, 58 | { 59 | "created_at": "2023-08-29T05:20:55+05:30", 60 | "assignee": { 61 | "login": "naarf10", 62 | "id": 4483, 63 | "node_id": "MDQ6VXNlcjQ0ODM=", 64 | "avatar_url": "https://avatars.githubusercontent.com/u/4483?v=4", 65 | "gravatar_id": "", 66 | "url": "https://api.github.com/users/naarf10", 67 | "html_url": "https://github.com/naarf10", 68 | "followers_url": "https://api.github.com/users/naarf10/followers", 69 | "following_url": "https://api.github.com/users/naarf10/following{/other_user}", 70 | "gists_url": "https://api.github.com/users/naarf10/gists{/gist_id}", 71 | "starred_url": "https://api.github.com/users/naarf10/starred{/owner}{/repo}", 72 | "subscriptions_url": "https://api.github.com/users/naarf10/subscriptions", 73 | "organizations_url": "https://api.github.com/users/naarf10/orgs", 74 | "repos_url": "https://api.github.com/users/naarf10/repos", 75 | "events_url": "https://api.github.com/users/naarf10/events{/privacy}", 76 | "received_events_url": "https://api.github.com/users/naarf10/received_events", 77 | "type": "User", 78 | "site_admin": true 79 | }, 80 | "updated_at": "2024-01-03T13:30:00+05:30", 81 | "pending_cancellation_date": null, 82 | "last_activity_at": "2024-01-10T13:42:46+05:30", 83 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 84 | }, 85 | { 86 | "created_at": "2023-08-29T05:20:55+05:30", 87 | "assignee": { 88 | "login": "arfkanny", 89 | "id": 10515, 90 | "node_id": "MDQ6VXNlcjEwNTE1", 91 | "avatar_url": "https://avatars.githubusercontent.com/u/10515?v=4", 92 | "gravatar_id": "", 93 | "url": "https://api.github.com/users/arfkanny", 94 | "html_url": "https://github.com/arfkanny", 95 | "followers_url": "https://api.github.com/users/arfkanny/followers", 96 | "following_url": "https://api.github.com/users/arfkanny/following{/other_user}", 97 | "gists_url": "https://api.github.com/users/arfkanny/gists{/gist_id}", 98 | "starred_url": "https://api.github.com/users/arfkanny/starred{/owner}{/repo}", 99 | "subscriptions_url": "https://api.github.com/users/arfkanny/subscriptions", 100 | "organizations_url": "https://api.github.com/users/arfkanny/orgs", 101 | "repos_url": "https://api.github.com/users/arfkanny/repos", 102 | "events_url": "https://api.github.com/users/arfkanny/events{/privacy}", 103 | "received_events_url": "https://api.github.com/users/arfkanny/received_events", 104 | "type": "User", 105 | "site_admin": true 106 | }, 107 | "updated_at": "2024-01-03T13:30:00+05:30", 108 | "pending_cancellation_date": null, 109 | "last_activity_at": "2024-01-10T13:51:59+05:30", 110 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 111 | }, 112 | { 113 | "created_at": "2023-08-29T05:20:55+05:30", 114 | "assignee": { 115 | "login": "grifnath", 116 | "id": 17725, 117 | "node_id": "MDQ6VXNlcjE3NzI1", 118 | "avatar_url": "https://avatars.githubusercontent.com/u/17725?v=4", 119 | "gravatar_id": "", 120 | "url": "https://api.github.com/users/grifnath", 121 | "html_url": "https://github.com/grifnath", 122 | "followers_url": "https://api.github.com/users/grifnath/followers", 123 | "following_url": "https://api.github.com/users/grifnath/following{/other_user}", 124 | "gists_url": "https://api.github.com/users/grifnath/gists{/gist_id}", 125 | "starred_url": "https://api.github.com/users/grifnath/starred{/owner}{/repo}", 126 | "subscriptions_url": "https://api.github.com/users/grifnath/subscriptions", 127 | "organizations_url": "https://api.github.com/users/grifnath/orgs", 128 | "repos_url": "https://api.github.com/users/grifnath/repos", 129 | "events_url": "https://api.github.com/users/grifnath/events{/privacy}", 130 | "received_events_url": "https://api.github.com/users/grifnath/received_events", 131 | "type": "User", 132 | "site_admin": true 133 | }, 134 | "updated_at": "2024-01-03T13:30:00+05:30", 135 | "pending_cancellation_date": null, 136 | "last_activity_at": "2023-05-26T19:55:53+05:30", 137 | "last_activity_editor": "vscode/1.78.2/copilot/1.86.82" 138 | }, 139 | { 140 | "created_at": "2023-08-29T05:20:55+05:30", 141 | "assignee": { 142 | "login": "lovepy", 143 | "id": 18643, 144 | "node_id": "MDQ6VXNlcjE4NjQz", 145 | "avatar_url": "https://avatars.githubusercontent.com/u/18643?v=4", 146 | "gravatar_id": "", 147 | "url": "https://api.github.com/users/lovepy", 148 | "html_url": "https://github.com/lovepy", 149 | "followers_url": "https://api.github.com/users/lovepy/followers", 150 | "following_url": "https://api.github.com/users/lovepy/following{/other_user}", 151 | "gists_url": "https://api.github.com/users/lovepy/gists{/gist_id}", 152 | "starred_url": "https://api.github.com/users/lovepy/starred{/owner}{/repo}", 153 | "subscriptions_url": "https://api.github.com/users/lovepy/subscriptions", 154 | "organizations_url": "https://api.github.com/users/lovepy/orgs", 155 | "repos_url": "https://api.github.com/users/lovepy/repos", 156 | "events_url": "https://api.github.com/users/lovepy/events{/privacy}", 157 | "received_events_url": "https://api.github.com/users/lovepy/received_events", 158 | "type": "User", 159 | "site_admin": true 160 | }, 161 | "updated_at": "2024-01-03T13:30:00+05:30", 162 | "pending_cancellation_date": null, 163 | "last_activity_at": "2024-01-10T13:03:51+05:30", 164 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 165 | }, 166 | { 167 | "created_at": "2023-08-29T05:20:55+05:30", 168 | "assignee": { 169 | "login": "stud2001", 170 | "id": 20966, 171 | "node_id": "MDQ6VXNlcjIwOTY2", 172 | "avatar_url": "https://avatars.githubusercontent.com/u/20966?v=4", 173 | "gravatar_id": "", 174 | "url": "https://api.github.com/users/stud2001", 175 | "html_url": "https://github.com/stud2001", 176 | "followers_url": "https://api.github.com/users/stud2001/followers", 177 | "following_url": "https://api.github.com/users/stud2001/following{/other_user}", 178 | "gists_url": "https://api.github.com/users/stud2001/gists{/gist_id}", 179 | "starred_url": "https://api.github.com/users/stud2001/starred{/owner}{/repo}", 180 | "subscriptions_url": "https://api.github.com/users/stud2001/subscriptions", 181 | "organizations_url": "https://api.github.com/users/stud2001/orgs", 182 | "repos_url": "https://api.github.com/users/stud2001/repos", 183 | "events_url": "https://api.github.com/users/stud2001/events{/privacy}", 184 | "received_events_url": "https://api.github.com/users/stud2001/received_events", 185 | "type": "User", 186 | "site_admin": true 187 | }, 188 | "updated_at": "2024-01-03T13:30:00+05:30", 189 | "pending_cancellation_date": null, 190 | "last_activity_at": "2024-01-03T02:49:52+05:30", 191 | "last_activity_editor": "/" 192 | }, 193 | { 194 | "created_at": "2023-08-29T05:20:55+05:30", 195 | "assignee": { 196 | "login": "user201", 197 | "id": 30761, 198 | "node_id": "MDQ6VXNlcjMwNzYx", 199 | "avatar_url": "https://avatars.githubusercontent.com/u/30761?v=4", 200 | "gravatar_id": "", 201 | "url": "https://api.github.com/users/user201", 202 | "html_url": "https://github.com/user201", 203 | "followers_url": "https://api.github.com/users/user201/followers", 204 | "following_url": "https://api.github.com/users/user201/following{/other_user}", 205 | "gists_url": "https://api.github.com/users/user201/gists{/gist_id}", 206 | "starred_url": "https://api.github.com/users/user201/starred{/owner}{/repo}", 207 | "subscriptions_url": "https://api.github.com/users/user201/subscriptions", 208 | "organizations_url": "https://api.github.com/users/user201/orgs", 209 | "repos_url": "https://api.github.com/users/user201/repos", 210 | "events_url": "https://api.github.com/users/user201/events{/privacy}", 211 | "received_events_url": "https://api.github.com/users/user201/received_events", 212 | "type": "User", 213 | "site_admin": true 214 | }, 215 | "updated_at": "2024-01-03T13:30:00+05:30", 216 | "pending_cancellation_date": null, 217 | "last_activity_at": "", 218 | "last_activity_editor": "vscode/1.85.0/copilot-chat/0.11.0" 219 | }, 220 | { 221 | "created_at": "2023-08-29T05:20:55+05:30", 222 | "assignee": { 223 | "login": "brsend", 224 | "id": 45141, 225 | "node_id": "MDQ6VXNlcjQ1MTQx", 226 | "avatar_url": "https://avatars.githubusercontent.com/u/45141?v=4", 227 | "gravatar_id": "", 228 | "url": "https://api.github.com/users/brsend", 229 | "html_url": "https://github.com/brsend", 230 | "followers_url": "https://api.github.com/users/brsend/followers", 231 | "following_url": "https://api.github.com/users/brsend/following{/other_user}", 232 | "gists_url": "https://api.github.com/users/brsend/gists{/gist_id}", 233 | "starred_url": "https://api.github.com/users/brsend/starred{/owner}{/repo}", 234 | "subscriptions_url": "https://api.github.com/users/brsend/subscriptions", 235 | "organizations_url": "https://api.github.com/users/brsend/orgs", 236 | "repos_url": "https://api.github.com/users/brsend/repos", 237 | "events_url": "https://api.github.com/users/brsend/events{/privacy}", 238 | "received_events_url": "https://api.github.com/users/brsend/received_events", 239 | "type": "User", 240 | "site_admin": true 241 | }, 242 | "updated_at": "2024-01-03T13:30:00+05:30", 243 | "pending_cancellation_date": null, 244 | "last_activity_at": "2023-12-22T20:24:56+05:30", 245 | "last_activity_editor": "vscode/1.85.0/copilot-chat/0.10.2" 246 | }, 247 | { 248 | "created_at": "2023-08-29T05:20:55+05:30", 249 | "assignee": { 250 | "login": "sand201", 251 | "id": 55970, 252 | "node_id": "MDQ6VXNlcjU1OTcw", 253 | "avatar_url": "https://avatars.githubusercontent.com/u/55970?v=4", 254 | "gravatar_id": "", 255 | "url": "https://api.github.com/users/sand201", 256 | "html_url": "https://github.com/sand201", 257 | "followers_url": "https://api.github.com/users/sand201/followers", 258 | "following_url": "https://api.github.com/users/sand201/following{/other_user}", 259 | "gists_url": "https://api.github.com/users/sand201/gists{/gist_id}", 260 | "starred_url": "https://api.github.com/users/sand201/starred{/owner}{/repo}", 261 | "subscriptions_url": "https://api.github.com/users/sand201/subscriptions", 262 | "organizations_url": "https://api.github.com/users/sand201/orgs", 263 | "repos_url": "https://api.github.com/users/sand201/repos", 264 | "events_url": "https://api.github.com/users/sand201/events{/privacy}", 265 | "received_events_url": "https://api.github.com/users/sand201/received_events", 266 | "type": "User", 267 | "site_admin": true 268 | }, 269 | "updated_at": "2024-01-03T13:30:00+05:30", 270 | "pending_cancellation_date": null, 271 | "last_activity_at": "2024-01-10T13:29:57+05:30", 272 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 273 | }, 274 | { 275 | "created_at": "2023-08-29T05:20:55+05:30", 276 | "assignee": { 277 | "login": "hook201", 278 | "id": 56753, 279 | "node_id": "MDQ6VXNlcjU2NzUz", 280 | "avatar_url": "https://avatars.githubusercontent.com/u/56753?v=4", 281 | "gravatar_id": "", 282 | "url": "https://api.github.com/users/hook201", 283 | "html_url": "https://github.com/hook201", 284 | "followers_url": "https://api.github.com/users/hook201/followers", 285 | "following_url": "https://api.github.com/users/hook201/following{/other_user}", 286 | "gists_url": "https://api.github.com/users/hook201/gists{/gist_id}", 287 | "starred_url": "https://api.github.com/users/hook201/starred{/owner}{/repo}", 288 | "subscriptions_url": "https://api.github.com/users/hook201/subscriptions", 289 | "organizations_url": "https://api.github.com/users/hook201/orgs", 290 | "repos_url": "https://api.github.com/users/hook201/repos", 291 | "events_url": "https://api.github.com/users/hook201/events{/privacy}", 292 | "received_events_url": "https://api.github.com/users/hook201/received_events", 293 | "type": "User", 294 | "site_admin": true 295 | }, 296 | "updated_at": "2024-01-03T13:30:00+05:30", 297 | "pending_cancellation_date": null, 298 | "last_activity_at": "2024-01-10T00:03:41+05:30", 299 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.12.2023120701" 300 | }, 301 | { 302 | "created_at": "2023-08-29T05:20:55+05:30", 303 | "assignee": { 304 | "login": "kjuthg", 305 | "id": 64868, 306 | "node_id": "MDQ6VXNlcjY0ODY4", 307 | "avatar_url": "https://avatars.githubusercontent.com/u/64868?v=4", 308 | "gravatar_id": "", 309 | "url": "https://api.github.com/users/kjuthg", 310 | "html_url": "https://github.com/kjuthg", 311 | "followers_url": "https://api.github.com/users/kjuthg/followers", 312 | "following_url": "https://api.github.com/users/kjuthg/following{/other_user}", 313 | "gists_url": "https://api.github.com/users/kjuthg/gists{/gist_id}", 314 | "starred_url": "https://api.github.com/users/kjuthg/starred{/owner}{/repo}", 315 | "subscriptions_url": "https://api.github.com/users/kjuthg/subscriptions", 316 | "organizations_url": "https://api.github.com/users/kjuthg/orgs", 317 | "repos_url": "https://api.github.com/users/kjuthg/repos", 318 | "events_url": "https://api.github.com/users/kjuthg/events{/privacy}", 319 | "received_events_url": "https://api.github.com/users/kjuthg/received_events", 320 | "type": "User", 321 | "site_admin": true 322 | }, 323 | "updated_at": "2024-01-03T13:30:00+05:30", 324 | "pending_cancellation_date": null, 325 | "last_activity_at": null, 326 | "last_activity_editor": null 327 | }, 328 | { 329 | "created_at": "2023-08-29T05:20:55+05:30", 330 | "assignee": { 331 | "login": "sarabanu", 332 | "id": 82035, 333 | "node_id": "MDQ6VXNlcjgyMDM1", 334 | "avatar_url": "https://avatars.githubusercontent.com/u/82035?v=4", 335 | "gravatar_id": "", 336 | "url": "https://api.github.com/users/sarabanu", 337 | "html_url": "https://github.com/sarabanu", 338 | "followers_url": "https://api.github.com/users/sarabanu/followers", 339 | "following_url": "https://api.github.com/users/sarabanu/following{/other_user}", 340 | "gists_url": "https://api.github.com/users/sarabanu/gists{/gist_id}", 341 | "starred_url": "https://api.github.com/users/sarabanu/starred{/owner}{/repo}", 342 | "subscriptions_url": "https://api.github.com/users/sarabanu/subscriptions", 343 | "organizations_url": "https://api.github.com/users/sarabanu/orgs", 344 | "repos_url": "https://api.github.com/users/sarabanu/repos", 345 | "events_url": "https://api.github.com/users/sarabanu/events{/privacy}", 346 | "received_events_url": "https://api.github.com/users/sarabanu/received_events", 347 | "type": "User", 348 | "site_admin": true 349 | }, 350 | "updated_at": "2024-01-03T13:30:00+05:30", 351 | "pending_cancellation_date": null, 352 | "last_activity_at": "", 353 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 354 | }, 355 | { 356 | "created_at": "2023-08-29T05:20:55+05:30", 357 | "assignee": { 358 | "login": "kevred01", 359 | "id": 82251, 360 | "node_id": "MDQ6VXNlcjgyMjUx", 361 | "avatar_url": "https://avatars.githubusercontent.com/u/82251?v=4", 362 | "gravatar_id": "", 363 | "url": "https://api.github.com/users/kevred01", 364 | "html_url": "https://github.com/kevred01", 365 | "followers_url": "https://api.github.com/users/kevred01/followers", 366 | "following_url": "https://api.github.com/users/kevred01/following{/other_user}", 367 | "gists_url": "https://api.github.com/users/kevred01/gists{/gist_id}", 368 | "starred_url": "https://api.github.com/users/kevred01/starred{/owner}{/repo}", 369 | "subscriptions_url": "https://api.github.com/users/kevred01/subscriptions", 370 | "organizations_url": "https://api.github.com/users/kevred01/orgs", 371 | "repos_url": "https://api.github.com/users/kevred01/repos", 372 | "events_url": "https://api.github.com/users/kevred01/events{/privacy}", 373 | "received_events_url": "https://api.github.com/users/kevred01/received_events", 374 | "type": "User", 375 | "site_admin": true 376 | }, 377 | "updated_at": "2024-01-03T13:30:00+05:30", 378 | "pending_cancellation_date": null, 379 | "last_activity_at": "2024-01-10T13:54:15+05:30", 380 | "last_activity_editor": "vscode/1.84.0/copilot/1.143.0" 381 | }, 382 | { 383 | "created_at": "2023-08-29T05:20:55+05:30", 384 | "assignee": { 385 | "login": "alexkev", 386 | "id": 84209, 387 | "node_id": "MDQ6VXNlcjg0MjA5", 388 | "avatar_url": "https://avatars.githubusercontent.com/u/84209?v=4", 389 | "gravatar_id": "", 390 | "url": "https://api.github.com/users/alexkev", 391 | "html_url": "https://github.com/alexkev", 392 | "followers_url": "https://api.github.com/users/alexkev/followers", 393 | "following_url": "https://api.github.com/users/alexkev/following{/other_user}", 394 | "gists_url": "https://api.github.com/users/alexkev/gists{/gist_id}", 395 | "starred_url": "https://api.github.com/users/alexkev/starred{/owner}{/repo}", 396 | "subscriptions_url": "https://api.github.com/users/alexkev/subscriptions", 397 | "organizations_url": "https://api.github.com/users/alexkev/orgs", 398 | "repos_url": "https://api.github.com/users/alexkev/repos", 399 | "events_url": "https://api.github.com/users/alexkev/events{/privacy}", 400 | "received_events_url": "https://api.github.com/users/alexkev/received_events", 401 | "type": "User", 402 | "site_admin": true 403 | }, 404 | "updated_at": "2024-01-03T13:30:00+05:30", 405 | "pending_cancellation_date": null, 406 | "last_activity_at": "2024-01-06T09:17:58+05:30", 407 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 408 | }, 409 | { 410 | "created_at": "2023-08-29T05:20:55+05:30", 411 | "assignee": { 412 | "login": "fuythg", 413 | "id": 98463, 414 | "node_id": "MDQ6VXNlcjk4NDYz", 415 | "avatar_url": "https://avatars.githubusercontent.com/u/98463?v=4", 416 | "gravatar_id": "", 417 | "url": "https://api.github.com/users/fuythg", 418 | "html_url": "https://github.com/fuythg", 419 | "followers_url": "https://api.github.com/users/fuythg/followers", 420 | "following_url": "https://api.github.com/users/fuythg/following{/other_user}", 421 | "gists_url": "https://api.github.com/users/fuythg/gists{/gist_id}", 422 | "starred_url": "https://api.github.com/users/fuythg/starred{/owner}{/repo}", 423 | "subscriptions_url": "https://api.github.com/users/fuythg/subscriptions", 424 | "organizations_url": "https://api.github.com/users/fuythg/orgs", 425 | "repos_url": "https://api.github.com/users/fuythg/repos", 426 | "events_url": "https://api.github.com/users/fuythg/events{/privacy}", 427 | "received_events_url": "https://api.github.com/users/fuythg/received_events", 428 | "type": "User", 429 | "site_admin": true 430 | }, 431 | "updated_at": "2024-01-03T13:30:00+05:30", 432 | "pending_cancellation_date": null, 433 | "last_activity_at": "2024-01-10T13:48:20+05:30", 434 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2023122001" 435 | }, 436 | { 437 | "created_at": "2023-08-29T05:20:55+05:30", 438 | "assignee": { 439 | "login": "testusr", 440 | "id": 110683, 441 | "node_id": "MDQ6VXNlcjExMDY4Mw==", 442 | "avatar_url": "https://avatars.githubusercontent.com/u/110683?v=4", 443 | "gravatar_id": "", 444 | "url": "https://api.github.com/users/testusr", 445 | "html_url": "https://github.com/testusr", 446 | "followers_url": "https://api.github.com/users/testusr/followers", 447 | "following_url": "https://api.github.com/users/testusr/following{/other_user}", 448 | "gists_url": "https://api.github.com/users/testusr/gists{/gist_id}", 449 | "starred_url": "https://api.github.com/users/testusr/starred{/owner}{/repo}", 450 | "subscriptions_url": "https://api.github.com/users/testusr/subscriptions", 451 | "organizations_url": "https://api.github.com/users/testusr/orgs", 452 | "repos_url": "https://api.github.com/users/testusr/repos", 453 | "events_url": "https://api.github.com/users/testusr/events{/privacy}", 454 | "received_events_url": "https://api.github.com/users/testusr/received_events", 455 | "type": "User", 456 | "site_admin": true 457 | }, 458 | "updated_at": "2024-01-03T13:30:00+05:30", 459 | "pending_cancellation_date": null, 460 | "last_activity_at": "2024-01-10T13:32:07+05:30", 461 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.12.2023120701" 462 | }, 463 | { 464 | "created_at": "2023-08-29T05:20:55+05:30", 465 | "assignee": { 466 | "login": "khyjtg23", 467 | "id": 115409, 468 | "node_id": "MDQ6VXNlcjExNTQwOQ==", 469 | "avatar_url": "https://avatars.githubusercontent.com/u/115409?v=4", 470 | "gravatar_id": "", 471 | "url": "https://api.github.com/users/khyjtg23", 472 | "html_url": "https://github.com/khyjtg23", 473 | "followers_url": "https://api.github.com/users/khyjtg23/followers", 474 | "following_url": "https://api.github.com/users/khyjtg23/following{/other_user}", 475 | "gists_url": "https://api.github.com/users/khyjtg23/gists{/gist_id}", 476 | "starred_url": "https://api.github.com/users/khyjtg23/starred{/owner}{/repo}", 477 | "subscriptions_url": "https://api.github.com/users/khyjtg23/subscriptions", 478 | "organizations_url": "https://api.github.com/users/khyjtg23/orgs", 479 | "repos_url": "https://api.github.com/users/khyjtg23/repos", 480 | "events_url": "https://api.github.com/users/khyjtg23/events{/privacy}", 481 | "received_events_url": "https://api.github.com/users/khyjtg23/received_events", 482 | "type": "User", 483 | "site_admin": true 484 | }, 485 | "updated_at": "2024-01-03T13:30:00+05:30", 486 | "pending_cancellation_date": null, 487 | "last_activity_at": "2024-01-10T10:15:14+05:30", 488 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 489 | }, 490 | { 491 | "created_at": "2023-08-29T05:20:55+05:30", 492 | "assignee": { 493 | "login": "timjos09", 494 | "id": 116134, 495 | "node_id": "MDQ6VXNlcjExNjEzNA==", 496 | "avatar_url": "https://avatars.githubusercontent.com/u/116134?v=4", 497 | "gravatar_id": "", 498 | "url": "https://api.github.com/users/timjos09", 499 | "html_url": "https://github.com/timjos09", 500 | "followers_url": "https://api.github.com/users/timjos09/followers", 501 | "following_url": "https://api.github.com/users/timjos09/following{/other_user}", 502 | "gists_url": "https://api.github.com/users/timjos09/gists{/gist_id}", 503 | "starred_url": "https://api.github.com/users/timjos09/starred{/owner}{/repo}", 504 | "subscriptions_url": "https://api.github.com/users/timjos09/subscriptions", 505 | "organizations_url": "https://api.github.com/users/timjos09/orgs", 506 | "repos_url": "https://api.github.com/users/timjos09/repos", 507 | "events_url": "https://api.github.com/users/timjos09/events{/privacy}", 508 | "received_events_url": "https://api.github.com/users/timjos09/received_events", 509 | "type": "User", 510 | "site_admin": true 511 | }, 512 | "updated_at": "2024-01-03T13:30:00+05:30", 513 | "pending_cancellation_date": null, 514 | "last_activity_at": "2024-01-09T00:20:31+05:30", 515 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2023122001" 516 | }, 517 | { 518 | "created_at": "2023-08-29T05:20:55+05:30", 519 | "assignee": { 520 | "login": "martiz675", 521 | "id": 150282, 522 | "node_id": "MDQ6VXNlcjE1MDI4Mg==", 523 | "avatar_url": "https://avatars.githubusercontent.com/u/150282?v=4", 524 | "gravatar_id": "", 525 | "url": "https://api.github.com/users/martiz675", 526 | "html_url": "https://github.com/martiz675", 527 | "followers_url": "https://api.github.com/users/martiz675/followers", 528 | "following_url": "https://api.github.com/users/martiz675/following{/other_user}", 529 | "gists_url": "https://api.github.com/users/martiz675/gists{/gist_id}", 530 | "starred_url": "https://api.github.com/users/martiz675/starred{/owner}{/repo}", 531 | "subscriptions_url": "https://api.github.com/users/martiz675/subscriptions", 532 | "organizations_url": "https://api.github.com/users/martiz675/orgs", 533 | "repos_url": "https://api.github.com/users/martiz675/repos", 534 | "events_url": "https://api.github.com/users/martiz675/events{/privacy}", 535 | "received_events_url": "https://api.github.com/users/martiz675/received_events", 536 | "type": "User", 537 | "site_admin": true 538 | }, 539 | "updated_at": "2024-01-03T13:30:00+05:30", 540 | "pending_cancellation_date": null, 541 | "last_activity_at": "2024-01-06T17:24:04+05:30", 542 | "last_activity_editor": "unknown-editor/0/unknown-editor-plugin/0" 543 | }, 544 | { 545 | "created_at": "2023-08-29T05:20:55+05:30", 546 | "assignee": { 547 | "login": "dan08", 548 | "id": 175638, 549 | "node_id": "MDQ6VXNlcjE3NTYzOA==", 550 | "avatar_url": "https://avatars.githubusercontent.com/u/175638?v=4", 551 | "gravatar_id": "", 552 | "url": "https://api.github.com/users/dan08", 553 | "html_url": "https://github.com/dan08", 554 | "followers_url": "https://api.github.com/users/dan08/followers", 555 | "following_url": "https://api.github.com/users/dan08/following{/other_user}", 556 | "gists_url": "https://api.github.com/users/dan08/gists{/gist_id}", 557 | "starred_url": "https://api.github.com/users/dan08/starred{/owner}{/repo}", 558 | "subscriptions_url": "https://api.github.com/users/dan08/subscriptions", 559 | "organizations_url": "https://api.github.com/users/dan08/orgs", 560 | "repos_url": "https://api.github.com/users/dan08/repos", 561 | "events_url": "https://api.github.com/users/dan08/events{/privacy}", 562 | "received_events_url": "https://api.github.com/users/dan08/received_events", 563 | "type": "User", 564 | "site_admin": true 565 | }, 566 | "updated_at": "2024-01-03T13:30:00+05:30", 567 | "pending_cancellation_date": null, 568 | "last_activity_at": "2024-01-08T22:05:45+05:30", 569 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 570 | }, 571 | { 572 | "created_at": "2023-08-29T05:20:55+05:30", 573 | "assignee": { 574 | "login": "yuvioijh", 575 | "id": 183380, 576 | "node_id": "MDQ6VXNlcjE4MzM4MA==", 577 | "avatar_url": "https://avatars.githubusercontent.com/u/183380?v=4", 578 | "gravatar_id": "", 579 | "url": "https://api.github.com/users/yuvioijh", 580 | "html_url": "https://github.com/yuvioijh", 581 | "followers_url": "https://api.github.com/users/yuvioijh/followers", 582 | "following_url": "https://api.github.com/users/yuvioijh/following{/other_user}", 583 | "gists_url": "https://api.github.com/users/yuvioijh/gists{/gist_id}", 584 | "starred_url": "https://api.github.com/users/yuvioijh/starred{/owner}{/repo}", 585 | "subscriptions_url": "https://api.github.com/users/yuvioijh/subscriptions", 586 | "organizations_url": "https://api.github.com/users/yuvioijh/orgs", 587 | "repos_url": "https://api.github.com/users/yuvioijh/repos", 588 | "events_url": "https://api.github.com/users/yuvioijh/events{/privacy}", 589 | "received_events_url": "https://api.github.com/users/yuvioijh/received_events", 590 | "type": "User", 591 | "site_admin": true 592 | }, 593 | "updated_at": "2024-01-03T13:30:00+05:30", 594 | "pending_cancellation_date": null, 595 | "last_activity_at": "2024-01-10T13:31:48+05:30", 596 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 597 | }, 598 | { 599 | "created_at": "2023-08-29T05:20:55+05:30", 600 | "assignee": { 601 | "login": "patchrt", 602 | "id": 185122, 603 | "node_id": "MDQ6VXNlcjE4NTEyMg==", 604 | "avatar_url": "https://avatars.githubusercontent.com/u/185122?v=4", 605 | "gravatar_id": "", 606 | "url": "https://api.github.com/users/patchrt", 607 | "html_url": "https://github.com/patchrt", 608 | "followers_url": "https://api.github.com/users/patchrt/followers", 609 | "following_url": "https://api.github.com/users/patchrt/following{/other_user}", 610 | "gists_url": "https://api.github.com/users/patchrt/gists{/gist_id}", 611 | "starred_url": "https://api.github.com/users/patchrt/starred{/owner}{/repo}", 612 | "subscriptions_url": "https://api.github.com/users/patchrt/subscriptions", 613 | "organizations_url": "https://api.github.com/users/patchrt/orgs", 614 | "repos_url": "https://api.github.com/users/patchrt/repos", 615 | "events_url": "https://api.github.com/users/patchrt/events{/privacy}", 616 | "received_events_url": "https://api.github.com/users/patchrt/received_events", 617 | "type": "User", 618 | "site_admin": true 619 | }, 620 | "updated_at": "2024-01-03T13:30:00+05:30", 621 | "pending_cancellation_date": null, 622 | "last_activity_at": "2023-12-22T08:38:29+05:30", 623 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 624 | }, 625 | { 626 | "created_at": "2023-08-29T05:20:55+05:30", 627 | "assignee": { 628 | "login": "stopkju", 629 | "id": 203805, 630 | "node_id": "MDQ6VXNlcjIwMzgwNQ==", 631 | "avatar_url": "https://avatars.githubusercontent.com/u/203805?v=4", 632 | "gravatar_id": "", 633 | "url": "https://api.github.com/users/stopkju", 634 | "html_url": "https://github.com/stopkju", 635 | "followers_url": "https://api.github.com/users/stopkju/followers", 636 | "following_url": "https://api.github.com/users/stopkju/following{/other_user}", 637 | "gists_url": "https://api.github.com/users/stopkju/gists{/gist_id}", 638 | "starred_url": "https://api.github.com/users/stopkju/starred{/owner}{/repo}", 639 | "subscriptions_url": "https://api.github.com/users/stopkju/subscriptions", 640 | "organizations_url": "https://api.github.com/users/stopkju/orgs", 641 | "repos_url": "https://api.github.com/users/stopkju/repos", 642 | "events_url": "https://api.github.com/users/stopkju/events{/privacy}", 643 | "received_events_url": "https://api.github.com/users/stopkju/received_events", 644 | "type": "User", 645 | "site_admin": true 646 | }, 647 | "updated_at": "2024-01-03T13:30:00+05:30", 648 | "pending_cancellation_date": null, 649 | "last_activity_at": "2024-01-10T13:56:13+05:30", 650 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 651 | }, 652 | { 653 | "created_at": "2023-08-29T05:20:55+05:30", 654 | "assignee": { 655 | "login": "topnhgf", 656 | "id": 211284, 657 | "node_id": "MDQ6VXNlcjIxMTI4NA==", 658 | "avatar_url": "https://avatars.githubusercontent.com/u/211284?v=4", 659 | "gravatar_id": "", 660 | "url": "https://api.github.com/users/topnhgf", 661 | "html_url": "https://github.com/topnhgf", 662 | "followers_url": "https://api.github.com/users/topnhgf/followers", 663 | "following_url": "https://api.github.com/users/topnhgf/following{/other_user}", 664 | "gists_url": "https://api.github.com/users/topnhgf/gists{/gist_id}", 665 | "starred_url": "https://api.github.com/users/topnhgf/starred{/owner}{/repo}", 666 | "subscriptions_url": "https://api.github.com/users/topnhgf/subscriptions", 667 | "organizations_url": "https://api.github.com/users/topnhgf/orgs", 668 | "repos_url": "https://api.github.com/users/topnhgf/repos", 669 | "events_url": "https://api.github.com/users/topnhgf/events{/privacy}", 670 | "received_events_url": "https://api.github.com/users/topnhgf/received_events", 671 | "type": "User", 672 | "site_admin": true 673 | }, 674 | "updated_at": "2024-01-03T13:30:00+05:30", 675 | "pending_cancellation_date": null, 676 | "last_activity_at": "2024-01-10T09:58:44+05:30", 677 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.12.2023120701" 678 | }, 679 | { 680 | "created_at": "2023-08-29T05:20:55+05:30", 681 | "assignee": { 682 | "login": "samhgtk", 683 | "id": 211704, 684 | "node_id": "MDQ6VXNlcjIxMTcwNA==", 685 | "avatar_url": "https://avatars.githubusercontent.com/u/211704?v=4", 686 | "gravatar_id": "", 687 | "url": "https://api.github.com/users/samhgtk", 688 | "html_url": "https://github.com/samhgtk", 689 | "followers_url": "https://api.github.com/users/samhgtk/followers", 690 | "following_url": "https://api.github.com/users/samhgtk/following{/other_user}", 691 | "gists_url": "https://api.github.com/users/samhgtk/gists{/gist_id}", 692 | "starred_url": "https://api.github.com/users/samhgtk/starred{/owner}{/repo}", 693 | "subscriptions_url": "https://api.github.com/users/samhgtk/subscriptions", 694 | "organizations_url": "https://api.github.com/users/samhgtk/orgs", 695 | "repos_url": "https://api.github.com/users/samhgtk/repos", 696 | "events_url": "https://api.github.com/users/samhgtk/events{/privacy}", 697 | "received_events_url": "https://api.github.com/users/samhgtk/received_events", 698 | "type": "User", 699 | "site_admin": true 700 | }, 701 | "updated_at": "2024-01-03T13:30:00+05:30", 702 | "pending_cancellation_date": null, 703 | "last_activity_at": "2024-01-09T19:57:26+05:30", 704 | "last_activity_editor": "/" 705 | }, 706 | { 707 | "created_at": "2023-08-29T05:20:55+05:30", 708 | "assignee": { 709 | "login": "kalli76", 710 | "id": 223966, 711 | "node_id": "MDQ6VXNlcjIyMzk2Ng==", 712 | "avatar_url": "https://avatars.githubusercontent.com/u/223966?v=4", 713 | "gravatar_id": "", 714 | "url": "https://api.github.com/users/kalli76", 715 | "html_url": "https://github.com/kalli76", 716 | "followers_url": "https://api.github.com/users/kalli76/followers", 717 | "following_url": "https://api.github.com/users/kalli76/following{/other_user}", 718 | "gists_url": "https://api.github.com/users/kalli76/gists{/gist_id}", 719 | "starred_url": "https://api.github.com/users/kalli76/starred{/owner}{/repo}", 720 | "subscriptions_url": "https://api.github.com/users/kalli76/subscriptions", 721 | "organizations_url": "https://api.github.com/users/kalli76/orgs", 722 | "repos_url": "https://api.github.com/users/kalli76/repos", 723 | "events_url": "https://api.github.com/users/kalli76/events{/privacy}", 724 | "received_events_url": "https://api.github.com/users/kalli76/received_events", 725 | "type": "User", 726 | "site_admin": true 727 | }, 728 | "updated_at": "2024-01-03T13:30:00+05:30", 729 | "pending_cancellation_date": null, 730 | "last_activity_at": "2023-12-12T07:21:27+05:30", 731 | "last_activity_editor": "vscode/1.82.2/copilot-chat/0.7.1" 732 | }, 733 | { 734 | "created_at": "2023-08-29T05:20:55+05:30", 735 | "assignee": { 736 | "login": "tonykjhu", 737 | "id": 253558, 738 | "node_id": "MDQ6VXNlcjI1MzU1OA==", 739 | "avatar_url": "https://avatars.githubusercontent.com/u/253558?v=4", 740 | "gravatar_id": "", 741 | "url": "https://api.github.com/users/tonykjhu", 742 | "html_url": "https://github.com/tonykjhu", 743 | "followers_url": "https://api.github.com/users/tonykjhu/followers", 744 | "following_url": "https://api.github.com/users/tonykjhu/following{/other_user}", 745 | "gists_url": "https://api.github.com/users/tonykjhu/gists{/gist_id}", 746 | "starred_url": "https://api.github.com/users/tonykjhu/starred{/owner}{/repo}", 747 | "subscriptions_url": "https://api.github.com/users/tonykjhu/subscriptions", 748 | "organizations_url": "https://api.github.com/users/tonykjhu/orgs", 749 | "repos_url": "https://api.github.com/users/tonykjhu/repos", 750 | "events_url": "https://api.github.com/users/tonykjhu/events{/privacy}", 751 | "received_events_url": "https://api.github.com/users/tonykjhu/received_events", 752 | "type": "User", 753 | "site_admin": true 754 | }, 755 | "updated_at": "2024-01-03T13:30:00+05:30", 756 | "pending_cancellation_date": null, 757 | "last_activity_at": "2023-12-14T05:04:43+05:30", 758 | "last_activity_editor": "/" 759 | }, 760 | { 761 | "created_at": "2023-08-29T05:20:55+05:30", 762 | "assignee": { 763 | "login": "jhasds", 764 | "id": 301795, 765 | "node_id": "MDQ6VXNlcjMwMTc5NQ==", 766 | "avatar_url": "https://avatars.githubusercontent.com/u/301795?v=4", 767 | "gravatar_id": "", 768 | "url": "https://api.github.com/users/jhasds", 769 | "html_url": "https://github.com/jhasds", 770 | "followers_url": "https://api.github.com/users/jhasds/followers", 771 | "following_url": "https://api.github.com/users/jhasds/following{/other_user}", 772 | "gists_url": "https://api.github.com/users/jhasds/gists{/gist_id}", 773 | "starred_url": "https://api.github.com/users/jhasds/starred{/owner}{/repo}", 774 | "subscriptions_url": "https://api.github.com/users/jhasds/subscriptions", 775 | "organizations_url": "https://api.github.com/users/jhasds/orgs", 776 | "repos_url": "https://api.github.com/users/jhasds/repos", 777 | "events_url": "https://api.github.com/users/jhasds/events{/privacy}", 778 | "received_events_url": "https://api.github.com/users/jhasds/received_events", 779 | "type": "User", 780 | "site_admin": true 781 | }, 782 | "updated_at": "2024-01-03T13:30:00+05:30", 783 | "pending_cancellation_date": null, 784 | "last_activity_at": "2024-01-09T23:02:27+05:30", 785 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 786 | }, 787 | { 788 | "created_at": "2023-08-29T05:20:55+05:30", 789 | "assignee": { 790 | "login": "sfdgtrb", 791 | "id": 317847, 792 | "node_id": "MDQ6VXNlcjMxNzg0Nw==", 793 | "avatar_url": "https://avatars.githubusercontent.com/u/317847?v=4", 794 | "gravatar_id": "", 795 | "url": "https://api.github.com/users/sfdgtrb", 796 | "html_url": "https://github.com/sfdgtrb", 797 | "followers_url": "https://api.github.com/users/sfdgtrb/followers", 798 | "following_url": "https://api.github.com/users/sfdgtrb/following{/other_user}", 799 | "gists_url": "https://api.github.com/users/sfdgtrb/gists{/gist_id}", 800 | "starred_url": "https://api.github.com/users/sfdgtrb/starred{/owner}{/repo}", 801 | "subscriptions_url": "https://api.github.com/users/sfdgtrb/subscriptions", 802 | "organizations_url": "https://api.github.com/users/sfdgtrb/orgs", 803 | "repos_url": "https://api.github.com/users/sfdgtrb/repos", 804 | "events_url": "https://api.github.com/users/sfdgtrb/events{/privacy}", 805 | "received_events_url": "https://api.github.com/users/sfdgtrb/received_events", 806 | "type": "User", 807 | "site_admin": true 808 | }, 809 | "updated_at": "2024-01-03T13:30:00+05:30", 810 | "pending_cancellation_date": null, 811 | "last_activity_at": "2024-01-09T02:40:12+05:30", 812 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 813 | }, 814 | { 815 | "created_at": "2023-08-29T05:20:55+05:30", 816 | "assignee": { 817 | "login": "dfrtr43", 818 | "id": 325485, 819 | "node_id": "MDQ6VXNlcjMyNTQ4NQ==", 820 | "avatar_url": "https://avatars.githubusercontent.com/u/325485?v=4", 821 | "gravatar_id": "", 822 | "url": "https://api.github.com/users/dfrtr43", 823 | "html_url": "https://github.com/dfrtr43", 824 | "followers_url": "https://api.github.com/users/dfrtr43/followers", 825 | "following_url": "https://api.github.com/users/dfrtr43/following{/other_user}", 826 | "gists_url": "https://api.github.com/users/dfrtr43/gists{/gist_id}", 827 | "starred_url": "https://api.github.com/users/dfrtr43/starred{/owner}{/repo}", 828 | "subscriptions_url": "https://api.github.com/users/dfrtr43/subscriptions", 829 | "organizations_url": "https://api.github.com/users/dfrtr43/orgs", 830 | "repos_url": "https://api.github.com/users/dfrtr43/repos", 831 | "events_url": "https://api.github.com/users/dfrtr43/events{/privacy}", 832 | "received_events_url": "https://api.github.com/users/dfrtr43/received_events", 833 | "type": "User", 834 | "site_admin": true 835 | }, 836 | "updated_at": "2024-01-03T13:30:00+05:30", 837 | "pending_cancellation_date": null, 838 | "last_activity_at": "2024-01-04T18:06:15+05:30", 839 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 840 | }, 841 | { 842 | "created_at": "2023-08-29T05:20:55+05:30", 843 | "assignee": { 844 | "login": "gfjghj44", 845 | "id": 334891, 846 | "node_id": "MDQ6VXNlcjMzNDg5MQ==", 847 | "avatar_url": "https://avatars.githubusercontent.com/u/334891?v=4", 848 | "gravatar_id": "", 849 | "url": "https://api.github.com/users/gfjghj44", 850 | "html_url": "https://github.com/gfjghj44", 851 | "followers_url": "https://api.github.com/users/gfjghj44/followers", 852 | "following_url": "https://api.github.com/users/gfjghj44/following{/other_user}", 853 | "gists_url": "https://api.github.com/users/gfjghj44/gists{/gist_id}", 854 | "starred_url": "https://api.github.com/users/gfjghj44/starred{/owner}{/repo}", 855 | "subscriptions_url": "https://api.github.com/users/gfjghj44/subscriptions", 856 | "organizations_url": "https://api.github.com/users/gfjghj44/orgs", 857 | "repos_url": "https://api.github.com/users/gfjghj44/repos", 858 | "events_url": "https://api.github.com/users/gfjghj44/events{/privacy}", 859 | "received_events_url": "https://api.github.com/users/gfjghj44/received_events", 860 | "type": "User", 861 | "site_admin": true 862 | }, 863 | "updated_at": "2024-01-03T13:30:00+05:30", 864 | "pending_cancellation_date": null, 865 | "last_activity_at": "2023-12-21T03:27:15+05:30", 866 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.12.2023120701" 867 | }, 868 | { 869 | "created_at": "2023-08-29T05:20:55+05:30", 870 | "assignee": { 871 | "login": "ghgjhiu44", 872 | "id": 376532, 873 | "node_id": "MDQ6VXNlcjM3NjUzMg==", 874 | "avatar_url": "https://avatars.githubusercontent.com/u/376532?v=4", 875 | "gravatar_id": "", 876 | "url": "https://api.github.com/users/ghgjhiu44", 877 | "html_url": "https://github.com/ghgjhiu44", 878 | "followers_url": "https://api.github.com/users/ghgjhiu44/followers", 879 | "following_url": "https://api.github.com/users/ghgjhiu44/following{/other_user}", 880 | "gists_url": "https://api.github.com/users/ghgjhiu44/gists{/gist_id}", 881 | "starred_url": "https://api.github.com/users/ghgjhiu44/starred{/owner}{/repo}", 882 | "subscriptions_url": "https://api.github.com/users/ghgjhiu44/subscriptions", 883 | "organizations_url": "https://api.github.com/users/ghgjhiu44/orgs", 884 | "repos_url": "https://api.github.com/users/ghgjhiu44/repos", 885 | "events_url": "https://api.github.com/users/ghgjhiu44/events{/privacy}", 886 | "received_events_url": "https://api.github.com/users/ghgjhiu44/received_events", 887 | "type": "User", 888 | "site_admin": true 889 | }, 890 | "updated_at": "2024-01-03T13:30:00+05:30", 891 | "pending_cancellation_date": null, 892 | "last_activity_at": "2024-01-10T13:34:17+05:30", 893 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2023122001" 894 | }, 895 | { 896 | "created_at": "2023-08-29T05:20:55+05:30", 897 | "assignee": { 898 | "login": "ghjtr45", 899 | "id": 378023, 900 | "node_id": "MDQ6VXNlcjM3ODAyMw==", 901 | "avatar_url": "https://avatars.githubusercontent.com/u/378023?v=4", 902 | "gravatar_id": "", 903 | "url": "https://api.github.com/users/ghjtr45", 904 | "html_url": "https://github.com/ghjtr45", 905 | "followers_url": "https://api.github.com/users/ghjtr45/followers", 906 | "following_url": "https://api.github.com/users/ghjtr45/following{/other_user}", 907 | "gists_url": "https://api.github.com/users/ghjtr45/gists{/gist_id}", 908 | "starred_url": "https://api.github.com/users/ghjtr45/starred{/owner}{/repo}", 909 | "subscriptions_url": "https://api.github.com/users/ghjtr45/subscriptions", 910 | "organizations_url": "https://api.github.com/users/ghjtr45/orgs", 911 | "repos_url": "https://api.github.com/users/ghjtr45/repos", 912 | "events_url": "https://api.github.com/users/ghjtr45/events{/privacy}", 913 | "received_events_url": "https://api.github.com/users/ghjtr45/received_events", 914 | "type": "User", 915 | "site_admin": true 916 | }, 917 | "updated_at": "2024-01-03T13:30:00+05:30", 918 | "pending_cancellation_date": null, 919 | "last_activity_at": "", 920 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.12.2023120701" 921 | }, 922 | { 923 | "created_at": "2023-08-29T05:20:55+05:30", 924 | "assignee": { 925 | "login": "23fgty", 926 | "id": 395397, 927 | "node_id": "MDQ6VXNlcjM5NTM5Nw==", 928 | "avatar_url": "https://avatars.githubusercontent.com/u/395397?v=4", 929 | "gravatar_id": "", 930 | "url": "https://api.github.com/users/23fgty", 931 | "html_url": "https://github.com/23fgty", 932 | "followers_url": "https://api.github.com/users/23fgty/followers", 933 | "following_url": "https://api.github.com/users/23fgty/following{/other_user}", 934 | "gists_url": "https://api.github.com/users/23fgty/gists{/gist_id}", 935 | "starred_url": "https://api.github.com/users/23fgty/starred{/owner}{/repo}", 936 | "subscriptions_url": "https://api.github.com/users/23fgty/subscriptions", 937 | "organizations_url": "https://api.github.com/users/23fgty/orgs", 938 | "repos_url": "https://api.github.com/users/23fgty/repos", 939 | "events_url": "https://api.github.com/users/23fgty/events{/privacy}", 940 | "received_events_url": "https://api.github.com/users/23fgty/received_events", 941 | "type": "User", 942 | "site_admin": true 943 | }, 944 | "updated_at": "2024-01-03T13:30:00+05:30", 945 | "pending_cancellation_date": null, 946 | "last_activity_at": "2024-01-06T04:03:20+05:30", 947 | "last_activity_editor": "vscode/1.85.0/copilot-chat/0.10.2" 948 | }, 949 | { 950 | "created_at": "2023-08-29T05:20:55+05:30", 951 | "assignee": { 952 | "login": "ererrtyr76", 953 | "id": 406937, 954 | "node_id": "MDQ6VXNlcjQwNjkzNw==", 955 | "avatar_url": "https://avatars.githubusercontent.com/u/406937?v=4", 956 | "gravatar_id": "", 957 | "url": "https://api.github.com/users/ererrtyr76", 958 | "html_url": "https://github.com/ererrtyr76", 959 | "followers_url": "https://api.github.com/users/ererrtyr76/followers", 960 | "following_url": "https://api.github.com/users/ererrtyr76/following{/other_user}", 961 | "gists_url": "https://api.github.com/users/ererrtyr76/gists{/gist_id}", 962 | "starred_url": "https://api.github.com/users/ererrtyr76/starred{/owner}{/repo}", 963 | "subscriptions_url": "https://api.github.com/users/ererrtyr76/subscriptions", 964 | "organizations_url": "https://api.github.com/users/ererrtyr76/orgs", 965 | "repos_url": "https://api.github.com/users/ererrtyr76/repos", 966 | "events_url": "https://api.github.com/users/ererrtyr76/events{/privacy}", 967 | "received_events_url": "https://api.github.com/users/ererrtyr76/received_events", 968 | "type": "User", 969 | "site_admin": true 970 | }, 971 | "updated_at": "2024-01-03T13:30:00+05:30", 972 | "pending_cancellation_date": null, 973 | "last_activity_at": "2024-01-10T06:22:31+05:30", 974 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.11.1" 975 | }, 976 | { 977 | "created_at": "2023-08-29T05:20:55+05:30", 978 | "assignee": { 979 | "login": "sdrtyvg", 980 | "id": 410195, 981 | "node_id": "MDQ6VXNlcjQxMDE5NQ==", 982 | "avatar_url": "https://avatars.githubusercontent.com/u/410195?v=4", 983 | "gravatar_id": "", 984 | "url": "https://api.github.com/users/sdrtyvg", 985 | "html_url": "https://github.com/sdrtyvg", 986 | "followers_url": "https://api.github.com/users/sdrtyvg/followers", 987 | "following_url": "https://api.github.com/users/sdrtyvg/following{/other_user}", 988 | "gists_url": "https://api.github.com/users/sdrtyvg/gists{/gist_id}", 989 | "starred_url": "https://api.github.com/users/sdrtyvg/starred{/owner}{/repo}", 990 | "subscriptions_url": "https://api.github.com/users/sdrtyvg/subscriptions", 991 | "organizations_url": "https://api.github.com/users/sdrtyvg/orgs", 992 | "repos_url": "https://api.github.com/users/sdrtyvg/repos", 993 | "events_url": "https://api.github.com/users/sdrtyvg/events{/privacy}", 994 | "received_events_url": "https://api.github.com/users/sdrtyvg/received_events", 995 | "type": "User", 996 | "site_admin": true 997 | }, 998 | "updated_at": "2024-01-03T13:30:00+05:30", 999 | "pending_cancellation_date": null, 1000 | "last_activity_at": "2023-10-27T01:28:48+05:30", 1001 | "last_activity_editor": "/" 1002 | }, 1003 | { 1004 | "created_at": "2023-08-29T05:20:55+05:30", 1005 | "assignee": { 1006 | "login": "werft5", 1007 | "id": 464067, 1008 | "node_id": "MDQ6VXNlcjQ2NDA2Nw==", 1009 | "avatar_url": "https://avatars.githubusercontent.com/u/464067?v=4", 1010 | "gravatar_id": "", 1011 | "url": "https://api.github.com/users/werft5", 1012 | "html_url": "https://github.com/werft5", 1013 | "followers_url": "https://api.github.com/users/werft5/followers", 1014 | "following_url": "https://api.github.com/users/werft5/following{/other_user}", 1015 | "gists_url": "https://api.github.com/users/werft5/gists{/gist_id}", 1016 | "starred_url": "https://api.github.com/users/werft5/starred{/owner}{/repo}", 1017 | "subscriptions_url": "https://api.github.com/users/werft5/subscriptions", 1018 | "organizations_url": "https://api.github.com/users/werft5/orgs", 1019 | "repos_url": "https://api.github.com/users/werft5/repos", 1020 | "events_url": "https://api.github.com/users/werft5/events{/privacy}", 1021 | "received_events_url": "https://api.github.com/users/werft5/received_events", 1022 | "type": "User", 1023 | "site_admin": true 1024 | }, 1025 | "updated_at": "2024-01-03T13:30:00+05:30", 1026 | "pending_cancellation_date": null, 1027 | "last_activity_at": "2023-07-15T01:02:17+05:30", 1028 | "last_activity_editor": "vscode/1.80.0-insider/copilot/1.96.255" 1029 | }, 1030 | { 1031 | "created_at": "2023-08-29T05:20:55+05:30", 1032 | "assignee": { 1033 | "login": "sertbh43", 1034 | "id": 472448, 1035 | "node_id": "MDQ6VXNlcjQ3MjQ0OA==", 1036 | "avatar_url": "https://avatars.githubusercontent.com/u/472448?v=4", 1037 | "gravatar_id": "", 1038 | "url": "https://api.github.com/users/sertbh43", 1039 | "html_url": "https://github.com/sertbh43", 1040 | "followers_url": "https://api.github.com/users/sertbh43/followers", 1041 | "following_url": "https://api.github.com/users/sertbh43/following{/other_user}", 1042 | "gists_url": "https://api.github.com/users/sertbh43/gists{/gist_id}", 1043 | "starred_url": "https://api.github.com/users/sertbh43/starred{/owner}{/repo}", 1044 | "subscriptions_url": "https://api.github.com/users/sertbh43/subscriptions", 1045 | "organizations_url": "https://api.github.com/users/sertbh43/orgs", 1046 | "repos_url": "https://api.github.com/users/sertbh43/repos", 1047 | "events_url": "https://api.github.com/users/sertbh43/events{/privacy}", 1048 | "received_events_url": "https://api.github.com/users/sertbh43/received_events", 1049 | "type": "User", 1050 | "site_admin": true 1051 | }, 1052 | "updated_at": "2024-01-03T13:30:00+05:30", 1053 | "pending_cancellation_date": null, 1054 | "last_activity_at": "2024-01-10T13:38:36+05:30", 1055 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 1056 | }, 1057 | { 1058 | "created_at": "2023-08-29T05:20:55+05:30", 1059 | "assignee": { 1060 | "login": "jukhg5", 1061 | "id": 494430, 1062 | "node_id": "MDQ6VXNlcjQ5NDQzMA==", 1063 | "avatar_url": "https://avatars.githubusercontent.com/u/494430?v=4", 1064 | "gravatar_id": "", 1065 | "url": "https://api.github.com/users/jukhg5", 1066 | "html_url": "https://github.com/jukhg5", 1067 | "followers_url": "https://api.github.com/users/jukhg5/followers", 1068 | "following_url": "https://api.github.com/users/jukhg5/following{/other_user}", 1069 | "gists_url": "https://api.github.com/users/jukhg5/gists{/gist_id}", 1070 | "starred_url": "https://api.github.com/users/jukhg5/starred{/owner}{/repo}", 1071 | "subscriptions_url": "https://api.github.com/users/jukhg5/subscriptions", 1072 | "organizations_url": "https://api.github.com/users/jukhg5/orgs", 1073 | "repos_url": "https://api.github.com/users/jukhg5/repos", 1074 | "events_url": "https://api.github.com/users/jukhg5/events{/privacy}", 1075 | "received_events_url": "https://api.github.com/users/jukhg5/received_events", 1076 | "type": "User", 1077 | "site_admin": true 1078 | }, 1079 | "updated_at": "2024-01-03T13:30:00+05:30", 1080 | "pending_cancellation_date": null, 1081 | "last_activity_at": "2023-04-10T23:44:40+05:30", 1082 | "last_activity_editor": "vscode/1.77.1/copilot/1.78.9758" 1083 | }, 1084 | { 1085 | "created_at": "2023-08-29T05:20:55+05:30", 1086 | "assignee": { 1087 | "login": "sedrty4", 1088 | "id": 498775, 1089 | "node_id": "MDQ6VXNlcjQ5ODc3NQ==", 1090 | "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4", 1091 | "gravatar_id": "", 1092 | "url": "https://api.github.com/users/sedrty4", 1093 | "html_url": "https://github.com/sedrty4", 1094 | "followers_url": "https://api.github.com/users/sedrty4/followers", 1095 | "following_url": "https://api.github.com/users/sedrty4/following{/other_user}", 1096 | "gists_url": "https://api.github.com/users/sedrty4/gists{/gist_id}", 1097 | "starred_url": "https://api.github.com/users/sedrty4/starred{/owner}{/repo}", 1098 | "subscriptions_url": "https://api.github.com/users/sedrty4/subscriptions", 1099 | "organizations_url": "https://api.github.com/users/sedrty4/orgs", 1100 | "repos_url": "https://api.github.com/users/sedrty4/repos", 1101 | "events_url": "https://api.github.com/users/sedrty4/events{/privacy}", 1102 | "received_events_url": "https://api.github.com/users/sedrty4/received_events", 1103 | "type": "User", 1104 | "site_admin": true 1105 | }, 1106 | "updated_at": "2024-01-03T13:30:00+05:30", 1107 | "pending_cancellation_date": null, 1108 | "last_activity_at": "2023-10-23T20:54:50+05:30", 1109 | "last_activity_editor": "vscode/1.84.0-insider/copilot-chat/0.9.2023102302" 1110 | }, 1111 | { 1112 | "created_at": "2023-08-29T05:20:55+05:30", 1113 | "assignee": { 1114 | "login": "sdrftg3", 1115 | "id": 523035, 1116 | "node_id": "MDQ6VXNlcjUyMzAzNQ==", 1117 | "avatar_url": "https://avatars.githubusercontent.com/u/523035?v=4", 1118 | "gravatar_id": "", 1119 | "url": "https://api.github.com/users/sdrftg3", 1120 | "html_url": "https://github.com/sdrftg3", 1121 | "followers_url": "https://api.github.com/users/sdrftg3/followers", 1122 | "following_url": "https://api.github.com/users/sdrftg3/following{/other_user}", 1123 | "gists_url": "https://api.github.com/users/sdrftg3/gists{/gist_id}", 1124 | "starred_url": "https://api.github.com/users/sdrftg3/starred{/owner}{/repo}", 1125 | "subscriptions_url": "https://api.github.com/users/sdrftg3/subscriptions", 1126 | "organizations_url": "https://api.github.com/users/sdrftg3/orgs", 1127 | "repos_url": "https://api.github.com/users/sdrftg3/repos", 1128 | "events_url": "https://api.github.com/users/sdrftg3/events{/privacy}", 1129 | "received_events_url": "https://api.github.com/users/sdrftg3/received_events", 1130 | "type": "User", 1131 | "site_admin": true 1132 | }, 1133 | "updated_at": "2024-01-03T13:30:00+05:30", 1134 | "pending_cancellation_date": null, 1135 | "last_activity_at": "2023-12-14T21:49:33+05:30", 1136 | "last_activity_editor": "/" 1137 | }, 1138 | { 1139 | "created_at": "2023-08-29T05:20:55+05:30", 1140 | "assignee": { 1141 | "login": "dewsrg", 1142 | "id": 533967, 1143 | "node_id": "MDQ6VXNlcjUzMzk2Nw==", 1144 | "avatar_url": "https://avatars.githubusercontent.com/u/533967?v=4", 1145 | "gravatar_id": "", 1146 | "url": "https://api.github.com/users/dewsrg", 1147 | "html_url": "https://github.com/dewsrg", 1148 | "followers_url": "https://api.github.com/users/dewsrg/followers", 1149 | "following_url": "https://api.github.com/users/dewsrg/following{/other_user}", 1150 | "gists_url": "https://api.github.com/users/dewsrg/gists{/gist_id}", 1151 | "starred_url": "https://api.github.com/users/dewsrg/starred{/owner}{/repo}", 1152 | "subscriptions_url": "https://api.github.com/users/dewsrg/subscriptions", 1153 | "organizations_url": "https://api.github.com/users/dewsrg/orgs", 1154 | "repos_url": "https://api.github.com/users/dewsrg/repos", 1155 | "events_url": "https://api.github.com/users/dewsrg/events{/privacy}", 1156 | "received_events_url": "https://api.github.com/users/dewsrg/received_events", 1157 | "type": "User", 1158 | "site_admin": true 1159 | }, 1160 | "updated_at": "2024-01-03T13:30:00+05:30", 1161 | "pending_cancellation_date": null, 1162 | "last_activity_at": "2024-01-10T03:32:11+05:30", 1163 | "last_activity_editor": "vscode/1.86.0-insider/copilot-chat/0.12.2024010901" 1164 | }, 1165 | { 1166 | "created_at": "2023-08-29T05:20:55+05:30", 1167 | "assignee": { 1168 | "login": "vfgth", 1169 | "id": 541250, 1170 | "node_id": "MDQ6VXNlcjU0MTI1MA==", 1171 | "avatar_url": "https://avatars.githubusercontent.com/u/541250?v=4", 1172 | "gravatar_id": "", 1173 | "url": "https://api.github.com/users/vfgth", 1174 | "html_url": "https://github.com/vfgth", 1175 | "followers_url": "https://api.github.com/users/vfgth/followers", 1176 | "following_url": "https://api.github.com/users/vfgth/following{/other_user}", 1177 | "gists_url": "https://api.github.com/users/vfgth/gists{/gist_id}", 1178 | "starred_url": "https://api.github.com/users/vfgth/starred{/owner}{/repo}", 1179 | "subscriptions_url": "https://api.github.com/users/vfgth/subscriptions", 1180 | "organizations_url": "https://api.github.com/users/vfgth/orgs", 1181 | "repos_url": "https://api.github.com/users/vfgth/repos", 1182 | "events_url": "https://api.github.com/users/vfgth/events{/privacy}", 1183 | "received_events_url": "https://api.github.com/users/vfgth/received_events", 1184 | "type": "User", 1185 | "site_admin": true 1186 | }, 1187 | "updated_at": "2024-01-03T13:30:00+05:30", 1188 | "pending_cancellation_date": null, 1189 | "last_activity_at": "2024-01-10T13:35:32+05:30", 1190 | "last_activity_editor": "vscode/1.85.1/copilot/1.147.0" 1191 | }, 1192 | { 1193 | "created_at": "2023-08-29T05:20:55+05:30", 1194 | "assignee": { 1195 | "login": "defghj4", 1196 | "id": 589285, 1197 | "node_id": "MDQ6VXNlcjU4OTI4NQ==", 1198 | "avatar_url": "https://avatars.githubusercontent.com/u/589285?v=4", 1199 | "gravatar_id": "", 1200 | "url": "https://api.github.com/users/defghj4", 1201 | "html_url": "https://github.com/defghj4", 1202 | "followers_url": "https://api.github.com/users/defghj4/followers", 1203 | "following_url": "https://api.github.com/users/defghj4/following{/other_user}", 1204 | "gists_url": "https://api.github.com/users/defghj4/gists{/gist_id}", 1205 | "starred_url": "https://api.github.com/users/defghj4/starred{/owner}{/repo}", 1206 | "subscriptions_url": "https://api.github.com/users/defghj4/subscriptions", 1207 | "organizations_url": "https://api.github.com/users/defghj4/orgs", 1208 | "repos_url": "https://api.github.com/users/defghj4/repos", 1209 | "events_url": "https://api.github.com/users/defghj4/events{/privacy}", 1210 | "received_events_url": "https://api.github.com/users/defghj4/received_events", 1211 | "type": "User", 1212 | "site_admin": true 1213 | }, 1214 | "updated_at": "2024-01-03T13:30:00+05:30", 1215 | "pending_cancellation_date": null, 1216 | "last_activity_at": "2023-12-16T17:49:38+05:30", 1217 | "last_activity_editor": "vscode/1.85.0/copilot-chat/0.10.2" 1218 | }, 1219 | { 1220 | "created_at": "2023-08-29T05:20:55+05:30", 1221 | "assignee": { 1222 | "login": "pkjm8", 1223 | "id": 600040, 1224 | "node_id": "MDQ6VXNlcjYwMDA0MA==", 1225 | "avatar_url": "https://avatars.githubusercontent.com/u/600040?v=4", 1226 | "gravatar_id": "", 1227 | "url": "https://api.github.com/users/pkjm8", 1228 | "html_url": "https://github.com/pkjm8", 1229 | "followers_url": "https://api.github.com/users/pkjm8/followers", 1230 | "following_url": "https://api.github.com/users/pkjm8/following{/other_user}", 1231 | "gists_url": "https://api.github.com/users/pkjm8/gists{/gist_id}", 1232 | "starred_url": "https://api.github.com/users/pkjm8/starred{/owner}{/repo}", 1233 | "subscriptions_url": "https://api.github.com/users/pkjm8/subscriptions", 1234 | "organizations_url": "https://api.github.com/users/pkjm8/orgs", 1235 | "repos_url": "https://api.github.com/users/pkjm8/repos", 1236 | "events_url": "https://api.github.com/users/pkjm8/events{/privacy}", 1237 | "received_events_url": "https://api.github.com/users/pkjm8/received_events", 1238 | "type": "User", 1239 | "site_admin": true 1240 | }, 1241 | "updated_at": "2024-01-03T13:30:00+05:30", 1242 | "pending_cancellation_date": null, 1243 | "last_activity_at": "2024-01-05T21:20:29+05:30", 1244 | "last_activity_editor": "vscode/1.85.1/copilot/1.143.0" 1245 | }, 1246 | { 1247 | "created_at": "2023-08-29T05:20:55+05:30", 1248 | "assignee": { 1249 | "login": "sdrtgh4", 1250 | "id": 609076, 1251 | "node_id": "MDQ6VXNlcjYwOTA3Ng==", 1252 | "avatar_url": "https://avatars.githubusercontent.com/u/609076?v=4", 1253 | "gravatar_id": "", 1254 | "url": "https://api.github.com/users/sdrtgh4", 1255 | "html_url": "https://github.com/sdrtgh4", 1256 | "followers_url": "https://api.github.com/users/sdrtgh4/followers", 1257 | "following_url": "https://api.github.com/users/sdrtgh4/following{/other_user}", 1258 | "gists_url": "https://api.github.com/users/sdrtgh4/gists{/gist_id}", 1259 | "starred_url": "https://api.github.com/users/sdrtgh4/starred{/owner}{/repo}", 1260 | "subscriptions_url": "https://api.github.com/users/sdrtgh4/subscriptions", 1261 | "organizations_url": "https://api.github.com/users/sdrtgh4/orgs", 1262 | "repos_url": "https://api.github.com/users/sdrtgh4/repos", 1263 | "events_url": "https://api.github.com/users/sdrtgh4/events{/privacy}", 1264 | "received_events_url": "https://api.github.com/users/sdrtgh4/received_events", 1265 | "type": "User", 1266 | "site_admin": true 1267 | }, 1268 | "updated_at": "2024-01-03T13:30:00+05:30", 1269 | "pending_cancellation_date": null, 1270 | "last_activity_at": "2024-01-09T21:53:32+05:30", 1271 | "last_activity_editor": "/" 1272 | }, 1273 | { 1274 | "created_at": "2023-08-29T05:20:55+05:30", 1275 | "assignee": { 1276 | "login": "sdert4", 1277 | "id": 617994, 1278 | "node_id": "MDQ6VXNlcjYxNzk5NA==", 1279 | "avatar_url": "https://avatars.githubusercontent.com/u/617994?v=4", 1280 | "gravatar_id": "", 1281 | "url": "https://api.github.com/users/sdert4", 1282 | "html_url": "https://github.com/sdert4", 1283 | "followers_url": "https://api.github.com/users/sdert4/followers", 1284 | "following_url": "https://api.github.com/users/sdert4/following{/other_user}", 1285 | "gists_url": "https://api.github.com/users/sdert4/gists{/gist_id}", 1286 | "starred_url": "https://api.github.com/users/sdert4/starred{/owner}{/repo}", 1287 | "subscriptions_url": "https://api.github.com/users/sdert4/subscriptions", 1288 | "organizations_url": "https://api.github.com/users/sdert4/orgs", 1289 | "repos_url": "https://api.github.com/users/sdert4/repos", 1290 | "events_url": "https://api.github.com/users/sdert4/events{/privacy}", 1291 | "received_events_url": "https://api.github.com/users/sdert4/received_events", 1292 | "type": "User", 1293 | "site_admin": true 1294 | }, 1295 | "updated_at": "2024-01-03T13:30:00+05:30", 1296 | "pending_cancellation_date": null, 1297 | "last_activity_at": "2023-08-04T20:36:19+05:30", 1298 | "last_activity_editor": "vscode/1.79.2/copilot/1.100.306" 1299 | }, 1300 | { 1301 | "created_at": "2023-08-29T05:20:55+05:30", 1302 | "assignee": { 1303 | "login": "eric546", 1304 | "id": 634191, 1305 | "node_id": "MDQ6VXNlcjYzNDE5MQ==", 1306 | "avatar_url": "https://avatars.githubusercontent.com/u/634191?v=4", 1307 | "gravatar_id": "", 1308 | "url": "https://api.github.com/users/eric546", 1309 | "html_url": "https://github.com/eric546", 1310 | "followers_url": "https://api.github.com/users/eric546/followers", 1311 | "following_url": "https://api.github.com/users/eric546/following{/other_user}", 1312 | "gists_url": "https://api.github.com/users/eric546/gists{/gist_id}", 1313 | "starred_url": "https://api.github.com/users/eric546/starred{/owner}{/repo}", 1314 | "subscriptions_url": "https://api.github.com/users/eric546/subscriptions", 1315 | "organizations_url": "https://api.github.com/users/eric546/orgs", 1316 | "repos_url": "https://api.github.com/users/eric546/repos", 1317 | "events_url": "https://api.github.com/users/eric546/events{/privacy}", 1318 | "received_events_url": "https://api.github.com/users/eric546/received_events", 1319 | "type": "User", 1320 | "site_admin": true 1321 | }, 1322 | "updated_at": "2024-01-03T13:30:00+05:30", 1323 | "pending_cancellation_date": null, 1324 | "last_activity_at": "2024-01-10T13:32:16+05:30", 1325 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 1326 | }, 1327 | { 1328 | "created_at": "2023-08-29T05:20:55+05:30", 1329 | "assignee": { 1330 | "login": "major654", 1331 | "id": 636626, 1332 | "node_id": "MDQ6VXNlcjYzNjYyNg==", 1333 | "avatar_url": "https://avatars.githubusercontent.com/u/636626?v=4", 1334 | "gravatar_id": "", 1335 | "url": "https://api.github.com/users/major654", 1336 | "html_url": "https://github.com/major654", 1337 | "followers_url": "https://api.github.com/users/major654/followers", 1338 | "following_url": "https://api.github.com/users/major654/following{/other_user}", 1339 | "gists_url": "https://api.github.com/users/major654/gists{/gist_id}", 1340 | "starred_url": "https://api.github.com/users/major654/starred{/owner}{/repo}", 1341 | "subscriptions_url": "https://api.github.com/users/major654/subscriptions", 1342 | "organizations_url": "https://api.github.com/users/major654/orgs", 1343 | "repos_url": "https://api.github.com/users/major654/repos", 1344 | "events_url": "https://api.github.com/users/major654/events{/privacy}", 1345 | "received_events_url": "https://api.github.com/users/major654/received_events", 1346 | "type": "User", 1347 | "site_admin": true 1348 | }, 1349 | "updated_at": "2024-01-03T13:30:00+05:30", 1350 | "pending_cancellation_date": null, 1351 | "last_activity_at": "2024-01-10T13:37:16+05:30", 1352 | "last_activity_editor": "vscode/1.85.1/copilot-chat/0.11.1" 1353 | } 1354 | ] 1355 | } -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | orgName: "Contoso", 8 | token:"<>", 9 | ghBaseUrl:"https://api.github.com/orgs", 10 | copilotUsageApiUrl:"/copilot/usage", 11 | copilotSeatApiUrl:"/copilot/billing/seats" 12 | }; 13 | 14 | /* 15 | * For easier debugging in development mode, you can import the following file 16 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 17 | * 18 | * This import should be commented out in production mode because it will have a negative impact 19 | * on performance if an error is thrown. 20 | */ 21 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 22 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octodemo/Copilot-Usage-Dashboard/457e2490a4b25023aa7da300797abc0ee70b7a88/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Copilot Usage Dashboard 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes recent versions of Safari, Chrome (including 12 | * Opera), Edge on the desktop, and iOS and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** 22 | * By default, zone.js will patch all possible macroTask and DomEvents 23 | * user can disable parts of macroTask/DomEvents patch by setting following flags 24 | * because those flags need to be set before `zone.js` being loaded, and webpack 25 | * will put import in the top of bundle, so user need to create a separate file 26 | * in this directory (for example: zone-flags.ts), and put the following flags 27 | * into that file, and then add the following code before importing zone.js. 28 | * import './zone-flags'; 29 | * 30 | * The flags allowed in zone-flags.ts are listed here. 31 | * 32 | * The following flags will work for all browsers. 33 | * 34 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 35 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 36 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 37 | * 38 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 39 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 40 | * 41 | * (window as any).__Zone_enable_cross_context_check = true; 42 | * 43 | */ 44 | 45 | /*************************************************************************************************** 46 | * Zone JS is required by default for Angular itself. 47 | */ 48 | import 'zone.js'; // Included with Angular CLI. 49 | 50 | 51 | /*************************************************************************************************** 52 | * APPLICATION IMPORTS 53 | */ 54 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | @import "../node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css"; 3 | 4 | html, body { height: 100%; } 5 | body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; margin-bottom: 50px;} 6 | 7 | .container { 8 | display: flex; 9 | flex-flow: wrap; 10 | height: 100%; 11 | margin-left: 2%; 12 | margin-right: 2%; 13 | padding: 10px; 14 | } -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | // First, initialize the Angular testing environment. 11 | getTestBed().initTestEnvironment( 12 | BrowserDynamicTestingModule, 13 | platformBrowserDynamicTesting(), 14 | ); 15 | -------------------------------------------------------------------------------- /test.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octodemo/Copilot-Usage-Dashboard/457e2490a4b25023aa7da300797abc0ee70b7a88/test.json -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "noImplicitOverride": true, 10 | "noPropertyAccessFromIndexSignature": true, 11 | "noImplicitReturns": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "sourceMap": true, 14 | "declaration": false, 15 | "downlevelIteration": true, 16 | "experimentalDecorators": true, 17 | "moduleResolution": "node", 18 | "importHelpers": true, 19 | "target": "ES2022", 20 | "module": "es2020", 21 | "lib": [ 22 | "es2020", 23 | "dom" 24 | ], 25 | "useDefineForClassFields": false 26 | }, 27 | "angularCompilerOptions": { 28 | "enableI18nLegacyMessageIdFormat": false, 29 | "strictInjectionParameters": true, 30 | "strictInputAccessModifiers": true, 31 | "strictTemplates": true 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | --------------------------------------------------------------------------------