diff --git a/src/app/pages/execute-system-test/execute-system-test.page.html b/src/app/pages/execute-system-test/execute-system-test.page.html
index 24ddb08..642090f 100644
--- a/src/app/pages/execute-system-test/execute-system-test.page.html
+++ b/src/app/pages/execute-system-test/execute-system-test.page.html
@@ -1,11 +1,41 @@
-
-
- execute_system_test
-
-
+
-
+
-
+
+
+
+
+ {{systemTest.title}}
+
+
+
+ {{systemTest.description}}
+
+
+
+ @for (step of systemTest["steps"] ; track systemTest.title){
+
+
+ {{step.stepTitle}}
+ {{step.expectedResults}}
+
+ @if (step.isComplete){
+
+
+ }
+ @if (!step.isComplete){
+
+
+ }
+
+ }
+
+
+ Save
+
+
+
+
diff --git a/src/app/pages/execute-system-test/execute-system-test.page.ts b/src/app/pages/execute-system-test/execute-system-test.page.ts
index 95d3270..f2529a2 100644
--- a/src/app/pages/execute-system-test/execute-system-test.page.ts
+++ b/src/app/pages/execute-system-test/execute-system-test.page.ts
@@ -1,4 +1,9 @@
import { Component, OnInit } from '@angular/core';
+import {ActivatedRoute} from "@angular/router";
+import {SystemTest} from "../../interfaces/system-test";
+import {User} from "../../interfaces/user";
+import {SystemTestService} from "../../services/system-test.service";
+import {LoadingController} from "@ionic/angular";
@Component({
selector: 'app-execute-system-test',
@@ -7,9 +12,109 @@ import { Component, OnInit } from '@angular/core';
})
export class ExecuteSystemTestPage implements OnInit {
- constructor() { }
+ productObjective: string = '';
+ productStep: string = '';
+ testTitle: string = '';
+
+ systemTest:SystemTest = {
+ title: '',
+ description: '',
+ steps: [],
+ type: 'system-test',
+ state: false
+ }
+
+ orgName: string = '';
+
+ constructor(
+ private activatedRoute: ActivatedRoute,
+ private systemTestService: SystemTestService,
+ private loadingCtrl: LoadingController
+ ) { }
ngOnInit() {
+ this.getProductFromParams();
+ this.getSystemTest();
+ }
+
+ ionViewWillEnter() {
+ this.getProductFromParams();
+ this.getSystemTest();
+ }
+
+ /**
+ * This method gets the product and step from URL parameters.
+ */
+ getProductFromParams() {
+ // Get product from URL params
+ this.activatedRoute.params.subscribe(params => {
+ this.productObjective = params['productObjective'];
+ this.productStep = params['step'];
+ this.testTitle = params['testTitle'];
+ });
+ console.log(this.productObjective);
+ console.log(this.productStep);
+ console.log(this.testTitle);
+ }
+
+ async getSystemTest() {
+ // Get User from local storage
+ const userString = localStorage.getItem('user');
+ if (!userString) return
+
+ const user: User = JSON.parse(userString);
+ this.orgName = user.orgName!;
+
+ // Get system test from database
+ await this.systemTestService.getSystemTest(this.orgName, this.productObjective, this.productStep).then(r => {
+ this.systemTest = r.find((systemTest: { title: string; }) => systemTest.title === this.testTitle)!;
+ });
+ }
+
+ okClick(stepTitle: string) {
+ //Change the step state to true
+ this.systemTest.steps.find((step: { stepTitle: string; }) => step.stepTitle === stepTitle)!.isComplete = true;
+ console.log(this.systemTest);
+ }
+
+ badClick(stepTitle: string) {
+ //Change the step state to false
+ this.systemTest.steps.find((step: { stepTitle: string; }) => step.stepTitle === stepTitle)!.isComplete = false;
+ console.log(this.systemTest);
+ }
+
+ async save() {
+ await this.showLoading()
+ //check if all steps are complete
+ let isComplete = true;
+ this.systemTest.steps.forEach(step => {
+ if (!step.isComplete) {
+ isComplete = false;
+ }
+ });
+ this.systemTest.state = isComplete
+
+ // Save the system test
+ await this.systemTestService.saveSystemTest(this.orgName, this.productObjective, this.productStep, this.systemTest);
+
+ await this.hideLoading()
+
+ }
+
+ /**
+ * Show a loading spinner.
+ */
+ async showLoading() {
+ const loading = await this.loadingCtrl.create({
+ });
+ await loading.present();
+ }
+
+ /**
+ * Hide the loading spinner.
+ */
+ async hideLoading() {
+ await this.loadingCtrl.dismiss();
}
}
diff --git a/src/app/pages/software-testing-chooser/software-testing-chooser.module.ts b/src/app/pages/software-testing-chooser/software-testing-chooser.module.ts
index f1ae496..db45691 100644
--- a/src/app/pages/software-testing-chooser/software-testing-chooser.module.ts
+++ b/src/app/pages/software-testing-chooser/software-testing-chooser.module.ts
@@ -8,6 +8,8 @@ import { SoftwareTestingChooserPageRoutingModule } from './software-testing-choo
import { SoftwareTestingChooserPage } from './software-testing-chooser.page';
import {ComponentsModule} from "../../components/components.module";
+import {NgxEchartsDirective} from "ngx-echarts";
+import {GraphPageRoutingModule} from "../graph-latency/graph-latency-routing.module";
@NgModule({
imports: [
@@ -15,7 +17,8 @@ import {ComponentsModule} from "../../components/components.module";
FormsModule,
IonicModule,
SoftwareTestingChooserPageRoutingModule,
- ComponentsModule
+ ComponentsModule,
+ NgxEchartsDirective,
],
declarations: [SoftwareTestingChooserPage]
})
diff --git a/src/app/pages/software-testing-chooser/software-testing-chooser.page.html b/src/app/pages/software-testing-chooser/software-testing-chooser.page.html
index 970ee63..e16e736 100644
--- a/src/app/pages/software-testing-chooser/software-testing-chooser.page.html
+++ b/src/app/pages/software-testing-chooser/software-testing-chooser.page.html
@@ -47,12 +47,59 @@
Choose a type of test.
-
+
+
+
+
+
+ Created tests for product step: {{productStep}}
+
+
+
+
+
+ Created tests for product step: {{productStep}}
+
+
+
- Created tests for product step: {{productStep}}
+ System tests results for product step: {{productStep}}
+
+
+
+
+ Passed Tests
+
+
+ {{passed}}
+
+
+
+
+
+
+ Failed Tests
+
+
+ {{ failed }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -60,10 +107,14 @@ Choose a type of test.
{{ test.title }}
- Execute Test
+ View Test Results
+ Execute Test
+ Delete Test
+
+
diff --git a/src/app/pages/software-testing-chooser/software-testing-chooser.page.ts b/src/app/pages/software-testing-chooser/software-testing-chooser.page.ts
index 385da51..8676a9f 100644
--- a/src/app/pages/software-testing-chooser/software-testing-chooser.page.ts
+++ b/src/app/pages/software-testing-chooser/software-testing-chooser.page.ts
@@ -4,6 +4,8 @@ import {Product} from "../../interfaces/product";
import {SystemTestService} from "../../services/system-test.service";
import {SystemTest} from "../../interfaces/system-test";
import {User} from "../../interfaces/user";
+import {LoadingController} from "@ionic/angular";
+import {EChartsOption} from "echarts";
@Component({
selector: 'app-software-testing-chooser',
@@ -17,19 +19,54 @@ export class SoftwareTestingChooserPage implements OnInit {
private user: User = {};
private orgName: string = '';
+ passed: number = 0;
+ failed: number = 0;
+
+ systemTestsChart: EChartsOption = {
+ tooltip: {
+ trigger: 'axis'
+ },
+ legend: {
+ data: ['Passed', 'Failed'],
+ left: 'left'
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: [] // This will be populated with execution dates
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ {
+ name: 'Passed',
+ type: 'line',
+ data: [] // This will be populated with the number of passed tests
+ },
+ {
+ name: 'Failed',
+ type: 'line',
+ data: [] // This will be populated with the number of failed tests
+ }
+ ]
+};
+
constructor(
private activatedRoute: ActivatedRoute,
private router: Router,
- private systemTestService: SystemTestService
+ private systemTestService: SystemTestService,
+ private loadingCtrl: LoadingController
) { }
ngOnInit() {
}
- ionViewWillEnter() {
+ async ionViewWillEnter() {
this.getProductFromParams();
- this.getSystemTests();
-
+ await this.getSystemTests();
+ await this.calculatePassed();
+ await this.calculateGraphData();
}
/**
@@ -53,7 +90,8 @@ export class SoftwareTestingChooserPage implements OnInit {
}]);
}
- getSystemTests() {
+ async getSystemTests() {
+ await this.showLoading()
// Get User from local storage
const userString = localStorage.getItem('user');
if (!userString) return;
@@ -66,6 +104,8 @@ export class SoftwareTestingChooserPage implements OnInit {
this.systemTestService.getSystemTest(this.orgName, this.productObjective, this.productStep).then(r => {
this.systemTests = r;
});
+
+ await this.hideLoading();
}
@@ -73,4 +113,132 @@ export class SoftwareTestingChooserPage implements OnInit {
this.getSystemTests();
$event.target.complete();
}
+
+ navigateToExecuteTest(testTitle:string) {
+ this.router.navigate(['/execute-system-test', {
+ productObjective: this.productObjective,
+ step: this.productStep,
+ testTitle: testTitle
+ }]);
+ }
+
+ async calculatePassed() {
+ await this.showLoading();
+
+ this.passed = 0;
+ this.failed = 0;
+ await this.systemTestService.getSystemTestHistoryByStep(this.orgName, this.productObjective, this.productStep).then(r => {
+ r.forEach((test: { state: boolean; }) => {
+ if (test.state) {
+ this.passed++;
+ }
+ else {
+ this.failed++;
+ }
+ });
+ });
+
+ await this.hideLoading();
+ }
+
+ /**
+ * Show a loading spinner.
+ */
+ async showLoading() {
+ const loading = await this.loadingCtrl.create({
+ });
+ await loading.present();
+ }
+
+ /**
+ * Hide the loading spinner.
+ */
+ async hideLoading() {
+ await this.loadingCtrl.dismiss();
+ }
+
+
+ async deleteTest(title: string) {
+ let systemTest = this.systemTests.find((systemTest: { title: string; }) => systemTest.title === title);
+ if (!systemTest) return;
+ await this.systemTestService.deleteSystemTest(this.orgName, this.productObjective, this.productStep,systemTest).then(async () => {
+ await this.getSystemTests();
+ });
+ await this.calculatePassed();
+ await this.calculateGraphData();
+ }
+
+
+ async calculateGraphData() {
+ await this.showLoading();
+ // Get the system test history
+ await this.systemTestService.getSystemTestHistory(this.orgName, this.productObjective).then(r => {
+ // Filter the data to only include the system tests for the specified product step
+ const filteredData = Object.keys(r)
+ .filter(key => r[key].productStep === this.productStep)
+ .map(key => ({ timestamp: key, systemTest: r[key].systemTest }));
+
+ // Sort the data by timestamp
+ // @ts-ignore
+ for (let i = 0; i < filteredData.length; i++) {
+ for (let j = 0; j < filteredData.length - 1; j++) {
+ if (new Date(filteredData[j].timestamp).getTime() > new Date(filteredData[j + 1].timestamp).getTime()) {
+ let temp = filteredData[j];
+ filteredData[j] = filteredData[j + 1];
+ filteredData[j + 1] = temp;
+ }
+ }
+ }
+
+ // count the number of passed and failed tests for each date
+ let data = [
+ ]
+
+ for (let test of filteredData) {
+ let date = new Date(test.timestamp).toLocaleDateString();
+ let passed = test.systemTest.state ? 1 : 0;
+ let failed = test.systemTest.state ? 0 : 1;
+
+ let index = data.findIndex((d: { date: string; }) => d.date === date);
+ if (index === -1) {
+ data.push({ date, passed, failed });
+ }
+ else {
+ data[index].passed += passed;
+ data[index].failed += failed;
+ }
+ }
+
+ console.log(data);
+
+ // Populate the chart data
+ this.systemTestsChart.xAxis = {
+ type: 'category',
+ boundaryGap: false,
+ data: data.map((d: { date: string; }) => d.date)
+ };
+ this.systemTestsChart.series = [
+ {
+ name: 'Passed',
+ type: 'line',
+ data: data.map((d: { passed: number; }) => d.passed)
+ },
+ {
+ name: 'Failed',
+ type: 'line',
+ data: data.map((d: { failed: number; }) => d.failed)
+ }
+ ];
+
+ console.log(this.systemTestsChart.xAxis.data);
+ console.log(this.systemTestsChart.series[0].data); // Passed data
+ console.log(this.systemTestsChart.series[1].data); // Failed data
+
+ this.systemTestsChart = { ...this.systemTestsChart };
+
+
+ });
+ await this.hideLoading();
+ }
+
}
diff --git a/src/app/services/system-test.service.ts b/src/app/services/system-test.service.ts
index c04d132..e151e22 100644
--- a/src/app/services/system-test.service.ts
+++ b/src/app/services/system-test.service.ts
@@ -46,7 +46,74 @@ export class SystemTestService {
}
+ async saveSystemTest(orgName: string, productObjective: string, productStep: string, systemTest: SystemTest) {
+ const docRef = doc(this.firestore, 'teams', orgName, 'products', productObjective, 'software_testing', 'system_tests_history');
+ // Get current date and time
+ const now = new Date();
+ const timestamp = `${now.getDate()}/${now.getMonth()}/${now.getFullYear()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
+ const docSnap = await getDoc(docRef);
+ if (!docSnap.exists()) {
+ await setDoc(docRef, { [timestamp]: {systemTest, productStep} });
+ } else {
+ let data = docSnap.data();
+ data[timestamp] = {systemTest};
+ data[timestamp].productStep = productStep;
+ await setDoc(docRef, data);
+ }
+ }
+
+ async getSystemTestHistoryByStep(orgName: string, productObjective: string, productStep: string) {
+ const docRef = doc(this.firestore, 'teams', orgName, 'products', productObjective, 'software_testing', 'system_tests_history');
+ const docSnap = await getDoc(docRef);
+ if (docSnap.exists()) {
+ const data = docSnap.data();
+
+ // Filter the data to only include the system tests for the specified product step
+ const filteredData = Object.keys(data).filter(key => data[key].productStep === productStep).map(key => data[key].systemTest);
+
+ return filteredData;
+ }
+ return [];
+ }
+
+ async getSystemTestHistory(orgName: string, productObjective: string) {
+ const docRef = doc(this.firestore, 'teams', orgName, 'products', productObjective, 'software_testing', 'system_tests_history');
+ const docSnap = await getDoc(docRef);
+ if (docSnap.exists()) {
+ const data = docSnap.data();
+ return data;
+ }
+ return {};
+ }
+
+ async deleteSystemTest(orgName: string, productObjective: string, productStep: string, systemTest: SystemTest) {
+ // Delete the system test from the system_tests collection
+ let docRef = doc(this.firestore, 'teams', orgName, 'products', productObjective, 'software_testing', 'system_tests');
+ let docSnap = await getDoc(docRef);
+ if (docSnap.exists()) {
+ let data = docSnap.data();
+ let arr = data[productStep];
+ let index = arr.indexOf(systemTest);
+ arr.splice(index, 1);
+ await setDoc(docRef, {[productStep]: arr});
+ }
+
+ // Delete the system test from the system_tests_history collection
+ docRef = doc(this.firestore, 'teams', orgName, 'products', productObjective, 'software_testing', 'system_tests_history');
+ docSnap = await getDoc(docRef);
+ if (docSnap.exists()) {
+ let data = docSnap.data();
+ for (let key in data) {
+ console.log(data[key].systemTest.title);
+ if (data[key].systemTest.title === systemTest.title) {
+ delete data[key];
+ }
+ }
+ await setDoc(docRef, data);
+ }
+
+ }
}
diff --git a/www/1062.27a6fbe77a434259.js b/www/1062.27a6fbe77a434259.js
deleted file mode 100644
index 64b22e4..0000000
--- a/www/1062.27a6fbe77a434259.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[1062],{5553:(E,c,n)=>{n.d(c,{h:()=>l});var r=n(177),d=n(7863),s=n(4438);let l=(()=>{var e;class m{}return(e=m).\u0275fac=function(i){return new(i||e)},e.\u0275mod=s.$C({type:e}),e.\u0275inj=s.G2t({imports:[r.MD,d.bv]}),m})()},1062:(E,c,n)=>{n.r(c),n.d(c,{ExecuteSystemTestPageModule:()=>P});var r=n(177),d=n(4341),s=n(7863),l=n(7650),e=n(4438),m=n(8453);const i=[{path:"",component:(()=>{var t;class o{constructor(){}ngOnInit(){}}return(t=o).\u0275fac=function(u){return new(u||t)},t.\u0275cmp=e.VBU({type:t,selectors:[["app-execute-system-test"]],decls:7,vars:3,consts:[[3,"translucent"],[3,"fullscreen"],[3,"title"]],template:function(u,T){1&u&&(e.j41(0,"ion-header",0)(1,"ion-toolbar")(2,"ion-title"),e.EFF(3,"execute_system_test"),e.k0s()()(),e.j41(4,"ion-content",1)(5,"ion-row"),e.nrm(6,"app-title",2),e.k0s()()),2&u&&(e.Y8G("translucent",!0),e.R7$(4),e.Y8G("fullscreen",!0),e.R7$(2),e.Y8G("title","Execute System Test"))},dependencies:[s.W9,s.eU,s.ln,s.BC,s.ai,m.W]}),o})()}];let g=(()=>{var t;class o{}return(t=o).\u0275fac=function(u){return new(u||t)},t.\u0275mod=e.$C({type:t}),t.\u0275inj=e.G2t({imports:[l.iI.forChild(i),l.iI]}),o})();var M=n(5553);let P=(()=>{var t;class o{}return(t=o).\u0275fac=function(u){return new(u||t)},t.\u0275mod=e.$C({type:t}),t.\u0275inj=e.G2t({imports:[r.MD,d.YN,s.bv,g,M.h]}),o})()}}]);
\ No newline at end of file
diff --git a/www/1062.8645b76ab9c621ba.js b/www/1062.8645b76ab9c621ba.js
new file mode 100644
index 0000000..a83e473
--- /dev/null
+++ b/www/1062.8645b76ab9c621ba.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[1062],{5553:(y,p,i)=>{i.d(p,{h:()=>d});var c=i(177),T=i(7863),o=i(4438);let d=(()=>{var l;class e{}return(l=e).\u0275fac=function(m){return new(m||l)},l.\u0275mod=o.$C({type:l}),l.\u0275inj=o.G2t({imports:[c.MD,T.bv]}),e})()},3241:(y,p,i)=>{i.d(p,{p:()=>d});var c=i(4438),T=i(177),o=i(7863);let d=(()=>{var l;class e{constructor(m){this.location=m,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(l=e).\u0275fac=function(m){return new(m||l)(c.rXU(T.aZ))},l.\u0275cmp=c.VBU({type:l,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(m,g){1&m&&(c.j41(0,"ion-header",0)(1,"ion-toolbar"),c.nrm(2,"ion-menu-button",1),c.j41(3,"ion-icon",2),c.bIt("click",function(){return g.goBack()}),c.k0s(),c.j41(4,"ion-title"),c.EFF(5),c.k0s()()()),2&m&&(c.Y8G("translucent",!0),c.R7$(5),c.JRh(g.title))},dependencies:[o.eU,o.iq,o.MC,o.BC,o.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),e})()},1062:(y,p,i)=>{i.r(p),i.d(p,{ExecuteSystemTestPageModule:()=>x});var c=i(177),T=i(4341),o=i(7863),d=i(7650),l=i(467),e=i(4438),_=i(9274),m=i(8453),g=i(3241);function h(s,u){return this.systemTest.title}function f(s,u){if(1&s){const r=e.RV6();e.j41(0,"ion-icon",9),e.bIt("click",function(){e.eBV(r);const n=e.XpG().$implicit,a=e.XpG();return e.Njj(a.okClick(n.stepTitle))}),e.k0s(),e.j41(1,"ion-icon",10),e.bIt("click",function(){e.eBV(r);const n=e.XpG().$implicit,a=e.XpG();return e.Njj(a.badClick(n.stepTitle))}),e.k0s()}}function E(s,u){if(1&s){const r=e.RV6();e.j41(0,"ion-icon",11),e.bIt("click",function(){e.eBV(r);const n=e.XpG().$implicit,a=e.XpG();return e.Njj(a.okClick(n.stepTitle))}),e.k0s(),e.j41(1,"ion-icon",12),e.bIt("click",function(){e.eBV(r);const n=e.XpG().$implicit,a=e.XpG();return e.Njj(a.badClick(n.stepTitle))}),e.k0s()}}function v(s,u){if(1&s&&(e.j41(0,"ion-item")(1,"ion-label")(2,"h1"),e.EFF(3),e.k0s(),e.j41(4,"p"),e.EFF(5),e.k0s()(),e.DNE(6,f,2,0)(7,E,2,0),e.k0s()),2&s){const r=u.$implicit;e.R7$(3),e.JRh(r.stepTitle),e.R7$(2),e.JRh(r.expectedResults),e.R7$(),e.vxM(6,r.isComplete?6:-1),e.R7$(),e.vxM(7,r.isComplete?-1:7)}}const C=[{path:"",component:(()=>{var s;class u{constructor(t,n,a){this.activatedRoute=t,this.systemTestService=n,this.loadingCtrl=a,this.productObjective="",this.productStep="",this.testTitle="",this.systemTest={title:"",description:"",steps:[],type:"system-test",state:!1},this.orgName=""}ngOnInit(){this.getProductFromParams(),this.getSystemTest()}ionViewWillEnter(){this.getProductFromParams(),this.getSystemTest()}getProductFromParams(){this.activatedRoute.params.subscribe(t=>{this.productObjective=t.productObjective,this.productStep=t.step,this.testTitle=t.testTitle}),console.log(this.productObjective),console.log(this.productStep),console.log(this.testTitle)}getSystemTest(){var t=this;return(0,l.A)(function*(){const n=localStorage.getItem("user");if(!n)return;const a=JSON.parse(n);t.orgName=a.orgName,yield t.systemTestService.getSystemTest(t.orgName,t.productObjective,t.productStep).then(k=>{t.systemTest=k.find(R=>R.title===t.testTitle)})})()}okClick(t){this.systemTest.steps.find(n=>n.stepTitle===t).isComplete=!0,console.log(this.systemTest)}badClick(t){this.systemTest.steps.find(n=>n.stepTitle===t).isComplete=!1,console.log(this.systemTest)}save(){var t=this;return(0,l.A)(function*(){yield t.showLoading();let n=!0;t.systemTest.steps.forEach(a=>{a.isComplete||(n=!1)}),t.systemTest.state=n,yield t.systemTestService.saveSystemTest(t.orgName,t.productObjective,t.productStep,t.systemTest),yield t.hideLoading()})()}showLoading(){var t=this;return(0,l.A)(function*(){yield(yield t.loadingCtrl.create({})).present()})()}hideLoading(){var t=this;return(0,l.A)(function*(){yield t.loadingCtrl.dismiss()})()}}return(s=u).\u0275fac=function(t){return new(t||s)(e.rXU(d.nX),e.rXU(_.h),e.rXU(o.Xi))},s.\u0275cmp=e.VBU({type:s,selectors:[["app-execute-system-test"]],decls:21,vars:5,consts:[[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12","size-md","12","size-lg","12",1,""],[1,"min-h-full","flex","flex-col","p-8"],[1,"p-2"],[1,"text-4xl","text-white","font-bold"],[1,"text-xl"],["color","primary","expand","block","fill","outline",3,"click"],["aria-hidden","true","name","checkmark-circle","slot","end","color","success",3,"click"],["aria-hidden","true","name","close-circle","slot","end",3,"click"],["aria-hidden","true","name","checkmark-circle","slot","end",3,"click"],["aria-hidden","true","name","close-circle","slot","end","color","danger",3,"click"]],template:function(t,n){1&t&&(e.nrm(0,"app-header-return",0),e.j41(1,"ion-content",1)(2,"ion-grid"),e.nrm(3,"app-title",0),e.j41(4,"ion-row",2)(5,"ion-col",3)(6,"ion-card",4)(7,"ion-card-title",5)(8,"ion-label",6),e.EFF(9),e.k0s()(),e.nrm(10,"br"),e.j41(11,"ion-card-title",5)(12,"ion-label",7),e.EFF(13),e.k0s()(),e.nrm(14,"br"),e.j41(15,"ion-list"),e.Z7z(16,v,8,4,"ion-item",null,h,!0),e.k0s(),e.nrm(18,"br"),e.j41(19,"ion-button",8),e.bIt("click",function(){return n.save()}),e.EFF(20,"Save"),e.k0s()()()()()()),2&t&&(e.Y8G("title","Execute System Test"),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(2),e.Y8G("title","Execute System Test"),e.R7$(6),e.JRh(n.systemTest.title),e.R7$(4),e.JRh(n.systemTest.description),e.R7$(3),e.Dyx(n.systemTest.steps))},dependencies:[o.Jm,o.b_,o.tN,o.hU,o.W9,o.lO,o.iq,o.uz,o.he,o.nf,o.ln,m.W,g.p]}),u})()}];let P=(()=>{var s;class u{}return(s=u).\u0275fac=function(t){return new(t||s)},s.\u0275mod=e.$C({type:s}),s.\u0275inj=e.G2t({imports:[d.iI.forChild(C),d.iI]}),u})();var S=i(5553);let x=(()=>{var s;class u{}return(s=u).\u0275fac=function(t){return new(t||s)},s.\u0275mod=e.$C({type:s}),s.\u0275inj=e.G2t({imports:[c.MD,T.YN,o.bv,P,S.h]}),u})()}}]);
\ No newline at end of file
diff --git a/www/383.77457df574544b3d.js b/www/383.77457df574544b3d.js
new file mode 100644
index 0000000..94fbeae
--- /dev/null
+++ b/www/383.77457df574544b3d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[383],{5553:(F,f,n)=>{n.d(f,{h:()=>g});var l=n(177),T=n(7863),i=n(4438);let g=(()=>{var a;class e{}return(a=e).\u0275fac=function(p){return new(p||a)},a.\u0275mod=i.$C({type:a}),a.\u0275inj=i.G2t({imports:[l.MD,T.bv]}),e})()},3241:(F,f,n)=>{n.d(f,{p:()=>g});var l=n(4438),T=n(177),i=n(7863);let g=(()=>{var a;class e{constructor(p){this.location=p,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(a=e).\u0275fac=function(p){return new(p||a)(l.rXU(T.aZ))},a.\u0275cmp=l.VBU({type:a,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(p,C){1&p&&(l.j41(0,"ion-header",0)(1,"ion-toolbar"),l.nrm(2,"ion-menu-button",1),l.j41(3,"ion-icon",2),l.bIt("click",function(){return C.goBack()}),l.k0s(),l.j41(4,"ion-title"),l.EFF(5),l.k0s()()()),2&p&&(l.Y8G("translucent",!0),l.R7$(5),l.JRh(C.title))},dependencies:[i.eU,i.iq,i.MC,i.BC,i.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),e})()},383:(F,f,n)=>{n.r(f),n.d(f,{SoftwareTestingChooserPageModule:()=>b});var l=n(177),T=n(4341),i=n(7863),g=n(7650),a=n(467),e=n(4438),y=n(9274),p=n(8453),C=n(3241),_=n(2820);function E(r,h){if(1&r){const u=e.RV6();e.j41(0,"ion-col",19)(1,"ion-card")(2,"ion-card-header")(3,"ion-card-title"),e.EFF(4),e.k0s()(),e.j41(5,"ion-card-content")(6,"ion-button",20),e.bIt("click",function(){const s=e.eBV(u).$implicit,o=e.XpG();return e.Njj(o.navigateToExecuteTest(s.title))}),e.EFF(7,"View Test Results"),e.k0s(),e.j41(8,"ion-button",20),e.bIt("click",function(){const s=e.eBV(u).$implicit,o=e.XpG();return e.Njj(o.navigateToExecuteTest(s.title))}),e.EFF(9,"Execute Test"),e.k0s(),e.j41(10,"ion-button",21),e.bIt("click",function(){const s=e.eBV(u).$implicit,o=e.XpG();return e.Njj(o.deleteTest(s.title))}),e.EFF(11,"Delete Test"),e.k0s()()()()}if(2&r){const u=h.$implicit;e.R7$(4),e.JRh(u.title)}}const P=[{path:"",component:(()=>{var r;class h{constructor(t,s,o,d){this.activatedRoute=t,this.router=s,this.systemTestService=o,this.loadingCtrl=d,this.productStep="",this.systemTests=[],this.productObjective="",this.user={},this.orgName="",this.passed=0,this.failed=0,this.systemTestsChart={tooltip:{trigger:"axis"},legend:{data:["Passed","Failed"],left:"left"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[{name:"Passed",type:"line",data:[]},{name:"Failed",type:"line",data:[]}]}}ngOnInit(){}ionViewWillEnter(){var t=this;return(0,a.A)(function*(){t.getProductFromParams(),yield t.getSystemTests(),yield t.calculatePassed(),yield t.calculateGraphData()})()}getProductFromParams(){this.activatedRoute.params.subscribe(t=>{this.productObjective=t.productObjective,this.productStep=t.step}),console.log(this.productObjective),console.log(this.productStep)}navigateToCreateSystemTest(){this.router.navigate(["/create-system-test",{productObjective:this.productObjective,step:this.productStep}])}getSystemTests(){var t=this;return(0,a.A)(function*(){yield t.showLoading();const s=localStorage.getItem("user");s&&(t.user=JSON.parse(s),t.orgName=t.user.orgName,t.systemTestService.getSystemTest(t.orgName,t.productObjective,t.productStep).then(o=>{t.systemTests=o}),yield t.hideLoading())})()}doRefresh(t){this.getSystemTests(),t.target.complete()}navigateToExecuteTest(t){this.router.navigate(["/execute-system-test",{productObjective:this.productObjective,step:this.productStep,testTitle:t}])}calculatePassed(){var t=this;return(0,a.A)(function*(){yield t.showLoading(),t.passed=0,t.failed=0,yield t.systemTestService.getSystemTestHistoryByStep(t.orgName,t.productObjective,t.productStep).then(s=>{s.forEach(o=>{o.state?t.passed++:t.failed++})}),yield t.hideLoading()})()}showLoading(){var t=this;return(0,a.A)(function*(){yield(yield t.loadingCtrl.create({})).present()})()}hideLoading(){var t=this;return(0,a.A)(function*(){yield t.loadingCtrl.dismiss()})()}deleteTest(t){var s=this;return(0,a.A)(function*(){let o=s.systemTests.find(d=>d.title===t);o&&(yield s.systemTestService.deleteSystemTest(s.orgName,s.productObjective,s.productStep,o).then((0,a.A)(function*(){yield s.getSystemTests()})),yield s.calculatePassed(),yield s.calculateGraphData())})()}calculateGraphData(){var t=this;return(0,a.A)(function*(){yield t.showLoading(),yield t.systemTestService.getSystemTestHistory(t.orgName,t.productObjective).then(s=>{const o=Object.keys(s).filter(c=>s[c].productStep===t.productStep).map(c=>({timestamp:c,systemTest:s[c].systemTest}));for(let c=0;cnew Date(o[m+1].timestamp).getTime()){let v=o[m];o[m]=o[m+1],o[m+1]=v}let d=[];for(let c of o){let m=new Date(c.timestamp).toLocaleDateString(),v=c.systemTest.state?1:0,j=c.systemTest.state?0:1,S=d.findIndex(k=>k.date===m);-1===S?d.push({date:m,passed:v,failed:j}):(d[S].passed+=v,d[S].failed+=j)}console.log(d),t.systemTestsChart.xAxis={type:"category",boundaryGap:!1,data:d.map(c=>c.date)},t.systemTestsChart.series=[{name:"Passed",type:"line",data:d.map(c=>c.passed)},{name:"Failed",type:"line",data:d.map(c=>c.failed)}],console.log(t.systemTestsChart.xAxis.data),console.log(t.systemTestsChart.series[0].data),console.log(t.systemTestsChart.series[1].data),t.systemTestsChart={...t.systemTestsChart}}),yield t.hideLoading()})()}}return(r=h).\u0275fac=function(t){return new(t||r)(e.rXU(g.nX),e.rXU(g.Ix),e.rXU(y.h),e.rXU(i.Xi))},r.\u0275cmp=e.VBU({type:r,selectors:[["app-software-testing-chooser"]],decls:86,vars:13,consts:[[3,"title"],[3,"fullscreen"],["slot","fixed",3,"ionRefresh"],[1,"lg:m-10","md:m-10"],["size","12","size-md","4","size-lg","4",1,""],[1,"min-h-full","flex","flex-col","justify-between"],[1,"text-3xl","text-white"],[1,"text-white"],[1,"mt-auto"],["color","primary","expand","block","fill","outline"],["color","primary","expand","block","fill","outline",3,"click"],["size","6","size-md","6","size-lg","6",1,""],[1,"flex","flex-col","justify-center","items-center","text-green-600"],[1,"flex","flex-col","justify-center","items-center"],[1,"flex","flex-col","justify-center","items-center","text-red-800"],["size","12","size-md","12","size-lg","12",1,""],[1,"h-[25em]"],["echarts","",1,"demo-chart","h-full","w-full","p-4",3,"options"],["size","12","size-md","3","size-lg","3","class","",4,"ngFor","ngForOf"],["size","12","size-md","3","size-lg","3",1,""],["color","primary","expand","block",3,"click"],["color","danger","expand","block",3,"click"]],template:function(t,s){1&t&&(e.nrm(0,"app-header-return",0),e.j41(1,"ion-content",1)(2,"ion-refresher",2),e.bIt("ionRefresh",function(d){return s.doRefresh(d)}),e.nrm(3,"ion-refresher-content"),e.k0s(),e.j41(4,"ion-grid"),e.nrm(5,"app-title",0),e.j41(6,"ion-row",3)(7,"ion-col",4)(8,"H2"),e.EFF(9,"Choose a type of test."),e.k0s(),e.nrm(10,"p"),e.k0s()(),e.j41(11,"ion-row",3)(12,"ion-col",4)(13,"ion-card",5)(14,"ion-card-header")(15,"h1",6),e.EFF(16,"Unit Tests"),e.k0s()(),e.j41(17,"ion-card-content")(18,"p",7),e.EFF(19,"A unit test is the smallest and simplest form of software testing. These tests are employed to assess a separable unit of software, such as a class or function, for correctness independent of the larger software system that contains the unit. Unit tests are also employed as a form of specification to ensure that a function or module exactly performs the behavior required by the system. Unit tests are commonly used to introduce test-driven development concepts."),e.k0s()(),e.j41(20,"ion-card-content",8)(21,"ion-button",9),e.EFF(22,"Create Unit Test"),e.k0s()()()(),e.j41(23,"ion-col",4)(24,"ion-card",5)(25,"ion-card-header")(26,"h1",6),e.EFF(27,"Integration Tests"),e.k0s()(),e.j41(28,"ion-card-content")(29,"p",7),e.EFF(30,"Software components that pass individual unit tests are assembled into larger components. Engineers then run an integration test on an assembled component to verify that it functions correctly. Selenium, Playwright and Cypress are popular tools for integration testing."),e.k0s()(),e.j41(31,"ion-card-content",8)(32,"ion-button",9),e.EFF(33,"Create Integration Test"),e.k0s()()()(),e.j41(34,"ion-col",4)(35,"ion-card",5)(36,"ion-card-header")(37,"h1",6),e.EFF(38,"System Tests"),e.k0s()(),e.j41(39,"ion-card-content")(40,"p",7),e.EFF(41,"A system test is the largest scale test that engineers run for an undeployed system. All modules belonging to a specific component, such as a server that passed integration tests, are assembled into the system. Then the engineer tests the end-to-end functionality of the system."),e.k0s()(),e.j41(42,"ion-card-content",8)(43,"ion-button",10),e.bIt("click",function(){return s.navigateToCreateSystemTest()}),e.EFF(44,"Create System Test"),e.k0s()()()()()(),e.j41(45,"ion-grid"),e.nrm(46,"app-title",0),e.j41(47,"ion-row",3)(48,"ion-col",4)(49,"p"),e.EFF(50),e.k0s()()(),e.nrm(51,"app-title",0),e.j41(52,"ion-row",3)(53,"ion-col",4)(54,"p"),e.EFF(55),e.k0s()()(),e.nrm(56,"app-title",0),e.j41(57,"ion-row",3)(58,"ion-col",4)(59,"p"),e.EFF(60),e.k0s()()(),e.j41(61,"ion-row",3)(62,"ion-col",11)(63,"ion-card")(64,"ion-card-header")(65,"ion-card-title",12),e.EFF(66,"Passed Tests"),e.k0s()(),e.j41(67,"ion-card-content",13)(68,"h1"),e.EFF(69),e.k0s()()()(),e.j41(70,"ion-col",11)(71,"ion-card")(72,"ion-card-header")(73,"ion-card-title",14),e.EFF(74,"Failed Tests"),e.k0s()(),e.j41(75,"ion-card-content",13)(76,"h1"),e.EFF(77),e.k0s()()()()(),e.j41(78,"ion-row",3)(79,"ion-col",15)(80,"ion-card")(81,"ion-card-content",16),e.nrm(82,"div",17),e.k0s()()()()(),e.j41(83,"ion-grid")(84,"ion-row",3),e.DNE(85,E,12,1,"ion-col",18),e.k0s()()()),2&t&&(e.Y8G("title","Software Testing Chooser"),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(4),e.Y8G("title","Software Testing Chooser"),e.R7$(41),e.Y8G("title","Unit Tests"),e.R7$(4),e.SpI("Created tests for product step: ",s.productStep,""),e.R7$(),e.Y8G("title","Integration Tests"),e.R7$(4),e.SpI("Created tests for product step: ",s.productStep,""),e.R7$(),e.Y8G("title","System Tests"),e.R7$(4),e.SpI("System tests results for product step: ",s.productStep,""),e.R7$(9),e.JRh(s.passed),e.R7$(8),e.JRh(s.failed),e.R7$(5),e.Y8G("options",s.systemTestsChart),e.R7$(3),e.Y8G("ngForOf",s.systemTests))},dependencies:[l.Sq,i.Jm,i.b_,i.I9,i.ME,i.tN,i.hU,i.W9,i.lO,i.To,i.Ki,i.ln,p.W,C.p,_.$P]}),h})()}];let R=(()=>{var r;class h{}return(r=h).\u0275fac=function(t){return new(t||r)},r.\u0275mod=e.$C({type:r}),r.\u0275inj=e.G2t({imports:[g.iI.forChild(P),g.iI]}),h})();var w=n(5553);let b=(()=>{var r;class h{}return(r=h).\u0275fac=function(t){return new(t||r)},r.\u0275mod=e.$C({type:r}),r.\u0275inj=e.G2t({imports:[l.MD,T.YN,i.bv,R,w.h]}),h})()}}]);
\ No newline at end of file
diff --git a/www/383.7ad6450a343fd310.js b/www/383.7ad6450a343fd310.js
deleted file mode 100644
index 2e542f0..0000000
--- a/www/383.7ad6450a343fd310.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[383],{5553:(T,m,n)=>{n.d(m,{h:()=>c});var s=n(177),g=n(7863),t=n(4438);let c=(()=>{var e;class d{}return(e=d).\u0275fac=function(i){return new(i||e)},e.\u0275mod=t.$C({type:e}),e.\u0275inj=t.G2t({imports:[s.MD,g.bv]}),d})()},3241:(T,m,n)=>{n.d(m,{p:()=>c});var s=n(4438),g=n(177),t=n(7863);let c=(()=>{var e;class d{constructor(i){this.location=i,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(e=d).\u0275fac=function(i){return new(i||e)(s.rXU(g.aZ))},e.\u0275cmp=s.VBU({type:e,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(i,p){1&i&&(s.j41(0,"ion-header",0)(1,"ion-toolbar"),s.nrm(2,"ion-menu-button",1),s.j41(3,"ion-icon",2),s.bIt("click",function(){return p.goBack()}),s.k0s(),s.j41(4,"ion-title"),s.EFF(5),s.k0s()()()),2&i&&(s.Y8G("translucent",!0),s.R7$(5),s.JRh(p.title))},dependencies:[t.eU,t.iq,t.MC,t.BC,t.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),d})()},383:(T,m,n)=>{n.r(m),n.d(m,{SoftwareTestingChooserPageModule:()=>F});var s=n(177),g=n(4341),t=n(7863),c=n(7650),e=n(4438),d=n(9274),h=n(8453),i=n(3241);const p=()=>["/execute-system-test"];function C(o,a){if(1&o&&(e.j41(0,"ion-col",12)(1,"ion-card")(2,"ion-card-header")(3,"ion-card-title"),e.EFF(4),e.k0s()(),e.j41(5,"ion-card-content")(6,"ion-button",13),e.EFF(7,"Execute Test"),e.k0s()()()()),2&o){const l=a.$implicit;e.R7$(4),e.JRh(l.title),e.R7$(2),e.Y8G("routerLink",e.lJ4(2,p))}}const y=[{path:"",component:(()=>{var o;class a{constructor(r,u,f){this.activatedRoute=r,this.router=u,this.systemTestService=f,this.productStep="",this.systemTests=[],this.productObjective="",this.user={},this.orgName=""}ngOnInit(){}ionViewWillEnter(){this.getProductFromParams(),this.getSystemTests()}getProductFromParams(){this.activatedRoute.params.subscribe(r=>{this.productObjective=r.productObjective,this.productStep=r.step}),console.log(this.productObjective),console.log(this.productStep)}navigateToCreateSystemTest(){this.router.navigate(["/create-system-test",{productObjective:this.productObjective,step:this.productStep}])}getSystemTests(){const r=localStorage.getItem("user");r&&(this.user=JSON.parse(r),this.orgName=this.user.orgName,this.systemTestService.getSystemTest(this.orgName,this.productObjective,this.productStep).then(u=>{this.systemTests=u}))}doRefresh(r){this.getSystemTests(),r.target.complete()}}return(o=a).\u0275fac=function(r){return new(r||o)(e.rXU(c.nX),e.rXU(c.Ix),e.rXU(d.h))},o.\u0275cmp=e.VBU({type:o,selectors:[["app-software-testing-chooser"]],decls:52,vars:6,consts:[[3,"title"],[3,"fullscreen"],["slot","fixed",3,"ionRefresh"],[1,"lg:m-10","md:m-10"],["size","12","size-md","4","size-lg","4",1,""],[1,"min-h-full","flex","flex-col","justify-between"],[1,"text-3xl","text-white"],[1,"text-white"],[1,"mt-auto"],["color","primary","expand","block","fill","outline"],["color","primary","expand","block","fill","outline",3,"click"],["size","12","size-md","3","size-lg","3","class","",4,"ngFor","ngForOf"],["size","12","size-md","3","size-lg","3",1,""],["color","primary","expand","block",3,"routerLink"]],template:function(r,u){1&r&&(e.nrm(0,"app-header-return",0),e.j41(1,"ion-content",1)(2,"ion-refresher",2),e.bIt("ionRefresh",function(E){return u.doRefresh(E)}),e.nrm(3,"ion-refresher-content"),e.k0s(),e.j41(4,"ion-grid"),e.nrm(5,"app-title",0),e.j41(6,"ion-row",3)(7,"ion-col",4)(8,"H2"),e.EFF(9,"Choose a type of test."),e.k0s(),e.nrm(10,"p"),e.k0s()(),e.j41(11,"ion-row",3)(12,"ion-col",4)(13,"ion-card",5)(14,"ion-card-header")(15,"h1",6),e.EFF(16,"Unit Tests"),e.k0s()(),e.j41(17,"ion-card-content")(18,"p",7),e.EFF(19,"A unit test is the smallest and simplest form of software testing. These tests are employed to assess a separable unit of software, such as a class or function, for correctness independent of the larger software system that contains the unit. Unit tests are also employed as a form of specification to ensure that a function or module exactly performs the behavior required by the system. Unit tests are commonly used to introduce test-driven development concepts."),e.k0s()(),e.j41(20,"ion-card-content",8)(21,"ion-button",9),e.EFF(22,"Create Unit Test"),e.k0s()()()(),e.j41(23,"ion-col",4)(24,"ion-card",5)(25,"ion-card-header")(26,"h1",6),e.EFF(27,"Integration Tests"),e.k0s()(),e.j41(28,"ion-card-content")(29,"p",7),e.EFF(30,"Software components that pass individual unit tests are assembled into larger components. Engineers then run an integration test on an assembled component to verify that it functions correctly. Selenium, Playwright and Cypress are popular tools for integration testing."),e.k0s()(),e.j41(31,"ion-card-content",8)(32,"ion-button",9),e.EFF(33,"Create Integration Test"),e.k0s()()()(),e.j41(34,"ion-col",4)(35,"ion-card",5)(36,"ion-card-header")(37,"h1",6),e.EFF(38,"System Tests"),e.k0s()(),e.j41(39,"ion-card-content")(40,"p",7),e.EFF(41,"A system test is the largest scale test that engineers run for an undeployed system. All modules belonging to a specific component, such as a server that passed integration tests, are assembled into the system. Then the engineer tests the end-to-end functionality of the system."),e.k0s()(),e.j41(42,"ion-card-content",8)(43,"ion-button",10),e.bIt("click",function(){return u.navigateToCreateSystemTest()}),e.EFF(44,"Create System Test"),e.k0s()()()()(),e.nrm(45,"app-title",0),e.j41(46,"ion-row",3)(47,"ion-col",4)(48,"p"),e.EFF(49),e.k0s()()(),e.j41(50,"ion-row",3),e.DNE(51,C,8,3,"ion-col",11),e.k0s()()()),2&r&&(e.Y8G("title","Software Testing Chooser"),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(4),e.Y8G("title","Software Testing Chooser"),e.R7$(40),e.Y8G("title","Created Tests"),e.R7$(4),e.SpI("Created tests for product step: ",u.productStep,""),e.R7$(2),e.Y8G("ngForOf",u.systemTests))},dependencies:[s.Sq,t.Jm,t.b_,t.I9,t.ME,t.tN,t.hU,t.W9,t.lO,t.To,t.Ki,t.ln,t.N7,c.Wk,h.W,i.p]}),a})()}];let v=(()=>{var o;class a{}return(o=a).\u0275fac=function(r){return new(r||o)},o.\u0275mod=e.$C({type:o}),o.\u0275inj=e.G2t({imports:[c.iI.forChild(y),c.iI]}),a})();var S=n(5553);let F=(()=>{var o;class a{}return(o=a).\u0275fac=function(r){return new(r||o)},o.\u0275mod=e.$C({type:o}),o.\u0275inj=e.G2t({imports:[s.MD,g.YN,t.bv,v,S.h]}),a})()}}]);
\ No newline at end of file
diff --git a/www/common.57508ee7b7985fb1.js b/www/common.57508ee7b7985fb1.js
new file mode 100644
index 0000000..373b446
--- /dev/null
+++ b/www/common.57508ee7b7985fb1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[2076],{1263:(w,p,l)=>{l.d(p,{c:()=>_});var m=l(9672),a=l(1086),u=l(8607);const _=(c,i)=>{let s,o;const e=(r,d,f)=>{if(typeof document>"u")return;const v=document.elementFromPoint(r,d);v&&i(v)&&!v.disabled?v!==s&&(t(),n(v,f)):t()},n=(r,d)=>{s=r,o||(o=s);const f=s;(0,m.w)(()=>f.classList.add("ion-activated")),d()},t=(r=!1)=>{if(!s)return;const d=s;(0,m.w)(()=>d.classList.remove("ion-activated")),r&&o!==s&&s.click(),s=void 0};return(0,u.createGesture)({el:c,gestureName:"buttonActiveDrag",threshold:0,onStart:r=>e(r.currentX,r.currentY,a.a),onMove:r=>e(r.currentX,r.currentY,a.b),onEnd:()=>{t(!0),(0,a.h)(),o=void 0}})}},8438:(w,p,l)=>{l.d(p,{g:()=>a});var m=l(8476);const a=()=>{if(void 0!==m.w)return m.w.Capacitor}},5572:(w,p,l)=>{l.d(p,{c:()=>m,i:()=>a});const m=(u,_,c)=>"function"==typeof c?c(u,_):"string"==typeof c?u[c]===_[c]:Array.isArray(_)?_.includes(u):u===_,a=(u,_,c)=>void 0!==u&&(Array.isArray(u)?u.some(i=>m(i,_,c)):m(u,_,c))},3351:(w,p,l)=>{l.d(p,{g:()=>m});const m=(i,s,o,e,n)=>u(i[1],s[1],o[1],e[1],n).map(t=>a(i[0],s[0],o[0],e[0],t)),a=(i,s,o,e,n)=>n*(3*s*Math.pow(n-1,2)+n*(-3*o*n+3*o+e*n))-i*Math.pow(n-1,3),u=(i,s,o,e,n)=>c((e-=n)-3*(o-=n)+3*(s-=n)-(i-=n),3*o-6*s+3*i,3*s-3*i,i).filter(r=>r>=0&&r<=1),c=(i,s,o,e)=>{if(0===i)return((i,s,o)=>{const e=s*s-4*i*o;return e<0?[]:[(-s+Math.sqrt(e))/(2*i),(-s-Math.sqrt(e))/(2*i)]})(s,o,e);const n=(3*(o/=i)-(s/=i)*s)/3,t=(2*s*s*s-9*s*o+27*(e/=i))/27;if(0===n)return[Math.pow(-t,1/3)];if(0===t)return[Math.sqrt(-n),-Math.sqrt(-n)];const r=Math.pow(t/2,2)+Math.pow(n/3,3);if(0===r)return[Math.pow(t/2,.5)-s/3];if(r>0)return[Math.pow(-t/2+Math.sqrt(r),1/3)-Math.pow(t/2+Math.sqrt(r),1/3)-s/3];const d=Math.sqrt(Math.pow(-n/3,3)),f=Math.acos(-t/(2*Math.sqrt(Math.pow(-n/3,3)))),v=2*Math.pow(d,1/3);return[v*Math.cos(f/3)-s/3,v*Math.cos((f+2*Math.PI)/3)-s/3,v*Math.cos((f+4*Math.PI)/3)-s/3]}},5083:(w,p,l)=>{l.d(p,{i:()=>m});const m=a=>a&&""!==a.dir?"rtl"===a.dir.toLowerCase():"rtl"===(null==document?void 0:document.dir.toLowerCase())},3126:(w,p,l)=>{l.r(p),l.d(p,{startFocusVisible:()=>_});const m="ion-focused",u=["Tab","ArrowDown","Space","Escape"," ","Shift","Enter","ArrowLeft","ArrowRight","ArrowUp","Home","End"],_=c=>{let i=[],s=!0;const o=c?c.shadowRoot:document,e=c||document.body,n=g=>{i.forEach(h=>h.classList.remove(m)),g.forEach(h=>h.classList.add(m)),i=g},t=()=>{s=!1,n([])},r=g=>{s=u.includes(g.key),s||n([])},d=g=>{if(s&&void 0!==g.composedPath){const h=g.composedPath().filter(y=>!!y.classList&&y.classList.contains("ion-focusable"));n(h)}},f=()=>{o.activeElement===e&&n([])};return o.addEventListener("keydown",r),o.addEventListener("focusin",d),o.addEventListener("focusout",f),o.addEventListener("touchstart",t,{passive:!0}),o.addEventListener("mousedown",t),{destroy:()=>{o.removeEventListener("keydown",r),o.removeEventListener("focusin",d),o.removeEventListener("focusout",f),o.removeEventListener("touchstart",t),o.removeEventListener("mousedown",t)},setFocus:n}}},1086:(w,p,l)=>{l.d(p,{I:()=>a,a:()=>s,b:()=>o,c:()=>i,d:()=>n,h:()=>e});var m=l(8438),a=function(t){return t.Heavy="HEAVY",t.Medium="MEDIUM",t.Light="LIGHT",t}(a||{});const _={getEngine(){const t=(0,m.g)();if(null!=t&&t.isPluginAvailable("Haptics"))return t.Plugins.Haptics},available(){if(!this.getEngine())return!1;const r=(0,m.g)();return"web"!==(null==r?void 0:r.getPlatform())||typeof navigator<"u"&&void 0!==navigator.vibrate},impact(t){const r=this.getEngine();r&&r.impact({style:t.style})},notification(t){const r=this.getEngine();r&&r.notification({type:t.type})},selection(){this.impact({style:a.Light})},selectionStart(){const t=this.getEngine();t&&t.selectionStart()},selectionChanged(){const t=this.getEngine();t&&t.selectionChanged()},selectionEnd(){const t=this.getEngine();t&&t.selectionEnd()}},c=()=>_.available(),i=()=>{c()&&_.selection()},s=()=>{c()&&_.selectionStart()},o=()=>{c()&&_.selectionChanged()},e=()=>{c()&&_.selectionEnd()},n=t=>{c()&&_.impact(t)}},909:(w,p,l)=>{l.d(p,{I:()=>i,a:()=>n,b:()=>c,c:()=>d,d:()=>v,f:()=>t,g:()=>e,i:()=>o,p:()=>f,r:()=>g,s:()=>r});var m=l(467),a=l(4920),u=l(4929);const c="ion-content",i=".ion-content-scroll-host",s=`${c}, ${i}`,o=h=>"ION-CONTENT"===h.tagName,e=function(){var h=(0,m.A)(function*(y){return o(y)?(yield new Promise(D=>(0,a.c)(y,D)),y.getScrollElement()):y});return function(D){return h.apply(this,arguments)}}(),n=h=>h.querySelector(i)||h.querySelector(s),t=h=>h.closest(s),r=(h,y)=>o(h)?h.scrollToTop(y):Promise.resolve(h.scrollTo({top:0,left:0,behavior:y>0?"smooth":"auto"})),d=(h,y,D,M)=>o(h)?h.scrollByPoint(y,D,M):Promise.resolve(h.scrollBy({top:D,left:y,behavior:M>0?"smooth":"auto"})),f=h=>(0,u.b)(h,c),v=h=>{if(o(h)){const D=h.scrollY;return h.scrollY=!1,D}return h.style.setProperty("overflow","hidden"),!0},g=(h,y)=>{o(h)?h.scrollY=y:h.style.removeProperty("overflow")}},3992:(w,p,l)=>{l.d(p,{a:()=>m,b:()=>d,c:()=>s,d:()=>f,e:()=>A,f:()=>i,g:()=>v,h:()=>u,i:()=>a,j:()=>E,k:()=>P,l:()=>o,m:()=>t,n:()=>g,o:()=>n,p:()=>c,q:()=>_,r:()=>O,s:()=>L,t:()=>r,u:()=>D,v:()=>M,w:()=>e,x:()=>h,y:()=>y});const m="data:image/svg+xml;utf8,",a="data:image/svg+xml;utf8,",u="data:image/svg+xml;utf8,",_="data:image/svg+xml;utf8,",c="data:image/svg+xml;utf8,",i="data:image/svg+xml;utf8,",s="data:image/svg+xml;utf8,",o="data:image/svg+xml;utf8,",e="data:image/svg+xml;utf8,",n="data:image/svg+xml;utf8,",t="data:image/svg+xml;utf8,",r="data:image/svg+xml;utf8,",d="data:image/svg+xml;utf8,",f="data:image/svg+xml;utf8,",v="data:image/svg+xml;utf8,",g="data:image/svg+xml;utf8,",h="data:image/svg+xml;utf8,",y="data:image/svg+xml;utf8,",D="data:image/svg+xml;utf8,",M="data:image/svg+xml;utf8,",O="data:image/svg+xml;utf8,",E="data:image/svg+xml;utf8,",P="data:image/svg+xml;utf8,",L="data:image/svg+xml;utf8,",A="data:image/svg+xml;utf8,"},243:(w,p,l)=>{l.d(p,{c:()=>_,g:()=>c});var m=l(8476),a=l(4920),u=l(4929);const _=(s,o,e)=>{let n,t;if(void 0!==m.w&&"MutationObserver"in m.w){const v=Array.isArray(o)?o:[o];n=new MutationObserver(g=>{for(const h of g)for(const y of h.addedNodes)if(y.nodeType===Node.ELEMENT_NODE&&v.includes(y.slot))return e(),void(0,a.r)(()=>r(y))}),n.observe(s,{childList:!0,subtree:!0})}const r=v=>{var g;t&&(t.disconnect(),t=void 0),t=new MutationObserver(h=>{e();for(const y of h)for(const D of y.removedNodes)D.nodeType===Node.ELEMENT_NODE&&D.slot===o&&f()}),t.observe(null!==(g=v.parentElement)&&void 0!==g?g:v,{subtree:!0,childList:!0})},f=()=>{t&&(t.disconnect(),t=void 0)};return{destroy:()=>{n&&(n.disconnect(),n=void 0),f()}}},c=(s,o,e)=>{const n=null==s?0:s.toString().length,t=i(n,o);if(void 0===e)return t;try{return e(n,o)}catch(r){return(0,u.a)("Exception in provided `counterFormatter`.",r),t}},i=(s,o)=>`${s} / ${o}`},1622:(w,p,l)=>{l.r(p),l.d(p,{KEYBOARD_DID_CLOSE:()=>c,KEYBOARD_DID_OPEN:()=>_,copyVisualViewport:()=>O,keyboardDidClose:()=>h,keyboardDidOpen:()=>v,keyboardDidResize:()=>g,resetKeyboardAssist:()=>n,setKeyboardClose:()=>f,setKeyboardOpen:()=>d,startKeyboardAssist:()=>t,trackViewportChanges:()=>M});var m=l(4379);l(8438),l(8476);const _="ionKeyboardDidShow",c="ionKeyboardDidHide";let s={},o={},e=!1;const n=()=>{s={},o={},e=!1},t=E=>{if(m.K.getEngine())r(E);else{if(!E.visualViewport)return;o=O(E.visualViewport),E.visualViewport.onresize=()=>{M(E),v()||g(E)?d(E):h(E)&&f(E)}}},r=E=>{E.addEventListener("keyboardDidShow",P=>d(E,P)),E.addEventListener("keyboardDidHide",()=>f(E))},d=(E,P)=>{y(E,P),e=!0},f=E=>{D(E),e=!1},v=()=>!e&&s.width===o.width&&(s.height-o.height)*o.scale>150,g=E=>e&&!h(E),h=E=>e&&o.height===E.innerHeight,y=(E,P)=>{const A=new CustomEvent(_,{detail:{keyboardHeight:P?P.keyboardHeight:E.innerHeight-o.height}});E.dispatchEvent(A)},D=E=>{const P=new CustomEvent(c);E.dispatchEvent(P)},M=E=>{s=Object.assign({},o),o=O(E.visualViewport)},O=E=>({width:Math.round(E.width),height:Math.round(E.height),offsetTop:E.offsetTop,offsetLeft:E.offsetLeft,pageTop:E.pageTop,pageLeft:E.pageLeft,scale:E.scale})},4379:(w,p,l)=>{l.d(p,{K:()=>_,a:()=>u});var m=l(8438),a=function(c){return c.Unimplemented="UNIMPLEMENTED",c.Unavailable="UNAVAILABLE",c}(a||{}),u=function(c){return c.Body="body",c.Ionic="ionic",c.Native="native",c.None="none",c}(u||{});const _={getEngine(){const c=(0,m.g)();if(null!=c&&c.isPluginAvailable("Keyboard"))return c.Plugins.Keyboard},getResizeMode(){const c=this.getEngine();return null!=c&&c.getResizeMode?c.getResizeMode().catch(i=>{if(i.code!==a.Unimplemented)throw i}):Promise.resolve(void 0)}}},4731:(w,p,l)=>{l.d(p,{c:()=>i});var m=l(467),a=l(8476),u=l(4379);const _=s=>{if(void 0===a.d||s===u.a.None||void 0===s)return null;const o=a.d.querySelector("ion-app");return null!=o?o:a.d.body},c=s=>{const o=_(s);return null===o?0:o.clientHeight},i=function(){var s=(0,m.A)(function*(o){let e,n,t,r;const d=function(){var y=(0,m.A)(function*(){const D=yield u.K.getResizeMode(),M=void 0===D?void 0:D.mode;e=()=>{void 0===r&&(r=c(M)),t=!0,f(t,M)},n=()=>{t=!1,f(t,M)},null==a.w||a.w.addEventListener("keyboardWillShow",e),null==a.w||a.w.addEventListener("keyboardWillHide",n)});return function(){return y.apply(this,arguments)}}(),f=(y,D)=>{o&&o(y,v(D))},v=y=>{if(0===r||r===c(y))return;const D=_(y);return null!==D?new Promise(M=>{const E=new ResizeObserver(()=>{D.clientHeight===r&&(E.disconnect(),M())});E.observe(D)}):void 0};return yield d(),{init:d,destroy:()=>{null==a.w||a.w.removeEventListener("keyboardWillShow",e),null==a.w||a.w.removeEventListener("keyboardWillHide",n),e=n=void 0},isKeyboardVisible:()=>t}});return function(e){return s.apply(this,arguments)}}()},7838:(w,p,l)=>{l.d(p,{c:()=>a});var m=l(467);const a=()=>{let u;return{lock:function(){var c=(0,m.A)(function*(){const i=u;let s;return u=new Promise(o=>s=o),void 0!==i&&(yield i),s});return function(){return c.apply(this,arguments)}}()}}},9001:(w,p,l)=>{l.d(p,{c:()=>u});var m=l(8476),a=l(4920);const u=(_,c,i)=>{let s;const o=()=>!(void 0===c()||void 0!==_.label||null===i()),n=()=>{const r=c();if(void 0===r)return;if(!o())return void r.style.removeProperty("width");const d=i().scrollWidth;if(0===d&&null===r.offsetParent&&void 0!==m.w&&"IntersectionObserver"in m.w){if(void 0!==s)return;const f=s=new IntersectionObserver(v=>{1===v[0].intersectionRatio&&(n(),f.disconnect(),s=void 0)},{threshold:.01,root:_});f.observe(r)}else r.style.setProperty("width",.75*d+"px")};return{calculateNotchWidth:()=>{o()&&(0,a.r)(()=>{n()})},destroy:()=>{s&&(s.disconnect(),s=void 0)}}}},7895:(w,p,l)=>{l.d(p,{S:()=>a});const a={bubbles:{dur:1e3,circles:9,fn:(u,_,c)=>{const i=u*_/c-u+"ms",s=2*Math.PI*_/c;return{r:5,style:{top:32*Math.sin(s)+"%",left:32*Math.cos(s)+"%","animation-delay":i}}}},circles:{dur:1e3,circles:8,fn:(u,_,c)=>{const i=_/c,s=u*i-u+"ms",o=2*Math.PI*i;return{r:5,style:{top:32*Math.sin(o)+"%",left:32*Math.cos(o)+"%","animation-delay":s}}}},circular:{dur:1400,elmDuration:!0,circles:1,fn:()=>({r:20,cx:48,cy:48,fill:"none",viewBox:"24 24 48 48",transform:"translate(0,0)",style:{}})},crescent:{dur:750,circles:1,fn:()=>({r:26,style:{}})},dots:{dur:750,circles:3,fn:(u,_)=>({r:6,style:{left:32-32*_+"%","animation-delay":-110*_+"ms"}})},lines:{dur:1e3,lines:8,fn:(u,_,c)=>({y1:14,y2:26,style:{transform:`rotate(${360/c*_+(_({y1:12,y2:20,style:{transform:`rotate(${360/c*_+(_({y1:17,y2:29,style:{transform:`rotate(${30*_+(_<6?180:-180)}deg)`,"animation-delay":u*_/c-u+"ms"}})},"lines-sharp-small":{dur:1e3,lines:12,fn:(u,_,c)=>({y1:12,y2:20,style:{transform:`rotate(${30*_+(_<6?180:-180)}deg)`,"animation-delay":u*_/c-u+"ms"}})}}},7166:(w,p,l)=>{l.r(p),l.d(p,{createSwipeBackGesture:()=>c});var m=l(4920),a=l(5083),u=l(8607);l(1970);const c=(i,s,o,e,n)=>{const t=i.ownerDocument.defaultView;let r=(0,a.i)(i);const f=D=>r?-D.deltaX:D.deltaX;return(0,u.createGesture)({el:i,gestureName:"goback-swipe",gesturePriority:101,threshold:10,canStart:D=>(r=(0,a.i)(i),(D=>{const{startX:O}=D;return r?O>=t.innerWidth-50:O<=50})(D)&&s()),onStart:o,onMove:D=>{const O=f(D)/t.innerWidth;e(O)},onEnd:D=>{const M=f(D),O=t.innerWidth,E=M/O,P=(D=>r?-D.velocityX:D.velocityX)(D),A=P>=0&&(P>.2||M>O/2),T=(A?1-E:E)*O;let C=0;if(T>5){const R=T/Math.abs(P);C=Math.min(R,540)}n(A,E<=0?.01:(0,m.j)(0,E,.9999),C)}})}},2935:(w,p,l)=>{l.d(p,{w:()=>m});const m=(_,c,i)=>{if(typeof MutationObserver>"u")return;const s=new MutationObserver(o=>{i(a(o,c))});return s.observe(_,{childList:!0,subtree:!0}),s},a=(_,c)=>{let i;return _.forEach(s=>{for(let o=0;o{if(1!==_.nodeType)return;const i=_;return(i.tagName===c.toUpperCase()?[i]:Array.from(i.querySelectorAll(c))).find(o=>o.value===i.value)}},385:(w,p,l)=>{l.d(p,{l:()=>u});var m=l(4438),a=l(7863);let u=(()=>{var _;class c{constructor(){this.title="Header Title"}ngOnInit(){}}return(_=c).\u0275fac=function(s){return new(s||_)},_.\u0275cmp=m.VBU({type:_,selectors:[["app-header"]],inputs:{title:"title"},decls:5,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"]],template:function(s,o){1&s&&(m.j41(0,"ion-header",0)(1,"ion-toolbar"),m.nrm(2,"ion-menu-button",1),m.j41(3,"ion-title"),m.EFF(4),m.k0s()()()),2&s&&(m.Y8G("translucent",!0),m.R7$(4),m.JRh(o.title))},dependencies:[a.eU,a.MC,a.BC,a.ai]}),c})()},8453:(w,p,l)=>{l.d(p,{W:()=>u});var m=l(4438),a=l(7863);let u=(()=>{var _;class c{constructor(){this.title="Title"}ngOnInit(){}}return(_=c).\u0275fac=function(s){return new(s||_)},_.\u0275cmp=m.VBU({type:_,selectors:[["app-title"]],inputs:{title:"title"},decls:4,vars:1,consts:[[1,"lg:m-10"],["size","12","size-md","6","size-lg","6"],[1,"text-4xl","lg:text-6xl","font-bold"]],template:function(s,o){1&s&&(m.j41(0,"ion-row",0)(1,"ion-col",1)(2,"h1",2),m.EFF(3),m.k0s()()()),2&s&&(m.R7$(3),m.JRh(o.title))},dependencies:[a.hU,a.ln]}),c})()},4796:(w,p,l)=>{l.d(p,{u:()=>c});var m=l(467),a=l(8737),u=l(4262),_=l(4438);let c=(()=>{var i;class s{constructor(e,n){this.auth=e,this.firestore=n}registerUser(e){var n=this;return(0,m.A)(function*(){try{const t=yield(0,a.eJ)(n.auth,e.email,e.password);return t.user?(yield(0,u.BN)((0,u.H9)(n.firestore,"users",t.user.uid),{email:e.email,name:e.name,orgName:e.orgName,uid:t.user.uid}),yield(0,u.BN)((0,u.H9)(n.firestore,"teams",`${e.orgName}`),{name:e.orgName,members:[t.user.uid]}),t):null}catch{return null}})()}loginUser(e){var n=this;return(0,m.A)(function*(){try{var t;const r=yield(0,a.x9)(n.auth,e.email,e.password);if(null!==(t=r.user)&&void 0!==t&&t.uid){const d=yield(0,u.x7)((0,u.H9)(n.firestore,"users",r.user.uid));if(d.exists())return localStorage.setItem("user",JSON.stringify(d.data())),r}}catch(r){console.error(r)}return null})()}logoutUser(){var e=this;return(0,m.A)(function*(){yield e.auth.signOut()})()}addMember(e){var n=this;return(0,m.A)(function*(){try{const t=yield(0,a.eJ)(n.auth,e.email,e.password);if(!t.user)return!1;const r={email:e.email,name:e.name,orgName:e.orgName,uid:t.user.uid};return yield(0,u.BN)((0,u.H9)(n.firestore,"users",t.user.uid),r),r}catch{return!1}})()}}return(i=s).\u0275fac=function(e){return new(e||i)(_.KVO(a.Nj),_.KVO(u._7))},i.\u0275prov=_.jDH({token:i,factory:i.\u0275fac,providedIn:"root"}),s})()},6560:(w,p,l)=>{l.d(p,{x:()=>c});var m=l(467),a=l(4262),u=l(4438),_=l(1626);let c=(()=>{var i;class s{constructor(e,n){this.firestore=e,this.http=n,this.url_cpu="https://devprobeapi.onrender.com/flame_graph_date",this.url_mem="https://devprobeapi.onrender.com/flame_graph_memory_date"}getProducts(e){var n=this;return(0,m.A)(function*(){try{const t=(0,a.rJ)(n.firestore,"teams",e,"products");return(yield(0,a.GG)(t)).docs.map(d=>d.data())}catch(t){return console.log(t),[]}})()}getDates(e,n,t){var r=this;return(0,m.A)(function*(){try{t||(t="cpu_usage");const d=(0,a.rJ)(r.firestore,"teams",e,"products",n,t);return(yield(0,a.GG)(d)).docs.map(v=>v.id)}catch(d){return console.log(d),[]}})()}getFlameGraphByDate(e,n,t,r){var d=this;return(0,m.A)(function*(){try{let f={team:e,product:n,date:t};return r?yield d.http.post(d.url_mem,f).toPromise():yield d.http.post(d.url_cpu,f).toPromise()}catch{return{}}})()}}return(i=s).\u0275fac=function(e){return new(e||i)(u.KVO(a._7),u.KVO(_.Qq))},i.\u0275prov=u.jDH({token:i,factory:i.\u0275fac,providedIn:"root"}),s})()},3661:(w,p,l)=>{l.d(p,{e:()=>c});var m=l(467),a=l(4438),u=l(4262),_=l(1626);let c=(()=>{var i;class s{constructor(e,n){this.firestore=e,this.http=n,this.ipApiURL="https://cors-ea3m.onrender.com/http://ip-api.com/json/"}getLocationDestSrc(e){var n=this;return(0,m.A)(function*(){var t,r,d,f,v,g,h,y;if(!e)return e;const D=n.http.get(n.ipApiURL+e.dst_addr).toPromise(),M=n.http.get(n.ipApiURL+e.src_addr).toPromise(),O=yield D,E=yield M;return e.dst_city=null!==(t=O.city)&&void 0!==t?t:"No city found",e.dst_country=null!==(r=O.country)&&void 0!==r?r:"No country found",e.dst_latitude=null!==(d=O.lat)&&void 0!==d?d:0,e.dst_longitude=null!==(f=O.lon)&&void 0!==f?f:0,e.src_city=null!==(v=E.city)&&void 0!==v?v:"No city found",e.src_country=null!==(g=E.country)&&void 0!==g?g:"No country found",e.src_latitude=null!==(h=E.lat)&&void 0!==h?h:0,e.src_longitude=null!==(y=E.lon)&&void 0!==y?y:0,e})()}getLocationFrom(e){var n=this;return(0,m.A)(function*(){if(!e)return e;let t=e.result;for(let g=0;g{l.d(p,{N:()=>c});var m=l(467),a=l(4262),u=l(4438),_=l(1626);let c=(()=>{var i;class s{constructor(e,n){this.firestore=e,this.http=n,this.ipApiURL="https://cors-ea3m.onrender.com/http://ip-api.com/json/"}getLocation(e){var n=this;return(0,m.A)(function*(){console.log(e);const r=yield n.http.get(n.ipApiURL+e[0].dst_addr).toPromise();for(let v=0;vn.http.get(n.ipApiURL+v.from).toPromise());return(yield Promise.all(d)).forEach((v,g)=>{e[g].fromLatitude=v.lat,e[g].fromLongitude=v.lon,e[g].cityFrom=v.city,e[g].countryFrom=v.country}),console.log(e),e})()}saveLocationResults(e,n,t,r){var d=this;return(0,m.A)(function*(){try{console.log(r,"ripeData");const f=(0,a.rJ)(d.firestore,"teams",e,"products",n,"ripe"),v=(0,a.H9)(f,t),g=r.map(h=>({from:h.from,dst_addr:h.dst_addr,latency:h.latency,cityFrom:h.cityFrom,countryFrom:h.countryFrom,cityTo:h.cityTo,countryTo:h.countryTo,fromLatitude:h.fromLatitude,fromLongitude:h.fromLongitude,toLatitude:h.toLatitude,toLongitude:h.toLongitude,id:h.id}));return yield(0,a.BN)(v,{data:g}),console.log("Data saved",{data:g}),!0}catch(f){return console.log(f),!1}})()}}return(i=s).\u0275fac=function(e){return new(e||i)(u.KVO(a._7),u.KVO(_.Qq))},i.\u0275prov=u.jDH({token:i,factory:i.\u0275fac,providedIn:"root"}),s})()},6241:(w,p,l)=>{l.d(p,{b:()=>_});var m=l(467),a=l(4262),u=l(4438);let _=(()=>{var c;class i{constructor(o){this.firestore=o}addProduct(o,e){var n=this;return(0,m.A)(function*(){try{console.log(o);const t=(0,a.H9)(n.firestore,"teams",e,"products",o.productObjective);return yield(0,a.BN)(t,o),!0}catch(t){return console.log(t),!1}})()}getProducts(o){var e=this;return(0,m.A)(function*(){try{const n=(0,a.rJ)(e.firestore,"teams",o,"products");return(yield(0,a.GG)(n)).docs.map(r=>r.data())}catch(n){return console.log(n),[]}})()}removeProduct(o,e){var n=this;return(0,m.A)(function*(){try{const t=(0,a.H9)(n.firestore,"teams",o,"products",e);return yield(0,a.kd)(t),!0}catch(t){return console.log(t),!1}})()}}return(c=i).\u0275fac=function(o){return new(o||c)(u.KVO(a._7))},c.\u0275prov=u.jDH({token:c,factory:c.\u0275fac,providedIn:"root"}),i})()},2588:(w,p,l)=>{l.d(p,{N:()=>c});var m=l(467),a=l(4262),u=l(4438),_=l(1626);let c=(()=>{var i;class s{constructor(e,n){this.http=e,this.firestore=n,this.measurementsUrl="https://cors-ea3m.onrender.com/https://atlas.ripe.net/api/v2/measurements/",this.measurementID=""}sendTraceRequest(e,n,t,r){var d=this;return(0,m.A)(function*(){console.log("Sending trace request");try{let f={definitions:[{target:e,description:n,type:t,af:4,is_oneoff:!0,protocol:"TCP"}],probes:[]};console.log(r);let v=r.split(",").length-1,g=(r=r.slice(0,-1)).split(","),h=[];for(let M=0;M({id:d.measurementID,dst_addr:h.dst_addr,dst_city:h.dst_city,dst_country:h.dst_country,dst_latitude:h.dst_latitude,dst_longitude:h.dst_longitude,src_addr:h.src_addr,src_city:h.src_city,src_country:h.src_country,src_latitude:h.src_latitude,src_longitude:h.src_longitude,result:h.result}));return yield(0,a.BN)(v,{data:g}),!0}catch(f){return console.log(f),!1}})()}getHistoryResults(e,n){var t=this;return(0,m.A)(function*(){const d=(0,a.rJ)(t.firestore,"teams/"+e+"/products/"+n+"/ripe_trace"),f=yield(0,a.GG)(d);let v=[];return f.docs.forEach(g=>{v.push({id:g.id,data:g.data()})}),console.log(v),v})()}getAllResultsByDescription(e,n,t){var r=this;return(0,m.A)(function*(){try{let d="teams/"+e+"/products/"+n+"/ripe_trace";console.log(d);let f=(0,a.H9)(r.firestore,d,t);return(yield(0,a.x7)(f)).data()}catch(d){return console.log(d),[]}})()}}return(i=s).\u0275fac=function(e){return new(e||i)(u.KVO(_.Qq),u.KVO(a._7))},i.\u0275prov=u.jDH({token:i,factory:i.\u0275fac,providedIn:"root"}),s})()},9640:(w,p,l)=>{l.d(p,{Q:()=>i});var m=l(467),a=l(1985),u=l(4262),_=l(4438),c=l(1626);let i=(()=>{var s;class o{constructor(n,t){this.http=n,this.firestore=t,this.measurementsUrl="https://cors-ea3m.onrender.com/https://atlas.ripe.net/api/v2/measurements/",this.measurementID=""}sendMeasurementRequest(n,t,r,d){var f=this;return(0,m.A)(function*(){let v=d.split(",").length-1;d=d.slice(0,-1);try{let g={definitions:[{target:n,description:"ping",type:"ping",af:4,is_oneoff:!0}],probes:[{requested:v,type:"probes",value:d}]},h={Authorization:"Key 92530695-134f-4cbc-b7c3-ec130f3719b0"};console.log(g);let y=yield f.http.post(f.measurementsUrl,g,{headers:h}).toPromise();return console.log(y),f.measurementID=y.measurements[0],f.measurementID}catch(g){return console.log(g),!1}})()}getMeasurementResults(n){var t=this;return(0,m.A)(function*(){n&&(t.measurementID=n);try{let r={Authorization:"Key 92530695-134f-4cbc-b7c3-ec130f3719b0"};return""===t.measurementID?(console.log("No measurement ID"),!1):t.http.get(t.measurementsUrl+t.measurementID+"/results/",{headers:r})}catch(r){return console.log(r),new a.c}})()}saveMeasurementResults(n,t,r,d){var f=this;return(0,m.A)(function*(){try{const v=(0,u.rJ)(f.firestore,"teams",n,"products",t,"ripe"),g=(0,u.H9)(v,r),h=d.map((y,D)=>({id:f.measurementID,from:y.from,dst_addr:y.dst_addr,latency:y.latency}));return yield(0,u.BN)(g,{data:h}),!0}catch(v){return console.log(v),!1}})()}getAllResultsByDescription(n,t,r){var d=this;return(0,m.A)(function*(){try{let f="teams/"+n+"/products/"+t+"/ripe";console.log(f);let v=(0,u.H9)(d.firestore,f,r);return(yield(0,u.x7)(v)).data()}catch(f){return console.log(f),[]}})()}getHistoryResults(n,t){var r=this;return(0,m.A)(function*(){const f=(0,u.rJ)(r.firestore,"teams/"+n+"/products/"+t+"/ripe"),v=yield(0,u.GG)(f);let g=[];return v.docs.forEach(h=>{g.push({id:h.id,data:h.data()})}),console.log(g),g})()}deleteHistory(n,t,r){var d=this;return(0,m.A)(function*(){const v=(0,u.H9)(d.firestore,"teams/"+n+"/products/"+t+"/ripe",r);try{return yield(0,u.kd)(v),!0}catch(g){return console.log(g),!1}})()}}return(s=o).\u0275fac=function(n){return new(n||s)(_.KVO(c.Qq),_.KVO(u._7))},s.\u0275prov=_.jDH({token:s,factory:s.\u0275fac,providedIn:"root"}),o})()},9274:(w,p,l)=>{l.d(p,{h:()=>_});var m=l(467),a=l(4262),u=l(4438);let _=(()=>{var c;class i{constructor(o){this.firestore=o}addSystemTest(o,e,n,t){var r=this;return(0,m.A)(function*(){const d=(0,a.H9)(r.firestore,"teams",o,"products",e,"software_testing","system_tests"),f=yield(0,a.x7)(d);if(f.exists()){const g=f.data()[n];console.log(g),g.push(t),yield(0,a.BN)(d,{[n]:g}),console.log("Document updated with ID: ",f.id)}else console.log("No such document!"),yield(0,a.BN)(d,{[n]:[t]}),console.log("Document created with ID: ",d.id)})()}getSystemTest(o,e,n){var t=this;return(0,m.A)(function*(){const r=(0,a.H9)(t.firestore,"teams",o,"products",e,"software_testing","system_tests"),d=yield(0,a.x7)(r);return d.exists()?d.data()[n]:[]})()}saveSystemTest(o,e,n,t){var r=this;return(0,m.A)(function*(){const d=(0,a.H9)(r.firestore,"teams",o,"products",e,"software_testing","system_tests_history"),f=new Date,v=`${f.getDate()}/${f.getMonth()}/${f.getFullYear()} ${f.getHours()}:${f.getMinutes()}:${f.getSeconds()}`,g=yield(0,a.x7)(d);if(g.exists()){let h=g.data();h[v]={systemTest:t},h[v].productStep=n,yield(0,a.BN)(d,h)}else yield(0,a.BN)(d,{[v]:{systemTest:t,productStep:n}})})()}getSystemTestHistoryByStep(o,e,n){var t=this;return(0,m.A)(function*(){const r=(0,a.H9)(t.firestore,"teams",o,"products",e,"software_testing","system_tests_history"),d=yield(0,a.x7)(r);if(d.exists()){const f=d.data();return Object.keys(f).filter(g=>f[g].productStep===n).map(g=>f[g].systemTest)}return[]})()}getSystemTestHistory(o,e){var n=this;return(0,m.A)(function*(){const t=(0,a.H9)(n.firestore,"teams",o,"products",e,"software_testing","system_tests_history"),r=yield(0,a.x7)(t);return r.exists()?r.data():{}})()}deleteSystemTest(o,e,n,t){var r=this;return(0,m.A)(function*(){let d=(0,a.H9)(r.firestore,"teams",o,"products",e,"software_testing","system_tests"),f=yield(0,a.x7)(d);if(f.exists()){let g=f.data()[n],h=g.indexOf(t);g.splice(h,1),yield(0,a.BN)(d,{[n]:g})}if(d=(0,a.H9)(r.firestore,"teams",o,"products",e,"software_testing","system_tests_history"),f=yield(0,a.x7)(d),f.exists()){let v=f.data();for(let g in v)console.log(v[g].systemTest.title),v[g].systemTest.title===t.title&&delete v[g];yield(0,a.BN)(d,v)}})()}}return(c=i).\u0275fac=function(o){return new(o||c)(u.KVO(a._7))},c.\u0275prov=u.jDH({token:c,factory:c.\u0275fac,providedIn:"root"}),i})()}}]);
\ No newline at end of file
diff --git a/www/common.d189814be88799fb.js b/www/common.d189814be88799fb.js
deleted file mode 100644
index e580bf5..0000000
--- a/www/common.d189814be88799fb.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[2076],{1263:(O,p,c)=>{c.d(p,{c:()=>u});var _=c(9672),l=c(1086),d=c(8607);const u=(a,s)=>{let o,r;const t=(i,h,v)=>{if(typeof document>"u")return;const m=document.elementFromPoint(i,h);m&&s(m)&&!m.disabled?m!==o&&(e(),n(m,v)):e()},n=(i,h)=>{o=i,r||(r=o);const v=o;(0,_.w)(()=>v.classList.add("ion-activated")),h()},e=(i=!1)=>{if(!o)return;const h=o;(0,_.w)(()=>h.classList.remove("ion-activated")),i&&r!==o&&o.click(),o=void 0};return(0,d.createGesture)({el:a,gestureName:"buttonActiveDrag",threshold:0,onStart:i=>t(i.currentX,i.currentY,l.a),onMove:i=>t(i.currentX,i.currentY,l.b),onEnd:()=>{e(!0),(0,l.h)(),r=void 0}})}},8438:(O,p,c)=>{c.d(p,{g:()=>l});var _=c(8476);const l=()=>{if(void 0!==_.w)return _.w.Capacitor}},5572:(O,p,c)=>{c.d(p,{c:()=>_,i:()=>l});const _=(d,u,a)=>"function"==typeof a?a(d,u):"string"==typeof a?d[a]===u[a]:Array.isArray(u)?u.includes(d):d===u,l=(d,u,a)=>void 0!==d&&(Array.isArray(d)?d.some(s=>_(s,u,a)):_(d,u,a))},3351:(O,p,c)=>{c.d(p,{g:()=>_});const _=(s,o,r,t,n)=>d(s[1],o[1],r[1],t[1],n).map(e=>l(s[0],o[0],r[0],t[0],e)),l=(s,o,r,t,n)=>n*(3*o*Math.pow(n-1,2)+n*(-3*r*n+3*r+t*n))-s*Math.pow(n-1,3),d=(s,o,r,t,n)=>a((t-=n)-3*(r-=n)+3*(o-=n)-(s-=n),3*r-6*o+3*s,3*o-3*s,s).filter(i=>i>=0&&i<=1),a=(s,o,r,t)=>{if(0===s)return((s,o,r)=>{const t=o*o-4*s*r;return t<0?[]:[(-o+Math.sqrt(t))/(2*s),(-o-Math.sqrt(t))/(2*s)]})(o,r,t);const n=(3*(r/=s)-(o/=s)*o)/3,e=(2*o*o*o-9*o*r+27*(t/=s))/27;if(0===n)return[Math.pow(-e,1/3)];if(0===e)return[Math.sqrt(-n),-Math.sqrt(-n)];const i=Math.pow(e/2,2)+Math.pow(n/3,3);if(0===i)return[Math.pow(e/2,.5)-o/3];if(i>0)return[Math.pow(-e/2+Math.sqrt(i),1/3)-Math.pow(e/2+Math.sqrt(i),1/3)-o/3];const h=Math.sqrt(Math.pow(-n/3,3)),v=Math.acos(-e/(2*Math.sqrt(Math.pow(-n/3,3)))),m=2*Math.pow(h,1/3);return[m*Math.cos(v/3)-o/3,m*Math.cos((v+2*Math.PI)/3)-o/3,m*Math.cos((v+4*Math.PI)/3)-o/3]}},5083:(O,p,c)=>{c.d(p,{i:()=>_});const _=l=>l&&""!==l.dir?"rtl"===l.dir.toLowerCase():"rtl"===(null==document?void 0:document.dir.toLowerCase())},3126:(O,p,c)=>{c.r(p),c.d(p,{startFocusVisible:()=>u});const _="ion-focused",d=["Tab","ArrowDown","Space","Escape"," ","Shift","Enter","ArrowLeft","ArrowRight","ArrowUp","Home","End"],u=a=>{let s=[],o=!0;const r=a?a.shadowRoot:document,t=a||document.body,n=g=>{s.forEach(f=>f.classList.remove(_)),g.forEach(f=>f.classList.add(_)),s=g},e=()=>{o=!1,n([])},i=g=>{o=d.includes(g.key),o||n([])},h=g=>{if(o&&void 0!==g.composedPath){const f=g.composedPath().filter(y=>!!y.classList&&y.classList.contains("ion-focusable"));n(f)}},v=()=>{r.activeElement===t&&n([])};return r.addEventListener("keydown",i),r.addEventListener("focusin",h),r.addEventListener("focusout",v),r.addEventListener("touchstart",e,{passive:!0}),r.addEventListener("mousedown",e),{destroy:()=>{r.removeEventListener("keydown",i),r.removeEventListener("focusin",h),r.removeEventListener("focusout",v),r.removeEventListener("touchstart",e),r.removeEventListener("mousedown",e)},setFocus:n}}},1086:(O,p,c)=>{c.d(p,{I:()=>l,a:()=>o,b:()=>r,c:()=>s,d:()=>n,h:()=>t});var _=c(8438),l=function(e){return e.Heavy="HEAVY",e.Medium="MEDIUM",e.Light="LIGHT",e}(l||{});const u={getEngine(){const e=(0,_.g)();if(null!=e&&e.isPluginAvailable("Haptics"))return e.Plugins.Haptics},available(){if(!this.getEngine())return!1;const i=(0,_.g)();return"web"!==(null==i?void 0:i.getPlatform())||typeof navigator<"u"&&void 0!==navigator.vibrate},impact(e){const i=this.getEngine();i&&i.impact({style:e.style})},notification(e){const i=this.getEngine();i&&i.notification({type:e.type})},selection(){this.impact({style:l.Light})},selectionStart(){const e=this.getEngine();e&&e.selectionStart()},selectionChanged(){const e=this.getEngine();e&&e.selectionChanged()},selectionEnd(){const e=this.getEngine();e&&e.selectionEnd()}},a=()=>u.available(),s=()=>{a()&&u.selection()},o=()=>{a()&&u.selectionStart()},r=()=>{a()&&u.selectionChanged()},t=()=>{a()&&u.selectionEnd()},n=e=>{a()&&u.impact(e)}},909:(O,p,c)=>{c.d(p,{I:()=>s,a:()=>n,b:()=>a,c:()=>h,d:()=>m,f:()=>e,g:()=>t,i:()=>r,p:()=>v,r:()=>g,s:()=>i});var _=c(467),l=c(4920),d=c(4929);const a="ion-content",s=".ion-content-scroll-host",o=`${a}, ${s}`,r=f=>"ION-CONTENT"===f.tagName,t=function(){var f=(0,_.A)(function*(y){return r(y)?(yield new Promise(D=>(0,l.c)(y,D)),y.getScrollElement()):y});return function(D){return f.apply(this,arguments)}}(),n=f=>f.querySelector(s)||f.querySelector(o),e=f=>f.closest(o),i=(f,y)=>r(f)?f.scrollToTop(y):Promise.resolve(f.scrollTo({top:0,left:0,behavior:y>0?"smooth":"auto"})),h=(f,y,D,M)=>r(f)?f.scrollByPoint(y,D,M):Promise.resolve(f.scrollBy({top:D,left:y,behavior:M>0?"smooth":"auto"})),v=f=>(0,d.b)(f,a),m=f=>{if(r(f)){const D=f.scrollY;return f.scrollY=!1,D}return f.style.setProperty("overflow","hidden"),!0},g=(f,y)=>{r(f)?f.scrollY=y:f.style.removeProperty("overflow")}},3992:(O,p,c)=>{c.d(p,{a:()=>_,b:()=>h,c:()=>o,d:()=>v,e:()=>L,f:()=>s,g:()=>m,h:()=>d,i:()=>l,j:()=>E,k:()=>P,l:()=>r,m:()=>e,n:()=>g,o:()=>n,p:()=>a,q:()=>u,r:()=>w,s:()=>A,t:()=>i,u:()=>D,v:()=>M,w:()=>t,x:()=>f,y:()=>y});const _="data:image/svg+xml;utf8,",l="data:image/svg+xml;utf8,",d="data:image/svg+xml;utf8,",u="data:image/svg+xml;utf8,",a="data:image/svg+xml;utf8,",s="data:image/svg+xml;utf8,",o="data:image/svg+xml;utf8,",r="data:image/svg+xml;utf8,",t="data:image/svg+xml;utf8,",n="data:image/svg+xml;utf8,",e="data:image/svg+xml;utf8,",i="data:image/svg+xml;utf8,",h="data:image/svg+xml;utf8,",v="data:image/svg+xml;utf8,",m="data:image/svg+xml;utf8,",g="data:image/svg+xml;utf8,",f="data:image/svg+xml;utf8,",y="data:image/svg+xml;utf8,",D="data:image/svg+xml;utf8,",M="data:image/svg+xml;utf8,",w="data:image/svg+xml;utf8,",E="data:image/svg+xml;utf8,",P="data:image/svg+xml;utf8,",A="data:image/svg+xml;utf8,",L="data:image/svg+xml;utf8,"},243:(O,p,c)=>{c.d(p,{c:()=>u,g:()=>a});var _=c(8476),l=c(4920),d=c(4929);const u=(o,r,t)=>{let n,e;if(void 0!==_.w&&"MutationObserver"in _.w){const m=Array.isArray(r)?r:[r];n=new MutationObserver(g=>{for(const f of g)for(const y of f.addedNodes)if(y.nodeType===Node.ELEMENT_NODE&&m.includes(y.slot))return t(),void(0,l.r)(()=>i(y))}),n.observe(o,{childList:!0,subtree:!0})}const i=m=>{var g;e&&(e.disconnect(),e=void 0),e=new MutationObserver(f=>{t();for(const y of f)for(const D of y.removedNodes)D.nodeType===Node.ELEMENT_NODE&&D.slot===r&&v()}),e.observe(null!==(g=m.parentElement)&&void 0!==g?g:m,{subtree:!0,childList:!0})},v=()=>{e&&(e.disconnect(),e=void 0)};return{destroy:()=>{n&&(n.disconnect(),n=void 0),v()}}},a=(o,r,t)=>{const n=null==o?0:o.toString().length,e=s(n,r);if(void 0===t)return e;try{return t(n,r)}catch(i){return(0,d.a)("Exception in provided `counterFormatter`.",i),e}},s=(o,r)=>`${o} / ${r}`},1622:(O,p,c)=>{c.r(p),c.d(p,{KEYBOARD_DID_CLOSE:()=>a,KEYBOARD_DID_OPEN:()=>u,copyVisualViewport:()=>w,keyboardDidClose:()=>f,keyboardDidOpen:()=>m,keyboardDidResize:()=>g,resetKeyboardAssist:()=>n,setKeyboardClose:()=>v,setKeyboardOpen:()=>h,startKeyboardAssist:()=>e,trackViewportChanges:()=>M});var _=c(4379);c(8438),c(8476);const u="ionKeyboardDidShow",a="ionKeyboardDidHide";let o={},r={},t=!1;const n=()=>{o={},r={},t=!1},e=E=>{if(_.K.getEngine())i(E);else{if(!E.visualViewport)return;r=w(E.visualViewport),E.visualViewport.onresize=()=>{M(E),m()||g(E)?h(E):f(E)&&v(E)}}},i=E=>{E.addEventListener("keyboardDidShow",P=>h(E,P)),E.addEventListener("keyboardDidHide",()=>v(E))},h=(E,P)=>{y(E,P),t=!0},v=E=>{D(E),t=!1},m=()=>!t&&o.width===r.width&&(o.height-r.height)*r.scale>150,g=E=>t&&!f(E),f=E=>t&&r.height===E.innerHeight,y=(E,P)=>{const L=new CustomEvent(u,{detail:{keyboardHeight:P?P.keyboardHeight:E.innerHeight-r.height}});E.dispatchEvent(L)},D=E=>{const P=new CustomEvent(a);E.dispatchEvent(P)},M=E=>{o=Object.assign({},r),r=w(E.visualViewport)},w=E=>({width:Math.round(E.width),height:Math.round(E.height),offsetTop:E.offsetTop,offsetLeft:E.offsetLeft,pageTop:E.pageTop,pageLeft:E.pageLeft,scale:E.scale})},4379:(O,p,c)=>{c.d(p,{K:()=>u,a:()=>d});var _=c(8438),l=function(a){return a.Unimplemented="UNIMPLEMENTED",a.Unavailable="UNAVAILABLE",a}(l||{}),d=function(a){return a.Body="body",a.Ionic="ionic",a.Native="native",a.None="none",a}(d||{});const u={getEngine(){const a=(0,_.g)();if(null!=a&&a.isPluginAvailable("Keyboard"))return a.Plugins.Keyboard},getResizeMode(){const a=this.getEngine();return null!=a&&a.getResizeMode?a.getResizeMode().catch(s=>{if(s.code!==l.Unimplemented)throw s}):Promise.resolve(void 0)}}},4731:(O,p,c)=>{c.d(p,{c:()=>s});var _=c(467),l=c(8476),d=c(4379);const u=o=>{if(void 0===l.d||o===d.a.None||void 0===o)return null;const r=l.d.querySelector("ion-app");return null!=r?r:l.d.body},a=o=>{const r=u(o);return null===r?0:r.clientHeight},s=function(){var o=(0,_.A)(function*(r){let t,n,e,i;const h=function(){var y=(0,_.A)(function*(){const D=yield d.K.getResizeMode(),M=void 0===D?void 0:D.mode;t=()=>{void 0===i&&(i=a(M)),e=!0,v(e,M)},n=()=>{e=!1,v(e,M)},null==l.w||l.w.addEventListener("keyboardWillShow",t),null==l.w||l.w.addEventListener("keyboardWillHide",n)});return function(){return y.apply(this,arguments)}}(),v=(y,D)=>{r&&r(y,m(D))},m=y=>{if(0===i||i===a(y))return;const D=u(y);return null!==D?new Promise(M=>{const E=new ResizeObserver(()=>{D.clientHeight===i&&(E.disconnect(),M())});E.observe(D)}):void 0};return yield h(),{init:h,destroy:()=>{null==l.w||l.w.removeEventListener("keyboardWillShow",t),null==l.w||l.w.removeEventListener("keyboardWillHide",n),t=n=void 0},isKeyboardVisible:()=>e}});return function(t){return o.apply(this,arguments)}}()},7838:(O,p,c)=>{c.d(p,{c:()=>l});var _=c(467);const l=()=>{let d;return{lock:function(){var a=(0,_.A)(function*(){const s=d;let o;return d=new Promise(r=>o=r),void 0!==s&&(yield s),o});return function(){return a.apply(this,arguments)}}()}}},9001:(O,p,c)=>{c.d(p,{c:()=>d});var _=c(8476),l=c(4920);const d=(u,a,s)=>{let o;const r=()=>!(void 0===a()||void 0!==u.label||null===s()),n=()=>{const i=a();if(void 0===i)return;if(!r())return void i.style.removeProperty("width");const h=s().scrollWidth;if(0===h&&null===i.offsetParent&&void 0!==_.w&&"IntersectionObserver"in _.w){if(void 0!==o)return;const v=o=new IntersectionObserver(m=>{1===m[0].intersectionRatio&&(n(),v.disconnect(),o=void 0)},{threshold:.01,root:u});v.observe(i)}else i.style.setProperty("width",.75*h+"px")};return{calculateNotchWidth:()=>{r()&&(0,l.r)(()=>{n()})},destroy:()=>{o&&(o.disconnect(),o=void 0)}}}},7895:(O,p,c)=>{c.d(p,{S:()=>l});const l={bubbles:{dur:1e3,circles:9,fn:(d,u,a)=>{const s=d*u/a-d+"ms",o=2*Math.PI*u/a;return{r:5,style:{top:32*Math.sin(o)+"%",left:32*Math.cos(o)+"%","animation-delay":s}}}},circles:{dur:1e3,circles:8,fn:(d,u,a)=>{const s=u/a,o=d*s-d+"ms",r=2*Math.PI*s;return{r:5,style:{top:32*Math.sin(r)+"%",left:32*Math.cos(r)+"%","animation-delay":o}}}},circular:{dur:1400,elmDuration:!0,circles:1,fn:()=>({r:20,cx:48,cy:48,fill:"none",viewBox:"24 24 48 48",transform:"translate(0,0)",style:{}})},crescent:{dur:750,circles:1,fn:()=>({r:26,style:{}})},dots:{dur:750,circles:3,fn:(d,u)=>({r:6,style:{left:32-32*u+"%","animation-delay":-110*u+"ms"}})},lines:{dur:1e3,lines:8,fn:(d,u,a)=>({y1:14,y2:26,style:{transform:`rotate(${360/a*u+(u({y1:12,y2:20,style:{transform:`rotate(${360/a*u+(u({y1:17,y2:29,style:{transform:`rotate(${30*u+(u<6?180:-180)}deg)`,"animation-delay":d*u/a-d+"ms"}})},"lines-sharp-small":{dur:1e3,lines:12,fn:(d,u,a)=>({y1:12,y2:20,style:{transform:`rotate(${30*u+(u<6?180:-180)}deg)`,"animation-delay":d*u/a-d+"ms"}})}}},7166:(O,p,c)=>{c.r(p),c.d(p,{createSwipeBackGesture:()=>a});var _=c(4920),l=c(5083),d=c(8607);c(1970);const a=(s,o,r,t,n)=>{const e=s.ownerDocument.defaultView;let i=(0,l.i)(s);const v=D=>i?-D.deltaX:D.deltaX;return(0,d.createGesture)({el:s,gestureName:"goback-swipe",gesturePriority:101,threshold:10,canStart:D=>(i=(0,l.i)(s),(D=>{const{startX:w}=D;return i?w>=e.innerWidth-50:w<=50})(D)&&o()),onStart:r,onMove:D=>{const w=v(D)/e.innerWidth;t(w)},onEnd:D=>{const M=v(D),w=e.innerWidth,E=M/w,P=(D=>i?-D.velocityX:D.velocityX)(D),L=P>=0&&(P>.2||M>w/2),C=(L?1-E:E)*w;let T=0;if(C>5){const R=C/Math.abs(P);T=Math.min(R,540)}n(L,E<=0?.01:(0,_.j)(0,E,.9999),T)}})}},2935:(O,p,c)=>{c.d(p,{w:()=>_});const _=(u,a,s)=>{if(typeof MutationObserver>"u")return;const o=new MutationObserver(r=>{s(l(r,a))});return o.observe(u,{childList:!0,subtree:!0}),o},l=(u,a)=>{let s;return u.forEach(o=>{for(let r=0;r{if(1!==u.nodeType)return;const s=u;return(s.tagName===a.toUpperCase()?[s]:Array.from(s.querySelectorAll(a))).find(r=>r.value===s.value)}},385:(O,p,c)=>{c.d(p,{l:()=>d});var _=c(4438),l=c(7863);let d=(()=>{var u;class a{constructor(){this.title="Header Title"}ngOnInit(){}}return(u=a).\u0275fac=function(o){return new(o||u)},u.\u0275cmp=_.VBU({type:u,selectors:[["app-header"]],inputs:{title:"title"},decls:5,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"]],template:function(o,r){1&o&&(_.j41(0,"ion-header",0)(1,"ion-toolbar"),_.nrm(2,"ion-menu-button",1),_.j41(3,"ion-title"),_.EFF(4),_.k0s()()()),2&o&&(_.Y8G("translucent",!0),_.R7$(4),_.JRh(r.title))},dependencies:[l.eU,l.MC,l.BC,l.ai]}),a})()},8453:(O,p,c)=>{c.d(p,{W:()=>d});var _=c(4438),l=c(7863);let d=(()=>{var u;class a{constructor(){this.title="Title"}ngOnInit(){}}return(u=a).\u0275fac=function(o){return new(o||u)},u.\u0275cmp=_.VBU({type:u,selectors:[["app-title"]],inputs:{title:"title"},decls:4,vars:1,consts:[[1,"lg:m-10"],["size","12","size-md","6","size-lg","6"],[1,"text-4xl","lg:text-6xl","font-bold"]],template:function(o,r){1&o&&(_.j41(0,"ion-row",0)(1,"ion-col",1)(2,"h1",2),_.EFF(3),_.k0s()()()),2&o&&(_.R7$(3),_.JRh(r.title))},dependencies:[l.hU,l.ln]}),a})()},4796:(O,p,c)=>{c.d(p,{u:()=>a});var _=c(467),l=c(8737),d=c(4262),u=c(4438);let a=(()=>{var s;class o{constructor(t,n){this.auth=t,this.firestore=n}registerUser(t){var n=this;return(0,_.A)(function*(){try{const e=yield(0,l.eJ)(n.auth,t.email,t.password);return e.user?(yield(0,d.BN)((0,d.H9)(n.firestore,"users",e.user.uid),{email:t.email,name:t.name,orgName:t.orgName,uid:e.user.uid}),yield(0,d.BN)((0,d.H9)(n.firestore,"teams",`${t.orgName}`),{name:t.orgName,members:[e.user.uid]}),e):null}catch{return null}})()}loginUser(t){var n=this;return(0,_.A)(function*(){try{var e;const i=yield(0,l.x9)(n.auth,t.email,t.password);if(null!==(e=i.user)&&void 0!==e&&e.uid){const h=yield(0,d.x7)((0,d.H9)(n.firestore,"users",i.user.uid));if(h.exists())return localStorage.setItem("user",JSON.stringify(h.data())),i}}catch(i){console.error(i)}return null})()}logoutUser(){var t=this;return(0,_.A)(function*(){yield t.auth.signOut()})()}addMember(t){var n=this;return(0,_.A)(function*(){try{const e=yield(0,l.eJ)(n.auth,t.email,t.password);if(!e.user)return!1;const i={email:t.email,name:t.name,orgName:t.orgName,uid:e.user.uid};return yield(0,d.BN)((0,d.H9)(n.firestore,"users",e.user.uid),i),i}catch{return!1}})()}}return(s=o).\u0275fac=function(t){return new(t||s)(u.KVO(l.Nj),u.KVO(d._7))},s.\u0275prov=u.jDH({token:s,factory:s.\u0275fac,providedIn:"root"}),o})()},6560:(O,p,c)=>{c.d(p,{x:()=>a});var _=c(467),l=c(4262),d=c(4438),u=c(1626);let a=(()=>{var s;class o{constructor(t,n){this.firestore=t,this.http=n,this.url_cpu="https://devprobeapi.onrender.com/flame_graph_date",this.url_mem="https://devprobeapi.onrender.com/flame_graph_memory_date"}getProducts(t){var n=this;return(0,_.A)(function*(){try{const e=(0,l.rJ)(n.firestore,"teams",t,"products");return(yield(0,l.GG)(e)).docs.map(h=>h.data())}catch(e){return console.log(e),[]}})()}getDates(t,n,e){var i=this;return(0,_.A)(function*(){try{e||(e="cpu_usage");const h=(0,l.rJ)(i.firestore,"teams",t,"products",n,e);return(yield(0,l.GG)(h)).docs.map(m=>m.id)}catch(h){return console.log(h),[]}})()}getFlameGraphByDate(t,n,e,i){var h=this;return(0,_.A)(function*(){try{let v={team:t,product:n,date:e};return i?yield h.http.post(h.url_mem,v).toPromise():yield h.http.post(h.url_cpu,v).toPromise()}catch{return{}}})()}}return(s=o).\u0275fac=function(t){return new(t||s)(d.KVO(l._7),d.KVO(u.Qq))},s.\u0275prov=d.jDH({token:s,factory:s.\u0275fac,providedIn:"root"}),o})()},3661:(O,p,c)=>{c.d(p,{e:()=>a});var _=c(467),l=c(4438),d=c(4262),u=c(1626);let a=(()=>{var s;class o{constructor(t,n){this.firestore=t,this.http=n,this.ipApiURL="https://cors-ea3m.onrender.com/http://ip-api.com/json/"}getLocationDestSrc(t){var n=this;return(0,_.A)(function*(){var e,i,h,v,m,g,f,y;if(!t)return t;const D=n.http.get(n.ipApiURL+t.dst_addr).toPromise(),M=n.http.get(n.ipApiURL+t.src_addr).toPromise(),w=yield D,E=yield M;return t.dst_city=null!==(e=w.city)&&void 0!==e?e:"No city found",t.dst_country=null!==(i=w.country)&&void 0!==i?i:"No country found",t.dst_latitude=null!==(h=w.lat)&&void 0!==h?h:0,t.dst_longitude=null!==(v=w.lon)&&void 0!==v?v:0,t.src_city=null!==(m=E.city)&&void 0!==m?m:"No city found",t.src_country=null!==(g=E.country)&&void 0!==g?g:"No country found",t.src_latitude=null!==(f=E.lat)&&void 0!==f?f:0,t.src_longitude=null!==(y=E.lon)&&void 0!==y?y:0,t})()}getLocationFrom(t){var n=this;return(0,_.A)(function*(){if(!t)return t;let e=t.result;for(let g=0;g{c.d(p,{N:()=>a});var _=c(467),l=c(4262),d=c(4438),u=c(1626);let a=(()=>{var s;class o{constructor(t,n){this.firestore=t,this.http=n,this.ipApiURL="https://cors-ea3m.onrender.com/http://ip-api.com/json/"}getLocation(t){var n=this;return(0,_.A)(function*(){console.log(t);const i=yield n.http.get(n.ipApiURL+t[0].dst_addr).toPromise();for(let m=0;mn.http.get(n.ipApiURL+m.from).toPromise());return(yield Promise.all(h)).forEach((m,g)=>{t[g].fromLatitude=m.lat,t[g].fromLongitude=m.lon,t[g].cityFrom=m.city,t[g].countryFrom=m.country}),console.log(t),t})()}saveLocationResults(t,n,e,i){var h=this;return(0,_.A)(function*(){try{console.log(i,"ripeData");const v=(0,l.rJ)(h.firestore,"teams",t,"products",n,"ripe"),m=(0,l.H9)(v,e),g=i.map(f=>({from:f.from,dst_addr:f.dst_addr,latency:f.latency,cityFrom:f.cityFrom,countryFrom:f.countryFrom,cityTo:f.cityTo,countryTo:f.countryTo,fromLatitude:f.fromLatitude,fromLongitude:f.fromLongitude,toLatitude:f.toLatitude,toLongitude:f.toLongitude,id:f.id}));return yield(0,l.BN)(m,{data:g}),console.log("Data saved",{data:g}),!0}catch(v){return console.log(v),!1}})()}}return(s=o).\u0275fac=function(t){return new(t||s)(d.KVO(l._7),d.KVO(u.Qq))},s.\u0275prov=d.jDH({token:s,factory:s.\u0275fac,providedIn:"root"}),o})()},6241:(O,p,c)=>{c.d(p,{b:()=>u});var _=c(467),l=c(4262),d=c(4438);let u=(()=>{var a;class s{constructor(r){this.firestore=r}addProduct(r,t){var n=this;return(0,_.A)(function*(){try{console.log(r);const e=(0,l.H9)(n.firestore,"teams",t,"products",r.productObjective);return yield(0,l.BN)(e,r),!0}catch(e){return console.log(e),!1}})()}getProducts(r){var t=this;return(0,_.A)(function*(){try{const n=(0,l.rJ)(t.firestore,"teams",r,"products");return(yield(0,l.GG)(n)).docs.map(i=>i.data())}catch(n){return console.log(n),[]}})()}removeProduct(r,t){var n=this;return(0,_.A)(function*(){try{const e=(0,l.H9)(n.firestore,"teams",r,"products",t);return yield(0,l.kd)(e),!0}catch(e){return console.log(e),!1}})()}}return(a=s).\u0275fac=function(r){return new(r||a)(d.KVO(l._7))},a.\u0275prov=d.jDH({token:a,factory:a.\u0275fac,providedIn:"root"}),s})()},2588:(O,p,c)=>{c.d(p,{N:()=>a});var _=c(467),l=c(4262),d=c(4438),u=c(1626);let a=(()=>{var s;class o{constructor(t,n){this.http=t,this.firestore=n,this.measurementsUrl="https://cors-ea3m.onrender.com/https://atlas.ripe.net/api/v2/measurements/",this.measurementID=""}sendTraceRequest(t,n,e,i){var h=this;return(0,_.A)(function*(){console.log("Sending trace request");try{let v={definitions:[{target:t,description:n,type:e,af:4,is_oneoff:!0,protocol:"TCP"}],probes:[]};console.log(i);let m=i.split(",").length-1,g=(i=i.slice(0,-1)).split(","),f=[];for(let M=0;M({id:h.measurementID,dst_addr:f.dst_addr,dst_city:f.dst_city,dst_country:f.dst_country,dst_latitude:f.dst_latitude,dst_longitude:f.dst_longitude,src_addr:f.src_addr,src_city:f.src_city,src_country:f.src_country,src_latitude:f.src_latitude,src_longitude:f.src_longitude,result:f.result}));return yield(0,l.BN)(m,{data:g}),!0}catch(v){return console.log(v),!1}})()}getHistoryResults(t,n){var e=this;return(0,_.A)(function*(){const h=(0,l.rJ)(e.firestore,"teams/"+t+"/products/"+n+"/ripe_trace"),v=yield(0,l.GG)(h);let m=[];return v.docs.forEach(g=>{m.push({id:g.id,data:g.data()})}),console.log(m),m})()}getAllResultsByDescription(t,n,e){var i=this;return(0,_.A)(function*(){try{let h="teams/"+t+"/products/"+n+"/ripe_trace";console.log(h);let v=(0,l.H9)(i.firestore,h,e);return(yield(0,l.x7)(v)).data()}catch(h){return console.log(h),[]}})()}}return(s=o).\u0275fac=function(t){return new(t||s)(d.KVO(u.Qq),d.KVO(l._7))},s.\u0275prov=d.jDH({token:s,factory:s.\u0275fac,providedIn:"root"}),o})()},9640:(O,p,c)=>{c.d(p,{Q:()=>s});var _=c(467),l=c(1985),d=c(4262),u=c(4438),a=c(1626);let s=(()=>{var o;class r{constructor(n,e){this.http=n,this.firestore=e,this.measurementsUrl="https://cors-ea3m.onrender.com/https://atlas.ripe.net/api/v2/measurements/",this.measurementID=""}sendMeasurementRequest(n,e,i,h){var v=this;return(0,_.A)(function*(){let m=h.split(",").length-1;h=h.slice(0,-1);try{let g={definitions:[{target:n,description:"ping",type:"ping",af:4,is_oneoff:!0}],probes:[{requested:m,type:"probes",value:h}]},f={Authorization:"Key 92530695-134f-4cbc-b7c3-ec130f3719b0"};console.log(g);let y=yield v.http.post(v.measurementsUrl,g,{headers:f}).toPromise();return console.log(y),v.measurementID=y.measurements[0],v.measurementID}catch(g){return console.log(g),!1}})()}getMeasurementResults(n){var e=this;return(0,_.A)(function*(){n&&(e.measurementID=n);try{let i={Authorization:"Key 92530695-134f-4cbc-b7c3-ec130f3719b0"};return""===e.measurementID?(console.log("No measurement ID"),!1):e.http.get(e.measurementsUrl+e.measurementID+"/results/",{headers:i})}catch(i){return console.log(i),new l.c}})()}saveMeasurementResults(n,e,i,h){var v=this;return(0,_.A)(function*(){try{const m=(0,d.rJ)(v.firestore,"teams",n,"products",e,"ripe"),g=(0,d.H9)(m,i),f=h.map((y,D)=>({id:v.measurementID,from:y.from,dst_addr:y.dst_addr,latency:y.latency}));return yield(0,d.BN)(g,{data:f}),!0}catch(m){return console.log(m),!1}})()}getAllResultsByDescription(n,e,i){var h=this;return(0,_.A)(function*(){try{let v="teams/"+n+"/products/"+e+"/ripe";console.log(v);let m=(0,d.H9)(h.firestore,v,i);return(yield(0,d.x7)(m)).data()}catch(v){return console.log(v),[]}})()}getHistoryResults(n,e){var i=this;return(0,_.A)(function*(){const v=(0,d.rJ)(i.firestore,"teams/"+n+"/products/"+e+"/ripe"),m=yield(0,d.GG)(v);let g=[];return m.docs.forEach(f=>{g.push({id:f.id,data:f.data()})}),console.log(g),g})()}deleteHistory(n,e,i){var h=this;return(0,_.A)(function*(){const m=(0,d.H9)(h.firestore,"teams/"+n+"/products/"+e+"/ripe",i);try{return yield(0,d.kd)(m),!0}catch(g){return console.log(g),!1}})()}}return(o=r).\u0275fac=function(n){return new(n||o)(u.KVO(a.Qq),u.KVO(d._7))},o.\u0275prov=u.jDH({token:o,factory:o.\u0275fac,providedIn:"root"}),r})()},9274:(O,p,c)=>{c.d(p,{h:()=>u});var _=c(467),l=c(4262),d=c(4438);let u=(()=>{var a;class s{constructor(r){this.firestore=r}addSystemTest(r,t,n,e){var i=this;return(0,_.A)(function*(){const h=(0,l.H9)(i.firestore,"teams",r,"products",t,"software_testing","system_tests"),v=yield(0,l.x7)(h);if(v.exists()){const g=v.data()[n];console.log(g),g.push(e),yield(0,l.BN)(h,{[n]:g}),console.log("Document updated with ID: ",v.id)}else console.log("No such document!"),yield(0,l.BN)(h,{[n]:[e]}),console.log("Document created with ID: ",h.id)})()}getSystemTest(r,t,n){var e=this;return(0,_.A)(function*(){const i=(0,l.H9)(e.firestore,"teams",r,"products",t,"software_testing","system_tests"),h=yield(0,l.x7)(i);return h.exists()?h.data()[n]:[]})()}}return(a=s).\u0275fac=function(r){return new(r||a)(d.KVO(l._7))},a.\u0275prov=d.jDH({token:a,factory:a.\u0275fac,providedIn:"root"}),s})()}}]);
\ No newline at end of file
diff --git a/www/index.html b/www/index.html
index b8dfc16..b45efb7 100644
--- a/www/index.html
+++ b/www/index.html
@@ -17,10 +17,10 @@
-
+
-
+