diff --git a/.DS_Store b/.DS_Store
index 2d9a17c9..5cc06c87 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
index faf05750..fff13d10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,7 @@ log.txt
npm-debug.log*
.idea/
-.sourcemaps/
+.sourcemaps/*
.sass-cache/
.tmp/
.versions/
@@ -33,3 +33,6 @@ $RECYCLE.BIN/
.DS_Store
Thumbs.db
UserInterfaceState.xcuserstate
+*.js.map
+.DS_Store
+src/.DS_Store
diff --git a/.sourcemaps/0.js.map b/.sourcemaps/0.js.map
index 534587be..519c3fa0 100644
--- a/.sourcemaps/0.js.map
+++ b/.sourcemaps/0.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/pages/tables/add-party/add-party.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAyC;AACO;AACL;AAU3C;IAAA;IAAiC,CAAC;IAArB,kBAAkB;QAR9B,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,gEAAY;aACb;YACD,OAAO,EAAE;gBACP,sEAAe,CAAC,QAAQ,CAAC,gEAAY,CAAC;aACvC;SACF,CAAC;OACW,kBAAkB,CAAG;IAAD,yBAAC;CAAA;AAAH","file":"0.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { AddPartyPage } from './add-party';\n\n@NgModule({\n declarations: [\n AddPartyPage,\n ],\n imports: [\n IonicPageModule.forChild(AddPartyPage),\n ],\n})\nexport class AddPartyPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/tables/add-party/add-party.module.ts"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["../../src/pages/event-modal/event-modal.module.ts","../../src/pages/event-modal/event-modal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAyC;AACO;AACD;AAU/C;IAAA;IAAmC,CAAC;IAAvB,oBAAoB;QARhC,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,oEAAc;aACf;YACD,OAAO,EAAE;gBACP,sEAAe,CAAC,QAAQ,CAAC,oEAAc,CAAC;aACzC;SACF,CAAC;OACW,oBAAoB,CAAG;IAAD,2BAAC;CAAA;AAAH;;;;;;;;;;;;;;;;;;;;;;;ACZS;AAC+B;AACxC;AAOjC;IAME,wBAAmB,OAAsB,EAAU,SAAoB,EAAS,QAAwB;QAArF,YAAO,GAAP,OAAO,CAAe;QAAU,cAAS,GAAT,SAAS,CAAW;QAAS,aAAQ,GAAR,QAAQ,CAAgB;QAJxG,UAAK,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAClG,YAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,6CAA6C;QAI/E,IAAI,CAAC,OAAO,GAAG,oCAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,eAAe,GAAG,oCAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;IACvC,CAAC;IAED,+BAAM,GAAN;QACE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,6BAAI,GAAJ;QACE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAnBU,cAAc;QAJ1B,wEAAS,CAAC;YACT,QAAQ,EAAE,kBAAkB;WACG;SAChC,CAAC;uBAOwG;OAN7F,cAAc,CAqB1B;IAAD,CAAC;AAAA;SArBY,cAAc,gB","file":"0.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { EventModalPage } from './event-modal';\n\n@NgModule({\n declarations: [\n EventModalPage,\n ],\n imports: [\n IonicPageModule.forChild(EventModalPage),\n ],\n})\nexport class EventModalPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/event-modal/event-modal.module.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular';\nimport * as moment from 'moment';\n\n@IonicPage()\n@Component({\n selector: 'page-event-modal',\n templateUrl: 'event-modal.html',\n})\nexport class EventModalPage {\n\n event = { startTime: new Date().toISOString(), endTime: new Date().toISOString(), allDay: false };\n minDate = new Date().toISOString(); //ISO string format: YYYY-MM-DDTHH:mm:ss.sssZ\n\n\n constructor(public navCtrl: NavController, private navParams: NavParams, public viewCtrl: ViewController) {\n this.minDate = moment(this.minDate).format();\n let preselectedDate = moment(this.navParams.get('selectedDay')).format();\n this.event.startTime = preselectedDate;\n this.event.endTime = preselectedDate;\n }\n\n cancel() {\n this.viewCtrl.dismiss();\n }\n\n save() {\n this.viewCtrl.dismiss(this.event);\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/event-modal/event-modal.ts"],"sourceRoot":""}
\ No newline at end of file
diff --git a/.sourcemaps/1.js.map b/.sourcemaps/1.js.map
index 9d89efd4..bd9e0962 100644
--- a/.sourcemaps/1.js.map
+++ b/.sourcemaps/1.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/pages/login/login.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAyC;AACO;AACZ;AAUpC;IAAA;IAA8B,CAAC;IAAlB,eAAe;QAR3B,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,yDAAS;aACV;YACD,OAAO,EAAE;gBACP,sEAAe,CAAC,QAAQ,CAAC,yDAAS,CAAC;aACpC;SACF,CAAC;OACW,eAAe,CAAG;IAAD,sBAAC;CAAA;AAAH","file":"1.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { LoginPage } from './login';\n\n@NgModule({\n declarations: [\n LoginPage,\n ],\n imports: [\n IonicPageModule.forChild(LoginPage),\n ],\n})\nexport class LoginPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/login/login.module.ts"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["../../src/pages/edit-event/edit-event.module.ts","../../src/pages/edit-event/edit-event.ts"],"names":[],"mappings":"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","file":"1.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { EditEventPage } from './edit-event';\n\n@NgModule({\n declarations: [\n EditEventPage,\n ],\n imports: [\n IonicPageModule.forChild(EditEventPage),\n ],\n})\nexport class EditEventPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/edit-event/edit-event.module.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams, ViewController, AlertController } from 'ionic-angular';\nimport * as moment from 'moment';\n\n@IonicPage()\n@Component({\n selector: 'page-edit-event',\n templateUrl: 'edit-event.html',\n})\nexport class EditEventPage {\n\n event = { startTime: new Date().toISOString(), endTime: new Date().toISOString(), allDay: false };\n minDate = new Date().toISOString(); //ISO string format: YYYY-MM-DDTHH:mm:ss.sssZ\n\n title: string;\n description: string;\n organizer: string;\n startTime: string;\n endTime: string;\n myEvent: any;\n events: any[];\n\n constructor(public navCtrl: NavController, private navParams: NavParams, public viewCtrl: ViewController, private alertCtrl: AlertController) {\n this.minDate = moment(this.minDate).format();\n let preselectedDate = moment(this.navParams.get('selectedDay')).format();\n this.event.startTime = preselectedDate;\n this.event.endTime = preselectedDate;\n\n this.myEvent = navParams.get('event');\n this.events = navParams.get('events');\n this.title = this.myEvent.title;\n this.description = this.myEvent.description;\n this.organizer = this.myEvent.organizer;\n this.startTime = moment(this.myEvent.startTime.toISOString()).format();\n this.endTime = moment(this.myEvent.endTime.toISOString()).format();\n //console.log(this.startTime);\n //console.log(this.endTime);\n\n }\n\n cancel() {\n this.viewCtrl.dismiss();\n }\n\n save() {\n this.myEvent.title = this.title;\n this.myEvent.description = this.description;\n this.myEvent.organizer = this.organizer;\n this.myEvent.startTime = new Date(this.startTime);\n this.myEvent.endTime = new Date(this.endTime);\n\n this.viewCtrl.dismiss(); //don't pass back the event, so it won't be deleted\n }\n\n delete() {\n let alert = this.alertCtrl.create({\n title: 'Confirm Delete',\n message: 'Are you sure you want to delete the event?',\n buttons: [\n {\n text: 'No',\n role: 'cancel'\n },\n {\n text: 'Yes',\n handler: data => {\n /*let index = this.events.indexOf(event, 0);\n if (index > -1) {\n this.events.splice(index, 1);\n }*/\n this.events = this.events.filter(e => e !== event);\n\n this.viewCtrl.dismiss(this.event); //pass back the event to be deleteds\n }\n }\n ]\n\n });\n alert.present();\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/edit-event/edit-event.ts"],"sourceRoot":""}
\ No newline at end of file
diff --git a/.sourcemaps/2.js.map b/.sourcemaps/2.js.map
index 33c9e20c..4058bdd1 100644
--- a/.sourcemaps/2.js.map
+++ b/.sourcemaps/2.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/pages/login/create-user/create-user.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAyC;AACO;AACD;AAU/C;IAAA;IAAmC,CAAC;IAAvB,oBAAoB;QARhC,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,oEAAc;aACf;YACD,OAAO,EAAE;gBACP,sEAAe,CAAC,QAAQ,CAAC,oEAAc,CAAC;aACzC;SACF,CAAC;OACW,oBAAoB,CAAG;IAAD,2BAAC;CAAA;AAAH","file":"2.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { CreateUserPage } from './create-user';\n\n@NgModule({\n declarations: [\n CreateUserPage,\n ],\n imports: [\n IonicPageModule.forChild(CreateUserPage),\n ],\n})\nexport class CreateUserPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/login/create-user/create-user.module.ts"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["../../src/pages/update-management/update-management.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAyC;AACO;AACW;AAU3D;IAAA;IAAyC,CAAC;IAA7B,0BAA0B;QARtC,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,gFAAoB;aACrB;YACD,OAAO,EAAE;gBACP,sEAAe,CAAC,QAAQ,CAAC,gFAAoB,CAAC;aAC/C;SACF,CAAC;OACW,0BAA0B,CAAG;IAAD,iCAAC;CAAA;AAAH","file":"2.js","sourcesContent":["import { NgModule } from '@angular/core';\nimport { IonicPageModule } from 'ionic-angular';\nimport { UpdateManagementPage } from './update-management';\n\n@NgModule({\n declarations: [\n UpdateManagementPage,\n ],\n imports: [\n IonicPageModule.forChild(UpdateManagementPage),\n ],\n})\nexport class UpdateManagementPageModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/update-management/update-management.module.ts"],"sourceRoot":""}
\ No newline at end of file
diff --git a/.sourcemaps/main.js.map b/.sourcemaps/main.js.map
deleted file mode 100644
index b2cdfe14..00000000
--- a/.sourcemaps/main.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/pages/tables/tables.ts","../../src/pages/create-employee/create-employee.ts","../../src/pages/edit-employee/edit-employee.ts","../../src/pages/login/create-user/create-user.ts","../../src/pages/login/login.ts","../../src/pages/tables/add-party/add-party.ts","../../node_modules/@angular/core/esm5 lazy","../../src lazy","../../src/pages/tabs/tabs.ts","../../src/pages/timepunch/timepunch.ts","../../src/pages/punchcard/punchcard.ts","../../src/pages/calendar/calendar.ts","../../src/pages/management/management.ts","../../src/app/main.ts","../../src/app/app.module.ts","../../src/app/app.component.ts","../../src/pages/employees/employees.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAA0C;AACgC;AACH;AAClB;AAMrD;IAQC,oBAAmB,OAAsB,EAC5B,SAA0B,EAC1B,SAA0B,EAC1B,eAAsC;QAHhC,YAAO,GAAP,OAAO,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAiB;QAC1B,cAAS,GAAT,SAAS,CAAiB;QAC1B,oBAAe,GAAf,eAAe,CAAuB;QAElD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,IAAI,CAAC,MAAM,GAAG,CAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,CAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC;YAC5D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC;YACrD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;YACxD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;YACxD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;QAElE,uCAAuC;IACxC,CAAC;IAED,8EAA8E;IAC9E,oCAAoC;IACpC,8EAA8E;IAC9E,wCAAmB,GAAnB,UAAoB,KAAY;QAAhC,iBAwCC;QAtCA,IAAI,UAAkB,CAAC;QAEvB,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAChB,UAAU,GAAG,YAAY,CAAC;QAC3B,CAAC;QAAC,IAAI,CAAC,CAAC;YACP,UAAU,GAAG,YAAY,CAAC;QAC3B,CAAC;QAED,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE;wBACR,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;4BAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;4BACtD,KAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBACpC,CAAC;wBAAC,IAAI,CAAC,CAAC;4BACP,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;4BACtD,KAAK,CAAC,SAAS,EAAE,CAAC;wBACnB,CAAC;oBACF,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;wBACnD,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,cAAQ,CAAC;iBAClB;aACD;SACD,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,8EAA8E;IAC9E,oCAAoC;IACpC,8EAA8E;IAC9E,wCAAmB,GAAnB,UAAoB,KAAY;QAAhC,iBA4CC;QA1CA,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;wBACvD,qCAAqC;wBACrC,KAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;oBACtC,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;wBACnD,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;wBACnD,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0EAAY,EAAE,EAAC,SAAS,EAAG,IAAI;4BAChC,MAAM,EAAE,IAAI;4BACZ,YAAY,EAAE,KAAK,EAAC,CAAC,CAAC;oBACxC,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC;wBACrD,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,cAAQ,CAAC;iBAClB;aACD;SACD,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,8EAA8E;IAC9E,kCAAkC;IAClC,8EAA8E;IAC9E,qCAAgB,GAAhB,UAAiB,CAAQ;QACxB,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,kCAAkC;IAClC,8EAA8E;IAC9E,qCAAgB,GAAhB,UAAiB,CAAQ;QACxB,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,wCAAwC;IACxC,8EAA8E;IAC9E,2CAAsB,GAAtB,UAAuB,CAAQ;QAC9B,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAC9E,iCAAY,GAAZ,UAAa,KAAY;QAAzB,iBAgEC;QA9DA,EAAE;QACF,wBAAwB;QACxB,0BAA0B;QAC1B,EAAE;QACF,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChB,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC9C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;oBACpD,IAAI,SAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;wBACnC,KAAK,EAAE,iBAAiB;wBACxB,OAAO,EAAE,kGAAkG;wBAC3G,qBAAqB,EAAE,KAAK;wBAC5B,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,cAAQ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC;6BACjE;4BACD;gCACC,IAAI,EAAE,MAAM;gCACZ,OAAO,EAAE;oCACR,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;oCAC7C,qCAAqC;oCACrC,KAAK,CAAC,IAAI,CAAC,KAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oCAC7D,KAAI,CAAC,WAAW,CAAC,KAAI,CAAC,aAAa,CAAC,CAAC;oCACrC,KAAI,CAAC,0BAA0B,EAAE,CAAC;gCACnC,CAAC;6BACD;yBACD;qBACD,CAAC,CAAC;oBACH,SAAO,CAAC,OAAO,EAAE,CAAC;gBAEnB,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACP,qCAAqC;oBACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC7D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACrC,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBACnC,CAAC;gBAEF,oBAAoB;YACpB,CAAC;YAAC,IAAI,CAAC,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,IAAI,OAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oBACjC,KAAK,EAAE,kCAAkC;oBACzC,qBAAqB,EAAE,KAAK;oBAC5B,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,cAAQ,CAAC;yBAClB;qBACD;iBACD,CAAC,CAAC;gBACH,OAAK,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YAEF,EAAE;YACF,qCAAqC;YACrC,0BAA0B;YAC1B,EAAE;QACF,CAAC;QAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;IAED,8EAA8E;IAC9E,mCAAmC;IACnC,8EAA8E;IAC9E,sCAAiB,GAAjB;QACC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,uBAAuB;IACxB,CAAC;IAED,8EAA8E;IAC9E,iCAAiC;IACjC,8EAA8E;IAC9E,oCAAe,GAAf;QACC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0EAAY,EAAE,EAAC,SAAS,EAAG,IAAI,CAAC,OAAO;YACxC,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,IAAI,EAAC,CAAC,CAAC;IACvC,CAAC;IAED,6CAAwB,GAAxB,UAAyB,CAAQ;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,+CAA0B,GAA1B;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,gCAAW,GAAX,UAAY,KAAY;QACvB,8CAA8C;QAC9C,IAAI,CAAC,CAAC;QACN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC;QACF,CAAC;IACF,CAAC;IAED,qCAAgB,GAAhB;QACC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC;IACvC,CAAC;IAjQW,UAAU;QAJtB,wEAAS,CAAC;YACV,QAAQ,EAAE,aAAa;WACG;SAC1B,CAAC;mFASwC;YACjB,sEAAe;YACf,4EAAe;YACT,OAAqB;OAXvC,UAAU,CAmQtB;IAAD,CAAC;AAAA;SAnQY,UAAU;AAqQvB,YAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,sBAAgF;AAChF,sBAAsB;AACtB,8BAAgF;AAoBhF;IAIC,mBAAmB,OAAsB,CAAmB;QAAzC,YAAO,GAAP,OAAO,CAAe;QACxC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACe;IAC7C,CAAC;IAED;MACoB;IACpB,CAAC;IAED,4BAAQ,GAAR;MAC0C;IAC1C,CAAC;IAfW,4EAAS;QAnBrB,SAAS,CAAC;YACV,QAAQ,EAAE,aAAa;WAgBtB;SACD,CAAC;kBAK2D;OAJhD,SAAS,CAgBrB;IAAD,CAAC;AAAA;SAhBY,SAAS;AAkBtB,sBAAgF;AAChF,sBAAsB;AACtB,8BAAgF;AAiBhF;IAIC,mBAAmB,OAAsB,CAAmB;QAAzC,YAAO,GAAP,OAAO,CAAe;QACxC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACe;IAC7C,CAAC;IAED;MACoB;IACpB,CAAC;IAXW,4EAAS;QAhBrB,SAAS,CAAC;YACV,QAAQ,EAAE,aAAa;WAatB;SACD,CAAC;kBAK2D;OAJhD,SAAS,CAYrB;IAAD,CAAC;AAAA;SAZY,SAAS;AActB,sBAAgF;AAChF,sBAAsB;AACtB,8BAAgF;AAoChF;IAKC,mBAAmB,OAAsB,CAElB;QAFJ,YAAO,GAAP,OAAO,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAiB;QAEtC,IAAI,CAAC,KAAK,GAAG,MAAoB;QACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KACgB;IACpC,CAAC;IAED,+BAAW,GAAX,UAAY,CAAS;MACqB;IAC1C,CAAC;IAED,gCAAY,GAAZ;MACkD;IAClD,CAAC;IAED;MACoB;IACpB,CAAC;IAED;QAAA,iBA4BC;QA3BA,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1C,IAAI,SAAO,GAAG,IAAI,CAAC,QAAiB;gBACnC,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,oBAAmG;gBAC5G,UAA4B;gBAC5B,KAAS;oBACR;wBACC,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE;yBACW;sBACnB;qBACD;oBACD;wBACC,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACR,qCAAqC;4BACrC,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAsB;yBACnB;qBACnB;iBACD;eACD;aACD,CAAC,CAAC;SACe;QACnB,CAAC;QAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAsB;SACnB;MACnB;IACF,CAAC;IAED;MACoB;IACpB,CAAC;IAzDW,4EAAS;QAnCrB,SAAS,CAAC;YACV,QAAQ,EAAE,aAAa;WAgCtB;SACD,CAAC;mFAMwC;YACjB,kEAAe;YACzB,MAAS;OAPX,SAAS,CA0DrB;IAAD,CAAC;AAAA;SA1DY,SAAS;AA4DtB,UAAgF;AAChF,UAAU;AACV,0BAAgF;AAEhF;IAWC,eAAY,UAAkB;QAC7B,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,KAAU;QAC1B,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,CAAW;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;KACG;IACxB,CAAC;IAED;QACC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACD;QACf,CAAC;QAAC,IAAI,CAAC,CAAC;SACW;MAClB;IACF,CAAC;IAED;QACC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACiB;QACjC,CAAC;QAAC,IAAI,CAAC,CAAC;SACqC;MAC5C;IACF,CAAC;IAED,yBAAS,GAAT;QACC,OAAO,CAAC,GAAG,CAAC,KAA+B;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;MACG;IACxB,CAAC;IAED,oBAAI,GAAJ,UAAK,IAAY,EAAE,IAAY;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAkD;QAC9D,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,KAAU;QACxB,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;SACI;QACvB,CAAC;QAAC,IAAI,CAAC,CAAC;SACgB;MACvB;IACF,CAAC;IArDM,aAAsB;IAsD9B,CAAC;AAAA;SAxDY,KAAK;AA0DlB;IAWC,eAAY,IAAY,EAAE,IAAY,EAAE,GACG;QAC1C,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,KAAU;QAC1B,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAqC;QACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACQ;IAChC,CAAC;IAED,uBAAO,GAAP;QACC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;SACD;QACtB,CAAC;QAAC,IAAI,CAAC,CAAC;SACQ;MACf;IACF,CAAC;IAED,uBAAO,GAAP;MAC0D;IAC1D,CAAC;IAhCM,aAAsB;IAiC9B,CAAC;AAAA;SAnCiB;AAqClB,IAAK,IAIJ;AAJD,WAAK,IAAI;IACR,qCAAW;IACX,+CAAgB;IAChB,oBAAiB;AAClB,CAAC,EAJI,IAAI,KAAJ,IAAI,QAIR,U;;;;;;;;;;;;;;;;;;;;;ACpiByC;AACgC;AACT;AAEjE;;;;;GAKG;AAOH;IAWE,4BAAmB,OAAsB,EAAS,SAAoB,EAAS,SAA0B;QAAtF,YAAO,GAAP,OAAO,CAAe;QAAS,cAAS,GAAT,SAAS,CAAW;QAAS,cAAS,GAAT,SAAS,CAAiB;QACvG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAC,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAC,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAC,EAAE,CAAC;QACX,IAAI,CAAC,KAAK,GAAC,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,GAAC,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,GAAC,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,GAAC,EAAE,CAAC;IAEhB,CAAC;IAED,0CAAa,GAAb;QAAA,iBAoBC;QAnBC,IAAI,aAAa,GAAG,IAAI,2EAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,sEAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAElD,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAChC,KAAK,EAAE,+BAA+B;YACtC,qBAAqB,EAAE,KAAK;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE;wBACP,KAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACrB,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,EAAE,CAAC;IAGlB,CAAC;IAED,wCAAW,GAAX;QAAA,iBAqBC;QApBC,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,uGAAuG;YAChH,qBAAqB,EAAE,KAAK;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wBACP,YAAY;oBACd,CAAC;iBACF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,KAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACrB,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAED,2CAAc,GAAd;QACE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAtEU,kBAAkB;QAJ9B,wEAAS,CAAC;YACT,QAAQ,EAAE,sBAAsB;WACG;SACpC,CAAC;2BAYyG;OAX9F,kBAAkB,CAwE9B;IAAD,CAAC;AAAA;SAxEY,kBAAkB,gB;;;;;;;;;;;;;;;;;;;;;AChBW;AACgC;AACT;AAEjE;;;;;GAKG;AAOH;IAcE,0BAAmB,OAAsB,EAAS,SAAoB,EAAS,SAA0B;QAAtF,YAAO,GAAP,OAAO,CAAe;QAAS,cAAS,GAAT,SAAS,CAAW;QAAS,cAAS,GAAT,SAAS,CAAiB;QACvG,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;IAI/C,CAAC;IAED,wCAAa,GAAb;QAAA,iBAqBC;QApBC,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,wCAAwC;YAC/C,OAAO,EAAE,wCAAwC;YACjD,qBAAqB,EAAE,KAAK;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wBACP,YAAY;oBACd,CAAC;iBACF;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE;wBACP,KAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC7B,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IACD,8CAAmB,GAAnB;QAAA,iBAwBC;QAvBC,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,iFAAiF;YACxF,OAAO,EAAE,wCAAwC;YACjD,qBAAqB,EAAE,KAAK;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wBACP,YAAY;oBACd,CAAC;iBACF;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE;wBACP,6CAA6C;wBAC7C,KAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAI,CAAC,gBAAgB,CAAC,EAAC,CAAC,CAAC,CAAC;wBACvE,KAAI,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC;wBAC5C,KAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACrB,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAED,sCAAW,GAAX;QAAA,iBAqBC;QApBC,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,4DAA4D;YACrE,qBAAqB,EAAE,KAAK;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wBACP,YAAY;oBACd,CAAC;iBACF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,KAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACrB,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAED,wCAAa,GAAb;QACE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,aAAa,GAAG,IAAI,2EAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,yCAAc,GAAd;QACE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IApHU,gBAAgB;QAJ5B,wEAAS,CAAC;YACT,QAAQ,EAAE,oBAAoB;WACG;SAClC,CAAC;yBAeyG;OAd9F,gBAAgB,CAsH5B;IAAD,CAAC;AAAA;SAtHY,gBAAgB,gB;;;;;;;;;;;;;;;;;;;;AChBa;AACe;AAEzD;;;;;GAKG;AAOH;IAEE,wBAAmB,OAAsB,EAAS,SAAoB;QAAnD,YAAO,GAAP,OAAO,CAAe;QAAS,cAAS,GAAT,SAAS,CAAW;IACtE,CAAC;IAED,uCAAc,GAAd;QACE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,kCAAS,GAAT;QACC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,6CAAoB,GAApB;IAEA,CAAC;IAfU,cAAc;QAJ1B,wEAAS,CAAC;YACT,QAAQ,EAAE,kBAAkB;WACG;SAChC,CAAC;uBAGsE;OAF3D,cAAc,CAiB1B;IAAD,CAAC;AAAA;SAjBY,cAAc,gB;;;;;;;;;;;;;;;;;;;;;;ACfe;AACe;AACjB;AACmB;AAE3D;;;;;GAKG;AAOH;IAKE,mBAAmB,OAAsB,EAAS,SAAoB;QAAnD,YAAO,GAAP,OAAO,CAAe;QAAS,cAAS,GAAT,SAAS,CAAW;IAAI,CAAC;IAE3E,kCAAc,GAAd;QACE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,gCAAY,GAAZ;QACE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvC,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4DAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;IAEH,CAAC;IAED,gCAAY,GAAZ,UAAa,KAAa,EAAE,QAAgB;QAC1C,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IAED,kCAAc,GAAd;QACC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gFAAc,CAAC,CAAC;IACnC,CAAC;IA9BU,SAAS;QAJrB,wEAAS,CAAC;YACT,QAAQ,EAAE,YAAY;WACG;SAC1B,CAAC;kBAMsE;OAL3D,SAAS,CA+BrB;IAAD,CAAC;AAAA;SA/BY,SAAS,e;;;;;;;;;;;;;;;;;;;;;;ACjBoB;AACc;AACQ;AAAA,CAAC;AAC/B;AAOlC;IAmBE,sBAAmB,OAAsB,EACtB,SAA0B,EAC1B,QAAwB,EACxB,SAAoB;QAHpB,YAAO,GAAP,OAAO,CAAe;QACtB,cAAS,GAAT,SAAS,CAAiB;QAC1B,aAAQ,GAAR,QAAQ,CAAgB;QACxB,cAAS,GAAT,SAAS,CAAW;QAErC,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;QAEtC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAC1C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;YAC7B,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;YAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IAEH,CAAC;IAED,6BAAM,GAAN;QACE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,oCAAa,GAAb,UAAc,KAAa;QAA3B,iBAeC;QAdC,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,YAAY,CAAC,cAAI;YACrB,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;gBACjB,EAAE,CAAC,CAAC,KAAK,IAAI,KAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC7B,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;oBACjB,KAAI,CAAC,cAAc,GAAG,MAAM,CAAC,KAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,KAAI,CAAC,aAAa,CAAC,CAAC,CAAC;oBACvC,KAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5B,KAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,KAAI,CAAC,OAAO,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QAEH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,gCAAS,GAAT;QACE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YACnB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YACnB,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;YACtB,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,6BAAM,GAAN;QACE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,+BAAQ,GAAR;QACE,IAAI,SAAiB,CAAC;QAEtB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACrB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACnB,IAAI,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,GAAW,CAAC;YAChB,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnB,GAAG,GAAG,IAAI,CAAC;YACb,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,GAAG,GAAG,IAAI,CAAC;YACb,CAAC;YACD,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,SAAS,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnB,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;YAC7B,CAAC;YACD,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvF,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACrB,IAAI,KAAK,GAAG,IAAI,sDAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EACjC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,sCAAe,GAAf;QACE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC9B,CAAC;IArIU,YAAY;QAJxB,wEAAS,CAAC;YACT,QAAQ,EAAE,gBAAgB;WACG;SAC9B,CAAC;mFAoByC;YACX,sEAAe;YAChB,kEAAc;YACb,SAAS;OAtB5B,YAAY,CAsIxB;IAAD,CAAC;AAAA;SAtIY,YAAY;AAwIzB,mBAAgF;AAChF,mBAAmB;AACnB,2BAAgF;AAoChF;IAKE,gBAAmB,OAAsB,EACtB,EACU;QAFV,YAAO,GAAP,OAAO,CAAe;QACtB,aAAQ,GAAR,QAAQ,CAAgB;QAEzC,IAAI,CAAC,KAAK,GAAG,MAAoB;KACd;IACrB,CAAC;IAED,4BAAW,GAAX,UAAY,CAAS;MACsB;IAC3C,CAAC;IAED,6BAAY,GAAZ;MACmD;IACnD,CAAC;IAED;MACqB;IACrB,CAAC;IAED,mBAAE,GAAF;QACE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,sCAA2C;SACL;QACxC,CAAC;QAAC,IAAI,CAAC,CAAC;SACsB;MAC7B;IACH,CAAC;IAED;MACqB;IACrB,CAAC;IAnCU,4EAAM;QAnClB,SAAS,CAAC;YACT,QAAQ,EAAE,gBAAgB;WAgCzB;SACF,CAAC;kFAMyC;YACZ,kEAAc;YACvB,GAAS;OAPlB,MAAM,CAoClB;IAAD,CAAC;AAAA;SApCY,MAAM,sB;;;;;;;ACxLnB;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,4CAA4C,WAAW;AACvD;AACA;AACA,kC;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,qC;;;;;;;;;;;;;;;;;;;;;;;;;AClC0C;AAEI;AACS;AACA;AACA;AACH;AACM;AAK1D;IASE;QAPA,aAAQ,GAAG,kEAAU,CAAC;QACtB,aAAQ,GAAG,2EAAa,CAAC;QACzB,aAAQ,GAAG,2EAAa,CAAC;QACzB,aAAQ,GAAG,2EAAa,CAAC;QACzB,aAAQ,GAAG,wEAAY,CAAC;QACxB,aAAQ,GAAG,8EAAc,CAAC;IAI1B,CAAC;IAXU,QAAQ;QAHpB,wEAAS,CAAC;WACe;SACzB,CAAC;;OACW,QAAQ,CAYpB;IAAD,CAAC;AAAA;SAZY,QAAQ,e;;;;;;;;;;;;;;;;;;;;;;ACZqB;AACqB;AAC7B;AAMlC;IAOC,uBAAmB,OAAsB,EAAU,SAA0B;QAA7E,iBAKC;QALkB,YAAO,GAAP,OAAO,CAAe;QAAU,cAAS,GAAT,SAAS,CAAiB;QALrE,iBAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAGlC,OAAE,GAAU,CAAC,CAAC;QAIb,IAAI,MAAM,GAAG,gDAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;QAChE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAC,CAAC,IAAK,YAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,EAA9B,CAA8B,CAAC,CAAC;IAE7E,CAAC;IAED,gDAAwB,GAAxB;QAAA,iBAqBC;QApBA,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;wBACR,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC/B,CAAC;iBACD;gBACD;oBACC,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE;wBACR,KAAI,CAAC,KAAK,CAAC,KAAI,CAAC,EAAE,CAAC;oBACpB,CAAC;iBACD;aACD;SACD,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,mCAAW,GAAX,UAAY,CAAS;QACpB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,oCAAY,GAAZ;QACC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAAA,CAAC;IACrC,CAAC;IAED,mCAAW,GAAX;QACC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACb,CAAC;IAED,6BAAK,GAAL,UAAM,EAAU;QACf,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,GAAQ,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACb,CAAC;IACF,CAAC;IAED,+BAAO,GAAP,UAAQ,EAAU;QACjB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACf,CAAC;IA3DW,aAAa;QAJzB,wEAAS,CAAC;YACV,QAAQ,EAAE,gBAAgB;WACG;SAC7B,CAAC;sBAQ4E;OAPjE,aAAa,CA4DzB;IAAD,CAAC;AAAA;SA5DY,aAAa,e;;;;;;;;;;;;;;;;;;;;;ACRgB;AACc;AAMxD;IAIE,uBAAmB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACvC,IAAI,CAAC,kBAAkB,GAAG;YACxB,IAAI,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,CAAC;YACnF,IAAI,aAAa,CAAC,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,CAAC;YAC/E,IAAI,aAAa,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,CAAC;YACtF,IAAI,aAAa,CAAC,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,CAAC;YAC/E,IAAI,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,CAAC;YACnF,IAAI,aAAa,CAAC,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,CAAC;YAC/E,IAAI,aAAa,CAAC,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,KAAK,CAAC;YAChF,IAAI,aAAa,CAAC,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,CAAC;SAC9E;IACH,CAAC;IAfU,aAAa;QAJzB,wEAAS,CAAC;YACT,QAAQ,EAAE,gBAAgB;WACG;SAC9B,CAAC;sBAKyC;OAJ9B,aAAa,CAiBzB;IAAD,CAAC;AAAA;SAjBY,aAAa;AAmB1B;IAOE,qBAAgF;QAC9E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,MAAU;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;SACK;QAC7B,CAAC;QAAC,IAAI,CAAC,CAAC;SACc;KACrB;IAEH,CAAC;IACD;MACmB;IACnB,CAAC;IACD;MACwB;IACxB,CAAC;IACD;MACsB;IACtB,CAAC;IACD;MACwB;IACxB,CAAC;IACD;QACE,mBAA2B;MACR;IACrB,CAAC;IAEH,CAAC;AAAA;;;;;;;;;;;;;;;;;;;;;AC7DyC;AACI;AAM9C;IAEE,sBAAmB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAEzC,CAAC;IAED,oCAAa,GAAb;QACC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IARU,YAAY;QAJxB,wEAAS,CAAC;YACT,QAAQ,EAAE,eAAe;WACG;SAC7B,CAAC;qBAGyC;OAF9B,YAAY,CASxB;IAAD,CAAC;AAAA;SATY,YAAY,e;;;;;;;;;;;;;;;;;;;;ACPiB;AACI;AAM9C;IAKE,wBAAmB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACvC,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;IAED,sCAAa,GAAb;QACC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAbU,cAAc;QAJ1B,wEAAS,CAAC;YACT,QAAQ,EAAE,iBAAiB;WACG;SAC/B,CAAC;uBAMyC;OAL9B,cAAc,CAc1B;IAAD,CAAC;AAAA;SAdY,cAAc,e;;;;;;;;;;;ACPgD;AAElC;AAEzC,yGAAsB,EAAE,CAAC,eAAe,CAAC,8DAAS,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJG;AACG;AACe;AACjC;AAC6B;AAEpB;AACuB;AAE1B;AAEuC;AACV;AACI;AAClB;AACA;AACH;AACM;AACQ;AAEnB;AACM;AACmB;AAuE9E;IAAA;IAAwB,CAAC;IAAZ,SAAS;QArErB,uEAAQ,CAAC;YACR,YAAY,EAAE;gBACZ,6DAAK;gBACL,qEAAS;gBACT,4FAAc;gBAEd,wEAAU;gBACV,uEAAS;gBACT,uEAAS;gBACT,uEAAS;gBACT,uFAAY;gBACZ,iFAAM;gBAEN,kFAAa;gBAEb,kFAAa;gBACb,kFAAa;gBACb,+EAAY;gBACZ,qFAAc;gBAEd,kEAAQ;gBACR,6FAAgB;gBAChB,mGAAkB;gBAClB,qFAAgB;aACjB;YACD,OAAO,EAAE;gBACP,gFAAa;gBACb,kEAAW,CAAC,OAAO,CAAC,6DAAK,EAAE,EAAE,EACjC;oBACE,KAAK,EAAE;wBACL,EAAE,YAAY,EAAE,0EAA0E,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;wBACzL,EAAE,YAAY,EAAE,oEAAoE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;wBAC/K,EAAE,YAAY,EAAE,oEAAoE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;wBAC3K,EAAE,YAAY,EAAE,6CAA6C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;wBACzI,EAAE,YAAY,EAAE,+DAA+D,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;qBACnK;iBACF,CAAC;aACC;YACD,SAAS,EAAE,CAAC,+DAAQ,CAAC;YACrB,eAAe,EAAE;gBACf,6DAAK;gBACL,qEAAS;gBACT,4FAAc;gBAEd,wEAAU;gBACV,uEAAS;gBACT,uEAAS;gBACT,uEAAS;gBACT,uFAAY;gBACZ,iFAAM;gBAEN,kFAAa;gBACb,kFAAa;gBACb,kFAAa;gBACb,+EAAY;gBACZ,qFAAc;gBAEd,kEAAQ;gBACR,6FAAgB;gBAChB,mGAAkB;gBAClB,qFAAgB;aACjB;YACD,SAAS,EAAE;gBACT,4EAAS;gBACT,kFAAY;gBACZ,2FAAiB;gBACjB,EAAC,OAAO,EAAE,mEAAY,EAAE,QAAQ,EAAE,wEAAiB,EAAC;aACrD;SACF,CAAC;OACW,SAAS,CAAG;IAAD,gBAAC;CAAA;AAAH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7FoB;AACD;AACY;AACM;AAEV;AAKjD;IAGE,eAAY,QAAkB,EAAE,SAAoB,EAAE,YAA0B;QAAhF,iBAcC;QAhBD,aAAQ,GAAO,qEAAS,CAAC;QAGvB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;YACpB,gEAAgE;YAChE,iEAAiE;YACjE,SAAS,CAAC,YAAY,EAAE,CAAC;YAEzB,iBAAiB;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;;oBACpB,SAAS,CAAC,IAAI,EAAE,CAAC;oBACjB,SAAS,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;;;iBACjD,CAAC,CAAC;YAEH,YAAY,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAjBU,KAAK;QAHjB,wEAAS,CAAC;WACc;SACxB,CAAC;cAIgF;OAHrE,KAAK,CAkBjB;IAAD,CAAC;AAAA;SAlBY,KAAK,2B;;;;;;;;;;;;;;;;;;;;;;;;ACVwB;AACuD;AAE/B;AACM;AAOxE;IAgBE,uBAAmB,OAAsB,EAAS,OAA0B;QAAzD,YAAO,GAAP,OAAO,CAAe;QAAS,YAAO,GAAP,OAAO,CAAmB;QAf5E,gBAAW,GAAW,EAAE,CAAC;QAMzB,cAAS,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,uDAAuD,CAAC,CAAC;QAC7J,cAAS,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,+DAA+D,CAAC,CAAC;QACpK,cAAS,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,mHAAmH,CAAC,CAAC;QAClN,cAAS,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,sEAAsE,CAAC,CAAC;QAClK,cAAS,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,qHAAqH,CAAC,CAAC;QAMhN,IAAI,CAAC,QAAQ,GAAG,sFAAgB,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,4FAAkB,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAY,CAAC;QAGvC,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,0GAA0G,CAAC,CAAC;QAC5M,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,2HAA2H,CAAC;QAC7N,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,6BAA6B,CAAC;QACzH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpJ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,2CAAmB,GAAnB,UAAoB,OAAO;QACzB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAC,EAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAC,CAAC,CAAC;QAE9F,OAAO,CAAC,OAAO,CAAC;YACd,EAAE,EAAE,OAAO;SACZ,CAAC,CAAC;IACL,CAAC;IAED,+CAAuB,GAAvB;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,uCAAe,GAAf;QACE,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,CAAC,gBAAgB;SACtB,CAAC;IACJ,CAAC;IAED,gCAAQ,GAAR,UAAS,EAAO;QACd,uCAAuC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,wCAAwC;QACxC,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAE1B,wDAAwD;QACxD,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAC,IAAI;gBAClC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,oCAAY,GAAZ;QACE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChI,CAAC;IACD,sCAAc,GAAd;QACE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,sCAAc,GAAd,UAAe,OAAO,EAAE,QAAQ;QAC9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IACnC,CAAC;IACD;;OAEG;IACH,sCAAc,GAAd,UAAe,CAAW,EAAE,CAAW;QACrC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACxD,CAAC;IA5EU,aAAa;QALzB,wEAAS,CAAC;YACT,QAAQ,EAAE,gBAAgB;WACG;SAC9B,CAAC;sBAkB4E;OAhBjE,aAAa,CA8EzB;IAAD,CAAC;AAAA;SA9EY,KAAa;AA+E1B,cAAc;AAiBd;IASE,0BAAmB,GAA4G;QAA5G,aAAQ,GAAR,KAAwB;QAAS,WAAM,GAAN,MAAM,CAAmB;QAAS,YAAO,GAAP,OAAO,CAAK;QAAS,cAAS,GAAT,SAAS,CAAW;QAE7H,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAoB;QAC/D,IAAI,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,EAA6B;QACxD,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAgB;QACjD,IAAI,IAAI,GAAG,QAAuB;QAClC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SACO;QAC1B,CAAC;QACD,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SACO;QAC1B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,GAAG,GAA2B;QACtD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;KACI;IACpC,CAAC;IAGD;MAC0B;IAC1B,CAAC;IA9BU,8EAAgB;QAhB5B,SAAS,CAAC;WAcR;SACF,CAAC;yBAU+H;OATpH,gBAAgB,CA+B5B;IAAD,CAAC;AAAA;SA/BY,gBAAgB;AAiC7B;IAWE,kBAAY,SAAiB,EAAE,EAAyF;QACtH,IAAI,CAAC,SAAS,GAAG,QAAU;QAC3B,IAAI,CAAC,QAAoB;QACzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,GAAS;QACzB,IAAI,CAAC,KAAK,GAAG,EAAM;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;KACI;IACrB,CAAC;IAED,0BAAO,GAAP;MAC0C;IAC1C,CAAC;IACD;;OAEG;IACH;MACwB;IACxB,CAAC;IACD,+BAA8B;MACD;IAC7B,CAAC;IACD;MACuB;IACvB,CAAC;IACD,6BAA4B;MACD;IAC3B,CAAC;IACD;MACuB;IACvB,CAAC;IACD,wBAAkB;MACI;IACtB,CAAC;IACD;MACiB;IACjB,CAAC;IACD,iBAAgB;MACD;IACf,CAAC;IACD;MACoB;IACpB,CAAC;IACD,uBAAsB;MACD;IACrB,CAAC;IACD;MACoB;IACpB,CAAC;IACD,uBAAsB;MACD;IACrB,CAAC;IACD;MACkB;IAClB,CAAC;IACD,mBAAkB;MACD;IACjB,CAAC;IACH,CAAC;AAAA","file":"main.js","sourcesContent":["import { Component } from '@angular/core';\nimport { NavController, NavParams, AlertController } from 'ionic-angular';\nimport { ActionSheetController, ModalController } from 'ionic-angular';\nimport { AddPartyPage } from './add-party/add-party';\n\n@Component({\n\tselector: 'page-tables',\n\ttemplateUrl: 'tables.html'\n})\nexport class TablesPage {\n\n\tmode: Mode;\n\tselectedParty: Party;\n\n\ttables: Table[];\n\tparties: Party[];\n\n\tconstructor(public navCtrl: NavController,\n\t\t\t\t\t\t\tpublic modalCtrl: ModalController,\n\t\t\t\t\t\t\tpublic alertCtrl: AlertController,\n\t\t\t\t\t\t\tpublic actionSheetCtrl: ActionSheetController) {\n\n\t\tthis.mode = Mode.Default;\n\t\tthis.selectedParty = null;\n\n\t\tthis.tables = [ new Table(4), new Table(4), new Table(6),\n\t\t\t\t\t\t\t\t\t\tnew Table(2), new Table(8), new Table(2),\n\t\t\t\t\t\t\t\t\t\tnew Table(2), new Table(4), new Table(6),\n\t\t\t\t\t\t\t\t\t\tnew Table(8), new Table(4), new Table(6)];\n\t\tthis.parties = [ new Party(\"Kass\", 7, \"4:20pm\", \"608 609 5186\", true),\n\t\t\t\t\t\t\t\t\t\t new Party(\"Casey\", 4, \"5:55pm\", \"608 608 6006\", true),\n\t\t\t\t\t\t\t\t\t\t new Party(\"Kameron\", 2, \"6:15pm\", \"506 506 5006\", false),\n\t\t\t\t\t\t\t\t\t\t new Party(\"Jimmie\", 3, \"8:01pm\", \"999 999 9999\", false),\n\t\t\t\t\t\t\t\t\t\t new Party(\"Suzy\", 1000, \"9:00pm\", \"012 345 6789\", false),\n\t\t\t\t\t\t\t\t\t\t new Party(\"Bryan\", 1, \"11:59pm\", \"666 666 6666\", false)];\n\n\t\t// TODO: get tables and parties from DB\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Action Sheet: presentTableActions\n\t//----------------------------------------------------------------------------\n\tpresentTableActions(table: Table) {\n\n\t\tvar seatOrFree: string;\n\n\t\tif (table.free) {\n\t\t\tseatOrFree = \"Seat Party\";\n\t\t} else {\n\t\t\tseatOrFree = \"Free Table\";\n\t\t}\n\n\t\tlet tableActions = this.actionSheetCtrl.create({\n\t\t\ttitle: 'Table Actions',\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\ttext: seatOrFree,\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tif (table.free) {\n\t\t\t\t\t\t\tconsole.log('Seat Party tapped on table ' + table.ID);\n\t\t\t\t\t\t\tthis.displaySeatTableNumpad(table);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log('Free Table tapped on table ' + table.ID);\n\t\t\t\t\t\t\ttable.freeTable();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Table Information',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Table ' + table.ID + ' info tappped');\n\t\t\t\t\t\tthis.displayTableInfo(table);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Cancel',\n\t\t\t\t\trole: 'cancel',\n\t\t\t\t\thandler: () => { }\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\ttableActions.present();\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Action Sheet: presentPartyActions\n\t//----------------------------------------------------------------------------\n\tpresentPartyActions(party: Party) {\n\n\t\tlet partyActions = this.actionSheetCtrl.create({\n\t\t\ttitle: 'Party Actions',\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\ttext: 'Seat Party',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Selected Party ' + party.ID + ' to seat');\n\t\t\t\t\t\t// Enable seating party to table mode\n\t\t\t\t\t\tthis.activateSeatingPartyMode(party);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Party Information',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Party ' + party.ID + ' info tappped');\n\t\t\t\t\t\tthis.displayPartyInfo(party);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Edit Party',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Party ' + party.ID + ' edit tappped');\n\t\t\t\t\t\tthis.navCtrl.push(AddPartyPage, {\"parties\" : null,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"edit\": true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"edit_party\": party});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Delete Party',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Party ' + party.ID + ' delete tappped');\n\t\t\t\t\t\tthis.deleteParty(party);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Cancel',\n\t\t\t\t\trole: 'cancel',\n\t\t\t\t\thandler: () => { }\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tpartyActions.present();\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Modal Trigger: displayTableInfo\n\t//----------------------------------------------------------------------------\n\tdisplayTableInfo(t: Table) {\n\t\tlet modal = this.modalCtrl.create(TableInfo, { table: t });\n\t\tmodal.present();\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Modal Trigger: displayPartyInfo\n\t//----------------------------------------------------------------------------\n\tdisplayPartyInfo(p: Party) {\n\t\tlet modal = this.modalCtrl.create(PartyInfo, { party: p });\n\t\tmodal.present();\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Modal Trigger: displaySeatTableNumpad\n\t//----------------------------------------------------------------------------\n\tdisplaySeatTableNumpad(t: Table) {\n\t\tlet modal = this.modalCtrl.create(NumToSeat, { table: t });\n\t\tmodal.present();\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Button Action: onTablePress\n\t//----------------------------------------------------------------------------\n\tonTablePress(table: Table) {\n\n\t\t//\n\t\t// In seating party mode\n\t\t// Seat the party at table\n\t\t//\n\t\tif (this.seatingPartyMode()) {\n\t\t\tconsole.log('Table tapped in seating party mode');\n\t\t\tif (table.free) {\n\t\t\t\tif (this.selectedParty.size > table.capacity) {\n\t\t\t\t\tconsole.log('Presented table overcapacity warning');\n\t\t\t\t\tlet confirm = this.alertCtrl.create({\n\t\t\t\t\t\ttitle: 'Table Too Small',\n\t\t\t\t\t\tmessage: 'This table is not large enough to seat that many people.Are you sure you want to seat them here?',\n\t\t\t\t\t\tenableBackdropDismiss: false,\n\t\t\t\t\t\tbuttons: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttext: 'Cancel',\n\t\t\t\t\t\t\t\thandler: () => { console.log('Cancelled seating overcapacity'); }\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttext: 'Seat',\n\t\t\t\t\t\t\t\thandler: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Selected to seat overcapacity');\n\t\t\t\t\t\t\t\t\t// Seat number of party size at table\n\t\t\t\t\t\t\t\t\ttable.seat(this.selectedParty.size, this.selectedParty.name);\n\t\t\t\t\t\t\t\t\tthis.deleteParty(this.selectedParty);\n\t\t\t\t\t\t\t\t\tthis.deactivateSeatingPartyMode();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t});\n\t\t\t\t\tconfirm.present();\n\n\t\t\t\t} else {\n\t\t\t\t\t// Seat number of party size at table\n\t\t\t\t\ttable.seat(this.selectedParty.size, this.selectedParty.name);\n\t\t\t\t\tthis.deleteParty(this.selectedParty);\n\t\t\t\t\tthis.deactivateSeatingPartyMode();\n\t\t\t\t}\n\n\t\t\t// Table is Occupied\n\t\t\t} else {\n\t\t\t\tconsole.log('Tried to seat at occupied table');\n\t\t\t\tlet alert = this.alertCtrl.create({\n\t\t\t\t\ttitle: 'This table is currently occupied',\n\t\t\t\t\tenableBackdropDismiss: false,\n\t\t\t\t\tbuttons: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttext: 'Dismiss',\n\t\t\t\t\t\t\thandler: () => { }\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t\talert.present();\n\t\t\t}\n\n\t\t//\n\t\t// Not in seating party at table mode\n\t\t// Show table action sheet\n\t\t//\n\t\t} else {\n\t\t\tthis.presentTableActions(table);\n\t\t}\n\t}\n\t\n\t//----------------------------------------------------------------------------\n\t// Button Action: onEditLayoutPress\n\t//----------------------------------------------------------------------------\n\tonEditLayoutPress() {\n\t\tconsole.log('Edit Layout Pressed');\n\t\t// Make layout editable\n\t}\n\n\t//----------------------------------------------------------------------------\n\t// Button Action: onAddPartyPress\n\t//----------------------------------------------------------------------------\n\tonAddPartyPress() {\n\t\tconsole.log('Add Party Pressed');\n\t\tthis.navCtrl.push(AddPartyPage, {\"parties\" : this.parties,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"edit\": false,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"edit_party\": null});\n\t}\n\n\tactivateSeatingPartyMode(p: Party) {\n\t\tthis.mode = Mode.SeatingParty;\n\t\tthis.selectedParty = p;\n\t}\n\n\tdeactivateSeatingPartyMode() {\n\t\tthis.mode = Mode.Default;\n\t\tthis.selectedParty = null;\n\t}\n\n\tdeleteParty(party: Party) {\n\t\t// Find corresponding party in list and remove\n\t\tvar i;\n\t\tfor (i = 0; i < this.parties.length; i++) {\n\t\t\tif (this.parties[i].ID == party.ID) {\n\t\t\t\tthis.parties.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tseatingPartyMode(): boolean {\n\t\treturn this.mode == Mode.SeatingParty;\n\t}\n\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Sub-Views\n////////////////////////////////////////////////////////////////////////////////\n\n//------------------------------------------------------------------------------\n// Sub-View: TableInfo\n//------------------------------------------------------------------------------\n@Component({\n\tselector: 'page-tables',\n\ttemplate: `\n\t\t
\n\t\t\t
\n\t\t\t\tTable {{t.ID}}\n\t\t\t\tCapacity: {{t.capacity}}\n\t\t\t\tStatus: {{t.getStatus()}}\n\t\t\t\tCurrent Party: {{t.partySize}}\n\t\t\t\tServer: {{t.server}}\n\t\t\t\tGuest: {{t.guestName}}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t
\n\t`\n})\nexport class TableInfo {\n\n\tt: Table\n\n\tconstructor(public navCtrl: NavController, params: NavParams) {\n\t\tthis.t = params.get('table');\n\t\tconsole.log('Passed Table ID: ', this.t.ID);\n\t}\n\n\tdismiss() {\n\t\tthis.navCtrl.pop();\n\t}\n\n\teditInfo() {\n\t\tconsole.log('Edit Table ID ', this.t.ID);\n\t}\n}\n\n//------------------------------------------------------------------------------\n// Sub-View: PartyInfo\n//------------------------------------------------------------------------------\n@Component({\n\tselector: 'page-tables',\n\ttemplate: `\n\t\t\n\t\t\t\n\t\t\t\t{{p.name}}'s {{p.getKind()}}\n\t\t\t\tSize: {{p.size}}\n\t\t\t\tArrival Time: {{p.time}}\n\t\t\t\tContact: {{p.contact}}\n\t\t\t\tID: {{p.ID}}\n\t\t\t\t\t\n\t\t\t\n\t\t
\n\t`\n})\nexport class PartyInfo {\n\n\tp: Party\n\n\tconstructor(public navCtrl: NavController, params: NavParams) {\n\t\tthis.p = params.get('party');\n\t\tconsole.log('Passed Party ID: ', this.p.ID);\n\t}\n\n\tdismiss() {\n\t\tthis.navCtrl.pop();\n\t}\n}\n\n//------------------------------------------------------------------------------\n// Sub-View: NumToSeat\n//------------------------------------------------------------------------------\n@Component({\n\tselector: 'page-tables',\n\ttemplate: `\n\t\t\n\t\t\t\t\n\t\t\t\t
{{numToSeat}}\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t
\n\t`\n})\nexport class NumToSeat {\n\n\ttable: Table;\n\tnumToSeat: number;\n\n\tconstructor(public navCtrl: NavController,\n\t\t\t\t\t\t\tpublic alertCtrl: AlertController,\n\t\t\t\t\t\t\tparams: NavParams) {\n\t\tthis.table = params.get('table');\n\t\tthis.numToSeat = 0;\n\t\tconsole.log('Pop-up: Num To Seat');\n\t}\n\n\tpressButton(n: number) {\n\t\tthis.numToSeat = this.numToSeat * 10 + n;\n\t}\n\n\tdeleteButton() {\n\t\tthis.numToSeat = Math.floor(this.numToSeat / 10);\n\t}\n\n\tclearButton() {\n\t\tthis.numToSeat = 0;\n\t}\n\n\tseat() {\n\t\tif (this.numToSeat > this.table.capacity) {\n\t\t\tlet confirm = this.alertCtrl.create({\n\t\t\t\ttitle: 'Table Too Small',\n\t\t\t\tmessage: 'This table is not large enough to seat that many people. Are you sure you want to seat them here?',\n\t\t\t\tenableBackdropDismiss: false,\n\t\t\t\tbuttons: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: 'Cancel',\n\t\t\t\t\t\thandler: () => {\n\t\t\t\t\t\t\tthis.clearButton();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: 'Seat',\n\t\t\t\t\t\thandler: () => {\n\t\t\t\t\t\t\t// Seat number of party size at table\n\t\t\t\t\t\t\tthis.table.seat(this.numToSeat, null);\n\t\t\t\t\t\t\tthis.navCtrl.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconfirm.present();\n\t\t} else {\n\t\t\tthis.table.seat(this.numToSeat, null);\n\t\t\tthis.navCtrl.pop();\n\t\t}\n\t}\n\n\tcancel() {\n\t\tthis.navCtrl.pop();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Classes\n////////////////////////////////////////////////////////////////////////////////\n\nexport class Table {\n\n\tstatic ID_runner: number = 1;\n\n\tID: number;\n\tcapacity: number;\n\tfree: boolean;\n\tpartySize: number;\n\tserver: string;\n\tguestName: string;\n\n\tconstructor(capacityIn: number) {\n\t\tthis.ID = Table.ID_runner;\n\t\tTable.ID_runner += 1;\n\t\tthis.capacity = capacityIn;\n\t\tthis.free = true;\n\t\tthis.partySize = 0;\n\t\tthis.server = \"N/A\";\n\t\tthis.guestName = \"N/A\";\n\t}\n\n\tgetStatus(): string {\n\t\tif (this.free) {\n\t\t\treturn \"Free\";\n\t\t} else {\n\t\t\treturn \"Occupied\";\n\t\t}\n\t}\n\n\tgetButtonText(): string {\n\t\tif (this.free) {\n\t\t\treturn this.capacity.toString();\n\t\t} else {\n\t\t\treturn this.partySize + '/' + this.capacity;\n\t\t}\n\t}\n\n\tfreeTable() {\n\t\tconsole.log('Table ' + this.ID + ' freed');\n\t\tthis.free = true;\n\t\tthis.partySize = 0;\n\t\tthis.server = \"N/A\";\n\t\tthis.guestName = \"N/A\";\n\t}\n\n\tseat(size: number, name: string) {\n\t\tconsole.log('Seated ' + size + ' people at Table ' + this.ID);\n\t\tthis.free = false;\n\t\tthis.partySize = size;\n\t\tthis.server = \"Manager\";\n\t\tif (name != null) {\n\t\t\tthis.guestName = name;\n\t\t} else {\n\t\t\tthis.guestName = \"N/A\";\n\t\t}\n\t}\n}\n\nexport class Party {\n\n\tstatic ID_runner: number = 0;\n\n\tID: number;\n\tname: string;\n\tsize: number;\n\ttime: string;\n\tcontact: string;\n\treservation: boolean;\n\n\tconstructor(name: string, size: number, time: string,\n\t\t\t\t\t\t\tcontact: string, reservation: boolean) {\n\t\tthis.ID = Party.ID_runner;\n\t\tParty.ID_runner += 1;\n\t\tconsole.log('created party ID: '+ this.ID);\n\t\tconsole.log('curr ID_runner: '+ Party.ID_runner);\n\t\tthis.name = name;\n\t\tthis.size = size;\n\t\tthis.time = time;\n\t\tthis.contact = contact;\n\t\tthis.reservation = reservation;\n\t}\n\n\tgetKind(): string {\n\t\tif (this.reservation) {\n\t\t\treturn \"Reservation\";\n\t\t} else {\n\t\t\treturn \"Party\";\n\t\t}\n\t}\n\n\tdisplay(): string {\n\t\treturn this.time + ' | ' + this.name + ' | ' + this.size;\n\t}\n}\n\nenum Mode {\n\tDefault = 0,\n\tSeatingParty = 1,\n\tEditingLayout = 2\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/tables/tables.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';\nimport { Employee, EmployeesPage } from '../employees/employees';\n\n/**\n * Generated class for the CreateEmployeePage page.\n *\n * See https://ionicframework.com/docs/components/#navigation for more info on\n * Ionic pages and navigation.\n */\n\n@IonicPage()\n@Component({\n selector: 'page-create-employee',\n templateUrl: 'create-employee.html',\n})\nexport class CreateEmployeePage {\n firstName: string;\n lastName: string;\n ID: string;\n phone: string;\n pay: string;\n src: string;\n title: string;\n\n employees: Array;\n\n constructor(public navCtrl: NavController, public navParams: NavParams, public alertCtrl: AlertController) {\n this.employees = navParams.get(\"employees\");\n this.firstName=\"\";\n this.lastName=\"\";\n this.ID=\"\";\n this.phone=\"\";\n this.pay=\"\";\n this.src=\"\";\n this.title=\"\";\n\n }\n\n createAndExit(){\n let employeesPage = new EmployeesPage(null, null);\n this.employees.push(new Employee(this.firstName, this.lastName, this.ID, this.title, this.pay, this.phone, this.src));\n this.employees.sort(employeesPage.sortByLastName);\n\n let alert = this.alertCtrl.create({\n title: 'Employee Successfully Created',\n enableBackdropDismiss: false,\n buttons: [\n {\n text: 'OK',\n handler: () => {\n this.navCtrl.pop();\n }\n }\n ]\n });\n alert.present();\n \n\n }\n\n confirmExit() {\n let confirm = this.alertCtrl.create({\n title: 'Exit without saving?',\n message: 'Are you sure you want to exit without saving your changes? This EMPLOYEE PROFILE WILL NOT BE CREATED.',\n enableBackdropDismiss: false,\n buttons: [\n {\n text: 'Cancel',\n handler: () => {\n //do nothing\n }\n },\n {\n text: 'Exit',\n handler: () => {\n this.navCtrl.pop();\n }\n }\n ]\n });\n confirm.present();\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad CreateEmployeePage');\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/create-employee/create-employee.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';\nimport { EmployeesPage, Employee } from '../employees/employees';\n\n/**\n * Generated class for the EditEmployeePage page.\n *\n * See https://ionicframework.com/docs/components/#navigation for more info on\n * Ionic pages and navigation.\n */\n\n@IonicPage()\n@Component({\n selector: 'page-edit-employee',\n templateUrl: 'edit-employee.html',\n})\nexport class EditEmployeePage {\n\n selectedEmployee: Employee;\n employees: Array;\n employeePage: any;\n newTitle: string;\n newID: string;\n newPay: string;\n newPhone: string;\n newFirstName: string;\n newLastName: string;\n newSrc: string;\n\n\n constructor(public navCtrl: NavController, public navParams: NavParams, public alertCtrl: AlertController) {\n this.employeePage = navParams.get('employeesPage');\n this.selectedEmployee = navParams.get('selectedEmployee');\n this.employees = navParams.get('employees');\n\n this.newTitle = this.selectedEmployee.getTitle();\n this.newID = this.selectedEmployee.getID();\n this.newPay = this.selectedEmployee.getPay();\n this.newFirstName = this.selectedEmployee.getFirstName();\n this.newLastName = this.selectedEmployee.getLastName();\n this.newPhone = this.selectedEmployee.getPhone();\n this.newSrc = this.selectedEmployee.getSrc();\n\n \n\n }\n\n confirmDelete() {\n let confirm = this.alertCtrl.create({\n title: 'Delete this employee profile and exit?',\n message: 'Warning: this action cannot be undone!',\n enableBackdropDismiss: false,\n buttons: [\n {\n text: 'Cancel',\n handler: () => {\n //do nothing\n }\n },\n {\n text: 'Delete and Exit',\n handler: () => {\n this.secondConfirmDelete();\n }\n }\n ]\n });\n confirm.present();\n }\n secondConfirmDelete() {\n let confirm = this.alertCtrl.create({\n title: 'Are you really sure you want to delete this employee profile and exit?',\n message: 'Warning: this action cannot be undone!',\n enableBackdropDismiss: false,\n buttons: [\n {\n text: 'Cancel',\n handler: () => {\n //do nothing\n }\n },\n {\n text: 'Delete and Exit',\n handler: () => {\n //TODO: delete profile from list of employees\n this.employees.splice(this.employees.indexOf(this.selectedEmployee),1);\n this.employeePage.refreshSelectedEmployee();\n this.navCtrl.pop();\n }\n }\n ]\n });\n confirm.present();\n }\n\n confirmExit() {\n let confirm = this.alertCtrl.create({\n title: 'Exit without saving?',\n message: 'Are you sure you want to exit without saving your changes?',\n enableBackdropDismiss: false,\n buttons: [\n {\n text: 'Cancel',\n handler: () => {\n //do nothing\n }\n },\n {\n text: 'Exit',\n handler: () => {\n this.navCtrl.pop();\n }\n }\n ]\n });\n confirm.present();\n }\n\n saveNewValues() {\n this.selectedEmployee.setID(this.newID);\n this.selectedEmployee.setFirstName(this.newFirstName);\n this.selectedEmployee.setLastName(this.newLastName);\n this.selectedEmployee.setTitle(this.newTitle);\n this.selectedEmployee.setPay(this.newPay);\n this.selectedEmployee.setPhone(this.newPhone);\n this.selectedEmployee.setSrc(this.newSrc);\n let employeesPage = new EmployeesPage(null, null);\n this.employees.sort(employeesPage.sortByLastName);\n this.navCtrl.pop();\n }\n ionViewDidLoad() {\n console.log('ionViewDidLoad EditEmployeePage');\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/edit-employee/edit-employee.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams } from 'ionic-angular';\n\n/**\n * Generated class for the CreateUserPage page.\n *\n * See https://ionicframework.com/docs/components/#navigation for more info on\n * Ionic pages and navigation.\n */\n\n@IonicPage()\n@Component({\n selector: 'page-create-user',\n templateUrl: 'create-user.html',\n})\nexport class CreateUserPage {\n \n constructor(public navCtrl: NavController, public navParams: NavParams) {\n }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad CreateUserPage');\n }\n\n goToLogin() {\n \tthis.navCtrl.pop();\n }\n\n goToSelectRestaurant() {\n \t\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/login/create-user/create-user.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams } from 'ionic-angular';\nimport { TabsPage } from '../tabs/tabs';\nimport { CreateUserPage } from './create-user/create-user';\n\n/**\n * Generated class for the LoginPage page.\n *\n * See https://ionicframework.com/docs/components/#navigation for more info on\n * Ionic pages and navigation.\n */\n\n@IonicPage()\n@Component({\n selector: 'page-login',\n templateUrl: 'login.html',\n})\nexport class LoginPage {\n\n email: string;\n password: string;\n\n constructor(public navCtrl: NavController, public navParams: NavParams) { }\n\n ionViewDidLoad() {\n console.log('ionViewDidLoad LoginPage');\n }\n\n executeLogin() {\n console.log(this.email, this.password);\n\n if (this.loginSuccess(this.email, this.password)) {\n console.log('Login Successful');\n this.navCtrl.push(TabsPage);\n } \n else {\n console.log('Login Unsuccessful');\n }\n\n }\n\n loginSuccess(email: string, password: string) {\n return true;\n }\n\n goToCreateUser() {\n \tthis.navCtrl.push(CreateUserPage);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/login/login.ts","import { Component } from '@angular/core';\nimport { IonicPage, NavController, NavParams } from 'ionic-angular'\nimport { ModalController, ViewController } from 'ionic-angular';;\nimport { Party } from '../tables';\n\n@IonicPage()\n@Component({\n selector: 'page-add-party',\n templateUrl: 'add-party.html',\n})\nexport class AddPartyPage {\n\n FIELD_SIZE: string;\n FIELD_CONTACT: string;\n buttonTextSize: string;\n buttonTextContact: string;\n\n editMode: boolean;\n\n ID: number;\n name: string;\n size: number;\n contact: string;\n time: string;\n reservation: boolean;\n\n party: Party;\n parties: Party[];\n\n constructor(public navCtrl: NavController,\n public modalCtrl: ModalController,\n public viewCtrl: ViewController,\n public navParams: NavParams) {\n\n this.FIELD_SIZE = \"Party Size\";\n this.FIELD_CONTACT = \"Contact Number\";\n \n this.editMode = navParams.get(\"edit\");\n console.log(\"EDIT PARTY MODE: \" + this.editMode);\n\n if (this.editMode) {\n this.party = navParams.get(\"edit_party\");\n this.buttonTextSize = String(this.party.size);\n this.buttonTextContact = String(this.party.contact);\n this.ID = this.party.ID;\n this.name = this.party.name;\n this.size = this.party.size;\n this.contact = this.party.contact;\n this.reservation = this.party.reservation;\n this.time = String(this.party.time);\n } else {\n this.parties = navParams.get(\"parties\");\n this.buttonTextSize = \"Size\";\n this.buttonTextContact = \"Contact Number\";\n this.ID = null;\n this.name = null;\n this.size = null;\n this.contact = null;\n this.reservation = false;\n this.time = null; \n }\n\n }\n\n submit() {\n if (this.editMode) {\n this.saveEditedParty();\n } else {\n this.addParty();\n }\n console.log(\"about to pop add party page\");\n this.navCtrl.pop();\n }\n\n presentNumpad(field: string) {\n let modal = this.modalCtrl.create(Numpad, {field: field});\n modal.onDidDismiss(data => {\n if (data != null) {\n if (field == this.FIELD_SIZE) {\n this.size = data;\n this.buttonTextSize = String(this.size);\n } else if (field == this.FIELD_CONTACT) {\n this.contact = String(data);\n this.buttonTextContact = String(this.contact);\n } \n }\n \n });\n modal.present();\n }\n\n validData() {\n return ((this.name != null) &&\n (this.size != null) &&\n (this.contact != null) &&\n (this.reservation != null));\n }\n\n cancel() {\n this.navCtrl.pop();\n }\n\n addParty() {\n var partyTime: string;\n\n if (this.reservation) {\n partyTime = this.time;\n } else {\n var d = new Date();\n var curr_hour = d.getHours();\n var curr_min = d.getMinutes();\n var a_p: string;\n if (curr_hour < 12) {\n a_p = \"AM\";\n } else {\n a_p = \"PM\";\n }\n if (curr_hour == 0) {\n curr_hour = 12;\n }\n if (curr_hour > 12) {\n curr_hour = curr_hour - 12;\n }\n partyTime = (curr_hour + \":\" + curr_min + \" \" + a_p);\n }\n\n console.log(this.name + \" \" + this.size + \" \" + this.contact + \" \" + this.reservation);\n \n if (this.validData()) {\n var party = new Party(this.name, this.size, partyTime,\n this.contact, this.reservation);\n this.parties.push(party);\n console.log(\"PUSHED PARTY\");\n }\n }\n\n saveEditedParty() {\n this.party.ID = this.ID;\n this.party.name = this.name;\n this.party.size = this.size;\n this.party.contact = this.contact;\n this.party.reservation = this.reservation;\n this.party.time = this.time;\n }\n}\n\n//------------------------------------------------------------------------------\n// Sub-View: NumPad\n//------------------------------------------------------------------------------\n@Component({\n selector: 'page-add-party',\n template: `\n \n \n
{{userInput}}\n
\n
\n \n | \n | \n | \n
\n \n | \n | \n | \n
\n \n | \n | \n | \n
\n \n | \n | \n | \n
\n
\n
\n
\n
\n
\n `\n})\nexport class Numpad {\n\n field: string;\n userInput: number;\n\n constructor(public navCtrl: NavController,\n public viewCtrl: ViewController,\n params: NavParams) {\n this.field = params.get('field');\n this.userInput = 0;\n }\n\n pressButton(n: number) {\n this.userInput = this.userInput * 10 + n;\n }\n\n deleteButton() {\n this.userInput = Math.floor(this.userInput / 10);\n }\n\n clearButton() {\n this.userInput = 0;\n }\n\n OK() {\n if (this.userInput > 0) {\n //let data = {'userInput': this.userInput};\n this.viewCtrl.dismiss(this.userInput);\n } else {\n this.viewCtrl.dismiss(null);\n }\n }\n\n cancel() {\n this.navCtrl.pop();\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/pages/tables/add-party/add-party.ts","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 167;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@angular/core/esm5 lazy\n// module id = 167\n// module chunks = 5","var map = {\n\t\"../pages/create-employee/create-employee.module\": [\n\t\t683,\n\t\t4\n\t],\n\t\"../pages/edit-employee/edit-employee.module\": [\n\t\t684,\n\t\t3\n\t],\n\t\"../pages/login/create-user/create-user.module\": [\n\t\t685,\n\t\t2\n\t],\n\t\"../pages/login/login.module\": [\n\t\t686,\n\t\t1\n\t],\n\t\"../pages/tables/add-party/add-party.module\": [\n\t\t687,\n\t\t0\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tvar ids = map[req];\n\tif(!ids)\n\t\treturn Promise.reject(new Error(\"Cannot find module '\" + req + \"'.\"));\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(ids[0]);\n\t});\n};\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 212;\nmodule.exports = webpackAsyncContext;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src lazy\n// module id = 212\n// module chunks = 5","import { Component } from '@angular/core';\n\nimport { TablesPage } from '../tables/tables';\nimport { EmployeesPage } from '../employees/employees';\nimport { TimePunchPage } from '../timepunch/timepunch';\nimport { PunchCardPage } from '../punchcard/punchcard';\nimport { CalendarPage } from '../calendar/calendar';\nimport { ManagementPage } from '../management/management';\n\n@Component({\n templateUrl: 'tabs.html'\n})\nexport class TabsPage {\n\n tab1Root = TablesPage;\n tab2Root = EmployeesPage;\n tab3Root = TimePunchPage;\n tab4Root = PunchCardPage;\n tab5Root = CalendarPage;\n tab6Root = ManagementPage;\n\n constructor() {\n\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/tabs/tabs.ts","import { Component } from '@angular/core';\nimport { NavController, AlertController } from 'ionic-angular';\nimport { Observable } from 'rxjs';\n\n@Component({\n\tselector: 'page-timepunch',\n\ttemplateUrl: 'timepunch.html',\n})\nexport class TimePunchPage {\n\n\tprivate currDateTime = new Date();\n\tprivate subscription;\n\n\tID:number = 0;\n\n\tconstructor(public navCtrl: NavController, private alertCtrl: AlertController) {\n\n\t\tvar source = Observable.interval(1000); // 1 second subscription\n\t\tthis.subscription = source.subscribe((x) => this.currDateTime = new Date());\n\t\t\n\t}\n\n\tpresentPunchConfirmation() {\n\t\tlet alert = this.alertCtrl.create({\n\t\t\ttitle: 'Confirm purchase',\n\t\t\tmessage: 'Do you want to buy this book?',\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\ttext: 'Cancel',\n\t\t\t\t\trole: 'cancel',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tconsole.log('Cancel clicked');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: 'Confirm',\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tthis.punch(this.ID)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\talert.present();\n\t}\n\n\tpressButton(n: number) {\n\t\tthis.ID = this.ID * 10 + n;\n\t}\n\n\tdeleteButton() {\n\t\tthis.ID = Math.floor(this.ID / 10);;\n\t}\n\n\tclearButton() {\n\t\tthis.ID = 0;\n\t}\n\n\tpunch(ID: number) {\n\t\tif (this.validID(ID)) {\n\t\t\tvar time: any = new Date();\n\t\t\tconsole.log('Punched time for Employee: ' + ID + ' at ' + time);\n\t\t\tthis.ID = 0;\n\t\t}\n\t}\n\n\tvalidID(ID: number) {\n\t\treturn ID > 0;\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/timepunch/timepunch.ts","import { Component } from '@angular/core';\nimport { NavController, DateTime } from 'ionic-angular';\n\n@Component({\n selector: 'page-punchcard',\n templateUrl: 'punchcard.html'\n})\nexport class PunchCardPage {\n\n employeeShiftsList: EmployeeShift[];\n\n constructor(public navCtrl: NavController) {\n this.employeeShiftsList = [\n new EmployeeShift(\"Kevin Anderson\", \"2018-02-12T07:24\", \"2018-02-12T19:24\", 12.000),\n new EmployeeShift(\"Bryan Suzan\", \"2018-02-12T07:25\", \"2018-02-12T09:47\", 2.367),\n new EmployeeShift(\"Marianne Beaumont\", \"2018-02-12T07:30\", \"2018-02-12T20:45\", 13.250),\n new EmployeeShift(\"Carl Robins\", \"2018-02-12T07:29\", \"2018-02-12T12:00\", 4.517),\n new EmployeeShift(\"Kevin Anderson\", \"2018-02-13T07:26\", \"2018-02-12T19:24\", 11.967),\n new EmployeeShift(\"Bryan Suzan\", \"2018-02-14T07:26\", \"2018-02-12T09:48\", 2.367),\n new EmployeeShift(\"Bryan Suzan\", \"2018-02-14T018:00\", \"2018-02-12T23:28\", 5.467),\n new EmployeeShift(\"TinaRusso\", \"2018-02-16T07:24\", \"2018-02-12T09:46\", 2.367)\n ]\n }\n\n}\n\nexport class EmployeeShift {\n name: string;\n startTime: string; //DateTime is just a string\n endTime: string;\n totalTime: number;\n\n\n constructor(name: string, startTime: string, endTime: string, totalTime?: number) {\n this.name = name;\n this.startTime = startTime;\n this.endTime = endTime;\n if (totalTime != null) {\n this.totalTime = totalTime;\n } else {\n this.setTotalTime();\n }\n\n }\n getName(): string {\n return this.name;\n }\n getStartTime(): string {\n return this.startTime;\n }\n getEndTime(): string {\n return this.endTime;\n }\n getTotalTime(): number {\n return this.totalTime;\n }\n setTotalTime() {\n //TODO: write this function\n this.totalTime = 0;\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/punchcard/punchcard.ts","import { Component } from '@angular/core';\nimport { NavController } from 'ionic-angular';\n\n@Component({\n selector: 'page-calendar',\n templateUrl: 'calendar.html'\n})\nexport class CalendarPage {\n\n constructor(public navCtrl: NavController) {\n\n }\n\n executeLogout() {\n \tthis.navCtrl.parent.parent.pop(this);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/calendar/calendar.ts","import { Component } from '@angular/core';\nimport { NavController } from 'ionic-angular';\n\n@Component({\n selector: 'page-management',\n templateUrl: 'management.html'\n})\nexport class ManagementPage {\n\n restaurantName: string;\n capacity: number;\n numEmployees: number;\n constructor(public navCtrl: NavController) {\n this.restaurantName = \"Osteria Francescana\";\n this.numEmployees = 23;\n this.capacity = 100;\n }\n\n executeLogout() {\n \tthis.navCtrl.parent.parent.pop(this);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/management/management.ts","import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/main.ts","import { NgModule, ErrorHandler } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';\nimport { MyApp } from './app.component';\nimport { ScreenOrientation } from '@ionic-native/screen-orientation';\n\nimport { LoginPage } from '../pages/login/login';\nimport { CreateUserPage } from '../pages/login/create-user/create-user';\n\nimport { TabsPage } from '../pages/tabs/tabs';\n\nimport { TablesPage, TableInfo, PartyInfo, NumToSeat } from '../pages/tables/tables';\nimport { AddPartyPage, Numpad } from '../pages/tables/add-party/add-party';\nimport { EmployeesPage, PunchPopoverPage } from '../pages/employees/employees';\nimport { TimePunchPage } from '../pages/timepunch/timepunch';\nimport { PunchCardPage } from '../pages/punchcard/punchcard';\nimport { CalendarPage } from '../pages/calendar/calendar';\nimport { ManagementPage } from '../pages/management/management';\nimport { EditEmployeePage } from '../pages/edit-employee/edit-employee';\n\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\nimport { CreateEmployeePage } from '../pages/create-employee/create-employee';\n\n@NgModule({\n declarations: [\n MyApp,\n LoginPage,\n CreateUserPage,\n\n TablesPage,\n TableInfo,\n PartyInfo,\n NumToSeat,\n AddPartyPage,\n Numpad,\n\n EmployeesPage,\n\n TimePunchPage,\n PunchCardPage,\n CalendarPage,\n ManagementPage,\n\n TabsPage,\n EditEmployeePage,\n CreateEmployeePage,\n PunchPopoverPage\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp)\n ],\n bootstrap: [IonicApp],\n entryComponents: [\n MyApp,\n LoginPage,\n CreateUserPage,\n\n TablesPage,\n TableInfo,\n PartyInfo,\n NumToSeat,\n AddPartyPage,\n Numpad,\n\n EmployeesPage,\n TimePunchPage,\n PunchCardPage,\n CalendarPage,\n ManagementPage,\n\n TabsPage,\n EditEmployeePage,\n CreateEmployeePage,\n PunchPopoverPage\n ],\n providers: [\n StatusBar,\n SplashScreen,\n ScreenOrientation,\n {provide: ErrorHandler, useClass: IonicErrorHandler}\n ]\n})\nexport class AppModule {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","import { Component } from '@angular/core';\nimport { Platform } from 'ionic-angular';\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\n\nimport { LoginPage } from '../pages/login/login';\n\n@Component({\n templateUrl: 'app.html'\n})\nexport class MyApp {\n rootPage:any = LoginPage;\n\n constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {\n platform.ready().then(() => {\n // Okay, so the platform is ready and our plugins are available.\n // Here you can do any higher level native things you might need.\n statusBar.styleDefault();\n\n // Hide Statusbar\n platform.ready().then(async () => {\n statusBar.hide();\n statusBar.backgroundColorByHexString('#ffffff');\n });\n \n splashScreen.hide();\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts","import { Component } from '@angular/core';\nimport { NavController, NavParams, PopoverController, ViewController, App } from 'ionic-angular';\nimport { List } from 'ionic-angular';\nimport { EditEmployeePage } from '../edit-employee/edit-employee';\nimport { CreateEmployeePage } from '../create-employee/create-employee';\n\n@Component({\n selector: 'page-employees',\n templateUrl: 'employees.html'\n})\n\nexport class EmployeesPage {\n searchQuery: string = '';\n items: Employee[];\n editPage: any;\n createEmployeePage: any;\n employees: Array;\n employee1: Employee;\n employee2 = new Employee(\"Carl\", \"Robins\", \"4321\", \"Assistant Manager\", \"$30/hr\", \"(608) 345-1209\", \"http://www.math.uni-frankfurt.de/~person/_4170854.jpg\");\n employee5 = new Employee(\"Marianne\", \"Beaumont\", \"9902\", \"Hostess\", \"$15/hr\", \"+33 8 92 70 12 39\", \"http://www.pearsonvue.com/pteprofessional/images/homepage.png\");\n employee6 = new Employee(\"Anna\", \"Schmidt\", \"4231\", \"Manager\", \"$50/hr\", \"+49 30 2273 2152\", \"https://i.pinimg.com/736x/25/48/31/25483183a26a96adcc2b5a4002eda6ca--headshot-ideas-professional-photographer.jpg\");\n employee7 = new Employee(\"Valerie\", \"Carter\", \"1\", \"Owner\", \"$1003/hr\", \"(202) 456-1111\", \"https://cdn10.phillymag.com/wp-content/uploads/2016/01/woman-biz.jpg\");\n employee8 = new Employee(\"Phil\", \"Scott\", \"8156\", \"Bartender\", \"$10/hr\", \"(608) 310-4545\", \"https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Robert_gold_bartender.jpg/220px-Robert_gold_bartender.jpg\");\n employee3: Employee;\n employee4: Employee;\n selectedEmployee: Employee;\n\n constructor(public navCtrl: NavController, public popCtrl: PopoverController) {\n this.editPage = EditEmployeePage;\n this.createEmployeePage = CreateEmployeePage;\n this.employees = new Array();\n\n\n this.employee1 = new Employee(\"Kevin\", \"Anderson\", \"1234\", \"Server\", \"$5/hr\", \"(608) 329-4565\", \"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxhJ8HaQ88jGA0Ws2WTCnI4DzSgMzvEXk4qdbQVbCAiKyP9yGl\");\n this.employee3 = new Employee(\"Tina\", \"Russo\", \"5678\", \"Head Chef\", \"$500/hr\", \"(414) 921-4980\", \"https://cdn2.goabroad.com/images/program_content/5-tips-for-teaching-english-abroad-as-a-person-of-color-2-1462426680.jpg\")\n this.employee4 = new Employee(\"Bryan\", \"Suzan\", \"666\", \"DJ\", \"$0.03/hr\", \"1-866-436-5706\", \"../../assets/imgs/bryan.jpg\")\n this.employees.push(this.employee1, this.employee2, this.employee3, this.employee4, this.employee5, this.employee6, this.employee7, this.employee8);\n this.employees.sort(this.sortByLastName);\n this.selectedEmployee = this.employees[0];\n }\n\n presentPunchPopover(anEvent) {\n let popover = this.popCtrl.create(PunchPopoverPage,{selectedEmployee: this.selectedEmployee});\n\n popover.present({\n ev: anEvent\n });\n }\n\n refreshSelectedEmployee() {\n this.selectedEmployee = this.employees[0];\n this.initializeItems();\n }\n initializeItems() {\n this.items = [\n this.selectedEmployee\n ];\n }\n\n getItems(ev: any) {\n // Reset items back to all of the items\n this.initializeItems();\n\n // set val to the value of the searchbar\n let val = ev.target.value;\n\n //if the value is an empty string don't filter the items\n if (val && val.trim() != '') {\n this.items = this.items.filter((item) => {\n return (item.getName().toLowerCase().indexOf(val.toLowerCase()) > -1);\n })\n }\n }\n openEditPage() {\n this.navCtrl.push(this.editPage, { selectedEmployee: this.selectedEmployee, employees: this.employees, employeesPage: this });\n }\n openCreatePage() {\n this.navCtrl.push(this.createEmployeePage, { employees: this.employees });\n }\n selectEmployee(myEvent, employee) {\n this.selectedEmployee = employee;\n }\n /*sortByName(a: Employee, b: Employee): number {\n return a.getName().localeCompare(b.getName());\n }*/\n sortByLastName(a: Employee, b: Employee): number {\n return a.getLastName().localeCompare(b.getLastName());\n }\n\n}\n//@IonicPage()\n@Component({\n template: `\n \n {{selectedEmployee.getName()}}'s punches
\n \n \n From:\n \n \n \n To:\n \n \n \n `\n})\nexport class PunchPopoverPage {\n\n startDate: string;\n currentDate: string;\n endDate: string;\n dd: any;\n mm: any;\n selectedEmployee: Employee;\n\n constructor(public viewCtrl: ViewController, public popCtl: PopoverController, public appCtrl: App, public navParams: NavParams) {\n \n this.selectedEmployee = this.navParams.get(\"selectedEmployee\");\n let currDate = new Date(); //initialized to current date\n this.dd = currDate.getDate();\n this.mm = currDate.getMonth() + 1; //January is 0\n let yyyy = currDate.getFullYear();\n if (this.dd < 10) {\n this.dd = '0' + this.dd;\n }\n if (this.mm < 10) {\n this.mm = '0' + this.mm;\n }\n this.startDate = yyyy + \"-\" + this.mm + \"-\" + this.dd;\n this.endDate = this.startDate;\n this.currentDate = this.startDate;\n }\n\n\n close() {\n this.viewCtrl.dismiss();\n }\n}\n\nexport class Employee {\n\n name: string;\n firstName: string;\n lastName: string;\n ID: string;\n imageSrc: string;\n title: string;\n pay: string;\n phone: string;\n\n constructor(firstName: string, lastName: string, ID: string, title: string, pay: string, phone: string, imageSrc: string) {\n this.firstName = firstName;\n this.lastName = lastName;\n this.ID = ID;\n this.imageSrc = imageSrc;\n this.title = title;\n this.pay = pay;\n this.phone = phone;\n }\n\n getName(): string {\n return this.firstName+\" \"+this.lastName;\n }\n /*setName(name: string) {\n this.name = name;\n }*/\n getFirstName(): string {\n return this.firstName;\n }\n setFirstName(firstName: string) {\n this.firstName = firstName;\n }\n getLastName(): string {\n return this.lastName;\n }\n setLastName(lastName: string) {\n this.lastName = lastName;\n }\n getSrc(): string {\n return this.imageSrc;\n }\n setSrc(src: string) {\n this.imageSrc = src;\n }\n getID(): string {\n return this.ID;\n }\n setID(id: string) {\n this.ID = id;\n }\n getTitle(): string {\n return this.title;\n }\n setTitle(title: string) {\n this.title = title;\n }\n getPhone(): string {\n return this.phone;\n }\n setPhone(phone: string) {\n this.phone = phone;\n }\n getPay(): string {\n return this.pay;\n }\n setPay(pay: string) {\n this.pay = pay;\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/pages/employees/employees.ts"],"sourceRoot":""}
\ No newline at end of file
diff --git a/README b/README
index 13e99c0e..c2bea451 100644
--- a/README
+++ b/README
@@ -1,13 +1,55 @@
-NOTE: You must have Node.js installed
+DineIn: How to Run
-To download Ionic, run
-npm install -g ionic
+1) Install node.js (if you don't already have it)
+ https://nodejs.org/en/
+
+2) Install Ionic
+ Run:
+ $ npm install -g ionic cordova
+
+3) Clone our Github repo
+ https://github.com/DineIn2018/dinein.git
+
+4) Checkout the branch "TEST"
-From within the repository, run
-npm install
-to install the dependencies. Then, still in the repository, run
-ionic serve
+5) In terminal, cd to the directory where you have the repo cloned
-This will open a tab in your browser, running the app.
+6) Install all the node.js dependencies
+ Run:
+ $ npm install
+
+7.1) If you don't have an iPad
+ Run:
+ $ ionic serve
+ This will open a tab in your browser, running the app.
+
+ * Note:
+ At the login page, it is not necessary to enter a username or password.
+ This will look real ugly, our application is meant to be deployed on an iPad, it will look better there
+ Some scrolling also won't work in the browser, it will work on the iPad
+ The browser is just a debugging platform
+
+ **********************************************************************************************************
+ * IMPORTANT:
+ * When the browser is opened with the app, an error will show initially
+ * This is due to a bug in a plugin we used to handle drag and drop called interactJS (not our fault!)
+ * The program's functionality works fine though, even with this bug, it just affects it at compile time
+ * To make the error go away, while ionic is serving and your browser showing the error page,
+ * open up any typescript (.ts) file within the pages folder in our project and save it (no need to modify)
+ * The error should go away and the app will run smoothly
+ **********************************************************************************************************
+
+7.2) If you have an iPad
+ Download the Ionic Dev App from the app store on your iPad
+ On your laptop, in the project directory, run:
+ $ ionic serve -c
+ Make sure your laptop and iPad are on the same Wifi network
+ Open the Ionic Dev App, DineIn should pop up, tap it to run the app
+
+ * Note: If you are on UW Wifi, you will have to add the IP address manually
+ See the terminal running the serve for the IP address and port is always 8100
-Note: from the login page, it is not necessary to enter a username or password.
+Our Bug Tracker (it's github issues):
+ https://github.com/DineIn2018/dinein/issues
+
+If you have any problems getting it running, send us an e-mail!
diff --git a/config.xml b/config.xml
index 7bcc2f9d..b067bbcd 100644
--- a/config.xml
+++ b/config.xml
@@ -19,6 +19,7 @@
+
@@ -81,9 +82,14 @@
-
-
+
+
+
+
+
+
+
diff --git a/hooks/.DS_Store b/hooks/.DS_Store
index 23f89821..5008ddfc 100644
Binary files a/hooks/.DS_Store and b/hooks/.DS_Store differ
diff --git a/ionic_emulate_iOS b/ionic_emulate_iOS
deleted file mode 100755
index feb3f86b..00000000
--- a/ionic_emulate_iOS
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-cd "$(dirname "$0")"
-ionic cordova emulate ios --livereload
diff --git a/npm_test b/npm_test
new file mode 100755
index 00000000..609dfa9b
--- /dev/null
+++ b/npm_test
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd "$(dirname "$0")"
+npm test
diff --git a/npm_testcoverage b/npm_testcoverage
new file mode 100755
index 00000000..f99b9b96
--- /dev/null
+++ b/npm_testcoverage
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd "$(dirname "$0")"
+npm testcoverage
diff --git a/package-lock.json b/package-lock.json
index e4892f0a..1e523a51 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -91,20 +91,40 @@
"tslib": "1.9.0"
}
},
+ "@ionic-native/camera": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-4.7.0.tgz",
+ "integrity": "sha512-5zVAuWuOggoDSg61qNLRq7FKH0X9SK8jb1gfB/yNeWMMkBgN2HSwd6lpVuLG8ijEx5At3B7AxzQzQw5WCoUxQg=="
+ },
"@ionic-native/core": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-4.4.0.tgz",
"integrity": "sha512-Gyq8clDPeRG2AvcCydqDaYEByjIeJqWOryDkHl117wGUhZ+bY/489unL3u6ua7usGjWfUtM4Oj6hFgEzEu+kWg=="
},
+ "@ionic-native/file": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-4.7.0.tgz",
+ "integrity": "sha512-W5wHpBHBMns3NBrUYAUNDSN843MzWYWZ72rBX56onNKCDaYXZS4WuFExVHh2P91RWq095hmohQNpPiDB8ElQ8g=="
+ },
+ "@ionic-native/file-path": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file-path/-/file-path-4.7.0.tgz",
+ "integrity": "sha512-U5pU9OrddbCu2vOxd1SZoy3yErfbo/PuRs1TbgFn4txAB2tQoBxhlNypQmDBWqj+SyTFtJ+p+2Pi956qCMixPg=="
+ },
+ "@ionic-native/file-transfer": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-4.7.0.tgz",
+ "integrity": "sha512-GKyKFgr3KoMfFo/19KVDeDVizP1gUA3fyo2Mk9uJx1y7sxUv4EPxJWO/uQamLxsmkOm5QF/kaWPFTelzxcZWPQ=="
+ },
"@ionic-native/keyboard": {
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-4.5.3.tgz",
"integrity": "sha512-r/dVOuevuWTng7LnhHg9PC35EYF6DfpbGf69htQdMOSNnEaeNnWaLYJrLKdTfN++np0ap69jbyE5iQzUIWufeA=="
},
"@ionic-native/screen-orientation": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-4.5.3.tgz",
- "integrity": "sha512-jQu+acCk4Kg4wOtkApVVL4KuIoJAWKdLsESZeVDZi7I9q9Aopc1nzUi57qBE87Ha31agMQoaMwTGPS3K5RK0qw=="
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-4.7.0.tgz",
+ "integrity": "sha512-MUwbSwNNq7dsHJEnN+Jyj5q4sZ7IgbUhwMuHK+An+MMZLVvNmG2Cn9NZuLY2gyk1OySR6G00dgpbo32NclXIog=="
},
"@ionic-native/splash-screen": {
"version": "4.4.0",
@@ -179,11 +199,45 @@
"localforage-cordovasqlitedriver": "1.5.0"
}
},
+ "@types/jasmine": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.6.tgz",
+ "integrity": "sha512-clg9raJTY0EOo5pVZKX3ZlMjlYzVU73L71q5OV1jhE2Uezb7oF94jh4CvwrW6wInquQAdhOxJz5VDF2TLUGmmA==",
+ "dev": true
+ },
"@types/localforage": {
"version": "0.0.30",
"resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.30.tgz",
"integrity": "sha1-PWCmv23aOOP4pGlhFZg3nx9klQk="
},
+ "@types/node": {
+ "version": "9.6.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz",
+ "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==",
+ "dev": true
+ },
+ "@types/q": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
+ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
+ "dev": true
+ },
+ "@types/selenium-webdriver": {
+ "version": "2.53.43",
+ "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz",
+ "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==",
+ "dev": true
+ },
+ "JSONStream": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
+ "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -222,6 +276,61 @@
}
}
},
+ "acorn-node": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz",
+ "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ }
+ }
+ },
+ "addressparser": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
+ "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=",
+ "dev": true,
+ "optional": true
+ },
+ "adm-zip": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
+ "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=",
+ "dev": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
@@ -256,6 +365,72 @@
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
},
+ "amqplib": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
+ "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bitsyntax": "0.0.4",
+ "bluebird": "3.5.1",
+ "buffer-more-ints": "0.0.2",
+ "readable-stream": "1.1.14",
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "angular2-template-loader": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz",
+ "integrity": "sha1-wNROkP/w+sleiyPwQ6zaf9HFHXw=",
+ "dev": true,
+ "requires": {
+ "loader-utils": "0.2.17"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+ "dev": true,
+ "requires": {
+ "big.js": "3.2.0",
+ "emojis-list": "2.1.0",
+ "json5": "0.5.1",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -266,7 +441,6 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
"requires": {
"color-convert": "1.9.1"
}
@@ -280,6 +454,15 @@
"normalize-path": "2.1.1"
}
},
+ "append-transform": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "1.0.0"
+ }
+ },
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
@@ -321,7 +504,12 @@
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
"dev": true
},
"array-find-index": {
@@ -336,11 +524,56 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
"dev": true
},
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
"array-unique": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
"integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
},
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -376,14 +609,30 @@
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
},
"ast-types": {
"version": "0.8.15",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz",
"integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI="
},
+ "astw": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz",
+ "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=",
+ "dev": true,
+ "requires": {
+ "acorn": "4.0.13"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ },
"async": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
@@ -419,8 +668,7 @@
"atob": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
- "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
- "dev": true
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10="
},
"autoprefixer": {
"version": "7.2.6",
@@ -448,6 +696,16 @@
"integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
"dev": true
},
+ "axios": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz",
+ "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "follow-redirects": "1.0.0"
+ }
+ },
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@@ -486,6 +744,95 @@
}
}
},
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.5"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.5",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -495,7 +842,6 @@
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
"requires": {
"cache-base": "1.0.1",
"class-utils": "0.3.6",
@@ -510,7 +856,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
"requires": {
"is-descriptor": "1.0.2"
}
@@ -518,8 +863,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -528,12 +872,24 @@
"resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz",
"integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ="
},
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
"base64-js": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz",
"integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==",
"dev": true
},
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
"bcrypt-pbkdf": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
@@ -544,17 +900,82 @@
"tweetnacl": "0.14.5"
}
},
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
- "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
- "dev": true
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
},
"binary-extensions": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
"integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
},
+ "bitsyntax": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
+ "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-more-ints": "0.0.2"
+ }
+ },
+ "bl": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+ "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "readable-stream": "2.0.6"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
"block-stream": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
@@ -564,6 +985,21 @@
"inherits": "2.0.3"
}
},
+ "blocking-proxy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz",
+ "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==",
+ "dev": true,
+ "requires": {
+ "minimist": "1.2.0"
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
"bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
@@ -658,9 +1094,35 @@
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
"dev": true
},
- "browser-resolve": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
+ "browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "combine-source-map": "0.8.0",
+ "defined": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "through2": "2.0.3",
+ "umd": "3.0.3"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "browser-resolve": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
"integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
"dev": true,
"requires": {
@@ -675,6 +1137,98 @@
}
}
},
+ "browserify": {
+ "version": "14.5.0",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz",
+ "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "assert": "1.4.1",
+ "browser-pack": "6.1.0",
+ "browser-resolve": "1.11.2",
+ "browserify-zlib": "0.2.0",
+ "buffer": "5.1.0",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.5.2",
+ "console-browserify": "1.1.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "defined": "1.0.0",
+ "deps-sort": "2.0.0",
+ "domain-browser": "1.1.7",
+ "duplexer2": "0.1.4",
+ "events": "1.1.1",
+ "glob": "7.1.2",
+ "has": "1.0.1",
+ "htmlescape": "1.1.1",
+ "https-browserify": "1.0.0",
+ "inherits": "2.0.3",
+ "insert-module-globals": "7.0.6",
+ "labeled-stream-splicer": "2.0.1",
+ "module-deps": "4.1.1",
+ "os-browserify": "0.3.0",
+ "parents": "1.0.1",
+ "path-browserify": "0.0.0",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "read-only-stream": "2.0.0",
+ "readable-stream": "2.3.4",
+ "resolve": "1.5.0",
+ "shasum": "1.0.2",
+ "shell-quote": "1.6.1",
+ "stream-browserify": "2.0.1",
+ "stream-http": "2.8.1",
+ "string_decoder": "1.0.3",
+ "subarg": "1.0.0",
+ "syntax-error": "1.4.0",
+ "through2": "2.0.3",
+ "timers-browserify": "1.4.2",
+ "tty-browserify": "0.0.0",
+ "url": "0.11.0",
+ "util": "0.10.3",
+ "vm-browserify": "0.0.4",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "buffer": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz",
+ "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==",
+ "dev": true,
+ "requires": {
+ "base64-js": "1.2.3",
+ "ieee754": "1.1.10"
+ }
+ },
+ "domain-browser": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+ "dev": true,
+ "requires": {
+ "process": "0.11.10"
+ }
+ }
+ }
+ },
"browserify-aes": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
@@ -755,6 +1309,11 @@
"electron-to-chromium": "1.3.37"
}
},
+ "bson": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz",
+ "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ=="
+ },
"buffer": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
@@ -766,12 +1325,40 @@
"isarray": "1.0.0"
}
},
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
+ "dev": true
+ },
+ "buffer-more-ints": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
+ "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=",
+ "dev": true
+ },
"buffer-xor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
+ "buildmail": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz",
+ "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "addressparser": "1.0.1",
+ "libbase64": "0.1.0",
+ "libmime": "3.0.0",
+ "libqp": "1.1.0",
+ "nodemailer-fetch": "1.6.0",
+ "nodemailer-shared": "1.1.0",
+ "punycode": "1.4.1"
+ }
+ },
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
@@ -794,7 +1381,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
"requires": {
"collection-visit": "1.0.0",
"component-emitter": "1.2.1",
@@ -810,11 +1396,32 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
+ "cached-path-relative": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
+ "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=",
+ "dev": true
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
@@ -857,7 +1464,6 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
"integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "dev": true,
"requires": {
"ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5",
@@ -890,11 +1496,16 @@
"safe-buffer": "5.1.1"
}
},
+ "circular-json": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.1.tgz",
+ "integrity": "sha512-UjgcRlTAhAkLeXmDe2wK7ktwy/tgAqxiSndTIPiFZuIPLZmzHzWMwUIe9h9m/OokypG7snxCDEuwJshGBdPvaw==",
+ "dev": true
+ },
"class-utils": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
"requires": {
"arr-union": "3.1.0",
"define-property": "0.2.5",
@@ -906,7 +1517,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "0.1.6"
}
@@ -915,7 +1525,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -924,7 +1533,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -935,7 +1543,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -944,7 +1551,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -955,7 +1561,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "0.1.6",
"is-data-descriptor": "0.1.4",
@@ -965,14 +1570,12 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
},
@@ -1012,7 +1615,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
"requires": {
"map-visit": "1.0.0",
"object-visit": "1.0.1"
@@ -1022,7 +1624,6 @@
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "dev": true,
"requires": {
"color-name": "1.1.3"
}
@@ -1030,9 +1631,43 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
"dev": true
},
+ "combine-lists": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "inline-source-map": "0.6.2",
+ "lodash.memoize": "3.0.4",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
+ "dev": true
+ }
+ }
+ },
"combined-stream": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
@@ -1048,10 +1683,27 @@
"integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==",
"dev": true
},
+ "compare-versions": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz",
+ "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==",
+ "dev": true
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
"dev": true
},
"concat-map": {
@@ -1059,6 +1711,80 @@
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
+ "concat-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
+ "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.0.6",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "connect": {
+ "version": "3.6.6",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+ "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.0",
+ "parseurl": "1.3.2",
+ "utils-merge": "1.0.1"
+ },
+ "dependencies": {
+ "finalhandler": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
"console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
@@ -1098,6 +1824,12 @@
"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
"dev": true
},
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
@@ -1113,32 +1845,47 @@
"copy-descriptor": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
- "cordova-ios": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-4.5.4.tgz",
- "integrity": "sha1-yAZIBYlyloVw3BXalzFP+S0H3+c=",
+ "cordova-browser": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/cordova-browser/-/cordova-browser-5.0.3.tgz",
+ "integrity": "sha1-9+VCAv3wlpQ4XXjArYckEMsJTfU=",
"requires": {
- "cordova-common": "2.1.0",
- "ios-sim": "6.1.2",
+ "cordova-common": "2.2.0",
+ "cordova-serve": "2.0.0",
"nopt": "3.0.6",
- "plist": "1.2.0",
- "q": "1.5.1",
- "shelljs": "0.5.3",
- "xcode": "0.9.3",
- "xml-escape": "1.1.0"
+ "shelljs": "0.5.3"
},
"dependencies": {
"abbrev": {
"version": "1.1.1",
"bundled": true
},
+ "accepts": {
+ "version": "1.3.4",
+ "bundled": true,
+ "requires": {
+ "mime-types": "2.1.17",
+ "negotiator": "0.6.1"
+ }
+ },
"ansi": {
"version": "0.3.1",
"bundled": true
},
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "bundled": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "bundled": true
+ },
"balanced-match": {
"version": "1.0.0",
"bundled": true
@@ -1148,21 +1895,30 @@
"bundled": true
},
"big-integer": {
- "version": "1.6.25",
+ "version": "1.6.26",
"bundled": true
},
- "bplist-creator": {
- "version": "0.0.7",
+ "body-parser": {
+ "version": "1.18.2",
"bundled": true,
"requires": {
- "stream-buffers": "2.2.0"
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.1",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.15"
}
},
"bplist-parser": {
"version": "0.1.1",
"bundled": true,
"requires": {
- "big-integer": "1.6.25"
+ "big-integer": "1.6.26"
}
},
"brace-expansion": {
@@ -1173,12 +1929,63 @@
"concat-map": "0.0.1"
}
},
+ "bytes": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "bundled": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "compressible": {
+ "version": "2.0.12",
+ "bundled": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.1",
+ "bundled": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "bytes": "3.0.0",
+ "compressible": "2.0.12",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ }
+ },
"concat-map": {
"version": "0.0.1",
"bundled": true
},
+ "content-disposition": {
+ "version": "0.5.2",
+ "bundled": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "bundled": true
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "bundled": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "bundled": true
+ },
"cordova-common": {
- "version": "2.1.0",
+ "version": "2.2.0",
"bundled": true,
"requires": {
"ansi": "0.3.1",
@@ -1200,24 +2007,154 @@
"version": "1.1.15",
"bundled": true
},
- "elementtree": {
- "version": "0.1.6",
+ "cordova-serve": {
+ "version": "2.0.0",
"bundled": true,
"requires": {
- "sax": "0.3.5"
+ "chalk": "1.1.3",
+ "compression": "1.7.1",
+ "express": "4.16.2",
+ "open": "0.0.5",
+ "shelljs": "0.5.3"
}
},
- "glob": {
- "version": "5.0.15",
+ "debug": {
+ "version": "2.6.9",
"bundled": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "bundled": true
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "elementtree": {
+ "version": "0.1.6",
+ "bundled": true,
+ "requires": {
+ "sax": "0.3.5"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "bundled": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "bundled": true
+ },
+ "express": {
+ "version": "4.16.2",
+ "bundled": true,
+ "requires": {
+ "accepts": "1.3.4",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.1",
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.0",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.2",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.1",
+ "serve-static": "1.13.1",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.3.1",
+ "type-is": "1.6.15",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "bundled": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "bundled": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "bundled": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
"once": "1.4.0",
"path-is-absolute": "1.0.1"
}
},
+ "has-ansi": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "bundled": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "setprototypeof": {
+ "version": "1.0.3",
+ "bundled": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "bundled": true
+ },
"inflight": {
"version": "1.0.6",
"bundled": true,
@@ -1230,33 +2167,41 @@
"version": "2.0.3",
"bundled": true
},
- "ios-sim": {
- "version": "6.1.2",
- "bundled": true,
- "requires": {
- "bplist-parser": "0.0.6",
- "nopt": "1.0.9",
- "plist": "1.2.0",
- "simctl": "1.1.1"
- },
- "dependencies": {
- "bplist-parser": {
- "version": "0.0.6",
- "bundled": true
- },
- "nopt": {
- "version": "1.0.9",
- "bundled": true,
- "requires": {
- "abbrev": "1.1.1"
- }
- }
- }
+ "ipaddr.js": {
+ "version": "1.5.2",
+ "bundled": true
},
"lodash": {
"version": "3.10.1",
"bundled": true
},
+ "media-typer": {
+ "version": "0.3.0",
+ "bundled": true
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "bundled": true
+ },
+ "mime": {
+ "version": "1.4.1",
+ "bundled": true
+ },
+ "mime-db": {
+ "version": "1.30.0",
+ "bundled": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "bundled": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
"minimatch": {
"version": "3.0.4",
"bundled": true,
@@ -1264,6 +2209,14 @@
"brace-expansion": "1.1.8"
}
},
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "bundled": true
+ },
"nopt": {
"version": "3.0.6",
"bundled": true,
@@ -1271,6 +2224,17 @@
"abbrev": "1.1.1"
}
},
+ "on-finished": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "bundled": true
+ },
"once": {
"version": "1.4.0",
"bundled": true,
@@ -1278,6 +2242,10 @@
"wrappy": "1.0.2"
}
},
+ "open": {
+ "version": "0.0.5",
+ "bundled": true
+ },
"os-homedir": {
"version": "1.0.2",
"bundled": true
@@ -1294,12 +2262,16 @@
"os-tmpdir": "1.0.2"
}
},
+ "parseurl": {
+ "version": "1.3.2",
+ "bundled": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"bundled": true
},
- "pegjs": {
- "version": "0.10.0",
+ "path-to-regexp": {
+ "version": "0.1.7",
"bundled": true
},
"plist": {
@@ -1312,10 +2284,40 @@
"xmldom": "0.1.27"
}
},
+ "proxy-addr": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.5.2"
+ }
+ },
"q": {
"version": "1.5.1",
"bundled": true
},
+ "qs": {
+ "version": "6.5.1",
+ "bundled": true
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "bundled": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true
+ },
"sax": {
"version": "0.3.5",
"bundled": true
@@ -1324,59 +2326,65 @@
"version": "5.4.1",
"bundled": true
},
+ "send": {
+ "version": "0.16.1",
+ "bundled": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.1",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ }
+ },
+ "serve-static": {
+ "version": "1.13.1",
+ "bundled": true,
+ "requires": {
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "bundled": true
+ },
"shelljs": {
"version": "0.5.3",
"bundled": true
},
- "simctl": {
- "version": "1.1.1",
- "bundled": true,
- "requires": {
- "shelljs": "0.2.6",
- "tail": "0.4.0"
- },
- "dependencies": {
- "shelljs": {
- "version": "0.2.6",
- "bundled": true
- }
- }
+ "statuses": {
+ "version": "1.3.1",
+ "bundled": true
},
- "simple-plist": {
- "version": "0.2.1",
+ "strip-ansi": {
+ "version": "3.0.1",
"bundled": true,
"requires": {
- "bplist-creator": "0.0.7",
- "bplist-parser": "0.1.1",
- "plist": "2.0.1"
- },
- "dependencies": {
- "base64-js": {
- "version": "1.1.2",
- "bundled": true
- },
- "plist": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "base64-js": "1.1.2",
- "xmlbuilder": "8.2.2",
- "xmldom": "0.1.27"
- }
- },
- "xmlbuilder": {
- "version": "8.2.2",
- "bundled": true
- }
+ "ansi-regex": "2.1.1"
}
},
- "stream-buffers": {
- "version": "2.2.0",
+ "supports-color": {
+ "version": "2.0.0",
"bundled": true
},
- "tail": {
- "version": "0.4.0",
- "bundled": true
+ "type-is": {
+ "version": "1.6.15",
+ "bundled": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.17"
+ }
},
"underscore": {
"version": "1.8.3",
@@ -1386,29 +2394,24 @@
"version": "1.4.1",
"bundled": true
},
+ "unpipe": {
+ "version": "1.0.0",
+ "bundled": true
+ },
"util-deprecate": {
"version": "1.0.2",
"bundled": true
},
- "uuid": {
- "version": "3.0.1",
+ "utils-merge": {
+ "version": "1.0.1",
"bundled": true
},
- "wrappy": {
- "version": "1.0.2",
+ "vary": {
+ "version": "1.1.2",
"bundled": true
},
- "xcode": {
- "version": "0.9.3",
- "bundled": true,
- "requires": {
- "pegjs": "0.10.0",
- "simple-plist": "0.2.1",
- "uuid": "3.0.1"
- }
- },
- "xml-escape": {
- "version": "1.1.0",
+ "wrappy": {
+ "version": "1.0.2",
"bundled": true
},
"xmlbuilder": {
@@ -1424,29 +2427,357 @@
}
}
},
- "cordova-plugin-device": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.1.tgz",
- "integrity": "sha1-m54jE+aCEZ/4QC9oCWo4vMUBNZM="
- },
- "cordova-plugin-ionic-keyboard": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.0.5.tgz",
- "integrity": "sha512-ygwK+U7Vs7OJJYsDrWAxhegHfvuRRpMC3Y8RhQSVLfv4ELrXtkCUjD+UfsDQ3aObpvxGLTvcVrOw5p04dPXy3w=="
- },
- "cordova-plugin-ionic-webview": {
- "version": "1.1.16",
- "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-1.1.16.tgz",
- "integrity": "sha512-57EW4qNkKyCfcVt0pH11s88Dvwdtgf2UkbAyPNk2+T1cmLVQ503S/+3Wa3l173J0NGt/QGGyUM8Z66LkqTnoWg=="
- },
- "cordova-plugin-screen-orientation": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.1.tgz",
- "integrity": "sha1-daNXzik4CB6PYdRgU5S213Rjwfg="
- },
- "cordova-plugin-splashscreen": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz",
+ "cordova-ios": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-4.5.4.tgz",
+ "integrity": "sha1-yAZIBYlyloVw3BXalzFP+S0H3+c=",
+ "requires": {
+ "cordova-common": "2.1.0",
+ "ios-sim": "6.1.2",
+ "nopt": "3.0.6",
+ "plist": "1.2.0",
+ "q": "1.5.1",
+ "shelljs": "0.5.3",
+ "xcode": "0.9.3",
+ "xml-escape": "1.1.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "ansi": {
+ "version": "0.3.1",
+ "bundled": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "base64-js": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "big-integer": {
+ "version": "1.6.25",
+ "bundled": true
+ },
+ "bplist-creator": {
+ "version": "0.0.7",
+ "bundled": true,
+ "requires": {
+ "stream-buffers": "2.2.0"
+ }
+ },
+ "bplist-parser": {
+ "version": "0.1.1",
+ "bundled": true,
+ "requires": {
+ "big-integer": "1.6.25"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "cordova-common": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "ansi": "0.3.1",
+ "bplist-parser": "0.1.1",
+ "cordova-registry-mapper": "1.1.15",
+ "elementtree": "0.1.6",
+ "glob": "5.0.15",
+ "minimatch": "3.0.4",
+ "osenv": "0.1.4",
+ "plist": "1.2.0",
+ "q": "1.5.1",
+ "semver": "5.4.1",
+ "shelljs": "0.5.3",
+ "underscore": "1.8.3",
+ "unorm": "1.4.1"
+ }
+ },
+ "cordova-registry-mapper": {
+ "version": "1.1.15",
+ "bundled": true
+ },
+ "elementtree": {
+ "version": "0.1.6",
+ "bundled": true,
+ "requires": {
+ "sax": "0.3.5"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "bundled": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ios-sim": {
+ "version": "6.1.2",
+ "bundled": true,
+ "requires": {
+ "bplist-parser": "0.0.6",
+ "nopt": "1.0.9",
+ "plist": "1.2.0",
+ "simctl": "1.1.1"
+ },
+ "dependencies": {
+ "bplist-parser": {
+ "version": "0.0.6",
+ "bundled": true
+ },
+ "nopt": {
+ "version": "1.0.9",
+ "bundled": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "bundled": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "bundled": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "bundled": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "pegjs": {
+ "version": "0.10.0",
+ "bundled": true
+ },
+ "plist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "base64-js": "0.0.8",
+ "util-deprecate": "1.0.2",
+ "xmlbuilder": "4.0.0",
+ "xmldom": "0.1.27"
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "bundled": true
+ },
+ "sax": {
+ "version": "0.3.5",
+ "bundled": true
+ },
+ "semver": {
+ "version": "5.4.1",
+ "bundled": true
+ },
+ "shelljs": {
+ "version": "0.5.3",
+ "bundled": true
+ },
+ "simctl": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "shelljs": "0.2.6",
+ "tail": "0.4.0"
+ },
+ "dependencies": {
+ "shelljs": {
+ "version": "0.2.6",
+ "bundled": true
+ }
+ }
+ },
+ "simple-plist": {
+ "version": "0.2.1",
+ "bundled": true,
+ "requires": {
+ "bplist-creator": "0.0.7",
+ "bplist-parser": "0.1.1",
+ "plist": "2.0.1"
+ },
+ "dependencies": {
+ "base64-js": {
+ "version": "1.1.2",
+ "bundled": true
+ },
+ "plist": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "base64-js": "1.1.2",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "stream-buffers": {
+ "version": "2.2.0",
+ "bundled": true
+ },
+ "tail": {
+ "version": "0.4.0",
+ "bundled": true
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "bundled": true
+ },
+ "unorm": {
+ "version": "1.4.1",
+ "bundled": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "bundled": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "xcode": {
+ "version": "0.9.3",
+ "bundled": true,
+ "requires": {
+ "pegjs": "0.10.0",
+ "simple-plist": "0.2.1",
+ "uuid": "3.0.1"
+ }
+ },
+ "xml-escape": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "xmlbuilder": {
+ "version": "4.0.0",
+ "bundled": true,
+ "requires": {
+ "lodash": "3.10.1"
+ }
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "bundled": true
+ }
+ }
+ },
+ "cordova-plugin-camera": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-4.0.3.tgz",
+ "integrity": "sha1-c3Olk4MYyGzP2E43E+I4LRD+B2s="
+ },
+ "cordova-plugin-device": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.2.tgz",
+ "integrity": "sha1-/Ajzci5n7ve2xnv8mag99q3Quro="
+ },
+ "cordova-plugin-file": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.1.tgz",
+ "integrity": "sha1-SWBrjBWlaI1HKPkuSnMloGHeB/U="
+ },
+ "cordova-plugin-file-transfer": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-1.7.1.tgz",
+ "integrity": "sha1-p12L4uvDu5sjxbG70ZkhTsJnWGs="
+ },
+ "cordova-plugin-filepath": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-filepath/-/cordova-plugin-filepath-1.3.0.tgz",
+ "integrity": "sha512-Dwd76FcVciSssAZ/FPfwfOlfHrmx7CAjYTNzCxeJ4NsMkCfTysCR3vHdX/03XExGi+74DImUB17uXsnyyOYnAQ=="
+ },
+ "cordova-plugin-ionic-keyboard": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.0.5.tgz",
+ "integrity": "sha512-ygwK+U7Vs7OJJYsDrWAxhegHfvuRRpMC3Y8RhQSVLfv4ELrXtkCUjD+UfsDQ3aObpvxGLTvcVrOw5p04dPXy3w=="
+ },
+ "cordova-plugin-ionic-webview": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-1.2.0.tgz",
+ "integrity": "sha512-PqnwJngjxoQQCPuDyp78ZF/ywIdbssmH2U8Rkoh2OnBh5KG7x2tm7ubs47pwgWuypYWRfHFEfBVKlW4DDhlEUQ=="
+ },
+ "cordova-plugin-screen-orientation": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.1.tgz",
+ "integrity": "sha1-daNXzik4CB6PYdRgU5S213Rjwfg="
+ },
+ "cordova-plugin-splashscreen": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz",
"integrity": "sha1-dH509W4gHNWFvGLRS8oZ9oZ/8e0="
},
"cordova-plugin-whitelist": {
@@ -1454,6 +2785,12 @@
"resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.3.tgz",
"integrity": "sha1-tehezbv+Wu3tQKG/TuI3LmfZb7Q="
},
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
+ },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -1543,6 +2880,12 @@
"array-find-index": "1.0.2"
}
},
+ "custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+ "dev": true
+ },
"d": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
@@ -1569,6 +2912,19 @@
}
}
},
+ "data-uri-to-buffer": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz",
+ "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==",
+ "dev": true,
+ "optional": true
+ },
+ "date-format": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
+ "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
+ "dev": true
+ },
"date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
@@ -1579,7 +2935,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -1593,14 +2948,28 @@
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true,
+ "optional": true
+ },
+ "default-require-extensions": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "2.0.0"
+ }
},
"define-property": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
"requires": {
"is-descriptor": "1.0.2",
"isobject": "3.0.1"
@@ -1609,11 +2978,52 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+ "dev": true
+ },
+ "degenerator": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
+ "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ast-types": "0.8.15",
+ "escodegen": "1.9.1",
+ "esprima": "3.1.3"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true,
+ "optional": true
}
}
},
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1632,6 +3042,30 @@
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"dev": true
},
+ "deps-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
+ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "shasum": "1.0.2",
+ "subarg": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
"des.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
@@ -1648,6 +3082,39 @@
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
"dev": true
},
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detective": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
+ "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "defined": "1.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ }
+ }
+ },
+ "di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+ "dev": true
+ },
"diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
@@ -1689,12 +3156,40 @@
}
}
},
+ "dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+ "dev": true,
+ "requires": {
+ "custom-event": "1.0.1",
+ "ent": "2.2.0",
+ "extend": "3.0.1",
+ "void-elements": "2.0.1"
+ }
+ },
"domain-browser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
"dev": true
},
+ "double-ended-queue": {
+ "version": "2.1.0-0",
+ "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
+ "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=",
+ "dev": true,
+ "optional": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4"
+ }
+ },
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
@@ -1717,38 +3212,105 @@
"integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=",
"dev": true
},
- "elliptic": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
- "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.3",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
+ "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "uws": "9.14.0",
+ "ws": "3.3.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
+ "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.2",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "brorand": "1.1.0",
- "hash.js": "1.1.3",
- "hmac-drbg": "1.0.1",
- "inherits": "2.0.3",
- "minimalistic-assert": "1.0.0",
- "minimalistic-crypto-utils": "1.0.1"
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
}
},
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
- },
"enhanced-resolve": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
"integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
- "dev": true,
"requires": {
"graceful-fs": "4.1.11",
"memory-fs": "0.4.1",
@@ -1756,11 +3318,16 @@
"tapable": "0.2.8"
}
},
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+ "dev": true
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "dev": true,
"requires": {
"prr": "1.0.1"
}
@@ -1829,6 +3396,12 @@
"event-emitter": "0.3.5"
}
},
+ "es6-promise": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
+ "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
+ "dev": true
+ },
"es6-set": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
@@ -1852,6 +3425,42 @@
"es5-ext": "0.10.40"
}
},
+ "es6-templates": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
+ "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
+ "dev": true,
+ "requires": {
+ "recast": "0.11.23",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ast-types": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
+ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "recast": {
+ "version": "0.11.23",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
+ "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
+ "dev": true,
+ "requires": {
+ "ast-types": "0.9.6",
+ "esprima": "3.1.3",
+ "private": "0.1.8",
+ "source-map": "0.5.7"
+ }
+ }
+ }
+ },
"es6-weak-map": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
@@ -1873,8 +3482,37 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true,
+ "optional": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ }
+ }
},
"escope": {
"version": "3.6.0",
@@ -1941,6 +3579,12 @@
"es5-ext": "0.10.40"
}
},
+ "eventemitter3": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+ "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+ "dev": true
+ },
"events": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
@@ -1972,6 +3616,56 @@
"strip-eof": "1.0.0"
}
},
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
+ },
+ "expand-braces": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+ "dev": true,
+ "requires": {
+ "array-slice": "0.2.3",
+ "array-unique": "0.2.1",
+ "braces": "0.1.5"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+ "dev": true,
+ "requires": {
+ "expand-range": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+ "dev": true,
+ "requires": {
+ "is-number": "0.1.1",
+ "repeat-string": "0.2.2"
+ }
+ },
+ "is-number": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+ "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+ "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+ "dev": true
+ }
+ }
+ },
"expand-brackets": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
@@ -2044,7 +3738,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
"requires": {
"assign-symbols": "1.0.0",
"is-extendable": "1.0.1"
@@ -2054,7 +3747,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
"requires": {
"is-plain-object": "2.0.4"
}
@@ -2105,6 +3797,19 @@
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true,
+ "optional": true
+ },
+ "fastparse": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+ "dev": true
+ },
"faye-websocket": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
@@ -2114,11 +3819,28 @@
"websocket-driver": "0.7.0"
}
},
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "optional": true
+ },
"filename-regex": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
},
+ "fileset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
+ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "minimatch": "3.0.4"
+ }
+ },
"fill-range": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
@@ -2156,6 +3878,16 @@
"pinkie-promise": "2.0.1"
}
},
+ "follow-redirects": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz",
+ "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9"
+ }
+ },
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -2201,7 +3933,6 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
"requires": {
"map-cache": "0.2.2"
}
@@ -2212,6 +3943,15 @@
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"dev": true
},
+ "fs-access": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+ "dev": true,
+ "requires": {
+ "null-check": "1.0.0"
+ }
+ },
"fs-extra": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
@@ -3029,6 +4769,52 @@
"rimraf": "2.6.2"
}
},
+ "ftp": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
+ "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "xregexp": "2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
@@ -3087,11 +4873,25 @@
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
"dev": true
},
+ "get-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz",
+ "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "data-uri-to-buffer": "1.2.0",
+ "debug": "2.6.9",
+ "extend": "3.0.1",
+ "file-uri-to-path": "1.0.0",
+ "ftp": "0.3.10",
+ "readable-stream": "2.3.4"
+ }
+ },
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
},
"getpass": {
"version": "0.1.7",
@@ -3141,6 +4941,26 @@
"is-glob": "2.0.1"
}
},
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
"globule": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
@@ -3152,11 +4972,93 @@
"minimatch": "3.0.4"
}
},
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
"har-validator": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
@@ -3196,6 +5098,15 @@
}
}
},
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "dev": true,
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@@ -3205,11 +5116,33 @@
"ansi-regex": "2.1.1"
}
},
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-unicode": {
"version": "2.0.1",
@@ -3221,7 +5154,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
"requires": {
"get-value": "2.0.6",
"has-values": "1.0.0",
@@ -3231,8 +5163,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -3240,7 +5171,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
"requires": {
"is-number": "3.0.0",
"kind-of": "4.0.0"
@@ -3250,7 +5180,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -3259,7 +5188,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -3270,7 +5198,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -3308,6 +5235,23 @@
"sntp": "1.0.9"
}
},
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hipchat-notifier": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz",
+ "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.5",
+ "request": "2.79.0"
+ }
+ },
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -3331,6 +5275,58 @@
"integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
"dev": true
},
+ "html-loader": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
+ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==",
+ "dev": true,
+ "requires": {
+ "es6-templates": "0.2.3",
+ "fastparse": "1.1.1",
+ "html-minifier": "3.5.14",
+ "loader-utils": "1.1.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "html-minifier": {
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz",
+ "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.0",
+ "he": "1.1.1",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.20"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.3.20",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz",
+ "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.0",
+ "source-map": "0.6.1"
+ }
+ }
+ }
+ },
+ "htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
+ "dev": true
+ },
"http-errors": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
@@ -3363,6 +5359,27 @@
"integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA==",
"dev": true
},
+ "http-proxy": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "1.2.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
"http-signature": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
@@ -3374,12 +5391,39 @@
"sshpk": "1.14.1"
}
},
+ "httpntlm": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
+ "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=",
+ "dev": true,
+ "requires": {
+ "httpreq": "0.4.24",
+ "underscore": "1.7.0"
+ }
+ },
+ "httpreq": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz",
+ "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=",
+ "dev": true
+ },
"https-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
@@ -3418,6 +5462,13 @@
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
"dev": true
},
+ "inflection": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.10.0.tgz",
+ "integrity": "sha1-W//LEZetPoEFD44X4hZoCH7p6y8=",
+ "dev": true,
+ "optional": true
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -3433,6 +5484,12 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
"inline-process-browser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz",
@@ -3442,12 +5499,81 @@
"through2": "0.6.5"
}
},
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "insert-module-globals": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.6.tgz",
+ "integrity": "sha512-R3sidKJr3SsggqQQ5cEwQb3pWG8RNx0UnpyeiOSR6jorRIeAOzH2gkTWnNdMnyRiVbjrG047K7UCtlMkQ1Mo9w==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "combine-source-map": "0.8.0",
+ "concat-stream": "1.6.2",
+ "is-buffer": "1.1.6",
+ "lexical-scope": "1.2.0",
+ "path-is-absolute": "1.0.1",
+ "process": "0.11.10",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.4",
+ "typedarray": "0.0.6"
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "interactjs": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.3.3.tgz",
+ "integrity": "sha512-JeB7Dn7pE/yzb2OJyV0AZIDHJYuvHrj0S/Lp3CIRWtAyAppbu5a5YFw/ndqvXKpXLt0/0vOQnO3ick0N6naysQ=="
+ },
"interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
"dev": true
},
+ "intl": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz",
+ "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94="
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
"invert-kv": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
@@ -3464,11 +5590,28 @@
"resolved": "https://registry.npmjs.org/ionic-plugin-keyboard/-/ionic-plugin-keyboard-2.2.1.tgz",
"integrity": "sha1-8qnhabvptVIkADR8n9bTRn7j+hI="
},
+ "ionic2-calendar": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/ionic2-calendar/-/ionic2-calendar-0.4.3.tgz",
+ "integrity": "sha1-l7ZQS0uKlj1bwRmKvB6X2AwjxFg="
+ },
+ "ionic3-mocks": {
+ "version": "0.11.22",
+ "resolved": "https://registry.npmjs.org/ionic3-mocks/-/ionic3-mocks-0.11.22.tgz",
+ "integrity": "sha512-P80f/aloF2lfnAmMmkbBIo3dXOu90pZadtTLkevaXzVceuju9wAoZdn5RwXrkJ4bfe9TAgN/jAkpP02mYNgn2A=="
+ },
"ionicons": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ionicons/-/ionicons-3.0.0.tgz",
"integrity": "sha1-QLja9P16MRUL0AIWD2ZJbiKpjDw="
},
+ "ip": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz",
+ "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=",
+ "dev": true,
+ "optional": true
+ },
"ipaddr.js": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
@@ -3479,7 +5622,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
"requires": {
"kind-of": "6.0.2"
},
@@ -3487,8 +5629,7 @@
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -3524,7 +5665,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
"requires": {
"kind-of": "6.0.2"
},
@@ -3532,8 +5672,7 @@
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -3541,7 +5680,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "1.0.0",
"is-data-descriptor": "1.0.0",
@@ -3551,8 +5689,7 @@
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -3642,7 +5779,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
"integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
- "dev": true,
"requires": {
"is-number": "4.0.0"
},
@@ -3650,16 +5786,38 @@
"is-number": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
}
}
},
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
"requires": {
"isobject": "3.0.1"
},
@@ -3667,8 +5825,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -3709,14 +5866,19 @@
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
+ "isbinaryfile": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
+ "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
+ "dev": true
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3737,6 +5899,150 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
+ "istanbul-api": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz",
+ "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==",
+ "dev": true,
+ "requires": {
+ "async": "2.6.0",
+ "compare-versions": "3.1.0",
+ "fileset": "2.0.3",
+ "istanbul-lib-coverage": "1.2.0",
+ "istanbul-lib-hook": "1.2.0",
+ "istanbul-lib-instrument": "1.10.1",
+ "istanbul-lib-report": "1.1.4",
+ "istanbul-lib-source-maps": "1.2.4",
+ "istanbul-reports": "1.3.0",
+ "js-yaml": "3.11.0",
+ "mkdirp": "0.5.1",
+ "once": "1.4.0"
+ }
+ },
+ "istanbul-instrumenter-loader": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
+ "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "istanbul-lib-instrument": "1.10.1",
+ "loader-utils": "1.1.0",
+ "schema-utils": "0.3.0"
+ }
+ },
+ "istanbul-lib-coverage": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz",
+ "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz",
+ "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==",
+ "dev": true,
+ "requires": {
+ "append-transform": "0.4.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz",
+ "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==",
+ "dev": true,
+ "requires": {
+ "babel-generator": "6.26.1",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "istanbul-lib-coverage": "1.2.0",
+ "semver": "5.5.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz",
+ "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "1.2.0",
+ "mkdirp": "0.5.1",
+ "path-parse": "1.0.5",
+ "supports-color": "3.2.3"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz",
+ "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0",
+ "istanbul-lib-coverage": "1.2.0",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz",
+ "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==",
+ "dev": true,
+ "requires": {
+ "handlebars": "4.0.11"
+ }
+ },
+ "jasmine-core": {
+ "version": "2.99.1",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
+ "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU="
+ },
+ "jasmine-spec-reporter": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
+ "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
+ "dev": true,
+ "requires": {
+ "colors": "1.1.2"
+ }
+ },
+ "jasminewd2": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
+ "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
+ "dev": true
+ },
"js-base64": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz",
@@ -3774,6 +6080,12 @@
"dev": true,
"optional": true
},
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
"json-loader": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
@@ -3792,6 +6104,15 @@
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
},
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -3801,8 +6122,7 @@
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
},
"jsonfile": {
"version": "4.0.0",
@@ -3812,6 +6132,18 @@
"graceful-fs": "4.1.11"
}
},
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "dev": true
+ },
"jsonpointer": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
@@ -3858,6 +6190,162 @@
}
}
},
+ "jszip": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
+ "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==",
+ "dev": true,
+ "requires": {
+ "core-js": "2.3.0",
+ "es6-promise": "3.0.2",
+ "lie": "3.1.1",
+ "pako": "1.0.6",
+ "readable-stream": "2.0.6"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
+ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=",
+ "dev": true
+ },
+ "lie": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
+ "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
+ "dev": true,
+ "requires": {
+ "immediate": "3.0.6"
+ }
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "karma": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.0.tgz",
+ "integrity": "sha512-K9Kjp8CldLyL9ANSUctDyxC7zH3hpqXj/K09qVf06K3T/kXaHtFZ5tQciK7OzQu68FLvI89Na510kqQ2LCbpIw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "body-parser": "1.18.2",
+ "browserify": "14.5.0",
+ "chokidar": "1.7.0",
+ "colors": "1.1.2",
+ "combine-lists": "1.0.1",
+ "connect": "3.6.6",
+ "core-js": "2.5.5",
+ "di": "0.0.1",
+ "dom-serialize": "2.2.1",
+ "expand-braces": "0.1.2",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "http-proxy": "1.16.2",
+ "isbinaryfile": "3.0.2",
+ "lodash": "4.17.5",
+ "log4js": "2.5.3",
+ "mime": "1.4.1",
+ "minimatch": "3.0.4",
+ "optimist": "0.6.1",
+ "qjobs": "1.2.0",
+ "range-parser": "1.2.0",
+ "rimraf": "2.6.2",
+ "safe-buffer": "5.1.1",
+ "socket.io": "2.0.4",
+ "source-map": "0.6.1",
+ "tmp": "0.0.33",
+ "useragent": "2.3.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "karma-chrome-launcher": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+ "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
+ "dev": true,
+ "requires": {
+ "fs-access": "1.0.1",
+ "which": "1.3.0"
+ }
+ },
+ "karma-coverage-istanbul-reporter": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.2.tgz",
+ "integrity": "sha512-sQHexslLF+QHzaKfK8+onTYMyvSwv+p5cDayVxhpEELGa3z0QuB+l0IMsicIkkBNMOJKQaqueiRoW7iuo7lsog==",
+ "dev": true,
+ "requires": {
+ "istanbul-api": "1.3.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "karma-jasmine": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz",
+ "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk="
+ },
+ "karma-jasmine-html-reporter": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz",
+ "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=",
+ "requires": {
+ "karma-jasmine": "1.1.1"
+ }
+ },
+ "karma-sourcemap-loader": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz",
+ "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "karma-webpack": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.0.tgz",
+ "integrity": "sha512-Ja1o9LLoqWaJyUNhTKaXjWiEH9y7a9H3mzP8pYB30SBsgoF5KBS/65NeHFd+QPuT9ITrym8xFt8BZeGbcOfujA==",
+ "dev": true,
+ "requires": {
+ "async": "2.6.0",
+ "babel-runtime": "6.26.0",
+ "loader-utils": "1.1.0",
+ "lodash": "4.17.5",
+ "source-map": "0.5.7",
+ "webpack-dev-middleware": "2.0.6"
+ }
+ },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -3866,6 +6354,25 @@
"is-buffer": "1.1.6"
}
},
+ "labeled-stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "isarray": "2.0.4",
+ "stream-splicer": "2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
+ "dev": true
+ }
+ }
+ },
"lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
@@ -3881,6 +6388,57 @@
"invert-kv": "1.0.0"
}
},
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "lexical-scope": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
+ "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=",
+ "dev": true,
+ "requires": {
+ "astw": "2.2.0"
+ }
+ },
+ "libbase64": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
+ "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=",
+ "dev": true
+ },
+ "libmime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz",
+ "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.4.15",
+ "libbase64": "0.1.0",
+ "libqp": "1.1.0"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+ "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
+ "dev": true
+ }
+ }
+ },
+ "libqp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
+ "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=",
+ "dev": true
+ },
"lie": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.0.2.tgz",
@@ -3921,7 +6479,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
- "dev": true,
"requires": {
"big.js": "3.2.0",
"emojis-list": "2.1.0",
@@ -3981,18 +6538,150 @@
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
+ "dev": true
+ },
"lodash.mergewith": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
"dev": true
},
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2"
+ }
+ },
+ "log4js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.5.3.tgz",
+ "integrity": "sha512-YL/qpTxYtK0iWWbuKCrevDZz5lh+OjyHHD+mICqpjnYGKdNRBvPeh/1uYjkKUemT1CSO4wwLOwphWMpKAnD9kw==",
+ "dev": true,
+ "requires": {
+ "amqplib": "0.5.2",
+ "axios": "0.15.3",
+ "circular-json": "0.5.1",
+ "date-format": "1.2.0",
+ "debug": "3.1.0",
+ "hipchat-notifier": "1.1.0",
+ "loggly": "1.1.1",
+ "mailgun-js": "0.7.15",
+ "nodemailer": "2.7.2",
+ "redis": "2.8.0",
+ "semver": "5.5.0",
+ "slack-node": "0.2.0",
+ "streamroller": "0.7.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "loggly": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz",
+ "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "json-stringify-safe": "5.0.1",
+ "request": "2.75.0",
+ "timespan": "2.3.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz",
+ "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "node-uuid": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
+ "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.75.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz",
+ "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "bl": "1.1.2",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.0.0",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "node-uuid": "1.4.8",
+ "oauth-sign": "0.8.2",
+ "qs": "6.2.3",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3"
+ }
+ }
+ }
+ },
+ "loglevelnext": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.4.tgz",
+ "integrity": "sha512-V3N6LAJAiGwa/zjtvmgs2tyeiCJ23bGNhxXN8R+v7k6TNlSlTz40mIyZYdmO762eBnEFymn0Mhha+WuAhnwMBg==",
+ "dev": true
+ },
"longest": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
"dev": true
},
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
@@ -4003,6 +6692,12 @@
"signal-exit": "3.0.2"
}
},
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
"lru-cache": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
@@ -4013,26 +6708,89 @@
"yallist": "2.1.2"
}
},
- "macos-release": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz",
- "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==",
+ "macos-release": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz",
+ "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==",
+ "dev": true
+ },
+ "magic-string": {
+ "version": "0.22.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "dev": true,
+ "requires": {
+ "vlq": "0.2.3"
+ }
+ },
+ "mailcomposer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz",
+ "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buildmail": "4.0.1",
+ "libmime": "3.0.0"
+ }
+ },
+ "mailgun-js": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.7.15.tgz",
+ "integrity": "sha1-7jZqINrGTDwVwD1sGz4O15UlKrs=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.1.5",
+ "debug": "2.2.0",
+ "form-data": "2.1.4",
+ "inflection": "1.10.0",
+ "is-stream": "1.1.0",
+ "path-proxy": "1.0.0",
+ "proxy-agent": "2.0.0",
+ "q": "1.4.1",
+ "tsscmp": "1.0.5"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.1.5.tgz",
+ "integrity": "sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.5"
+ }
+ },
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "0.7.1"
+ }
+ },
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "make-error": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
+ "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==",
"dev": true
},
- "magic-string": {
- "version": "0.22.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
- "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
- "dev": true,
- "requires": {
- "vlq": "0.2.3"
- }
- },
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
},
"map-obj": {
"version": "1.0.1",
@@ -4044,7 +6802,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
"requires": {
"object-visit": "1.0.1"
}
@@ -4090,7 +6847,6 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
"integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "dev": true,
"requires": {
"errno": "0.1.7",
"readable-stream": "2.3.4"
@@ -4212,7 +6968,6 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
- "dev": true,
"requires": {
"for-in": "1.0.2",
"is-extendable": "1.0.1"
@@ -4222,7 +6977,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
"requires": {
"is-plain-object": "2.0.4"
}
@@ -4244,11 +6998,75 @@
}
}
},
+ "module-deps": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
+ "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.2",
+ "browser-resolve": "1.11.2",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.5.2",
+ "defined": "1.0.0",
+ "detective": "4.7.1",
+ "duplexer2": "0.1.4",
+ "inherits": "2.0.3",
+ "parents": "1.0.1",
+ "readable-stream": "2.3.4",
+ "resolve": "1.5.0",
+ "stream-combiner2": "1.1.1",
+ "subarg": "1.0.0",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "moment": {
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz",
+ "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg=="
+ },
+ "mongo": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/mongo/-/mongo-0.1.0.tgz",
+ "integrity": "sha1-yK8PjfmNSJS3crNzQph8O+zzcYw=",
+ "requires": {
+ "mongodb": "3.0.6"
+ }
+ },
+ "mongodb": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.6.tgz",
+ "integrity": "sha512-nEg7SnzcyobArDTXEqvI1BasY6Z45h1lyBtVMCS9gRTkbtwrDn6WcLRa+MVRYufrJXxQPkAiYJQ94eCUzit0EQ==",
+ "requires": {
+ "mongodb-core": "3.0.6"
+ }
+ },
+ "mongodb-core": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.6.tgz",
+ "integrity": "sha512-EIaEyA4DEft4je4Hfa+CDswKdFhlev9V9o5KJo/nITgG6KNKz5Rxg5ZuMGEjGkMwFkydFQ3Kz0CxZ18AXhRrEg==",
+ "requires": {
+ "bson": "1.0.6",
+ "require_optional": "1.0.1"
+ }
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"nan": {
"version": "2.9.2",
@@ -4259,7 +7077,6 @@
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
"integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
- "dev": true,
"requires": {
"arr-diff": "4.0.0",
"array-unique": "0.3.2",
@@ -4278,20 +7095,17 @@
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
},
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -4307,6 +7121,22 @@
"integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==",
"dev": true
},
+ "netmask": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
+ "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=",
+ "dev": true,
+ "optional": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
"node-gyp": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
@@ -4431,6 +7261,98 @@
}
}
},
+ "nodemailer": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz",
+ "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "libmime": "3.0.0",
+ "mailcomposer": "4.0.1",
+ "nodemailer-direct-transport": "3.3.2",
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-smtp-pool": "2.8.2",
+ "nodemailer-smtp-transport": "2.7.2",
+ "socks": "1.1.9"
+ },
+ "dependencies": {
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true,
+ "optional": true
+ },
+ "socks": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz",
+ "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ip": "1.1.5",
+ "smart-buffer": "1.1.15"
+ }
+ }
+ }
+ },
+ "nodemailer-direct-transport": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz",
+ "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-fetch": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz",
+ "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=",
+ "dev": true
+ },
+ "nodemailer-shared": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz",
+ "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=",
+ "dev": true,
+ "requires": {
+ "nodemailer-fetch": "1.6.0"
+ }
+ },
+ "nodemailer-smtp-pool": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz",
+ "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-wellknown": "0.1.10",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-smtp-transport": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz",
+ "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-wellknown": "0.1.10",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-wellknown": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz",
+ "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=",
+ "dev": true
+ },
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -4487,6 +7409,18 @@
"set-blocking": "2.0.0"
}
},
+ "null-check": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+ "dev": true
+ },
+ "null-loader": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz",
+ "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64=",
+ "dev": true
+ },
"num2fraction": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
@@ -4508,14 +7442,18 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
"dev": true
},
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
"requires": {
"copy-descriptor": "0.1.1",
"define-property": "0.2.5",
@@ -4526,7 +7464,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "0.1.6"
}
@@ -4535,7 +7472,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
}
@@ -4544,7 +7480,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
}
@@ -4553,7 +7488,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "0.1.6",
"is-data-descriptor": "0.1.4",
@@ -4563,8 +7497,7 @@
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
}
@@ -4579,7 +7512,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
"requires": {
"isobject": "3.0.1"
},
@@ -4587,8 +7519,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -4605,7 +7536,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
"requires": {
"isobject": "3.0.1"
},
@@ -4613,8 +7543,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -4636,6 +7565,54 @@
"wrappy": "1.0.2"
}
},
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "options": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+ "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
+ "dev": true
+ },
"os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@@ -4713,12 +7690,71 @@
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
+ "pac-proxy-agent": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz",
+ "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1",
+ "get-uri": "2.0.1",
+ "http-proxy-agent": "1.0.0",
+ "https-proxy-agent": "1.0.0",
+ "pac-resolver": "2.0.0",
+ "raw-body": "2.3.2",
+ "socks-proxy-agent": "2.1.1"
+ }
+ },
+ "pac-resolver": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz",
+ "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "3.0.6",
+ "degenerator": "1.0.4",
+ "ip": "1.0.1",
+ "netmask": "1.0.6",
+ "thunkify": "2.1.2"
+ },
+ "dependencies": {
+ "co": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz",
+ "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
"pako": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
"integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
"dev": true
},
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "dev": true,
+ "requires": {
+ "path-platform": "0.11.15"
+ }
+ },
"parse-asn1": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
@@ -4752,6 +7788,24 @@
"error-ex": "1.3.1"
}
},
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
"parseurl": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
@@ -4761,8 +7815,7 @@
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
},
"path-browserify": {
"version": "0.0.0",
@@ -4790,6 +7843,12 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -4802,6 +7861,31 @@
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
"dev": true
},
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
+ "dev": true
+ },
+ "path-proxy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz",
+ "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "inflection": "1.3.8"
+ },
+ "dependencies": {
+ "inflection": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz",
+ "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
"path-to-regexp": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
@@ -4865,8 +7949,7 @@
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
},
"postcss": {
"version": "6.0.20",
@@ -4893,6 +7976,12 @@
"integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
"dev": true
},
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
"preserve": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
@@ -4914,6 +8003,104 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
},
+ "protractor": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.1.tgz",
+ "integrity": "sha512-AW9qJ0prx2QEMy1gnhJ1Sl1WBQL2R3fx/VnG09FEmWprPIQPK14t0B83OB/pAGddpxiDCAAV0KiNNLf2c2Y/lQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.105",
+ "@types/q": "0.0.32",
+ "@types/selenium-webdriver": "2.53.43",
+ "blocking-proxy": "1.0.1",
+ "chalk": "1.1.3",
+ "glob": "7.1.2",
+ "jasmine": "2.8.0",
+ "jasminewd2": "2.2.0",
+ "optimist": "0.6.1",
+ "q": "1.4.1",
+ "saucelabs": "1.3.0",
+ "selenium-webdriver": "3.6.0",
+ "source-map-support": "0.4.18",
+ "webdriver-js-extender": "1.0.0",
+ "webdriver-manager": "12.0.6"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.105",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.105.tgz",
+ "integrity": "sha512-fMIbw7iw91TSInS3b2DtDse5VaQEZqs0oTjvRNIFHnoHbnji+dLwpzL1L6dYGL39RzDNPHM/Off+VNcMk4ahwQ==",
+ "dev": true
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "jasmine": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz",
+ "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=",
+ "dev": true,
+ "requires": {
+ "exit": "0.1.2",
+ "glob": "7.1.2",
+ "jasmine-core": "2.8.0"
+ }
+ },
+ "jasmine-core": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz",
+ "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "webdriver-manager": {
+ "version": "12.0.6",
+ "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz",
+ "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=",
+ "dev": true,
+ "requires": {
+ "adm-zip": "0.4.7",
+ "chalk": "1.1.3",
+ "del": "2.2.2",
+ "glob": "7.1.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "q": "1.4.1",
+ "request": "2.79.0",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "xml2js": "0.4.19"
+ }
+ }
+ }
+ },
"proxy-addr": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
@@ -4924,6 +8111,32 @@
"ipaddr.js": "1.6.0"
}
},
+ "proxy-agent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz",
+ "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1",
+ "http-proxy-agent": "1.0.0",
+ "https-proxy-agent": "1.0.0",
+ "lru-cache": "2.6.5",
+ "pac-proxy-agent": "1.1.0",
+ "socks-proxy-agent": "2.1.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz",
+ "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
"proxy-middleware": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz",
@@ -4933,8 +8146,7 @@
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
- "dev": true
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
},
"pseudomap": {
"version": "1.0.2",
@@ -4961,6 +8173,18 @@
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
},
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ },
+ "qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true
+ },
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
@@ -5053,6 +8277,15 @@
"unpipe": "1.0.0"
}
},
+ "read-only-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.4"
+ }
+ },
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -5127,11 +8360,43 @@
"strip-indent": "1.0.1"
}
},
+ "redis": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
+ "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "double-ended-queue": "2.1.0-0",
+ "redis-commands": "1.3.5",
+ "redis-parser": "2.6.0"
+ }
+ },
+ "redis-commands": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz",
+ "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==",
+ "dev": true,
+ "optional": true
+ },
+ "redis-parser": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
+ "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
+ "dev": true,
+ "optional": true
+ },
"reflect-metadata": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz",
"integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A=="
},
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
"regex-cache": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
@@ -5144,12 +8409,17 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
"requires": {
"extend-shallow": "3.0.2",
"safe-regex": "1.1.0"
}
},
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -5210,6 +8480,19 @@
}
}
},
+ "requestretry": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz",
+ "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend": "3.0.1",
+ "lodash": "4.17.5",
+ "request": "2.79.0",
+ "when": "3.7.8"
+ }
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -5222,6 +8505,21 @@
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true
},
+ "require_optional": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
+ "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
+ "requires": {
+ "resolve-from": "2.0.0",
+ "semver": "5.5.0"
+ }
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
"resolve": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
@@ -5231,17 +8529,20 @@
"path-parse": "1.0.5"
}
},
+ "resolve-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+ "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
+ },
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
},
"ret": {
"version": "0.1.15",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
},
"right-align": {
"version": "0.1.3",
@@ -5351,7 +8652,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
"requires": {
"ret": "0.1.15"
}
@@ -5368,12 +8668,30 @@
"yargs": "7.1.0"
}
},
+ "saucelabs": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz",
+ "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=",
+ "dev": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true
},
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2"
+ }
+ },
"scss-tokenizer": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -5395,11 +8713,33 @@
}
}
},
+ "selenium-webdriver": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
+ "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==",
+ "dev": true,
+ "requires": {
+ "jszip": "3.1.5",
+ "rimraf": "2.6.2",
+ "tmp": "0.0.30",
+ "xml2js": "0.4.19"
+ },
+ "dependencies": {
+ "tmp": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
+ "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ }
+ }
+ },
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
- "dev": true
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
},
"send": {
"version": "0.16.2",
@@ -5454,7 +8794,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
- "dev": true,
"requires": {
"extend-shallow": "2.0.1",
"is-extendable": "0.1.1",
@@ -5466,7 +8805,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "0.1.1"
}
@@ -5495,6 +8833,16 @@
"safe-buffer": "5.1.1"
}
},
+ "shasum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "0.0.1",
+ "sha.js": "2.4.10"
+ }
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -5510,17 +8858,54 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "0.0.1",
+ "array-map": "0.0.0",
+ "array-reduce": "0.0.0",
+ "jsonify": "0.0.0"
+ }
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
+ "slack-node": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz",
+ "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "requestretry": "1.13.0"
+ }
+ },
+ "smart-buffer": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
+ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
+ "dev": true
+ },
+ "smtp-connection": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz",
+ "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=",
+ "dev": true,
+ "requires": {
+ "httpntlm": "1.6.1",
+ "nodemailer-shared": "1.1.0"
+ }
+ },
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
"requires": {
"base": "0.11.2",
"debug": "2.6.9",
@@ -5536,7 +8921,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "0.1.6"
}
@@ -5545,7 +8929,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "0.1.1"
}
@@ -5554,7 +8937,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -5563,7 +8945,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -5574,7 +8955,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -5583,7 +8963,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -5594,7 +8973,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "0.1.6",
"is-data-descriptor": "0.1.4",
@@ -5604,8 +8982,7 @@
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
},
@@ -5613,7 +8990,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
"requires": {
"define-property": "1.0.0",
"isobject": "3.0.1",
@@ -5624,7 +9000,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
"requires": {
"is-descriptor": "1.0.2"
}
@@ -5632,8 +9007,7 @@
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -5641,7 +9015,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
}
@@ -5655,6 +9028,104 @@
"hoek": "2.16.3"
}
},
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "engine.io": "3.1.5",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "3.1.3"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.6.9",
+ "engine.io-client": "3.1.6",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.1.3",
+ "to-array": "0.1.4"
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
+ "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "has-binary2": "1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "socks": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz",
+ "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=",
+ "dev": true,
+ "requires": {
+ "ip": "1.1.5",
+ "smart-buffer": "1.1.15"
+ },
+ "dependencies": {
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true
+ }
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz",
+ "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "extend": "3.0.1",
+ "socks": "1.1.10"
+ }
+ },
"source-list-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
@@ -5670,7 +9141,6 @@
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
"integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
- "dev": true,
"requires": {
"atob": "2.0.3",
"decode-uri-component": "0.2.0",
@@ -5690,8 +9160,7 @@
"source-map-url": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
},
"spdx-correct": {
"version": "3.0.0",
@@ -5729,7 +9198,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
"requires": {
"extend-shallow": "3.0.2"
}
@@ -5768,7 +9236,6 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
"requires": {
"define-property": "0.2.5",
"object-copy": "0.1.0"
@@ -5778,7 +9245,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "0.1.6"
}
@@ -5787,7 +9253,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -5796,7 +9261,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -5807,7 +9271,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
},
@@ -5816,7 +9279,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "1.1.6"
}
@@ -5827,7 +9289,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "0.1.6",
"is-data-descriptor": "0.1.4",
@@ -5837,8 +9298,7 @@
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
},
@@ -5867,6 +9327,16 @@
"readable-stream": "2.3.4"
}
},
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.4"
+ }
+ },
"stream-http": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz",
@@ -5880,6 +9350,39 @@
"xtend": "4.0.1"
}
},
+ "stream-splicer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
+ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.4"
+ }
+ },
+ "streamroller": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
+ "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
+ "dev": true,
+ "requires": {
+ "date-format": "1.2.0",
+ "debug": "3.1.0",
+ "mkdirp": "0.5.1",
+ "readable-stream": "2.3.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
"string-template": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
@@ -5944,11 +9447,19 @@
"get-stdin": "4.0.1"
}
},
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "dev": true,
+ "requires": {
+ "minimist": "1.2.0"
+ }
+ },
"supports-color": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
"integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "dev": true,
"requires": {
"has-flag": "3.0.0"
}
@@ -5967,11 +9478,19 @@
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
},
+ "syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "1.3.0"
+ }
+ },
"tapable": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
- "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
- "dev": true
+ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI="
},
"tar": {
"version": "2.2.1",
@@ -6021,6 +9540,13 @@
}
}
},
+ "thunkify": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
+ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
+ "dev": true,
+ "optional": true
+ },
"timers-browserify": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz",
@@ -6030,6 +9556,13 @@
"setimmediate": "1.0.5"
}
},
+ "timespan": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+ "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
+ "dev": true,
+ "optional": true
+ },
"tiny-lr": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
@@ -6050,94 +9583,386 @@
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "true-case-path": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
+ "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
+ "dev": true,
+ "requires": {
+ "glob": "6.0.4"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
+ }
+ },
+ "ts-loader": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.5.0.tgz",
+ "integrity": "sha512-JTia3kObhTk36wPFgy0RnkZReiusYx7Le9IhcUWRrCTcFcr6Dy1zGsFd3x8DG4gevlbN65knI8W50FfoykXcng==",
+ "requires": {
+ "chalk": "2.3.2",
+ "enhanced-resolve": "3.4.1",
+ "loader-utils": "1.1.0",
+ "micromatch": "3.1.10",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
}
- }
- }
- },
- "to-arraybuffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": true,
- "requires": {
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "regex-not": "1.0.2",
- "safe-regex": "1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "3.0.0",
- "repeat-string": "1.6.1"
- },
- "dependencies": {
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
"requires": {
"kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
}
}
},
- "tough-cookie": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
- "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
- "dev": true,
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
- "dev": true
- },
- "true-case-path": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
- "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
+ "ts-node": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-5.0.1.tgz",
+ "integrity": "sha512-XK7QmDcNHVmZkVtkiwNDWiERRHPyU8nBqZB1+iv2UhOG0q3RQ9HsZ2CMqISlFbxjrYFGfG2mX7bW4dAyxBVzUw==",
"dev": true,
"requires": {
- "glob": "6.0.4"
+ "arrify": "1.0.1",
+ "chalk": "2.3.2",
+ "diff": "3.5.0",
+ "make-error": "1.3.4",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.5.4",
+ "yn": "2.0.0"
},
"dependencies": {
- "glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz",
+ "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==",
"dev": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "source-map": "0.6.1"
}
}
}
@@ -6197,6 +10022,13 @@
}
}
},
+ "tsscmp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz",
+ "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=",
+ "dev": true,
+ "optional": true
+ },
"tsutils": {
"version": "2.22.2",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz",
@@ -6225,6 +10057,15 @@
"dev": true,
"optional": true
},
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
"type-is": {
"version": "1.6.16",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
@@ -6235,6 +10076,12 @@
"mime-types": "2.1.18"
}
},
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
"typescript": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz",
@@ -6331,11 +10178,22 @@
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
"dev": true
},
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+ "dev": true
+ },
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
"integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
- "dev": true,
"requires": {
"arr-union": "3.1.0",
"get-value": "2.0.6",
@@ -6347,7 +10205,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "0.1.1"
}
@@ -6356,7 +10213,6 @@
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
- "dev": true,
"requires": {
"extend-shallow": "2.0.1",
"is-extendable": "0.1.1",
@@ -6391,7 +10247,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
"requires": {
"has-value": "0.3.1",
"isobject": "3.0.1"
@@ -6401,7 +10256,6 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
"requires": {
"get-value": "2.0.6",
"has-values": "0.1.4",
@@ -6412,7 +10266,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
"requires": {
"isarray": "1.0.0"
}
@@ -6422,14 +10275,12 @@
"has-values": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}
}
},
@@ -6439,11 +10290,16 @@
"integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
"dev": true
},
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
"urix": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
},
"url": {
"version": "0.11.0",
@@ -6463,11 +10319,16 @@
}
}
},
+ "url-join": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz",
+ "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=",
+ "dev": true
+ },
"use": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
"integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
- "dev": true,
"requires": {
"kind-of": "6.0.2"
},
@@ -6475,11 +10336,20 @@
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
+ "useragent": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
+ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.2",
+ "tmp": "0.0.33"
+ }
+ },
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
@@ -6514,6 +10384,13 @@
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
"dev": true
},
+ "uws": {
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
+ "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
+ "dev": true,
+ "optional": true
+ },
"validate-npm-package-license": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
@@ -6564,6 +10441,12 @@
"indexof": "0.0.1"
}
},
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+ "dev": true
+ },
"watchpack": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
@@ -6899,6 +10782,69 @@
}
}
},
+ "webdriver-js-extender": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz",
+ "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=",
+ "dev": true,
+ "requires": {
+ "@types/selenium-webdriver": "2.53.43",
+ "selenium-webdriver": "2.53.3"
+ },
+ "dependencies": {
+ "sax": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
+ "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=",
+ "dev": true
+ },
+ "selenium-webdriver": {
+ "version": "2.53.3",
+ "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz",
+ "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=",
+ "dev": true,
+ "requires": {
+ "adm-zip": "0.4.4",
+ "rimraf": "2.6.2",
+ "tmp": "0.0.24",
+ "ws": "1.1.5",
+ "xml2js": "0.4.4"
+ }
+ },
+ "tmp": {
+ "version": "0.0.24",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
+ "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
+ "dev": true
+ },
+ "ultron": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+ "dev": true
+ },
+ "ws": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
+ "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+ "dev": true,
+ "requires": {
+ "options": "0.0.6",
+ "ultron": "1.0.2"
+ }
+ },
+ "xml2js": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
+ "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
+ "dev": true,
+ "requires": {
+ "sax": "0.6.1",
+ "xmlbuilder": "9.0.7"
+ }
+ }
+ }
+ },
"webpack": {
"version": "3.8.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz",
@@ -7093,6 +11039,41 @@
}
}
},
+ "webpack-dev-middleware": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
+ "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==",
+ "dev": true,
+ "requires": {
+ "loud-rejection": "1.6.0",
+ "memory-fs": "0.4.1",
+ "mime": "2.3.1",
+ "path-is-absolute": "1.0.1",
+ "range-parser": "1.2.0",
+ "url-join": "2.0.5",
+ "webpack-log": "1.2.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-log": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz",
+ "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.2",
+ "log-symbols": "2.2.0",
+ "loglevelnext": "1.0.4",
+ "uuid": "3.2.1"
+ }
+ },
"webpack-sources": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
@@ -7127,6 +11108,13 @@
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
"dev": true
},
+ "when": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+ "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
+ "dev": true,
+ "optional": true
+ },
"which": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
@@ -7215,6 +11203,19 @@
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
"dev": true
},
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
+ "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
+ "dev": true,
+ "optional": true
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
@@ -7278,6 +11279,18 @@
}
}
},
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "yn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+ "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
+ "dev": true
+ },
"zone.js": {
"version": "0.8.18",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.18.tgz",
diff --git a/package.json b/package.json
index e46e06b2..28a438ae 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,13 @@
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint",
"ionic:build": "ionic-app-scripts build",
- "ionic:serve": "ionic-app-scripts serve"
+ "ionic:serve": "ionic-app-scripts serve",
+ "test": "karma start ./test-config/karma.conf.js",
+ "test-ci": "karma start ./test-config/karma.conf.js --single-run",
+ "testcoverage": "karma start ./test-config/karma.conf.js --coverage",
+ "e2e": "npm run e2e-update && npm run e2e-test",
+ "e2e-test": "protractor ./test-config/protractor.conf.js",
+ "e2e-update": "webdriver-manager update --standalone false --gecko false"
},
"dependencies": {
"@angular/common": "5.0.3",
@@ -20,29 +26,62 @@
"@angular/http": "5.0.3",
"@angular/platform-browser": "5.0.3",
"@angular/platform-browser-dynamic": "5.0.3",
+ "@ionic-native/camera": "^4.7.0",
"@ionic-native/core": "4.4.0",
+ "@ionic-native/file": "^4.7.0",
+ "@ionic-native/file-path": "^4.7.0",
+ "@ionic-native/file-transfer": "^4.7.0",
"@ionic-native/keyboard": "^4.5.3",
- "@ionic-native/screen-orientation": "^4.5.3",
+ "@ionic-native/screen-orientation": "^4.7.0",
"@ionic-native/splash-screen": "4.4.0",
"@ionic-native/status-bar": "4.4.0",
"@ionic/storage": "2.1.3",
+ "cordova-browser": "5.0.3",
"cordova-ios": "4.5.4",
- "cordova-plugin-device": "^2.0.1",
+ "cordova-plugin-camera": "^4.0.3",
+ "cordova-plugin-device": "^2.0.2",
+ "cordova-plugin-file": "^6.0.1",
+ "cordova-plugin-file-transfer": "^1.7.1",
+ "cordova-plugin-filepath": "^1.3.0",
"cordova-plugin-ionic-keyboard": "^2.0.5",
- "cordova-plugin-ionic-webview": "^1.1.16",
+ "cordova-plugin-ionic-webview": "^1.2.0",
"cordova-plugin-screen-orientation": "^3.0.1",
"cordova-plugin-splashscreen": "^5.0.2",
"cordova-plugin-whitelist": "^1.3.3",
"fs-extra": "^5.0.0",
+ "interactjs": "^1.3.3",
+ "intl": "^1.2.3",
"ionic-angular": "3.9.2",
"ionic-plugin-keyboard": "^2.2.1",
+ "ionic2-calendar": "^0.4.3",
+ "ionic3-mocks": "^0.11.22",
"ionicons": "3.0.0",
+ "jasmine-core": "^2.99.1",
+ "karma-jasmine-html-reporter": "^0.2.2",
+ "moment": "^2.22.0",
+ "mongo": "^0.1.0",
"rxjs": "5.5.2",
"sw-toolbox": "3.6.0",
+ "ts-loader": "^3.5.0",
"zone.js": "0.8.18"
},
"devDependencies": {
"@ionic/app-scripts": "^3.1.8",
+ "@types/jasmine": "^2.8.6",
+ "@types/node": "^9.6.4",
+ "angular2-template-loader": "^0.6.2",
+ "html-loader": "^0.5.5",
+ "istanbul-instrumenter-loader": "^3.0.1",
+ "jasmine-spec-reporter": "^4.2.1",
+ "karma": "^2.0.0",
+ "karma-chrome-launcher": "^2.2.0",
+ "karma-coverage-istanbul-reporter": "^1.4.2",
+ "karma-jasmine": "^1.1.1",
+ "karma-sourcemap-loader": "^0.3.7",
+ "karma-webpack": "^3.0.0",
+ "null-loader": "^0.1.1",
+ "protractor": "^5.3.1",
+ "ts-node": "^5.0.1",
"typescript": "2.4.2"
},
"description": "An Ionic project",
@@ -54,10 +93,15 @@
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-ionic-webview": {},
- "cordova-plugin-ionic-keyboard": {}
+ "cordova-plugin-ionic-keyboard": {},
+ "cordova-plugin-camera": {},
+ "cordova-plugin-file": {},
+ "cordova-plugin-file-transfer": {},
+ "cordova-plugin-filepath": {}
},
"platforms": [
- "ios"
+ "ios",
+ "browser"
]
}
}
\ No newline at end of file
diff --git a/resources/.DS_Store b/resources/.DS_Store
index 0bffff38..ddc5ea5f 100644
Binary files a/resources/.DS_Store and b/resources/.DS_Store differ
diff --git a/resources/icon.png.md5 b/resources/icon.png.md5
new file mode 100644
index 00000000..3b4fd4f1
--- /dev/null
+++ b/resources/icon.png.md5
@@ -0,0 +1 @@
+3f1bbdf1aefcb5ce7b60770ce907c68f
\ No newline at end of file
diff --git a/resources/ios/icon/icon-1024.png b/resources/ios/icon/icon-1024.png
index bee77667..57a70a85 100644
Binary files a/resources/ios/icon/icon-1024.png and b/resources/ios/icon/icon-1024.png differ
diff --git a/resources/ios/icon/icon-40.png b/resources/ios/icon/icon-40.png
index 76cc53c3..0608f944 100644
Binary files a/resources/ios/icon/icon-40.png and b/resources/ios/icon/icon-40.png differ
diff --git a/resources/ios/icon/icon-40@2x.png b/resources/ios/icon/icon-40@2x.png
index 64b49069..e6fdc839 100644
Binary files a/resources/ios/icon/icon-40@2x.png and b/resources/ios/icon/icon-40@2x.png differ
diff --git a/resources/ios/icon/icon-40@3x.png b/resources/ios/icon/icon-40@3x.png
index 9f8c8f0f..0259c00c 100644
Binary files a/resources/ios/icon/icon-40@3x.png and b/resources/ios/icon/icon-40@3x.png differ
diff --git a/resources/ios/icon/icon-50.png b/resources/ios/icon/icon-50.png
index 8bd51dfd..4edee644 100644
Binary files a/resources/ios/icon/icon-50.png and b/resources/ios/icon/icon-50.png differ
diff --git a/resources/ios/icon/icon-50@2x.png b/resources/ios/icon/icon-50@2x.png
index 2676f8f6..0e9bca3a 100644
Binary files a/resources/ios/icon/icon-50@2x.png and b/resources/ios/icon/icon-50@2x.png differ
diff --git a/resources/ios/icon/icon-60.png b/resources/ios/icon/icon-60.png
index 11f39124..2dccd67d 100644
Binary files a/resources/ios/icon/icon-60.png and b/resources/ios/icon/icon-60.png differ
diff --git a/resources/ios/icon/icon-60@2x.png b/resources/ios/icon/icon-60@2x.png
index b5210482..0259c00c 100644
Binary files a/resources/ios/icon/icon-60@2x.png and b/resources/ios/icon/icon-60@2x.png differ
diff --git a/resources/ios/icon/icon-60@3x.png b/resources/ios/icon/icon-60@3x.png
index dbc83030..c988211c 100644
Binary files a/resources/ios/icon/icon-60@3x.png and b/resources/ios/icon/icon-60@3x.png differ
diff --git a/resources/ios/icon/icon-72.png b/resources/ios/icon/icon-72.png
index 4e5a8276..b6d4a583 100644
Binary files a/resources/ios/icon/icon-72.png and b/resources/ios/icon/icon-72.png differ
diff --git a/resources/ios/icon/icon-72@2x.png b/resources/ios/icon/icon-72@2x.png
index 56fb29e6..969f4c1e 100644
Binary files a/resources/ios/icon/icon-72@2x.png and b/resources/ios/icon/icon-72@2x.png differ
diff --git a/resources/ios/icon/icon-76.png b/resources/ios/icon/icon-76.png
index e66a90ed..7573025e 100644
Binary files a/resources/ios/icon/icon-76.png and b/resources/ios/icon/icon-76.png differ
diff --git a/resources/ios/icon/icon-76@2x.png b/resources/ios/icon/icon-76@2x.png
index 3f5c942f..ebf95ed5 100644
Binary files a/resources/ios/icon/icon-76@2x.png and b/resources/ios/icon/icon-76@2x.png differ
diff --git a/resources/ios/icon/icon-83.5@2x.png b/resources/ios/icon/icon-83.5@2x.png
index 2b367cbc..500a6300 100644
Binary files a/resources/ios/icon/icon-83.5@2x.png and b/resources/ios/icon/icon-83.5@2x.png differ
diff --git a/resources/ios/icon/icon-small.png b/resources/ios/icon/icon-small.png
index de3146dc..db5a755e 100644
Binary files a/resources/ios/icon/icon-small.png and b/resources/ios/icon/icon-small.png differ
diff --git a/resources/ios/icon/icon-small@2x.png b/resources/ios/icon/icon-small@2x.png
index 916a02ec..a716ba48 100644
Binary files a/resources/ios/icon/icon-small@2x.png and b/resources/ios/icon/icon-small@2x.png differ
diff --git a/resources/ios/icon/icon-small@3x.png b/resources/ios/icon/icon-small@3x.png
index 0efa99d8..d0b62ca5 100644
Binary files a/resources/ios/icon/icon-small@3x.png and b/resources/ios/icon/icon-small@3x.png differ
diff --git a/resources/ios/icon/icon.png b/resources/ios/icon/icon.png
index 89f8c00f..2dd0384c 100644
Binary files a/resources/ios/icon/icon.png and b/resources/ios/icon/icon.png differ
diff --git a/resources/ios/icon/icon@2x.png b/resources/ios/icon/icon@2x.png
index a6687a10..55a6bdd3 100644
Binary files a/resources/ios/icon/icon@2x.png and b/resources/ios/icon/icon@2x.png differ
diff --git a/resources/ios/splash/Default-568h@2x~iphone.png b/resources/ios/splash/Default-568h@2x~iphone.png
index d2128a63..cf26e3b4 100644
Binary files a/resources/ios/splash/Default-568h@2x~iphone.png and b/resources/ios/splash/Default-568h@2x~iphone.png differ
diff --git a/resources/ios/splash/Default-667h.png b/resources/ios/splash/Default-667h.png
index fc23e64c..46bae0d6 100644
Binary files a/resources/ios/splash/Default-667h.png and b/resources/ios/splash/Default-667h.png differ
diff --git a/resources/ios/splash/Default-736h.png b/resources/ios/splash/Default-736h.png
index 71b16ca4..67ce2771 100644
Binary files a/resources/ios/splash/Default-736h.png and b/resources/ios/splash/Default-736h.png differ
diff --git a/resources/ios/splash/Default-Landscape-736h.png b/resources/ios/splash/Default-Landscape-736h.png
index aaff74ad..6da3540b 100644
Binary files a/resources/ios/splash/Default-Landscape-736h.png and b/resources/ios/splash/Default-Landscape-736h.png differ
diff --git a/resources/ios/splash/Default-Landscape@2x~ipad.png b/resources/ios/splash/Default-Landscape@2x~ipad.png
index 19770a2c..f7e1e41d 100644
Binary files a/resources/ios/splash/Default-Landscape@2x~ipad.png and b/resources/ios/splash/Default-Landscape@2x~ipad.png differ
diff --git a/resources/ios/splash/Default-Landscape@~ipadpro.png b/resources/ios/splash/Default-Landscape@~ipadpro.png
index 64382323..e38de458 100644
Binary files a/resources/ios/splash/Default-Landscape@~ipadpro.png and b/resources/ios/splash/Default-Landscape@~ipadpro.png differ
diff --git a/resources/ios/splash/Default-Landscape~ipad.png b/resources/ios/splash/Default-Landscape~ipad.png
index 6fe89255..a7818280 100644
Binary files a/resources/ios/splash/Default-Landscape~ipad.png and b/resources/ios/splash/Default-Landscape~ipad.png differ
diff --git a/resources/ios/splash/Default-Portrait@2x~ipad.png b/resources/ios/splash/Default-Portrait@2x~ipad.png
index 3d06d86d..fa22a57e 100644
Binary files a/resources/ios/splash/Default-Portrait@2x~ipad.png and b/resources/ios/splash/Default-Portrait@2x~ipad.png differ
diff --git a/resources/ios/splash/Default-Portrait@~ipadpro.png b/resources/ios/splash/Default-Portrait@~ipadpro.png
index a3704197..c24147a5 100644
Binary files a/resources/ios/splash/Default-Portrait@~ipadpro.png and b/resources/ios/splash/Default-Portrait@~ipadpro.png differ
diff --git a/resources/ios/splash/Default-Portrait~ipad.png b/resources/ios/splash/Default-Portrait~ipad.png
index 53ad4c4c..ad43464a 100644
Binary files a/resources/ios/splash/Default-Portrait~ipad.png and b/resources/ios/splash/Default-Portrait~ipad.png differ
diff --git a/resources/ios/splash/Default@2x~iphone.png b/resources/ios/splash/Default@2x~iphone.png
index 6a133168..2059c536 100644
Binary files a/resources/ios/splash/Default@2x~iphone.png and b/resources/ios/splash/Default@2x~iphone.png differ
diff --git a/resources/ios/splash/Default@2x~universal~anyany.png b/resources/ios/splash/Default@2x~universal~anyany.png
index 960cb82a..070af1a9 100644
Binary files a/resources/ios/splash/Default@2x~universal~anyany.png and b/resources/ios/splash/Default@2x~universal~anyany.png differ
diff --git a/resources/ios/splash/Default~iphone.png b/resources/ios/splash/Default~iphone.png
index 0aaad62b..6d16cb17 100644
Binary files a/resources/ios/splash/Default~iphone.png and b/resources/ios/splash/Default~iphone.png differ
diff --git a/resources/splash.png.md5 b/resources/splash.png.md5
new file mode 100644
index 00000000..a9a26386
--- /dev/null
+++ b/resources/splash.png.md5
@@ -0,0 +1 @@
+2412a8324a656ec5993eb50b3b293c69
\ No newline at end of file
diff --git a/src/.DS_Store b/src/.DS_Store
index 099cc6af..e2f21cdc 100644
Binary files a/src/.DS_Store and b/src/.DS_Store differ
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
new file mode 100644
index 00000000..8b74a2bf
--- /dev/null
+++ b/src/app/app.component.spec.ts
@@ -0,0 +1,58 @@
+import { async, TestBed } from '@angular/core/testing';
+import { IonicModule, Platform } from 'ionic-angular';
+
+import { StatusBar } from '@ionic-native/status-bar';
+import { SplashScreen } from '@ionic-native/splash-screen';
+
+import { MyApp } from './app.component';
+import { LoginPage } from '../pages/login/login';
+import {
+ PlatformMock,
+ StatusBarMock,
+ SplashScreenMock
+} from '../../test-config/mocks-ionic';
+
+describe('MyApp Component', () => {
+ let fixture;
+ let component;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [MyApp],
+ imports: [
+ IonicModule.forRoot(MyApp)
+ ],
+ providers: [
+ { provide: StatusBar, useClass: StatusBarMock },
+ { provide: SplashScreen, useClass: SplashScreenMock },
+ { provide: Platform, useClass: PlatformMock }
+ ]
+ })
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MyApp);
+ component = fixture.componentInstance;
+ });
+
+ afterEach(() => {
+ fixture.destroy();
+ component = null;
+ });
+
+ it('is created', () => {
+ expect(fixture).toBeTruthy();
+ expect(component).toBeTruthy();
+ });
+ it('initialises with a root page of LoginPage', () => {
+ expect(component['rootPage']).toBe(LoginPage);
+ });
+ it('should be created', () => {
+ expect(component instanceof MyApp).toBe(true);
+ });
+ it('should have test value 777', () => {
+ expect(component['testvalue']).toBe(777);
+ //console.log(component['testvalue']);
+ });
+
+});
\ No newline at end of file
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 337acb9b..2cd47bb8 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
+import { ScreenOrientation } from '@ionic-native/screen-orientation';
import { LoginPage } from '../pages/login/login';
@@ -10,8 +11,13 @@ import { LoginPage } from '../pages/login/login';
})
export class MyApp {
rootPage:any = LoginPage;
+ testvalue:number = 777;
+
+ constructor(platform: Platform,
+ statusBar: StatusBar,
+ splashScreen: SplashScreen,
+ private screenOrientation: ScreenOrientation) {
- constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
@@ -22,7 +28,11 @@ export class MyApp {
statusBar.hide();
statusBar.backgroundColorByHexString('#ffffff');
});
-
+
+ if (platform.is('ios')) {
+ this.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.LANDSCAPE);
+ }
+
splashScreen.hide();
});
}
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 0c5a70a4..13bb7c80 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -5,81 +5,119 @@ import { MyApp } from './app.component';
import { ScreenOrientation } from '@ionic-native/screen-orientation';
import { LoginPage } from '../pages/login/login';
-import { CreateUserPage } from '../pages/login/create-user/create-user';
+import { CreateUserPage, SelectRestaurant } from '../pages/login/create-user';
+import { CreateRestaurantPage } from '../pages/login/create-restaurant';
import { TabsPage } from '../pages/tabs/tabs';
-import { TablesPage, TableInfo, PartyInfo, NumToSeat } from '../pages/tables/tables';
-import { AddPartyPage, Numpad } from '../pages/tables/add-party/add-party';
+import { TablesPage, TableInfo, PartyInfo, SelectServer } from '../pages/tables/tables';
+import { AddPartyPage } from '../pages/tables/add-party';
+
import { EmployeesPage, PunchPopoverPage } from '../pages/employees/employees';
+import { EditEmployeePage, TitleSelector } from '../pages/employees/edit-employee';
+
import { TimePunchPage } from '../pages/timepunch/timepunch';
-import { PunchCardPage } from '../pages/punchcard/punchcard';
+import { PunchCardPage, SelectEmployee } from '../pages/punchcard/punchcard';
+
import { CalendarPage } from '../pages/calendar/calendar';
+
import { ManagementPage } from '../pages/management/management';
-import { EditEmployeePage } from '../pages/edit-employee/edit-employee';
+import { UpdateManagementPage } from '../pages/management/update-management';
+
+import { DateTimeService } from '../pages/util/date-time';
+import { InputNumpad } from '../pages/util/numpad';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
-import { CreateEmployeePage } from '../pages/create-employee/create-employee';
+
+import { NgCalendarModule } from 'ionic2-calendar';
+
+import { FileTransfer, FileUploadOptions, FileTransferObject } from '@ionic-native/file-transfer';
+import { File } from '@ionic-native/file';
+import { Camera } from '@ionic-native/camera';
@NgModule({
declarations: [
MyApp,
+
LoginPage,
CreateUserPage,
+ SelectRestaurant,
+ CreateRestaurantPage,
TablesPage,
TableInfo,
PartyInfo,
- NumToSeat,
+ SelectServer,
AddPartyPage,
- Numpad,
EmployeesPage,
+ EditEmployeePage,
+ TitleSelector,
+ PunchPopoverPage,
TimePunchPage,
PunchCardPage,
+ SelectEmployee,
+
CalendarPage,
+
ManagementPage,
+ UpdateManagementPage,
TabsPage,
- EditEmployeePage,
- CreateEmployeePage,
- PunchPopoverPage
+
+ InputNumpad
],
imports: [
BrowserModule,
- IonicModule.forRoot(MyApp)
+ IonicModule.forRoot(MyApp),
+ NgCalendarModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
+
LoginPage,
CreateUserPage,
+ SelectRestaurant,
+ CreateRestaurantPage,
TablesPage,
TableInfo,
PartyInfo,
- NumToSeat,
+ SelectServer,
AddPartyPage,
- Numpad,
EmployeesPage,
+ EditEmployeePage,
+ TitleSelector,
+ PunchPopoverPage,
+
TimePunchPage,
PunchCardPage,
+ SelectEmployee,
+
CalendarPage,
+
ManagementPage,
+ UpdateManagementPage,
TabsPage,
- EditEmployeePage,
- CreateEmployeePage,
- PunchPopoverPage
+
+ InputNumpad
],
providers: [
StatusBar,
SplashScreen,
ScreenOrientation,
- {provide: ErrorHandler, useClass: IonicErrorHandler}
+ DateTimeService,
+ {provide: ErrorHandler, useClass: IonicErrorHandler},
+ FileTransfer,
+ //FileUploadOptions, //commented b/c kept causing errors
+ FileTransferObject,
+ File,
+ Camera
]
})
export class AppModule {}
diff --git a/src/app/app.scss b/src/app/app.scss
index 59f22595..cd5a3995 100644
--- a/src/app/app.scss
+++ b/src/app/app.scss
@@ -17,160 +17,425 @@
.md, .ios, .wp {
- // MAIN TITLE STYLING
- .maintitle {
- color: color($colors, primary);
- padding-bottom: 10px;
- font-size: 70px;
- font-weight: 500;
- }
-
- // SUBTITLE STYLING
- .subtitle {
- color: color($colors, primary);
- padding-bottom: 5px;
- font-size: 45px;
- font-weight: 475;
- }
-
- // SUBSUBTITLE STYLING
- .subsubtitle {
- color: color($colors, primary);
- padding-bottom: 5px;
- font-size: 35px;
- font-weight: 450;
- }
-
- // HEADER STYLING
- .header {
- color: color($colors, medium);
- font-size: 30px;
- font-weight: 450;
- }
-
- // Regular Text STYLING
- .regularText {
- color: color($colors, medium);
- font-size: 24px;
- font-weight: 350;
- }
-
- // small Text STYLING
- .smalltext {
- //color: color($colors, medium);
- font-size: 16px;
- font-weight: 500;
- }
-
- .background {
- background-color: color($colors, darkest);
- width: 100%;
- height: 100%;
- }
+ .background {
+ background-color: color($colors, darkest);
+ width: 100%;
+ height: 100%;
+ }
+
+ /*ion-header {
+ background-color: color($colors, primary);
+ }*/
+
+//------------------------------------------------------------------------------
+// TEXT STYLING
+//------------------------------------------------------------------------------
+
+ h1 {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ padding-all: 0px;
+ font-size: 70px;
+ font-weight: 500;
+ }
+
+ h2 {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 42px;
+ font-weight: 500;
+ }
+
+ h3 {
+ margin-top: 12px;
+ margin-bottom: 12px;
+ font-size: 32px;
+ font-weight: 500;
+ }
+
+ h4 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-size: 26px;
+ font-weight: 500;
+ }
+
+ h5 {
+ margin-top: 8px;
+ margin-bottom: 8px;
+ font-size: 22px;
+ font-weight: 500;
+ }
+
+ h6 {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ font-size: 16px;
+ font-weight: 500;
+ }
+
+ .colorprimary {
+ color: color($colors, primary);
+ }
+
+ .colormiddark {
+ color: color($colors, middark);
+ }
+
+ .colormedium {
+ color: color($colors, medium);
+ }
+
+ .colordark {
+ color: color($colors, dark);
+ }
+
+ .colordarker {
+ color: color($colors, darker);
+ }
+
+ .colorsecondary {
+ color: color($colors, secondary);
+ }
- // TEXT INPUT BOX Styling
- .inputfield {
- border: 2px solid color($colors, primary);
- background-color: color($colors, darkest);
+//------------------------------------------------------------------------------
+// MODAL STYLING
+//------------------------------------------------------------------------------
+
+ .modalbase {
+ //background-color: color($colors, dark);
+ padding-top: 20px;
+ padding-bottom: 20px;
+ padding-left: 30px;
+ padding-right: 30px;
+ border-radius: 5px;
+ //border: solid 1px;
+ //border-color: color($colors, darker);
+ //background-color: transparent;
+ backdrop-filter: blur(10px) brightness(1.25) saturate(125%);
+ background-color: rgba(color($colors, dark), 0.5);
+ }
+
+ .modalbutton {
+ margin-top: 20px;
+ }
+
+ .modalbuttonprimary[outline] {
+ background-color: rgba(color($colors, darker), 0.5);
+ }
+ .modalbuttonprimary[outline].activated {
+ background-color: color($colors, primary);
+ color: color($colors, darker);
+ }
+
+ .numpadmodal {
+ height: 100%;
+ width: 55%;
+ margin: auto;
+ }
+
+ .numpad {
+ table-layout: fixed;
+ border-radius: 5px;
+ width: 100%;
+ height: 100%;
+ }
+
+ .numpadrow {
+ height: 25%;
+ width: 100%;
+ }
+
+ .numkey {
+ width: 99%;
+ height: 100%;
+ font-size: 28px;
+ font-weight: 600;
+ border-radius: 5px;
+ margin: 0px;
+ }
+
+ .localbutton, .modalbutton {
+ font-size: 15px;
+ font-weight: 475;
+ }
+
+ .modallist {
+ width: 100%;
+ height: 65%;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ background-color: transparent;
+ }
+
+ .modallisttitle {
+ width: 100%;
+ height: 60%;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ background-color: transparent;
+ }
+
+ .modallist3buttons {
width: 100%;
- height: 50px;
- margin: 20px auto;
- border-radius: 3px;
- font-size: 15px;
- font-weight: 475;
- }
-
- .modalbase {
- background-color: color($colors, dark);
- padding-top: 15px;
- padding-bottom: 2px;
- padding-left: 30px;
- padding-right: 30px;
- border-radius: 5px;
-
- }
-
- .modalbutton {
- margin-top: 20px;
- font-size: 15px;
- font-weight: 475;
- }
-
- .numpad {
- table-layout: fixed;
- border-radius: 5px;
+ height: 55%;
+ margin-top: 15px;
margin-bottom: 15px;
- width: 100%;
- height: 100%;
- }
-
- .numkey {
- width: 98%;
- height: 100%;
- font-size: 28px;
- font-weight: 600;
- border-radius: 5px;
- margin: 0px;
- }
-
- .localbutton {
- font-size: 15px;
- font-weight: 475;
- }
-
- // Tab styling, darkens when selected
- .tabs-ios .tab-button[aria-selected=true] {
- background-color: color($colors, darkest);
- }
-
- .picker-wrapper {
- border-radius: 3px;
- border-color: color($colors, dark);
- border-width: 0px;
- .picker-opt{
- color: color($colors, medium);
- }
- .picker-opt-selected {
- color: color($colors, primary);
- }
- }
-
- .item-checkbox {
- border: solid 2px;
- border-radius: 3px;
- border-color: color($colors, primary);
- background-color: color($colors, darkest);
- .checkbox-icon {
- border: solid 1px;
- border-radius: 3px;
- border-color: color($colors, primary);
- background-color: color($colors, darkest);
- }
- .checkbox-checked {
- background-color: color($colors, primary);
- }
- }
-
- .datetime {
- .datetime-placeholder {
- color: color($colors, middark);
- }
- // Color for selected datetime
- color: color($colors, primary);
- }
-
- // Checkbox inner
- .item-checkbox {
- .item-inner {
- color: color($colors, primary);
- }
- }
- // Changes color of text in text input box
- .text-input {
- color: color($colors, primary);
- }
- // Changes color of placeholder in text input box
- .text-input::-webkit-input-placeholder {
- color: color($colors, middark);
- }
+ background-color: transparent;
+ }
+
+ .listbutton {
+ padding-left: 10px;
+ margin: 0px;
+ border-radius: 0px;
+ border-top: 0px;
+ border-right: 0px;
+ border-left: 0px;
+ border-bottom: solid 0.7px;
+ border-radius: 2px;
+ border-color: color($colors, middark);
+ font-size: 15px;
+ font-weight: 450;
+
+ .button-inner{
+ justify-content: flex-start;
+ }
+ }
+
+ .listbutton[outline] {
+ background-color: transparent;
+ }
+ .listbutton[outline].activated {
+ background-color: color($colors, primary);
+ }
+
+ .redbutton {
+ border-color: color($colors, secondary);
+ color: color($colors, secondary);
+ }
+ .redbutton.activated {
+ color: color($colors, darker);
+ background-color: color($colors, secondary);
+ }
+
+ .dangerbutton {
+ color: color($colors, darker);
+ background-color: color($colors, secondary);
+ }
+ .dangerbutton.activated {
+ color: color($colors, secondary);
+ background-color: color($colors, darkest);
+ border-color: color($colors, secondary);
+ border-width: 2px;
+ border-style: solid;
+ }
+
+ .xbutton {
+ float: left;
+ width: 27px;
+ height: 27px;
+ .button-inner {
+ font-size: 20px;
+ font-weight: 550;
+ padding-bottom: 3px;
+ }
+ margin-top: 0px !important;
+ margin-bottom: 0px !important;
+ margin-right: 0px !important;
+ color: color($colors, middark);
+ background-color: transparent;
+ }
+
+ .xbutton.activated {
+ background-color: color($colors, primary);
+ color: color($colors, darker);
+ }
+
+
+//------------------------------------------------------------------------------
+// USER INPUT FIELDS STYLING
+//------------------------------------------------------------------------------
+
+ .timeselect, .timeselecterror {
+ margin-top: 10px;
+ padding-left: 0px;
+ border-style: solid;
+ border-radius: 2px;
+ border-width: 2px;
+ font-size: 15px;
+ font-weight: 475;
+ background-color: color($colors, darkest);
+ }
+
+ .timeselect {
+ border-color: color($colors, primary);
+ }
+ .timeselecterror {
+ border-color: color($colors, secondary);
+ .datetime-text {
+ color: color($colors, secondary);
+ }
+ }
+
+ // TEXT INPUT BOX Styling
+ .inputfield, .inputfielderror {
+ border: 2px solid;
+ background-color: color($colors, darkest);
+ width: 100%;
+ height: 50px;
+ margin: 20px auto;
+ border-radius: 3px;
+ font-size: 15px;
+ font-weight: 475;
+ //padding-left: 15px;
+
+ // Changes color of placeholder in text input box
+ .text-input::-webkit-input-placeholder {
+ color: color($colors, middark);
+ }
+ }
+
+ .inputfield {
+ border-color: color($colors, primary);
+ // Changes color of text in text input box
+ .text-input {
+ color: color($colors, primary);
+ }
+ }
+
+ .inputfielderror {
+ border-color: color($colors, secondary);
+ // Changes color of text in text input box
+ .text-input {
+ color: color($colors, secondary);
+ }
+ }
+
+ .inputbutton {
+ margin-bottom: 20px;
+ height: 50px;
+ font-size: 15px;
+ font-weight: 475;
+ .button-inner {
+ justify-content:flex-start;
+ }
+ }
+
+ .inputbuttonnoval {
+ .button-inner {
+ color: color($colors, middark);
+ }
+ }
+ .inputbuttonhasval {
+ .button-inner {
+ color: color($colors, primary);
+ }
+ }
+ .inputbuttonhasval.activated, .inputbuttonnoval.activated {
+ .button-inner {
+ color: color($colors, darkest);
+ }
+ }
+
+ .numpadinput, .numpadinputhasval {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ }
+
+ // Tab styling, darkens when selected, unused
+ .tabs-ios .tab-button[aria-selected=true] {
+ //background-color: color($colors, darkest);
+ }
+
+ .picker-wrapper {
+ border-radius: 3px;
+ border-width: 0px;
+ color: color($colors, dark) !important;
+ background-color: color($colors, dark) !important;
+ .picker-toolbar, .picker-columns {
+ //backdrop-filter: blur(15px) brightness(1.25) saturate(125%);
+ //background-color: rgba(color($colors, middark), 0.05);
+ background-color: color($colors, dark) !important;
+
+ .picker-col, .picker-opts-left, .picker-opts-right {
+ background-color: color($colors, dark) !important;
+ }
+ }
+ .picker-opt{
+ color: color($colors, medium);
+ }
+ .picker-opt-selected {
+ color: color($colors, primary);
+ }
+ }
+
+ .item-checkbox {
+ border: solid 2px;
+ border-radius: 3px;
+ border-color: color($colors, primary);
+ background-color: color($colors, darkest);
+ .checkbox-icon {
+ border: solid 1px;
+ border-radius: 3px;
+ border-color: color($colors, primary);
+ background-color: color($colors, darkest);
+ }
+ .checkbox-checked {
+ background-color: color($colors, primary);
+ .checkbox-inner {
+ border-color: color($colors, darkest);
+ }
+ }
+ }
+
+ .datetime {
+ .datetime-placeholder {
+ color: color($colors, middark);
+ }
+ // Color for selected datetime
+ color: color($colors, primary);
+ }
+
+ // Checkbox inner
+ .item-checkbox {
+ .item-inner {
+ color: color($colors, primary);
+ }
+ }
+
+ .alert-wrapper {
+ backdrop-filter: blur(15px) brightness(1.25) saturate(125%);
+ background-color: rgba(color($colors, middark), 0.1);
+ }
+
+ .alert-ios {
+ .alert-title {
+ color: color($colors, medium);
+ font-size: 20px;
+ font-weight: 500;
+ }
+ .alert-message {
+ color: color($colors, middark);
+ font-size: 16px;
+ font-weight: 500;
+ }
+ }
+
+ .action-sheet-group, .action-sheet-group-cancel {
+ backdrop-filter: blur(15px) brightness(1.25) saturate(125%);
+ background-color: rgba(color($colors, medium), 0.1);
+ }
+
+ .action-sheet-button {
+ color: color($colors, primary);
+ }
+
+ .action-sheet-cancel {
+ color: color($colors, secondary);
+ background-color: transparent;
+ }
+
+ .no-scroll .scroll-content {
+ overflow: hidden;
+ }
}
\ No newline at end of file
diff --git a/src/assets/imgs/dinein_logo.png b/src/assets/imgs/dinein_logo.png
new file mode 100644
index 00000000..46d1d89e
Binary files /dev/null and b/src/assets/imgs/dinein_logo.png differ
diff --git a/src/assets/imgs/mikefass.jpg b/src/assets/imgs/mikefass.jpg
new file mode 100644
index 00000000..d9c3d73e
Binary files /dev/null and b/src/assets/imgs/mikefass.jpg differ
diff --git a/src/pages/calendar/calendar.html b/src/pages/calendar/calendar.html
index fe6f5414..40f3c7b7 100644
--- a/src/pages/calendar/calendar.html
+++ b/src/pages/calendar/calendar.html
@@ -1,19 +1,27 @@
-
- Calendar
-
+
+
+
-
-
+
+ {{ viewTitle }}
+
-
+
+
+
+
-
-
+
-
-
+
+
+
+
diff --git a/src/pages/calendar/calendar.scss b/src/pages/calendar/calendar.scss
index 543e0449..55572e89 100644
--- a/src/pages/calendar/calendar.scss
+++ b/src/pages/calendar/calendar.scss
@@ -15,7 +15,32 @@ page-calendar {
}
#container {
- float: bottom;
+ //float: bottom;
+ display: flex;
+
}
+ .alertCSS {
+ background-color: black;
+ width: 500px;
+ height: auto;
+ }
+
+ .top-nav {
+ display: flex;
+ justify-content: space-around;
+ }
+
+ .month-view {
+ float: left;
+ }
+
+ .event-view {
+ float: right;
+ }
+
+
+
+
+
}
diff --git a/src/pages/calendar/calendar.ts b/src/pages/calendar/calendar.ts
index de46ee76..f8bf94d1 100644
--- a/src/pages/calendar/calendar.ts
+++ b/src/pages/calendar/calendar.ts
@@ -1,17 +1,89 @@
import { Component } from '@angular/core';
-import { NavController } from 'ionic-angular';
+import { NavController, ModalController, AlertController } from 'ionic-angular';
+import * as moment from 'moment';
@Component({
- selector: 'page-calendar',
- templateUrl: 'calendar.html'
+ selector: 'page-calendar',
+ templateUrl: 'calendar.html'
})
export class CalendarPage {
+ eventSource = [];
+ viewTitle: string;
+ selectedDay = new Date();
- constructor(public navCtrl: NavController) {
+ calendar = {
+ mode: 'month',
+ currentDate: new Date()
+ };
- }
+ constructor(public navCtrl: NavController, private modalCtrl: ModalController, private alertCtrl: AlertController) { }
- executeLogout() {
- this.navCtrl.parent.parent.pop(this);
- }
+ addEvent() {
+ let modal = this.modalCtrl.create('EventModalPage', { selectedDay: this.selectedDay });
+ modal.present();
+ modal.onDidDismiss(data => {
+ if (data) {
+ let eventData = data;
+
+ eventData.startTime = new Date(data.startTime);
+ eventData.endTime = new Date(data.endTime);
+
+ let events = this.eventSource;
+ events.push(eventData);
+ this.eventSource = [];
+ setTimeout(() => {
+ this.eventSource = events;
+ });
+ }
+ });
+ }
+
+
+ // not sure how to do this
+ editEvent(event) {
+ let modal = this.modalCtrl.create('EditEventPage', {event : event, events : this.eventSource});
+
+ modal.present();
+
+ modal.onDidDismiss(data => {
+ if (data) {
+ //delete the event passed back
+ this.eventSource = this.eventSource.filter(e => e !== event);
+ }
+ })
+
+ }
+
+ goToToday() {
+ this.calendar.currentDate = new Date();
+ }
+
+ onViewTitleChanged(title) {
+ this.viewTitle = title;
+ }
+
+ onEventSelected(event) {
+ let start = moment(event.startTime).format('LLLL');
+ let end = moment(event.endTime).format('LLLL');
+
+ let alert = this.alertCtrl.create({
+ title: '' + event.title,
+ subTitle: 'From: ' + start + '
To: ' + end + '
Organizer: ' + event.organizer,
+ message: 'Description: ' + event.description,
+ buttons: ['OK',
+ {
+ text: 'Edit',
+ handler: () => {
+ this.editEvent(event);
+ },
+ }
+ ],
+ cssClass: 'alertCSS'
+ })
+ alert.present();
+ }
+
+ onTimeSelected(ev) {
+ this.selectedDay = ev.selectedTime;
+ }
}
diff --git a/src/pages/create-employee/create-employee.html b/src/pages/create-employee/create-employee.html
deleted file mode 100644
index b686051e..00000000
--- a/src/pages/create-employee/create-employee.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
- Image src
-
-
-
-
- First Name
-
-
-
-
- Last Name
-
-
-
-
- ID
-
-
-
-
- Title
-
-
-
-
- Pay
-
-
-
-
- Phone
-
-
-
-
-
-
diff --git a/src/pages/create-employee/create-employee.module.ts b/src/pages/create-employee/create-employee.module.ts
deleted file mode 100644
index a7e9f203..00000000
--- a/src/pages/create-employee/create-employee.module.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { NgModule } from '@angular/core';
-import { IonicPageModule } from 'ionic-angular';
-import { CreateEmployeePage } from './create-employee';
-
-@NgModule({
- declarations: [
- CreateEmployeePage,
- ],
- imports: [
- IonicPageModule.forChild(CreateEmployeePage),
- ],
-})
-export class CreateEmployeePageModule {}
diff --git a/src/pages/create-employee/create-employee.scss b/src/pages/create-employee/create-employee.scss
deleted file mode 100644
index e9a73e15..00000000
--- a/src/pages/create-employee/create-employee.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-page-create-employee {
-
-}
diff --git a/src/pages/create-employee/create-employee.ts b/src/pages/create-employee/create-employee.ts
deleted file mode 100644
index dd5c4a3a..00000000
--- a/src/pages/create-employee/create-employee.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Component } from '@angular/core';
-import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';
-import { Employee, EmployeesPage } from '../employees/employees';
-
-/**
- * Generated class for the CreateEmployeePage page.
- *
- * See https://ionicframework.com/docs/components/#navigation for more info on
- * Ionic pages and navigation.
- */
-
-@IonicPage()
-@Component({
- selector: 'page-create-employee',
- templateUrl: 'create-employee.html',
-})
-export class CreateEmployeePage {
- firstName: string;
- lastName: string;
- ID: string;
- phone: string;
- pay: string;
- src: string;
- title: string;
-
- employees: Array;
-
- constructor(public navCtrl: NavController, public navParams: NavParams, public alertCtrl: AlertController) {
- this.employees = navParams.get("employees");
- this.firstName="";
- this.lastName="";
- this.ID="";
- this.phone="";
- this.pay="";
- this.src="";
- this.title="";
-
- }
-
- createAndExit(){
- let employeesPage = new EmployeesPage(null, null);
- this.employees.push(new Employee(this.firstName, this.lastName, this.ID, this.title, this.pay, this.phone, this.src));
- this.employees.sort(employeesPage.sortByLastName);
-
- let alert = this.alertCtrl.create({
- title: 'Employee Successfully Created',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'OK',
- handler: () => {
- this.navCtrl.pop();
- }
- }
- ]
- });
- alert.present();
-
-
- }
-
- confirmExit() {
- let confirm = this.alertCtrl.create({
- title: 'Exit without saving?',
- message: 'Are you sure you want to exit without saving your changes? This EMPLOYEE PROFILE WILL NOT BE CREATED.',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => {
- //do nothing
- }
- },
- {
- text: 'Exit',
- handler: () => {
- this.navCtrl.pop();
- }
- }
- ]
- });
- confirm.present();
- }
-
- ionViewDidLoad() {
- console.log('ionViewDidLoad CreateEmployeePage');
- }
-
-}
diff --git a/src/pages/edit-employee/edit-employee.html b/src/pages/edit-employee/edit-employee.html
deleted file mode 100644
index fefbb288..00000000
--- a/src/pages/edit-employee/edit-employee.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
- Image src
-
-
-
-
- First Name
-
-
-
-
- Last Name
-
-
-
-
- ID
-
-
-
-
- Title
-
-
-
-
- Pay
-
-
-
-
- Phone
-
-
-
-
-
-
-
diff --git a/src/pages/edit-employee/edit-employee.scss b/src/pages/edit-employee/edit-employee.scss
deleted file mode 100644
index 598b4b91..00000000
--- a/src/pages/edit-employee/edit-employee.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-page-edit-employee {
-
- .no-scroll .scroll-content{
- overflow: hidden;
- }
-
-
-
-
-
-}
diff --git a/src/pages/edit-employee/edit-employee.ts b/src/pages/edit-employee/edit-employee.ts
deleted file mode 100644
index e54617cd..00000000
--- a/src/pages/edit-employee/edit-employee.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { Component } from '@angular/core';
-import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';
-import { EmployeesPage, Employee } from '../employees/employees';
-
-/**
- * Generated class for the EditEmployeePage page.
- *
- * See https://ionicframework.com/docs/components/#navigation for more info on
- * Ionic pages and navigation.
- */
-
-@IonicPage()
-@Component({
- selector: 'page-edit-employee',
- templateUrl: 'edit-employee.html',
-})
-export class EditEmployeePage {
-
- selectedEmployee: Employee;
- employees: Array;
- employeePage: any;
- newTitle: string;
- newID: string;
- newPay: string;
- newPhone: string;
- newFirstName: string;
- newLastName: string;
- newSrc: string;
-
-
- constructor(public navCtrl: NavController, public navParams: NavParams, public alertCtrl: AlertController) {
- this.employeePage = navParams.get('employeesPage');
- this.selectedEmployee = navParams.get('selectedEmployee');
- this.employees = navParams.get('employees');
-
- this.newTitle = this.selectedEmployee.getTitle();
- this.newID = this.selectedEmployee.getID();
- this.newPay = this.selectedEmployee.getPay();
- this.newFirstName = this.selectedEmployee.getFirstName();
- this.newLastName = this.selectedEmployee.getLastName();
- this.newPhone = this.selectedEmployee.getPhone();
- this.newSrc = this.selectedEmployee.getSrc();
-
-
-
- }
-
- confirmDelete() {
- let confirm = this.alertCtrl.create({
- title: 'Delete this employee profile and exit?',
- message: 'Warning: this action cannot be undone!',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => {
- //do nothing
- }
- },
- {
- text: 'Delete and Exit',
- handler: () => {
- this.secondConfirmDelete();
- }
- }
- ]
- });
- confirm.present();
- }
- secondConfirmDelete() {
- let confirm = this.alertCtrl.create({
- title: 'Are you really sure you want to delete this employee profile and exit?',
- message: 'Warning: this action cannot be undone!',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => {
- //do nothing
- }
- },
- {
- text: 'Delete and Exit',
- handler: () => {
- //TODO: delete profile from list of employees
- this.employees.splice(this.employees.indexOf(this.selectedEmployee),1);
- this.employeePage.refreshSelectedEmployee();
- this.navCtrl.pop();
- }
- }
- ]
- });
- confirm.present();
- }
-
- confirmExit() {
- let confirm = this.alertCtrl.create({
- title: 'Exit without saving?',
- message: 'Are you sure you want to exit without saving your changes?',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => {
- //do nothing
- }
- },
- {
- text: 'Exit',
- handler: () => {
- this.navCtrl.pop();
- }
- }
- ]
- });
- confirm.present();
- }
-
- saveNewValues() {
- this.selectedEmployee.setID(this.newID);
- this.selectedEmployee.setFirstName(this.newFirstName);
- this.selectedEmployee.setLastName(this.newLastName);
- this.selectedEmployee.setTitle(this.newTitle);
- this.selectedEmployee.setPay(this.newPay);
- this.selectedEmployee.setPhone(this.newPhone);
- this.selectedEmployee.setSrc(this.newSrc);
- let employeesPage = new EmployeesPage(null, null);
- this.employees.sort(employeesPage.sortByLastName);
- this.navCtrl.pop();
- }
- ionViewDidLoad() {
- console.log('ionViewDidLoad EditEmployeePage');
- }
-
-}
diff --git a/src/pages/edit-event/edit-event.html b/src/pages/edit-event/edit-event.html
new file mode 100644
index 00000000..ee288915
--- /dev/null
+++ b/src/pages/edit-event/edit-event.html
@@ -0,0 +1,50 @@
+
+
+
+
+
+ Event Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Start
+
+
+
+
+ End
+
+
+
+
+ All Day?
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/edit-event/edit-event.module.ts b/src/pages/edit-event/edit-event.module.ts
new file mode 100644
index 00000000..d05f7500
--- /dev/null
+++ b/src/pages/edit-event/edit-event.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { EditEventPage } from './edit-event';
+
+@NgModule({
+ declarations: [
+ EditEventPage,
+ ],
+ imports: [
+ IonicPageModule.forChild(EditEventPage),
+ ],
+})
+export class EditEventPageModule {}
diff --git a/src/pages/edit-event/edit-event.scss b/src/pages/edit-event/edit-event.scss
new file mode 100644
index 00000000..4f4ab992
--- /dev/null
+++ b/src/pages/edit-event/edit-event.scss
@@ -0,0 +1,3 @@
+page-edit-event {
+
+}
diff --git a/src/pages/edit-event/edit-event.ts b/src/pages/edit-event/edit-event.ts
new file mode 100644
index 00000000..7e2d909a
--- /dev/null
+++ b/src/pages/edit-event/edit-event.ts
@@ -0,0 +1,82 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams, ViewController, AlertController } from 'ionic-angular';
+import * as moment from 'moment';
+
+@IonicPage()
+@Component({
+ selector: 'page-edit-event',
+ templateUrl: 'edit-event.html',
+})
+export class EditEventPage {
+
+ event = { startTime: new Date().toISOString(), endTime: new Date().toISOString(), allDay: false };
+ minDate = new Date().toISOString(); //ISO string format: YYYY-MM-DDTHH:mm:ss.sssZ
+
+ title: string;
+ description: string;
+ organizer: string;
+ startTime: string;
+ endTime: string;
+ myEvent: any;
+ events: any[];
+
+ constructor(public navCtrl: NavController, private navParams: NavParams, public viewCtrl: ViewController, private alertCtrl: AlertController) {
+ this.minDate = moment(this.minDate).format();
+ let preselectedDate = moment(this.navParams.get('selectedDay')).format();
+ this.event.startTime = preselectedDate;
+ this.event.endTime = preselectedDate;
+
+ this.myEvent = navParams.get('event');
+ this.events = navParams.get('events');
+ this.title = this.myEvent.title;
+ this.description = this.myEvent.description;
+ this.organizer = this.myEvent.organizer;
+ this.startTime = moment(this.myEvent.startTime.toISOString()).format();
+ this.endTime = moment(this.myEvent.endTime.toISOString()).format();
+ //console.log(this.startTime);
+ //console.log(this.endTime);
+
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss();
+ }
+
+ save() {
+ this.myEvent.title = this.title;
+ this.myEvent.description = this.description;
+ this.myEvent.organizer = this.organizer;
+ this.myEvent.startTime = new Date(this.startTime);
+ this.myEvent.endTime = new Date(this.endTime);
+
+ this.viewCtrl.dismiss(); //don't pass back the event, so it won't be deleted
+ }
+
+ delete() {
+ let alert = this.alertCtrl.create({
+ title: 'Confirm Delete',
+ message: 'Are you sure you want to delete the event?',
+ buttons: [
+ {
+ text: 'No',
+ role: 'cancel'
+ },
+ {
+ text: 'Yes',
+ handler: data => {
+ /*let index = this.events.indexOf(event, 0);
+ if (index > -1) {
+ this.events.splice(index, 1);
+ }*/
+ this.events = this.events.filter(e => e !== event);
+
+ this.viewCtrl.dismiss(this.event); //pass back the event to be deleteds
+ }
+ }
+ ]
+
+ });
+ alert.present();
+ }
+
+}
diff --git a/src/pages/employees/edit-employee.html b/src/pages/employees/edit-employee.html
new file mode 100644
index 00000000..723d5ee9
--- /dev/null
+++ b/src/pages/employees/edit-employee.html
@@ -0,0 +1,115 @@
+
+
+
+
+ {{editMode? "Edit Employee Information" : "Create New Employee"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/edit-employee/edit-employee.module.ts b/src/pages/employees/edit-employee.module.ts
similarity index 100%
rename from src/pages/edit-employee/edit-employee.module.ts
rename to src/pages/employees/edit-employee.module.ts
diff --git a/src/pages/employees/edit-employee.scss b/src/pages/employees/edit-employee.scss
new file mode 100644
index 00000000..3359ad1c
--- /dev/null
+++ b/src/pages/employees/edit-employee.scss
@@ -0,0 +1,37 @@
+page-edit-employee {
+
+ #container {
+ height: 100%;
+ width: 40%;
+ padding-top: 30px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+
+ #titlemodal {
+ border-radius: 5px;
+ padding-top: 15px;
+ padding-bottom: 2px;
+ padding-left: 30px;
+ padding-right: 30px;
+ width: 45%;
+ height: 90%;
+ margin: auto;
+ }
+
+ .selectedtitle {
+ color: color($colors, primary);
+ }
+
+ .title {
+ color: color($colors, middark);
+ }
+
+ h6 {
+ margin-right: 5px;
+ }
+}
diff --git a/src/pages/employees/edit-employee.ts b/src/pages/employees/edit-employee.ts
new file mode 100644
index 00000000..cb97ada2
--- /dev/null
+++ b/src/pages/employees/edit-employee.ts
@@ -0,0 +1,335 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams, AlertController, LoadingController, ModalController, ViewController } from 'ionic-angular';
+import { Employee } from '../employees/employees';
+import { FileTransfer, FileUploadOptions, FileTransferObject } from '@ionic-native/file-transfer';
+import { Camera, CameraOptions } from '@ionic-native/camera';
+import { InputNumpad } from '../util/numpad';
+
+@IonicPage()
+@Component({
+ selector: 'page-edit-employee',
+ templateUrl: 'edit-employee.html',
+})
+export class EditEmployeePage {
+
+ employee: Employee;
+ employees: Employee[];
+
+ ID: number;
+ firstName: string;
+ lastName: string;
+ title: string;
+ pay: number;
+ phone: number;
+
+ editMode: boolean;
+
+ newSrc: string;
+ imageURI: any;
+ imageFileName: any;
+
+
+ constructor(public navCtrl: NavController,
+ public navParams: NavParams,
+ public alertCtrl: AlertController,
+ public modalCtrl: ModalController,
+ private transfer: FileTransfer,
+ private camera: Camera,
+ public loadingCtrl: LoadingController) {
+
+
+ this.editMode = this.navParams.get('editMode');
+ this.employees = this.navParams.get('employeesList');
+
+ if (this.editMode) {
+ this.employee = this.navParams.get('employee');
+ this.ID = this.employee.ID;
+ this.firstName = this.employee.firstName;
+ this.lastName = this.employee.lastName;
+ this.title = this.employee.title;
+ this.pay = this.employee.pay;
+ this.phone = this.employee.phone;
+ } else {
+ this.employee = new Employee(null, null, null, null, null);
+ this.ID = this.employee.ID;
+ this.firstName = null;
+ this.lastName = null;
+ this.title = null;
+ this.pay = null;
+ this.phone = null;
+ }
+ }
+
+ submit() {
+
+ if (this.validData()) {
+ this.employee.firstName = this.firstName;
+ this.employee.lastName = this.lastName;
+ this.employee.title = this.title;
+ this.employee.pay = this.pay;
+ this.employee.phone = this.phone;
+ if (!this.editMode) {
+ this.employees.push(this.employee);
+ }
+ this.navCtrl.pop();
+ } else {
+
+ }
+ }
+
+ presentPayNumpad() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Pay $/hr",
+ alertTitle: "Invalid Employee Pay",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.pay = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ presentPhoneNumpad() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Phone Number",
+ alertTitle: "Invalid Phone Number",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.phone = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ deleteEmployee() {
+ let confirm = this.alertCtrl.create({
+ title: 'Delete this employee profile and exit?',
+ message: 'Warning: this action cannot be undone!',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Delete and Exit',
+ handler: () => { this.confirmDelete(); }
+ }
+ ]
+ });
+ confirm.present();
+ }
+
+ confirmDelete() {
+ let confirm = this.alertCtrl.create({
+ title: 'Are you really sure you want to delete this employee profile and exit?',
+ message: 'Warning: this action cannot be undone!',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Delete and Exit',
+ handler: () => {
+ //TODO: delete profile from list of employees
+ this.employees.splice(this.employees.indexOf(this.employee), 1);
+ this.navCtrl.pop();
+ }
+ }
+ ]
+ });
+ confirm.present();
+ }
+
+ validData(): boolean {
+ return ((this.firstName != null) &&
+ (this.lastName != null) &&
+ (this.title != null) &&
+ (this.pay != null) &&
+ (this.phone != null));
+ }
+
+ confirmExit() {
+ let confirm = this.alertCtrl.create({
+ title: 'Exit without saving?',
+ message: 'Are you sure you want to exit without saving your changes?',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => {
+ //do nothing
+ }
+ },
+ {
+ text: 'Exit',
+ handler: () => {
+ Employee.ID_runner -= 1;
+ this.navCtrl.pop();
+ }
+ }
+ ]
+ });
+ confirm.present();
+ }
+
+ presentTitleSelector() {
+ let modal = this.modalCtrl.create(TitleSelector);
+ modal.onDidDismiss(title => {
+ if (title != null) {
+ this.title = title;
+ }
+ });
+ modal.present();
+ }
+
+ getPhoneStr(): string {
+ if (this.phone) {
+ let phoneStr = this.phone.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.phone.toString();
+ }
+
+ getIDStr() {
+ if (this.ID < 10) {
+ return '000' + this.ID;
+ }
+ if (this.ID < 100) {
+ return '00' + this.ID;
+ }
+ if (this.ID < 1000) {
+ return '0' + this.ID;
+ }
+ return this.ID.toString();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ getImage() {
+ const options: CameraOptions = {
+ quality: 100,
+ destinationType: this.camera.DestinationType.FILE_URI,
+ sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
+ }
+
+ this.camera.getPicture(options).then((imageData) => {
+ this.imageURI = imageData;
+ }, (err) => {
+ console.log(err);
+ this.showAlert(err);
+ });
+ }
+
+ uploadFile() {
+ let loader = this.loadingCtrl.create({
+ content: "Uploading..."
+ });
+ loader.present();
+ const fileTransfer: FileTransferObject = this.transfer.create();
+
+ let options: FileUploadOptions = {
+ chunkedMode: false,
+ headers: {}
+ }
+
+ fileTransfer.upload(this.imageURI, encodeURI('http://localhost:8100/Users/kameronyoung/dinein/src/assets/imgs/img.jpg'), options)
+ .then((data) => {
+ console.log(data + " Uploaded Successfully");
+ this.imageFileName = "http://localhost:8100/static/images/ionicfile.jpg"
+ loader.dismiss();
+ this.showAlert("Image uploaded successfully");
+ }, (err) => {
+ console.log("Code: "+err.code+"\nSource: "+err.source+"\nTarget: "+err.target+"\nHttp_Status: "+err.http_status+"\nBody: "+err.body+"\nException: "+err.exception);
+ loader.dismiss();
+ this.showAlert(err);
+ });
+ }
+ /*presentToast(msg) {
+ let toast = this.toastCtrl.create({
+ message: msg,
+ duration: 3000,
+ position: 'bottom'
+ });
+
+ toast.onDidDismiss(() => {
+ console.log('Dismissed toast');
+ });
+
+ toast.present();
+ }*/
+ showAlert(msg) {
+ let alert = this.alertCtrl.create({
+ subTitle: msg,
+ buttons: ['OK']
+ });
+ alert.present();
+ }
+
+}
+
+//------------------------------------------------------------------------------
+// Sub-View: SelectServer
+//------------------------------------------------------------------------------
+@Component({
+ selector: 'page-edit-employee',
+ template: `
+
+
Select Title
+
+
+
+
+
+
+
+
+ `
+})
+export class TitleSelector {
+
+ titleList: string[] = [ "Owner", "Manager", "Host/Hostess", "Server",
+ "Bartender", "Chef", "Cook", "DJ" ];
+
+ selectedTitle: string;
+
+ constructor(public viewCtrl: ViewController) {
+ this.selectedTitle = this.titleList[0];
+ }
+
+ selectTitle(title: string) {
+ this.selectedTitle = title;
+ }
+
+ OK() {
+ this.viewCtrl.dismiss(this.selectedTitle);
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss(null);
+ }
+
+}
diff --git a/src/pages/employees/employees.html b/src/pages/employees/employees.html
index 40a65c7b..998bd7c9 100644
--- a/src/pages/employees/employees.html
+++ b/src/pages/employees/employees.html
@@ -1,67 +1,123 @@
+
+
+
Employees
+
+
+
+
+
+
+
+

+
+
+
+
+
{{selectedEmployee.getFullName()}}
+
+
+
+
ID:
+ Job Title:
+ Pay:
+ Phone:
+
+
+
{{selectedEmployee.getIDStr()}}
+ {{selectedEmployee.title}}
+ ${{selectedEmployee.pay.toFixed(2)}}/hr
+ {{selectedEmployee.getPhoneStr()}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EMPLOYEES
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+-->
diff --git a/src/pages/employees/employees.scss b/src/pages/employees/employees.scss
index cc514863..b69b2b7f 100644
--- a/src/pages/employees/employees.scss
+++ b/src/pages/employees/employees.scss
@@ -1,144 +1,112 @@
page-employees {
- .no-scroll .scroll-content{
- overflow: hidden;
- }
-
- #topleft {
- float: left;
- padding-top: 0px;
- padding-left: 20px;
- width: 80%;
- }
- #editbutton {
- width:auto;
- /*margin-top: 0%;*/
- position: fixed;
- left: 2%;
- top: 2%;
- z-index: 1;
- font-family: palatino;
- /*color: color($colors, primary);
- background-color: color($colors, darker);
- outline-style: solid;
- outline-color: color($colors, primary);*/
- }
- #addButton {
- width: auto;
- position: fixed;
- display: inline;
- z-index: 1;
- font-family: palatino;
- }
- #viewpunchbutton {
- width: auto;
- z-index: 1;
- position: fixed;
- left: 2%;
- bottom: 10%;
- font-family: palatino;
- font-size: 2vh;
- }
- #mainbody {
- width: 80%;
- height: 100%;
- margin-left: 0%;
- /*margin-bottom: 10%;
- background-color: color($colors,darker);*/
- }
- #sidebar {
- width:20%;
- height: 100%;
- margin-top: 0%;
- margin-left: 80%;
- background-color: color($colors, darker);
- overflow: scroll;
- }
- #searchbar {
- position: fixed;
- margin-top: 40px;
- }
- #myList {
- margin-top: 40px;
- }
- h2 {
- /*padding-top: 0%;*/
- /*float: right;*/
- display: block;
- width: 20%;
- /*height: 6%;*/
- position: fixed;
- /*position: sticky;
- position: -webkit-sticky; /* Safari */
- /*top: 0;*/
- margin-top: 0;
- color: color($colors, primary);
- background-color: color($colors, darker);
- text-align: center;
- font-size: 3vw;
- font-family: impact;
- z-index: 1;
- }
-
- #employeelist {
- display: block;
- padding-top: 20%;
- /*position: fixed;*/
- background-color: color($colors, darker);
- /*width: 20%;*/
- /* margin-top: 16%;*/
- /*height: 94%;*/
- font-family: palatino;
- z-index: -1;
- padding-bottom: 18%;
- /*margin-left: 80%;*/
- }
-
- .label {
- /*text-decoration: underline;*/
- font-style: italic;
-
- float: left;
- /*color: color($colors, tertiary);*/
- }
+
+ #employeetitle {
+ width: 22%;
+ float: right;
+ padding: 1%;
+ text-align: center;
+ background-color: color($colors, primary);
+ //color: color($colors, dark);
+ color: white;
+ }
+
+ #mainview {
+ width: 78%;
+ margin-right: 22%;
+ }
+
+ #sideview {
+ width: 22%;
+ margin-left: 78%;
+ background-color: color($colors, dark);
+ }
+
+ #employeelist {
+ width: 100%;
+ height: 100%;
+ padding: 10px;
+ background-color: color($colors, dark);
+ }
+
+ #topleft {
+ float: left;
+ padding-top: 0px;
+ padding-left: 20px;
+ width: 80%;
+ }
+
+ #profileleft {
+ padding-left: 75px;
+ padding-right: 25px;
+ padding-top: 10%;
+ height: 100%;
+ width: 40%;
+ float: left;
+ }
+
+ #profileright {
+ padding-left: 25px;
+ padding-right: 75px;
+ padding-top: 2%;
+ height: 100%;
+ width: 60%;
+ float: left;
+ }
+
+ #imgcontainer {
+ height: 225px;
+ width: 225px;
+ }
+
+ #employeeimage {
+ height: 100%;
+ width: 100%;
+ border-style: solid;
+ border-radius: 4px;
+ border-width: 2px;
+ border-color: color($colors, middark);
+ object-fit: cover;
+ }
+
#employeeprofile {
- /*background-color: color($colors, darkest);*/
- width: 80%;
- height: 100%;
- float: left;
- /*border-right: 2px solid color($colors, primary);*/
- position: fixed;
- overflow: scroll;
- padding-bottom: 10%;
- }
- #employeeimage {
- padding-top: 10%;
- height: 50%;
- display: block;
- margin-left: auto;
- margin-right: auto;
-
- }
- h1 {
- color: color($colors, primary);
- text-align: center;
- font-size: 400%;
- font-family: palatino;
-
- }
- #employeeinfo {
- padding: 10px;
- color: color($colors, primary);
- width: 50%;
- display: block;
- margin: auto;
- text-align: right;
- font-size: 200%;
- font-family: palatino;
- outline-style: solid;
- outline-color: color($colors, primary);
-
- }
-
-
-
+ height: 225px;
+ width: 100%;
+ color: color($colors, middark);
+ border-style: solid;
+ border-radius: 4px;
+ border-width: 2px;
+ h5 {
+ margin-bottom: 20px;
+ }
+ }
+
+ #labels {
+ width: 35%;
+ height: 100%;
+ padding-top: 20px;
+ padding-left: 20px;
+ float: left;
+ }
+
+ #employeeinfo {
+ width: 65%;
+ height: 100%;
+ padding-top: 20px;
+ float: left;
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+
+ .employee {
+ color: color($colors, middark);
+ }
+ .selectedemployee {
+ color: color($colors, primary);
+ }
+
+ // fix
+ $popover-ios-width: 400px;
+
}
diff --git a/src/pages/employees/employees.ts b/src/pages/employees/employees.ts
index 3efc861b..7bdeedc6 100644
--- a/src/pages/employees/employees.ts
+++ b/src/pages/employees/employees.ts
@@ -1,210 +1,353 @@
import { Component } from '@angular/core';
import { NavController, NavParams, PopoverController, ViewController, App } from 'ionic-angular';
import { List } from 'ionic-angular';
-import { EditEmployeePage } from '../edit-employee/edit-employee';
-import { CreateEmployeePage } from '../create-employee/create-employee';
+import { EditEmployeePage } from './edit-employee';
@Component({
- selector: 'page-employees',
- templateUrl: 'employees.html'
+ selector: 'page-employees',
+ templateUrl: 'employees.html'
})
export class EmployeesPage {
- searchQuery: string = '';
- items: Employee[];
- editPage: any;
- createEmployeePage: any;
- employees: Array;
- employee1: Employee;
- employee2 = new Employee("Carl", "Robins", "4321", "Assistant Manager", "$30/hr", "(608) 345-1209", "http://www.math.uni-frankfurt.de/~person/_4170854.jpg");
- employee5 = new Employee("Marianne", "Beaumont", "9902", "Hostess", "$15/hr", "+33 8 92 70 12 39", "http://www.pearsonvue.com/pteprofessional/images/homepage.png");
- employee6 = new Employee("Anna", "Schmidt", "4231", "Manager", "$50/hr", "+49 30 2273 2152", "https://i.pinimg.com/736x/25/48/31/25483183a26a96adcc2b5a4002eda6ca--headshot-ideas-professional-photographer.jpg");
- employee7 = new Employee("Valerie", "Carter", "1", "Owner", "$1003/hr", "(202) 456-1111", "https://cdn10.phillymag.com/wp-content/uploads/2016/01/woman-biz.jpg");
- employee8 = new Employee("Phil", "Scott", "8156", "Bartender", "$10/hr", "(608) 310-4545", "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Robert_gold_bartender.jpg/220px-Robert_gold_bartender.jpg");
- employee3: Employee;
- employee4: Employee;
- selectedEmployee: Employee;
-
- constructor(public navCtrl: NavController, public popCtrl: PopoverController) {
- this.editPage = EditEmployeePage;
- this.createEmployeePage = CreateEmployeePage;
- this.employees = new Array();
-
-
- this.employee1 = new Employee("Kevin", "Anderson", "1234", "Server", "$5/hr", "(608) 329-4565", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxhJ8HaQ88jGA0Ws2WTCnI4DzSgMzvEXk4qdbQVbCAiKyP9yGl");
- this.employee3 = new Employee("Tina", "Russo", "5678", "Head Chef", "$500/hr", "(414) 921-4980", "https://cdn2.goabroad.com/images/program_content/5-tips-for-teaching-english-abroad-as-a-person-of-color-2-1462426680.jpg")
- this.employee4 = new Employee("Bryan", "Suzan", "666", "DJ", "$0.03/hr", "1-866-436-5706", "../../assets/imgs/bryan.jpg")
- this.employees.push(this.employee1, this.employee2, this.employee3, this.employee4, this.employee5, this.employee6, this.employee7, this.employee8);
- this.employees.sort(this.sortByLastName);
- this.selectedEmployee = this.employees[0];
- }
-
- presentPunchPopover(anEvent) {
- let popover = this.popCtrl.create(PunchPopoverPage,{selectedEmployee: this.selectedEmployee});
-
- popover.present({
- ev: anEvent
- });
- }
-
- refreshSelectedEmployee() {
- this.selectedEmployee = this.employees[0];
- this.initializeItems();
- }
- initializeItems() {
- this.items = [
- this.selectedEmployee
- ];
- }
-
- getItems(ev: any) {
- // Reset items back to all of the items
- this.initializeItems();
-
- // set val to the value of the searchbar
- let val = ev.target.value;
-
- //if the value is an empty string don't filter the items
- if (val && val.trim() != '') {
- this.items = this.items.filter((item) => {
- return (item.getName().toLowerCase().indexOf(val.toLowerCase()) > -1);
- })
- }
- }
- openEditPage() {
- this.navCtrl.push(this.editPage, { selectedEmployee: this.selectedEmployee, employees: this.employees, employeesPage: this });
- }
- openCreatePage() {
- this.navCtrl.push(this.createEmployeePage, { employees: this.employees });
- }
- selectEmployee(myEvent, employee) {
- this.selectedEmployee = employee;
- }
- /*sortByName(a: Employee, b: Employee): number {
- return a.getName().localeCompare(b.getName());
+ //searchQuery: string = '';
+
+ placeholderImg: string = "https://openskymerchants.files.wordpress.com/2013/10/smile_icon.png";
+
+ items: Employee[];
+ //editPage: any;
+ //createEmployeePage: any;
+ employees: Employee[];
+ selectedEmployee: Employee;
+
+ constructor(public navCtrl: NavController,
+ public popCtrl: PopoverController) {
+ //this.editPage = EditEmployeePage;
+ //this.createEmployeePage = CreateEmployeePage;
+ this.employees =
+ [
+ new Employee("Michael", "Fassbender", "Owner", 100000.01, 2024561111,
+ "../assets/imgs/mikefass.jpg", 1),
+ new Employee("Anna", "Schmidt", "Manager", 50.00, 6086076006,
+ "https://i.pinimg.com/736x/25/48/31/25483183a26a96adcc2b5a4002eda6ca--headshot-ideas-professional-photographer.jpg", 2),
+ new Employee("Carl", "Robins", "Assistant Manager", 30.00, 6083456789,
+ "http://www.math.uni-frankfurt.de/~person/_4170854.jpg", 10),
+ new Employee("Marianne", "Beaumont", "Hostess", 15.00, 9119119911,
+ "http://www.pearsonvue.com/pteprofessional/images/homepage.png"),
+ new Employee("Phil", "Scott", "Bartender", 10.00, 6083104545,
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Robert_gold_bartender.jpg/220px-Robert_gold_bartender.jpg"),
+ new Employee("Kevin", "Anderson", "Server", 5.00, 6088067777,
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxhJ8HaQ88jGA0Ws2WTCnI4DzSgMzvEXk4qdbQVbCAiKyP9yGl"),
+ new Employee("Daniel", "Radcliffe", "Server", 1.00, 7299389920,
+ "https://img.buzzfeed.com/buzzfeed-static/static/2018-01/12/14/asset/buzzfeed-prod-fastlane-03/sub-buzz-18898-1515786282-5.jpg?downsize=715:*&output-format=auto&output-quality=auto"),
+ new Employee("Arnold", "Schwarznegger", "Cook", 9999.99, 9999999999,
+ "https://upload.wikimedia.org/wikipedia/commons/1/10/Arnold_Schwarzenegger_September_2017.jpg"),
+ new Employee("Kevin", "Spacey", "Server", 0.01, 8299291834,
+ "https://www.gannett-cdn.com/-mm-/cafa601533d164e1a938fceb66dbd9ba7dec8622/c=1252-527-2956-1808&r=x404&c=534x401/local/-/media/2017/11/08/USATODAY/USATODAY/636457309000424528-XXX-AFP-TZ54V-95172455.JPG"),
+ new Employee("Anthony", "Hopkins", "Bartender", 50.00, 7144969596,
+ "https://www.biography.com/.image/t_share/MTE5NDg0MDU1MDAxMDczMTY3/sir-anthony-hopkins-9343556-1-402.jpg"),
+ new Employee("Cara", "Delevingne", "Server", 15.00, 6783859873,
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTmLg8W3_tJ--QpQhPQjFglY9G-Tu9pCyWV-5UR8FLe4lFGXJhE"),
+ new Employee("Kameron", "Young", "Server", 5.00, 6088067777,
+ "https://scontent-ort2-1.xx.fbcdn.net/v/t1.0-9/13077027_1318802494800331_7760229749495766368_n.jpg?_nc_cat=0&oh=86e592e3eea0db57911dc21527f25dec&oe=5B965C90"),
+ new Employee("Casey", "Nitz", "Server", 5.00, 6088067777,
+ "https://scontent-ort2-1.xx.fbcdn.net/v/t31.0-8/1511827_792745014132756_977096387972296994_o.jpg?_nc_cat=0&oh=b31aba57dc71c510bb519eb13c1a1108&oe=5B8EF421"),
+ new Employee("Suzy", "Kong", "Server", 5.00, 6088067777,
+ "https://scontent-ort2-1.xx.fbcdn.net/v/t1.0-9/27073417_1873106099611377_6868467175191870057_n.jpg?_nc_cat=0&oh=61fe7c000239c0767dd7975c790defd0&oe=5B902065"),
+ new Employee("Jimmie", "Plautz", "Server", 5.00, 6088067777,
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYKzL4WtUsWpaDI_PkYH01KiEEwByV8JDplXwvdvJfrnEYa330"),
+ new Employee("Kass", "Chupongstimun", "Server", 5.00, 6088067777,
+ "https://scontent-ort2-1.xx.fbcdn.net/v/t1.0-9/29570700_1895844113789958_947715976665000958_n.jpg?_nc_cat=0&oh=2b736c14194f3e72574a68df67838e69&oe=5B9D77DD"),
+ new Employee("Tina", "Russo", "Head Chef", 500.00, 4149217439,
+ "https://cdn2.goabroad.com/images/program_content/5-tips-for-teaching-english-abroad-as-a-person-of-color-2-1462426680.jpg"),
+ new Employee("Bryan", "Suzan", "DJ", 0.03, 6666666666, "../../assets/imgs/bryan.jpg")
+ ];
+
+ this.employees.sort(Employee.sortByLastName);
+ this.selectedEmployee = this.employees[0];
+ }
+
+ presentPunchPopover(anEvent) {
+ let popover = this.popCtrl.create(PunchPopoverPage,{selectedEmployee: this.selectedEmployee});
+
+ popover.present({
+ ev: anEvent
+ });
+ }
+
+ refreshSelectedEmployee() {
+ this.selectedEmployee = this.employees[0];
+ this.initializeItems();
+ }
+ initializeItems() {
+ this.items = [
+ this.selectedEmployee
+ ];
+ }
+
+ /*getItems(ev: any) {
+ // Reset items back to all of the items
+ this.initializeItems();
+
+ // set val to the value of the searchbar
+ let val = ev.target.value;
+
+ //if the value is an empty string don't filter the items
+ if (val && val.trim() != '') {
+ this.items = this.items.filter((item) => {
+ return (item.name.toLowerCase().indexOf(val.toLowerCase()) > -1);
+ })
+ }
}*/
- sortByLastName(a: Employee, b: Employee): number {
- return a.getLastName().localeCompare(b.getLastName());
- }
+
+ onEditEmployeePress() {
+ this.navCtrl.push(EditEmployeePage, { editMode: true,
+ employee: this.selectedEmployee,
+ employeesList: this.employees });
+ }
+ onCreateEmployeePress() {
+ this.navCtrl.push(EditEmployeePage, { editMode: false,
+ employee: null,
+ employeesList: this.employees });
+ }
+
+ selectEmployee(myEvent, employee) {
+ this.selectedEmployee = employee;
+ }
}
//@IonicPage()
@Component({
- template: `
-
- {{selectedEmployee.getName()}}'s punches
-
-
- From:
-
-
-
- To:
-
-
-
- `
+
+ selector: 'page-employees',
+
+ template: `
+
+
+
+ {{selectedEmployee.firstName}}'s Punches
+
+
+ From:
+
+
+
+ To:
+
+
+
+
+
+
+ `
})
export class PunchPopoverPage {
- startDate: string;
- currentDate: string;
- endDate: string;
- dd: any;
- mm: any;
- selectedEmployee: Employee;
-
- constructor(public viewCtrl: ViewController, public popCtl: PopoverController, public appCtrl: App, public navParams: NavParams) {
-
- this.selectedEmployee = this.navParams.get("selectedEmployee");
- let currDate = new Date(); //initialized to current date
- this.dd = currDate.getDate();
- this.mm = currDate.getMonth() + 1; //January is 0
- let yyyy = currDate.getFullYear();
- if (this.dd < 10) {
- this.dd = '0' + this.dd;
- }
- if (this.mm < 10) {
- this.mm = '0' + this.mm;
- }
- this.startDate = yyyy + "-" + this.mm + "-" + this.dd;
- this.endDate = this.startDate;
- this.currentDate = this.startDate;
- }
-
-
- close() {
- this.viewCtrl.dismiss();
- }
+ startDate: string;
+ currentDate: string;
+ endDate: string;
+ dd: any;
+ mm: any;
+ selectedEmployee: Employee;
+
+ constructor(public viewCtrl: ViewController,
+ public popCtl: PopoverController,
+ public appCtrl: App,
+ private navParams: NavParams) {
+
+ this.selectedEmployee = this.navParams.get("selectedEmployee");
+ let currDate = new Date(); //initialized to current date
+ this.dd = currDate.getDate();
+ this.mm = currDate.getMonth() + 1; //January is 0
+ let yyyy = currDate.getFullYear();
+ if (this.dd < 10) {
+ this.dd = '0' + this.dd;
+ }
+ if (this.mm < 10) {
+ this.mm = '0' + this.mm;
+ }
+ this.startDate = yyyy + "-" + this.mm + "-" + this.dd;
+ this.endDate = this.startDate;
+ this.currentDate = this.startDate;
+ }
+
+ close() {
+ this.viewCtrl.dismiss();
+ }
}
export class Employee {
- name: string;
- firstName: string;
- lastName: string;
- ID: string;
- imageSrc: string;
- title: string;
- pay: string;
- phone: string;
-
- constructor(firstName: string, lastName: string, ID: string, title: string, pay: string, phone: string, imageSrc: string) {
- this.firstName = firstName;
- this.lastName = lastName;
- this.ID = ID;
- this.imageSrc = imageSrc;
- this.title = title;
- this.pay = pay;
- this.phone = phone;
- }
-
- getName(): string {
- return this.firstName+" "+this.lastName;
- }
- /*setName(name: string) {
- this.name = name;
- }*/
- getFirstName(): string {
- return this.firstName;
- }
- setFirstName(firstName: string) {
- this.firstName = firstName;
- }
- getLastName(): string {
- return this.lastName;
- }
- setLastName(lastName: string) {
- this.lastName = lastName;
- }
- getSrc(): string {
- return this.imageSrc;
- }
- setSrc(src: string) {
- this.imageSrc = src;
- }
- getID(): string {
- return this.ID;
- }
- setID(id: string) {
- this.ID = id;
- }
- getTitle(): string {
- return this.title;
- }
- setTitle(title: string) {
- this.title = title;
- }
- getPhone(): string {
- return this.phone;
- }
- setPhone(phone: string) {
- this.phone = phone;
- }
- getPay(): string {
- return this.pay;
- }
- setPay(pay: string) {
- this.pay = pay;
- }
-}
\ No newline at end of file
+ static ID_runner: number = 100;
+
+ ID: number;
+ firstName: string;
+ lastName: string;
+ imageSrc: string;
+ title: string;
+ pay: number;
+ phone: number;
+
+ shifts: EmployeeShift[];
+
+ constructor(firstName: string, lastName: string, title: string, pay: number,
+ phone: number, imageSrc?: string, ID?: number) {
+
+ if (ID) {
+ if (ID < 100) {
+ this.ID = ID;
+ } else {
+ this.ID = Employee.ID_runner;
+ Employee.ID_runner += 1;
+ }
+ } else {
+ this.ID = Employee.ID_runner;
+ Employee.ID_runner += 1;
+ }
+
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.title = title;
+ this.pay = pay;
+ this.phone = phone;
+ this.shifts = [];
+ if (imageSrc) {
+ this.imageSrc = imageSrc;
+ } else {
+ this.imageSrc = null;
+ }
+ }
+
+ punchIn(timeIn: string) {
+
+ // Instantiate shift object with only shift start time, no shift end time
+ // Mark new shift as incompleted/in progress
+ // Set employee status to "Currently working"
+ // Add the shift object to the employee
+ this.shifts.push(new EmployeeShift(timeIn, undefined, this.getFullName()));
+ console.log('Successfully punched in for employee: ' + this.ID);
+ }
+
+ punchOut(timeOut: string) {
+
+ // Add shift end time to the latest shift object
+ // Mark shift as completed
+ // Set employee to not be currently working
+ this.shifts[this.shifts.length-1].endShift(timeOut);
+ console.log('Successfully punched outfor employee: ' + this.ID);
+ }
+
+
+ isCurrentlyWorking(): boolean {
+ //
+ // Special case when employee newly instantiated and has empty shifts
+ // array, accessing the last element will make the app pissed
+ // In this case, just return false because a newly instantiated employee
+ // hasn't started a shift yet
+ //
+ if (this.shifts.length < 1) {
+ return false;
+ }
+ let mostRecentShift = this.shifts[this.shifts.length-1];
+ return !mostRecentShift.hasEnded();
+ }
+
+ getFullName(): string {
+ return this.firstName + " " + this.lastName;
+ }
+
+ getPhoneStr(): string {
+ if (this.phone) {
+ let phoneStr = this.phone.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return null;
+ }
+
+ getIDStr() {
+ if (this.ID < 10) {
+ return '000' + this.ID;
+ }
+ if (this.ID < 100) {
+ return '00' + this.ID;
+ }
+ if (this.ID < 1000) {
+ return '0' + this.ID;
+ }
+ return this.ID.toString();
+ }
+
+ static sortByLastName(a: Employee, b: Employee): number {
+ return a.lastName.localeCompare(b.lastName);
+ }
+
+}
+
+export class EmployeeShift {
+
+ name: string;
+ startTime: string; //DateTime is just a string
+ endTime: string;
+ shiftLength: number;
+
+
+ constructor(startTime: string, endTime?: string, name?: string) {
+ this.startTime = startTime;
+
+ if(name) {
+ this.name = name;
+ }
+
+ if (endTime) {
+ this.endTime = endTime;
+ this.shiftLength = this.getDiffQuarterHour(this.startTime, this.endTime);
+ } else {
+ this.endTime = null;
+ this.shiftLength = null;
+ }
+
+ }
+
+ endShift(endTime: string) {
+ this.endTime = endTime;
+ this.shiftLength = this.getDiffQuarterHour(this.startTime, this.endTime);
+ }
+
+ hasEnded() {
+ return this.endTime != null;
+ }
+
+ getDiffQuarterHour(t1, t2): number {
+ let d1 = new Date(t1);
+ let d2 = new Date(t2);
+ let diffHours = (d2.getTime() - d1.getTime()) / 3600000;
+ return parseFloat((Math.round(diffHours * 4) / 4).toFixed(2));
+ }
+
+ static compare(s1: EmployeeShift, s2: EmployeeShift) {
+ let d1 = new Date(s1.startTime);
+ let d2 = new Date(s2.startTime);
+ let diff = (d1.getTime() - d2.getTime());
+
+ if (diff < 0) {
+ return -1;
+ }
+ if (diff > 0) {
+ return 1;
+ }
+ return 0;
+ }
+
+}
+
+export enum title {
+ Owner = 0,
+ Manager = 1,
+ Host = 2,
+ Server = 3,
+ Bartender = 4,
+ Chef = 5,
+ Cook = 6,
+ DJ = 69
+}
diff --git a/src/pages/event-modal/event-modal.html b/src/pages/event-modal/event-modal.html
new file mode 100644
index 00000000..d3672625
--- /dev/null
+++ b/src/pages/event-modal/event-modal.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ Event Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Start
+
+
+
+
+ End
+
+
+
+
+ All Day?
+
+
+
+
+
+
diff --git a/src/pages/event-modal/event-modal.module.ts b/src/pages/event-modal/event-modal.module.ts
new file mode 100644
index 00000000..de34dfbe
--- /dev/null
+++ b/src/pages/event-modal/event-modal.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { EventModalPage } from './event-modal';
+
+@NgModule({
+ declarations: [
+ EventModalPage,
+ ],
+ imports: [
+ IonicPageModule.forChild(EventModalPage),
+ ],
+})
+export class EventModalPageModule {}
diff --git a/src/pages/event-modal/event-modal.scss b/src/pages/event-modal/event-modal.scss
new file mode 100644
index 00000000..96cb57f8
--- /dev/null
+++ b/src/pages/event-modal/event-modal.scss
@@ -0,0 +1,3 @@
+page-event-modal {
+
+}
diff --git a/src/pages/event-modal/event-modal.ts b/src/pages/event-modal/event-modal.ts
new file mode 100644
index 00000000..ae799c2e
--- /dev/null
+++ b/src/pages/event-modal/event-modal.ts
@@ -0,0 +1,31 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular';
+import * as moment from 'moment';
+
+@IonicPage()
+@Component({
+ selector: 'page-event-modal',
+ templateUrl: 'event-modal.html',
+})
+export class EventModalPage {
+
+ event = { startTime: new Date().toISOString(), endTime: new Date().toISOString(), allDay: false };
+ minDate = new Date().toISOString(); //ISO string format: YYYY-MM-DDTHH:mm:ss.sssZ
+
+
+ constructor(public navCtrl: NavController, private navParams: NavParams, public viewCtrl: ViewController) {
+ this.minDate = moment(this.minDate).format();
+ let preselectedDate = moment(this.navParams.get('selectedDay')).format();
+ this.event.startTime = preselectedDate;
+ this.event.endTime = preselectedDate;
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss();
+ }
+
+ save() {
+ this.viewCtrl.dismiss(this.event);
+ }
+
+}
diff --git a/src/pages/login/create-restaurant.html b/src/pages/login/create-restaurant.html
new file mode 100644
index 00000000..2dd48576
--- /dev/null
+++ b/src/pages/login/create-restaurant.html
@@ -0,0 +1,58 @@
+
+
+
+
+
Create Restaurant
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/login/create-restaurant.module.ts b/src/pages/login/create-restaurant.module.ts
new file mode 100644
index 00000000..c5dfccd0
--- /dev/null
+++ b/src/pages/login/create-restaurant.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { CreateRestaurantPage } from './create-restaurant';
+
+@NgModule({
+ declarations: [
+ CreateRestaurantPage,
+ ],
+ imports: [
+ IonicPageModule.forChild(CreateRestaurantPage),
+ ],
+})
+export class CreateRestaurantPageModule {}
diff --git a/src/pages/login/create-restaurant.scss b/src/pages/login/create-restaurant.scss
new file mode 100644
index 00000000..3eea8fd0
--- /dev/null
+++ b/src/pages/login/create-restaurant.scss
@@ -0,0 +1,14 @@
+page-create-restaurant {
+
+ #container {
+ height: 100%;
+ width: 40%;
+ padding-top: 60px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+}
diff --git a/src/pages/login/create-restaurant.ts b/src/pages/login/create-restaurant.ts
new file mode 100644
index 00000000..4926ee73
--- /dev/null
+++ b/src/pages/login/create-restaurant.ts
@@ -0,0 +1,106 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams } from 'ionic-angular';
+import { ModalController, ViewController, AlertController } from 'ionic-angular';
+import { CreateUserPage } from './create-user';
+import { Employee } from '../employees/employees';
+import { Restaurant } from '../management/management';
+import { InputNumpad } from '../util/numpad';
+
+@IonicPage()
+@Component({
+ selector: 'page-create-restaurant',
+ templateUrl: 'create-restaurant.html',
+})
+export class CreateRestaurantPage {
+
+ restaurantName: string;
+ addrLine1: string;
+ addrLine2: string;
+ phone: number;
+ ownerFirstName: string;
+ ownerLastName: string;
+
+ constructor(public navCtrl: NavController,
+ public modalCtrl: ModalController,
+ public viewCtrl: ViewController,
+ public alertCtrl: AlertController) {
+ this.restaurantName = null;
+ this.addrLine1 = null;
+ this.addrLine2 = null;
+ this.phone = null;
+ this.ownerFirstName = null;
+ this.ownerLastName = null;
+ }
+
+ create() {
+ //
+ // Invalid Input data
+ //
+ if (!this.validData()) {
+ let alert = this.alertCtrl.create({
+ title: 'Some Information is Missing!',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Dismiss',
+ handler: () => {
+ console.log(this.restaurantName + this.addrLine1 + this.addrLine2 + this.phone + this.ownerFirstName + this.ownerLastName);
+ }
+ }
+ ]
+ });
+ alert.present();
+
+ //
+ // Valid Input Data
+ //
+ } else {
+ let owner = new Employee(this.ownerFirstName, this.ownerLastName, "Owner",
+ 100000.01, 2024561111, "../assets/imgs/mikefass.jpg", 1);
+ let createdRestaurant: Restaurant = new Restaurant(
+ this.restaurantName, this.phone, owner, this.addrLine1, this.addrLine2);
+ this.navCtrl.popTo(CreateUserPage);
+ }
+ }
+
+ exit() {
+ this.navCtrl.pop();
+ }
+
+ presentNumpad(field: string) {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Phone Number",
+ alertTitle: "Invalid Phone Number",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.phone = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ validData() {
+ return ((this.addrLine1 != null) &&
+ (this.addrLine2 != null) &&
+ (this.phone != null) &&
+ (this.ownerFirstName != null) &&
+ (this.ownerLastName != null));
+ }
+
+ getPhoneStr(): string {
+ if (this.phone) {
+ let phoneStr = this.phone.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.phone.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/src/pages/login/create-user.html b/src/pages/login/create-user.html
new file mode 100644
index 00000000..7393c04a
--- /dev/null
+++ b/src/pages/login/create-user.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
Create User
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/login/create-user/create-user.module.ts b/src/pages/login/create-user.module.ts
similarity index 100%
rename from src/pages/login/create-user/create-user.module.ts
rename to src/pages/login/create-user.module.ts
diff --git a/src/pages/login/create-user.scss b/src/pages/login/create-user.scss
new file mode 100644
index 00000000..b831ac32
--- /dev/null
+++ b/src/pages/login/create-user.scss
@@ -0,0 +1,28 @@
+page-create-user {
+
+ #container {
+ height: 100%;
+ width: 35%;
+ padding-top: 40px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ #restaurantmodal {
+ height: 100%;
+ width: 55%;
+ margin: auto;
+ }
+
+ .selectedrestaurant {
+ color: color($colors, primary);
+ }
+
+ .restaurant {
+ color: color($colors, middark);
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+}
diff --git a/src/pages/login/create-user.spec.ts b/src/pages/login/create-user.spec.ts
new file mode 100644
index 00000000..18733a67
--- /dev/null
+++ b/src/pages/login/create-user.spec.ts
@@ -0,0 +1,90 @@
+import { NavController, ModalController, ViewController, NavParams } from 'ionic-angular';
+import { NavControllerMock, ModalControllerMock, ViewControllerMock, NavParamsMock, ModalMock } from 'ionic3-mocks';
+
+import { CreateUserPage, PhoneNumpad } from './create-user';
+
+describe('Create User Page', () => {
+
+ let navCtrl: NavController;
+ let modalCtrl: ModalController;
+ let viewCtrl: ViewController;
+ let navParams: NavParams;
+
+ let SUT: CreateUserPage;
+
+ beforeEach(() => {
+ // MOCKS :)
+ navCtrl = NavControllerMock.instance();
+ modalCtrl = ModalControllerMock.instance();
+ viewCtrl = ViewControllerMock.instance();
+ navParams = NavParamsMock.instance();
+ SUT = new CreateUserPage(navCtrl, modalCtrl, viewCtrl, navParams);
+ });
+
+ afterEach(() => {
+ navCtrl = null;
+ modalCtrl = null;
+ viewCtrl = null;
+ navParams = null;
+ SUT = null;
+ });
+
+ it('should be created', () => {
+ expect(SUT).toBeTruthy();
+ });
+ it('should be a Create User Page', () => {
+ expect(SUT instanceof CreateUserPage).toBe(true);
+ });
+ it('should initially contain invalid data', () => {
+ expect(SUT.validData()).toBe(false);
+ });
+
+ it('should be popped', () => {
+ SUT.goToLogin();
+ expect(navCtrl.pop).toHaveBeenCalled();
+ });
+
+ describe('When user enters inputs', () => {
+
+ beforeEach(function() {
+ SUT.email = "e-mail";
+ SUT.password = "password";
+ SUT.confirmPassword = "password";
+ SUT.firstName = "firstName";
+ SUT.lastName = null;
+ SUT.phone = null;
+ SUT.restaurant = "Restaurant";
+ });
+
+ afterEach(function() {
+ SUT.email = null;
+ SUT.password = null;
+ SUT.confirmPassword = null;
+ SUT.firstName = null;
+ SUT.lastName = null;
+ SUT.phone = null;
+ SUT.restaurant = null;
+ });
+
+ it('should not require optional inputs', function() {
+ expect(SUT.validData()).toBe(true);
+ });
+ it('should check if password and confirmation matches', function() {
+ var pass1 = "password";
+ var pass2 = "badpassword";
+ SUT.password = pass1;
+ SUT.confirmPassword = pass1;
+ expect(SUT.passwordsMatch()).toBe(true);
+ SUT.password = pass1;
+ SUT.confirmPassword = pass2;
+ expect(SUT.passwordsMatch()).toBe(false);
+ });
+ });
+
+ describe('Getting data from numpad modal', function() {
+ it('should call a modal when button pressed', function() {
+ SUT.presentNumpad();
+ expect(modalCtrl.create).toHaveBeenCalled();
+ });
+ });
+});
\ No newline at end of file
diff --git a/src/pages/login/create-user.ts b/src/pages/login/create-user.ts
new file mode 100644
index 00000000..2d3e2f3a
--- /dev/null
+++ b/src/pages/login/create-user.ts
@@ -0,0 +1,179 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams, ModalController, ViewController } from 'ionic-angular';
+import { CreateRestaurantPage } from './create-restaurant';
+import { Restaurant } from '../management/management';
+import { InputNumpad } from '../util/numpad';
+
+/**
+ * Generated class for the CreateUserPage page.
+ *
+ * See https://ionicframework.com/docs/components/#navigation for more info on
+ * Ionic pages and navigation.
+ */
+
+@IonicPage()
+@Component({
+ selector: 'page-create-user',
+ templateUrl: 'create-user.html'
+})
+export class CreateUserPage {
+
+ email: string;
+ password: string;
+ confirmPassword: string;
+ firstName: string;
+ lastName: string;
+ phone: number;
+ restaurant: string;
+
+ buttonTextPhone: string;
+ buttonTextRestaurant: string;
+
+ createdRestaurant: Restaurant;
+
+ restaurantsList: string[] = ["Potbelly", "State St. Brats", "Hopcat", "Five Guys",
+ "Chipotle", "Nitty Gritty", "Dotty's", "Ians",
+ "Glaze", "QQs"];
+
+ constructor(public navCtrl: NavController,
+ public modalCtrl: ModalController,
+ public viewCtrl: ViewController,
+ public navParams: NavParams) {
+
+ this.createdRestaurant = this.navParams.get('restaurant');
+ if (this.createdRestaurant) {
+ console.log('received restaurant: ' + this.createdRestaurant.name);
+ } else {
+ this.createdRestaurant = null;
+ }
+
+ this.email = null;
+ this.password = null;
+ this.confirmPassword = null;
+ this.firstName = null;
+ this.lastName = null;
+ this.phone = null;
+ this.restaurant = null;
+
+ }
+
+ ionViewDidLoad() {
+ console.log('ionViewDidLoad CreateUserPage');
+ }
+
+ goToLogin() {
+ this.navCtrl.pop();
+ }
+
+ presentNumpad() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Phone Number",
+ alertTitle: "Invalid Phone Number",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.phone = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ presentRestaurantSelector() {
+ let modal = this.modalCtrl.create(SelectRestaurant, {restaurants: this.restaurantsList});
+ modal.onDidDismiss(data => {
+ if (data != null) {
+ if (data == 0) {
+ this.navCtrl.push(CreateRestaurantPage);
+ } else {
+ this.restaurant = data;
+ this.buttonTextRestaurant = String(this.restaurant);
+ }
+ }
+ });
+ modal.present();
+ }
+
+ validData() {
+ return (this.email != null &&
+ this.password != null &&
+ this.confirmPassword != null &&
+ this.firstName != null &&
+ this.restaurant != null);
+ }
+
+ passwordsMatch() {
+ return (this.password == this.confirmPassword);
+ }
+
+ getPhoneStr(): string {
+ if (this.phone) {
+ let phoneStr = this.phone.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.phone.toString();
+ }
+}
+
+//------------------------------------------------------------------------------
+// Sub-View: SelectServer
+//------------------------------------------------------------------------------
+@Component({
+ selector: 'page-create-user',
+ template: `
+
+
Select Restaurant
+
+
+
+
+
+
+
+
+
+ `
+})
+export class SelectRestaurant {
+
+ restaurants: string[];
+ selectedRestaurant: string;
+
+ constructor(public viewCtrl: ViewController,
+ private params: NavParams) {
+ this.restaurants = params.get('restaurants');
+ this.selectedRestaurant = this.restaurants[0];
+ }
+
+ selectRestaurant(r: string) {
+ this.selectedRestaurant = r;
+ }
+
+ OK() {
+ this.viewCtrl.dismiss(this.selectedRestaurant);
+ }
+
+ createNewRestaurant() {
+ this.viewCtrl.dismiss(0);
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss(null);
+ }
+
+}
diff --git a/src/pages/login/create-user/create-user.html b/src/pages/login/create-user/create-user.html
deleted file mode 100644
index 0f5672dc..00000000
--- a/src/pages/login/create-user/create-user.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
- Create User
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Restaurant
-
- CREATE NEW RESTAURANT
- Placeholder Restaurant
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/login/create-user/create-user.scss b/src/pages/login/create-user/create-user.scss
deleted file mode 100644
index c9febfe4..00000000
--- a/src/pages/login/create-user/create-user.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-page-create-user {
-
- #container {
- padding-top: 3%;
- width: 350px;
- margin-left:auto;
- margin-right: auto;
- }
-
- .localbutton {
- margin: 20px auto;
- }
-}
diff --git a/src/pages/login/create-user/create-user.ts b/src/pages/login/create-user/create-user.ts
deleted file mode 100644
index 04a643e1..00000000
--- a/src/pages/login/create-user/create-user.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Component } from '@angular/core';
-import { IonicPage, NavController, NavParams } from 'ionic-angular';
-
-/**
- * Generated class for the CreateUserPage page.
- *
- * See https://ionicframework.com/docs/components/#navigation for more info on
- * Ionic pages and navigation.
- */
-
-@IonicPage()
-@Component({
- selector: 'page-create-user',
- templateUrl: 'create-user.html',
-})
-export class CreateUserPage {
-
- constructor(public navCtrl: NavController, public navParams: NavParams) {
- }
-
- ionViewDidLoad() {
- console.log('ionViewDidLoad CreateUserPage');
- }
-
- goToLogin() {
- this.navCtrl.pop();
- }
-
- goToSelectRestaurant() {
-
- }
-
-}
diff --git a/src/pages/login/login.html b/src/pages/login/login.html
index 2dee75c5..1c6b2db1 100644
--- a/src/pages/login/login.html
+++ b/src/pages/login/login.html
@@ -1,26 +1,35 @@
-
-
-
+
+
-
DineIn
+
+
+

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/login/login.scss b/src/pages/login/login.scss
index c866c68d..7a10e564 100644
--- a/src/pages/login/login.scss
+++ b/src/pages/login/login.scss
@@ -2,12 +2,16 @@ page-login {
#container {
padding-top: 15%;
- width: 350px;
- margin-left:auto;
+ width: 350px;
+ margin-left:auto;
margin-right: auto;
}
.localbutton {
margin: 20px auto;
}
+
+
+
+
}
diff --git a/src/pages/login/login.spec.ts b/src/pages/login/login.spec.ts
new file mode 100644
index 00000000..240467a9
--- /dev/null
+++ b/src/pages/login/login.spec.ts
@@ -0,0 +1,67 @@
+import { async, TestBed, ComponentFixture } from '@angular/core/testing';
+import { IonicModule } from 'ionic-angular';
+
+import { LoginPage } from './login';
+
+import { Component } from '@angular/core';
+import { MyApp } from '../../app/app.component';
+import { IonicPage, NavController, NavParams } from 'ionic-angular';
+import { TabsPage } from '../tabs/tabs';
+import { CreateUserPage } from './create-user';
+
+
+describe('LoginPage Component', () => {
+
+ let fixture: ComponentFixture;
+ let component: LoginPage;
+
+ beforeEach(async(() => {
+
+ TestBed.configureTestingModule({
+ declarations: [
+ MyApp,
+ LoginPage
+ ],
+ imports: [
+ IonicModule.forRoot(MyApp)
+ ],
+ providers: [
+ NavController,
+ {provide: NavParams, useClass: MockNavParams}
+ ]
+ }).compileComponents();
+
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LoginPage);
+ component = fixture.componentInstance;
+ });
+
+ afterEach(() => {
+ fixture.destroy();
+ component = null;
+ });
+
+ it('is created', () => {
+ expect(fixture).toBeTruthy();
+ expect(component).toBeTruthy();
+ });
+ it('should be created', () => {
+ expect(component instanceof LoginPage).toBe(true);
+ });
+ it('should initially have [email, password] set as null', () => {
+ expect(component['email']).toBeNull();
+ expect(component['password']).toBeNull();
+ });
+
+});
+
+class MockNavParams{
+ data = {
+ };
+
+ get(param){
+ return this.data[param];
+ }
+}
\ No newline at end of file
diff --git a/src/pages/login/login.ts b/src/pages/login/login.ts
index 57120ec8..0c6539f1 100644
--- a/src/pages/login/login.ts
+++ b/src/pages/login/login.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { TabsPage } from '../tabs/tabs';
-import { CreateUserPage } from './create-user/create-user';
+import { CreateUserPage } from './create-user';
/**
* Generated class for the LoginPage page.
@@ -20,7 +20,10 @@ export class LoginPage {
email: string;
password: string;
- constructor(public navCtrl: NavController, public navParams: NavParams) { }
+ constructor(public navCtrl: NavController, public navParams: NavParams) {
+ this.email = null;
+ this.password = null;
+ }
ionViewDidLoad() {
console.log('ionViewDidLoad LoginPage');
@@ -32,7 +35,7 @@ export class LoginPage {
if (this.loginSuccess(this.email, this.password)) {
console.log('Login Successful');
this.navCtrl.push(TabsPage);
- }
+ }
else {
console.log('Login Unsuccessful');
}
diff --git a/src/pages/management/management.html b/src/pages/management/management.html
index 0c15e102..bcbf4cbf 100644
--- a/src/pages/management/management.html
+++ b/src/pages/management/management.html
@@ -1,29 +1,73 @@
-
- Management
-
-
-
-
-
+
+
Management
+
+
+
+
+
{{restaurant.name}}
+
+
+
+
Owner:
+ Manager:
+ Employees:
+ Capacity:
+ Tables:
+ Phone:
+ Address:
+
+
+
{{restaurant.getOwner().getFullName()}}
+ {{restaurant.getManager().getFullName()}}
+ {{restaurant.getNumEmployees()}}
+ {{restaurant.getCapacity()}}
+ {{restaurant.tables.length}}
+ {{restaurant.getPhoneStr()}}
+ {{restaurant.addrLine1}}
+ {{restaurant.addrLine2}}
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
-
- Restaurant Name: {{restaurantName}}
-
- Restaurant Capacity: {{capacity}}
-
- Total Employees: {{numEmployees}}
-
+
+

+
+
+
+
+ Restaurant Name: {{management_info.restaurantName}}
+
+ Manager Name: {{management_info.managerName}}
+
+ Restaurant Capacity: {{management_info.capacity}}
+
+ Total Employees: {{management_info.numEmployees}}
+
+
+
+-->
diff --git a/src/pages/management/management.scss b/src/pages/management/management.scss
index ce5a66f5..5bf11c10 100644
--- a/src/pages/management/management.scss
+++ b/src/pages/management/management.scss
@@ -1,5 +1,4 @@
page-management {
-
#topleft {
float: left;
padding-top: 10px;
@@ -15,24 +14,97 @@ page-management {
}
#container {
- float: bottom;
+ width: 100%;
+ height: 100%;
+ }
+
+
+ #profileleft {
+ padding-left: 115px;
+ padding-right: 15px;
+ padding-top: 4%;
+ height: 100%;
+ width: 60%;
+ float: left;
+ }
+
+ #profileright {
+ padding-left: 15px;
+ padding-right: 115px;
+ padding-top: 10%;
+ height: 100%;
+ width: 40%;
+ float: left;
+ }
+
+ #imgcontainer {
+ width: 100%;
+ height: 300px;
+ }
+
+ #employeeimage {
+ height: 100%;
+ width: 100%;
+ border-style: solid;
+ border-radius: 4px;
+ border-width: 2px;
+ border-color: color($colors, middark);
+ object-fit: cover;
+ }
+
+ #employeeprofile {
+ height: 425px;
+ width: 100%;
+ color: color($colors, middark);
+ border-style: solid;
+ border-radius: 4px;
+ border-width: 2px;
+ h5 {
+ margin-bottom: 20px;
+ }
+ }
+
+ #labels {
+ width: 35%;
+ height: 100%;
+ padding-top: 20px;
+ padding-left: 20px;
+ float: left;
+ }
+
+ #employeeinfo {
+ width: 65%;
+ height: 100%;
+ padding-top: 20px;
+ float: left;
+ }
+
+ .localbutton {
+ margin-top: 20px;
}
#restaurantInfo {
- padding: 10px;
+ padding: 15px;
color: color($colors, primary);
- width: 65%;
+ width: 40%;
display: block;
margin: auto;
text-align: right;
- font-size: 200%;
- font-family: palatino;
+ font-size: 150%;
outline-style: solid;
outline-color: color($colors, primary);
-
+ border-width: thin;
+ }
+
+ .resize {
+ width: 650px;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 30px;
}
+
.label {
- font-style: italic;
float: left;
}
}
diff --git a/src/pages/management/management.ts b/src/pages/management/management.ts
index 8d92bab7..76f651ca 100644
--- a/src/pages/management/management.ts
+++ b/src/pages/management/management.ts
@@ -1,22 +1,104 @@
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
+import { UpdateManagementPage } from './update-management';
+import { Employee } from '../employees/employees';
+import { Table } from '../tables/tables';
+//import { NUMBER_TYPE } from '@angular/compiler/src/output/output_ast';
@Component({
- selector: 'page-management',
- templateUrl: 'management.html'
+ selector: 'page-management',
+ templateUrl: 'management.html'
})
export class ManagementPage {
- restaurantName: string;
- capacity: number;
- numEmployees: number;
- constructor(public navCtrl: NavController) {
- this.restaurantName = "Osteria Francescana";
- this.numEmployees = 23;
- this.capacity = 100;
- }
-
- executeLogout() {
- this.navCtrl.parent.parent.pop(this);
- }
+ restaurant: Restaurant;
+
+ constructor(public navCtrl: NavController) {
+ let owner = new Employee("Michael", "Fassbender", "Owner", 100000.01,
+ 2024561111, "../assets/imgs/mikefass.jpg", 1);
+ this.restaurant = new Restaurant("Osteria Francescana", 6088060806, owner,
+ "168 World's End St.", "Nowhere, NO, 99999");
+
+ this.restaurant.employees.push(new Employee("Anna", "Schmidt", "Manager",
+ 50.00, 6086076006, "https://i.pinimg.com/736x/25/48/31/25483183a26a96adcc2b5a4002eda6ca--headshot-ideas-professional-photographer.jpg", 2));
+ }
+
+ executeLogout() {
+ this.navCtrl.parent.parent.pop(this);
+ }
+
+ onEditInfoPress() {
+ this.navCtrl.push(UpdateManagementPage, {restaurant: this.restaurant});
+ }
+
+}
+
+export class Restaurant {
+
+ name: string;
+ addrLine1: string;
+ addrLine2: string;
+
+ capacity: number;
+ phoneNumber: number;
+ totalEmployees: number;
+ tables: Table[];
+
+ employees: Employee[];
+
+ constructor(name: string, phoneNumber: number, owner: Employee,
+ addrLine1: string, addrLine2: string) {
+ this.name = name;
+ this.addrLine1 = addrLine1;
+ this.addrLine2 = addrLine2;
+ this.phoneNumber = phoneNumber;
+
+ this.tables = [];
+ this.employees = [];
+ this.employees.push(owner);
+ }
+
+ getPhoneStr(): string {
+ if (this.phoneNumber) {
+ let phoneStr = this.phoneNumber.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.phoneNumber.toString();
+ }
+
+ getOwner(): Employee {
+ var i;
+ for (i = 0; i < this.employees.length; i++) {
+ if (this.employees[i].ID == 1) {
+ return this.employees[i];
+ }
+ }
+ }
+ getManager(): Employee {
+ var i;
+ for (i = 0; i < this.employees.length; i++) {
+ if (this.employees[i].ID == 2) {
+ return this.employees[i];
+ }
+ }
+ }
+
+ getNumEmployees(): number {
+ return this.employees.length;
+ }
+ getNumTables(): number {
+ return this.tables.length;
+ }
+ getCapacity(): number {
+ if (this.tables.length == 0) {
+ return 0;
+ } else {
+ var i = 0;
+ for (i = 0; i < this.tables.length; i++) {
+ i += this.tables[i].capacity;
+ }
+ }
+ }
}
diff --git a/src/pages/management/update-management.html b/src/pages/management/update-management.html
new file mode 100644
index 00000000..a58626c0
--- /dev/null
+++ b/src/pages/management/update-management.html
@@ -0,0 +1,33 @@
+
+
+
+
Restaurant Information
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/management/update-management.module.ts b/src/pages/management/update-management.module.ts
new file mode 100644
index 00000000..dd37a2b4
--- /dev/null
+++ b/src/pages/management/update-management.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from 'ionic-angular';
+import { UpdateManagementPage } from './update-management';
+
+@NgModule({
+ declarations: [
+ UpdateManagementPage,
+ ],
+ imports: [
+ IonicPageModule.forChild(UpdateManagementPage),
+ ],
+})
+export class UpdateManagementPageModule {}
diff --git a/src/pages/management/update-management.scss b/src/pages/management/update-management.scss
new file mode 100644
index 00000000..b7de1675
--- /dev/null
+++ b/src/pages/management/update-management.scss
@@ -0,0 +1,17 @@
+page-update-management {
+ #container {
+ height: 100%;
+ width: 35%;
+ padding-top: 15%;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+
+ h3 {
+ padding-bottom: 15px;
+ }
+}
diff --git a/src/pages/management/update-management.ts b/src/pages/management/update-management.ts
new file mode 100644
index 00000000..a49fce78
--- /dev/null
+++ b/src/pages/management/update-management.ts
@@ -0,0 +1,86 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams } from 'ionic-angular'
+import { ModalController, ViewController, AlertController } from 'ionic-angular';
+import { ManagementPage} from '../management/management';
+import { InputNumpad } from '../util/numpad';
+import { Restaurant } from './management';
+
+@IonicPage()
+@Component({
+ selector: 'page-update-management',
+ templateUrl: 'update-management.html',
+})
+
+export class UpdateManagementPage {
+
+ restaurant: Restaurant;
+ phone: number;
+ addrLine1: string;
+ addrLine2: string;
+
+ constructor(public navCtrl: NavController,
+ public navParams: NavParams,
+ public alertCtrl: AlertController,
+ public modalCtrl: ModalController) {
+ // this.managementPage = this.navParams.get('managementPage');
+ this.restaurant = this.navParams.get('restaurant');
+ this.phone = this.restaurant.phoneNumber;
+ this.addrLine1 = this.restaurant.addrLine1;
+ this.addrLine2 = this.restaurant.addrLine2;
+ }
+
+ submit() {
+ this.restaurant.phoneNumber = this.phone;
+ this.restaurant.addrLine1 = this.addrLine1;
+ this.restaurant.addrLine2 = this.addrLine2;
+ this.navCtrl.pop();
+ }
+
+ presentPhoneNumpad() {
+
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Phone Number",
+ alertTitle: "Invalid Phone Number",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0; },
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.phone = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ getPhoneStr(): string {
+ if (this.phone) {
+ let phoneStr = this.phone.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.phone.toString();
+ }
+
+ exit() {
+ let confirm = this.alertCtrl.create({
+ title: 'Exit without saving?',
+ message: 'Are you sure you want to exit without saving your changes?',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Exit',
+ handler: () => { this.navCtrl.pop(); }
+ }
+ ]
+ });
+ confirm.present();
+ }
+}
diff --git a/src/pages/punchcard/punchcard.html b/src/pages/punchcard/punchcard.html
index 7664602b..c2ad2cbe 100644
--- a/src/pages/punchcard/punchcard.html
+++ b/src/pages/punchcard/punchcard.html
@@ -1,41 +1,123 @@
-
- View PunchCards
-
-
-
-
+
+
View PunchCards
+
-
-
-
-
-
- | Name |
- Shift Start |
- Shift End |
- Hours Worked |
-
-
- | {{entry.getName()}} |
- {{entry.getStartTime()}} |
- {{entry.getEndTime()}} |
- {{entry.getTotalTime()}} |
-
-
- | {{entry.getName()}} |
- {{entry.getStartTime()}} |
- {{entry.getEndTime()}} |
- {{entry.getTotalTime()}} |
-
-
- | {{entry.getName()}} |
- {{entry.getStartTime()}} |
- {{entry.getEndTime()}} |
- {{entry.getTotalTime()}} |
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+ Employee Name |
+ Shift Start |
+ Shift End |
+ Hours Worked |
+
+
+
+
+
+
+
+
+
+
+
+ {{shift.name}}
+ |
+
+ {{shift.startTime}}
+ |
+
+
+ {{shift.hasEnded()? shift.endTime : "In Progress"}}
+
+ |
+
+
+ {{shift.hasEnded()? shift.shiftLength : "N/A"}}
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
For Employee:
+
+
+
+
+
+
+
+
From:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
To:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/punchcard/punchcard.scss b/src/pages/punchcard/punchcard.scss
index e4d6c374..972bbf3f 100644
--- a/src/pages/punchcard/punchcard.scss
+++ b/src/pages/punchcard/punchcard.scss
@@ -5,22 +5,89 @@ page-punchcard {
padding-top: 10px;
padding-left: 25px;
width: 75%;
- }
+ }
+
+ #topright {
+ float:right;
+ padding-top: 25px;
+ padding-right: 20px;
+ width: 25%;
+ }
+
+ #scrollcontainer {
+ float: top;
+ height: 75%;
+
+ margin-top: 5%;
+ margin-bottom: 25%;
+
+ h4 {
+ margin-bottom: 20px;
+ }
+ h6 {
+ margin-bottom: 12px;
+ }
+
+ }
+
+ #punchcardtable {
+ height: 80%;
+ width: 100%;
+ padding: 20px;
+ }
- #topright {
- float:right;
- padding-top: 25px;
- padding-right: 20px;
- width: 25%;
- }
+ #filterpanel {
+ float: bottom;
+ height: 100%;
+ margin-top: 45%;
+ padding-top: 30px;
+ padding-left: 35px;
+ padding-right: 35px;
+ }
- #container {
- float: bottom;
- }
+ #employeemodal {
+ width: 50%;
+ height: 100%;
+ margin: auto;
+ }
+
+ #employeeslist {
+ width: 100%;
+ height: 310px;
+ margin-top: 15px;
+ margin-bottom: 25px;
+ background-color: color($colors, dark);
+ }
+
+ .selectedemployee {
+ color: color($colors, primary);
+ }
+
+ .employee {
+ color: color($colors, middark);
+ }
th, td {
width: 500px;
- padding: 10px;
text-align: center;
}
+
+ .filter-container {
+ //background-color: blakc
+ }
+
+ .filterparam {
+ display: inline;
+ float: left;
+ width: 25%;
+ height: 140px;
+ padding: 15px;
+
+
+ }
+
+ .applyfilterbutton {
+ margin-top: 43px;
+ height: 50px;
+ }
}
diff --git a/src/pages/punchcard/punchcard.ts b/src/pages/punchcard/punchcard.ts
index fa9a23f5..ef8f88ee 100644
--- a/src/pages/punchcard/punchcard.ts
+++ b/src/pages/punchcard/punchcard.ts
@@ -1,62 +1,270 @@
import { Component } from '@angular/core';
-import { NavController, DateTime } from 'ionic-angular';
+import { NavController, ModalController, ViewController, NavParams, AlertController } from 'ionic-angular';
+import { Employee, EmployeeShift } from '../employees/employees';
+import { DateTimeService } from '../util/date-time';
@Component({
- selector: 'page-punchcard',
- templateUrl: 'punchcard.html'
+ selector: 'page-punchcard',
+ templateUrl: 'punchcard.html'
})
export class PunchCardPage {
- employeeShiftsList: EmployeeShift[];
-
- constructor(public navCtrl: NavController) {
- this.employeeShiftsList = [
- new EmployeeShift("Kevin Anderson", "2018-02-12T07:24", "2018-02-12T19:24", 12.000),
- new EmployeeShift("Bryan Suzan", "2018-02-12T07:25", "2018-02-12T09:47", 2.367),
- new EmployeeShift("Marianne Beaumont", "2018-02-12T07:30", "2018-02-12T20:45", 13.250),
- new EmployeeShift("Carl Robins", "2018-02-12T07:29", "2018-02-12T12:00", 4.517),
- new EmployeeShift("Kevin Anderson", "2018-02-13T07:26", "2018-02-12T19:24", 11.967),
- new EmployeeShift("Bryan Suzan", "2018-02-14T07:26", "2018-02-12T09:48", 2.367),
- new EmployeeShift("Bryan Suzan", "2018-02-14T018:00", "2018-02-12T23:28", 5.467),
- new EmployeeShift("TinaRusso", "2018-02-16T07:24", "2018-02-12T09:46", 2.367)
- ]
- }
+ displayShiftList: EmployeeShift[];
+ employees: Employee[];
+ allShifts: EmployeeShift[];
+ filterStartDate: string;
+ filterEndDate: string;
+
+ selectedEmployeeID: number;
+
+ constructor(public navCtrl: NavController,
+ public modalCtrl: ModalController,
+ public alertCtrl: AlertController,
+ private dateTime: DateTimeService) {
+
+ this.displayShiftList = [];
+ this.allShifts = [];
+ this.selectedEmployeeID = null;
+ this.filterStartDate = null;
+ this.filterEndDate = null;
+
+ this.employees =
+ [
+ new Employee("Carl", "Robins", "Assistant Manager", 30, 6083456789, "http://www.math.uni-frankfurt.de/~person/_4170854.jpg"),
+ new Employee("Marianne", "Beaumont", "Hostess", 15, 9119119911, "http://www.pearsonvue.com/pteprofessional/images/homepage.png"),
+ new Employee("Anna", "Schmidt", "Manager", 50, 6086076006, "https://i.pinimg.com/736x/25/48/31/25483183a26a96adcc2b5a4002eda6ca--headshot-ideas-professional-photographer.jpg"),
+ new Employee("Valerie", "Carter", "Owner", 1003, 2024561111, "https://cdn10.phillymag.com/wp-content/uploads/2016/01/woman-biz.jpg"),
+ new Employee("Phil", "Scott", "Bartender", 10, 6083104545, "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Robert_gold_bartender.jpg/220px-Robert_gold_bartender.jpg"),
+ new Employee("Kevin", "Anderson", "Server", 5, 6088067777, "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxhJ8HaQ88jGA0Ws2WTCnI4DzSgMzvEXk4qdbQVbCAiKyP9yGl"),
+ new Employee("Tina", "Russo", "Head Chef", 500, 4149217439, "https://cdn2.goabroad.com/images/program_content/5-tips-for-teaching-english-abroad-as-a-person-of-color-2-1462426680.jpg"),
+ new Employee("Bryan", "Suzan", "DJ", 0.03, 6666666666, "../../assets/imgs/bryan.jpg")
+ ];
+
+ this.employees[7].shifts = [
+ new EmployeeShift("02/01/2018 06:00", "02/01/2018 18:00", "Bryan Suzan"),
+ new EmployeeShift("02/02/2018 07:00", "02/02/2018 07:15", "Bryan Suzan"),
+ new EmployeeShift("02/14/2018 08:00", "02/14/2018 09:30", "Bryan Suzan"),
+ new EmployeeShift("04/01/2018 18:00", "04/02/2018 18:00", "Bryan Suzan"),
+ new EmployeeShift("04/20/2018 04:20", "04/20/2018 14:20", "Bryan Suzan"),
+ new EmployeeShift("04/21/2018 00:20", "04/21/2018 01:54", "Bryan Suzan"),
+ new EmployeeShift("02/01/2018 06:01", "02/01/2018 18:00", "Bryan Suzan"),
+ new EmployeeShift("02/02/2018 07:01", "02/02/2018 07:15", "Bryan Suzan"),
+ new EmployeeShift("02/14/2018 08:01", "02/14/2018 09:30", "Bryan Suzan"),
+ new EmployeeShift("04/01/2018 18:01", "04/02/2018 18:00", "Bryan Suzan"),
+ new EmployeeShift("04/20/2018 04:21", "04/20/2018 14:20", "Bryan Suzan"),
+ new EmployeeShift("04/21/2018 00:21", "04/21/2018 01:54", "Bryan Suzan")
+ //new EmployeeShift("04/22/2018 07:01", undefined, "Bryan Suzan")
+ ];
+ this.employees[0].shifts = [
+ new EmployeeShift("02/01/2018 00:00", "02/01/2018 23:59", "Carl Robins"),
+ new EmployeeShift("02/02/2018 23:45", "02/03/2018 00:15", "Carl Robins"),
+ new EmployeeShift("02/11/2018 08:13", "02/14/2018 13:22", "Carl Robins"),
+ new EmployeeShift("04/20/2018 18:00", "04/02/2018 18:00", "Carl Robins"),
+ new EmployeeShift("04/20/2018 04:20", "02/01/2018 14:20", "Carl Robins")
+ ];
+ this.employees[1].shifts = [
+ new EmployeeShift("02/01/2018 06:00", "02/01/2018 18:00", "Marianne Beaumont"),
+ new EmployeeShift("02/02/2018 07:00", "02/02/2018 07:15", "Marianne Beaumont"),
+ new EmployeeShift("02/14/2018 08:00", "02/14/2018 09:30", "Marianne Beaumont"),
+ new EmployeeShift("04/01/2018 18:00", "04/02/2018 18:00", "Marianne Beaumont"),
+ new EmployeeShift("04/20/2018 04:20", "02/01/2018 14:20", "Marianne Beaumont")
+ ];
+ this.employees[2].shifts = [
+ new EmployeeShift("02/01/2018 06:00", "02/01/2018 18:00", "Anna Schmidt"),
+ new EmployeeShift("02/02/2018 07:00", "02/02/2018 07:15", "Anna Schmidt"),
+ new EmployeeShift("02/14/2018 08:00", "02/14/2018 09:30", "Anna Schmidt"),
+ new EmployeeShift("04/01/2018 18:00", "04/02/2018 18:00", "Anna Schmidt"),
+ new EmployeeShift("04/20/2018 04:20", "02/01/2018 14:20", "Anna Schmidt")
+ ];
+
+ var i;
+ for (i = 0; i < this.employees.length; i++) {
+ this.employees[i].shifts.sort(EmployeeShift.compare);
+ var j;
+ for (j = 0; j < this.employees[i].shifts.length; j++) {
+ this.allShifts.push(this.employees[i].shifts[j]);
+ }
+ }
+ this.allShifts.sort(EmployeeShift.compare);
+
+ this.filterShiftByLatest(30);
+ }
+
+ filterShiftByEmployeeID(ID: number, shiftCount?: number) {
+ let employee: Employee = this.getEmployeeByID(ID);
+ let limit = shiftCount? shiftCount : 100;
+ var i, count;
+ for(i = employee.shifts.length-1, count = 0;
+ (i >=0) && (count <= limit);
+ i--, count++) {
+ this.displayShiftList.push(employee.shifts[i]);
+ }
+ }
+
+ filterShiftByLatest(shiftCount?: number) {
+ let limit = shiftCount? shiftCount : 100;
+ var i, count;
+ for(i = this.allShifts.length-1, count = 0;
+ (i >= 0) && (count <= limit);
+ i--, count++) {
+ this.displayShiftList.push(this.allShifts[i]);
+ }
+ }
+
+ filterShiftByDate() {
+ let tmp: EmployeeShift[] = [];
+ var j;
+ for (j = 0; j < this.displayShiftList.length; j++) {
+ tmp.push(this.displayShiftList[j]);
+ }
+ this.clearDisplayShiftList();
+
+ var i;
+ if (this.filterBySingleDate()) {
+ for (i = 0; i < tmp.length; i++) {
+ if (this.dateTime.sameDay(tmp[i].startTime, this.filterStartDate) ||
+ this.dateTime.sameDay(tmp[i].endTime, this.filterStartDate) ||
+ this.dateTime.sameDay(tmp[i].startTime, this.filterEndDate) ||
+ this.dateTime.sameDay(tmp[i].endTime, this.filterEndDate)) {
+ this.displayShiftList.push(tmp[i]);
+ }
+ }
+ } else if (this.filterByInterval()) {
+ for (i = 0; i < tmp.length; i++) {
+ if (this.dateTime.inBetween(tmp[i].startTime, this.filterStartDate, this.filterEndDate)) {
+ this.displayShiftList.push(tmp[i]);
+ }
+ }
+ }
+ }
+
+ getEmployeeByID(ID: number) {
+ var i: number;
+ for (i = 0; i < this.employees.length; i++) {
+ if (ID == this.employees[i].ID) {
+ return this.employees[i];
+ }
+ }
+ return null // SHOULD NOT BE REACHED
+ }
+
+ presentEmployeeSelector() {
+ let modal = this.modalCtrl.create(SelectEmployee, {employees: this.employees});
+ modal.onDidDismiss(data => {
+ if (data != null) {
+ this.selectedEmployeeID = data;
+ }
+ });
+ modal.present();
+ }
+
+ applyFilter() {
+
+ if (this.selectedEmployeeID == null) {
+ let alert = this.alertCtrl.create({
+ title: 'Please Select an Employee',
+ enableBackdropDismiss: false,
+ buttons: [ { text: 'OK', handler: () => {} } ]
+ });
+ alert.present();
+ return;
+ }
+ if (!this.noTimeFilter() && !this.filterBySingleDate() &&
+ !(this.filterStartDate == this.filterEndDate)) {
+ if (!this.dateTime.isBefore(this.filterStartDate, this.filterEndDate)) {
+ let alert = this.alertCtrl.create({
+ title: 'The End Date is Before the Start Date',
+ enableBackdropDismiss: false,
+ buttons: [ { text: 'OK', handler: () => {} } ]
+ });
+ alert.present();
+ return;
+ }
+ }
+
+ this.clearDisplayShiftList();
+ if (this.selectedEmployeeID == 0) {
+ this.filterShiftByLatest();
+ } else {
+ this.filterShiftByEmployeeID(this.selectedEmployeeID);
+ }
+ if (!this.noTimeFilter()) {
+ this.filterShiftByDate();
+ }
+ }
+
+ clearDisplayShiftList() {
+ this.displayShiftList.length = 0;
+ }
+
+ filterBySingleDate(): boolean {
+ return !this.filterByInterval() && !this.noTimeFilter();
+ }
+
+ filterByInterval(): boolean {
+ return ((this.filterStartDate != null) && (this.filterEndDate != null) &&
+ !(this.filterStartDate == this.filterEndDate));
+ }
+
+ noTimeFilter(): boolean {
+ return (this.filterStartDate == null) && (this.filterEndDate == null);
+ }
}
-export class EmployeeShift {
- name: string;
- startTime: string; //DateTime is just a string
- endTime: string;
- totalTime: number;
-
-
- constructor(name: string, startTime: string, endTime: string, totalTime?: number) {
- this.name = name;
- this.startTime = startTime;
- this.endTime = endTime;
- if (totalTime != null) {
- this.totalTime = totalTime;
- } else {
- this.setTotalTime();
- }
-
- }
- getName(): string {
- return this.name;
- }
- getStartTime(): string {
- return this.startTime;
- }
- getEndTime(): string {
- return this.endTime;
- }
- getTotalTime(): number {
- return this.totalTime;
- }
- setTotalTime() {
- //TODO: write this function
- this.totalTime = 0;
- }
+//------------------------------------------------------------------------------
+// Sub-View: SelectServer
+//------------------------------------------------------------------------------
+@Component({
+ selector: 'page-punchcard',
+ template: `
+
+
Select Employee
+
+
+
+
+
+
+
+
+
+ `
+})
+export class SelectEmployee {
+
+ employees: Employee[];
+ selectedEmployee: Employee;
+
+ constructor(public viewCtrl: ViewController,
+ private params: NavParams) {
+ this.employees = params.get('employees');
+ this.selectedEmployee = this.employees[0];
+ }
+
+ selectEmployee(e: Employee) {
+ this.selectedEmployee = e;
+ }
+
+ OK() {
+ this.viewCtrl.dismiss(this.selectedEmployee.ID);
+ }
+
+ selectAllEmployees() {
+ this.viewCtrl.dismiss(0);
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss(null);
+ }
}
diff --git a/src/pages/tables/add-party.html b/src/pages/tables/add-party.html
new file mode 100644
index 00000000..08d2267b
--- /dev/null
+++ b/src/pages/tables/add-party.html
@@ -0,0 +1,44 @@
+
+
+
+
Party Information
+
+
+
+
+
+
+
+
+
+ Reservation?
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/tables/add-party/add-party.module.ts b/src/pages/tables/add-party.module.ts
similarity index 100%
rename from src/pages/tables/add-party/add-party.module.ts
rename to src/pages/tables/add-party.module.ts
diff --git a/src/pages/tables/add-party.scss b/src/pages/tables/add-party.scss
new file mode 100644
index 00000000..ede554ac
--- /dev/null
+++ b/src/pages/tables/add-party.scss
@@ -0,0 +1,27 @@
+page-add-party {
+
+ #container {
+ height: 100%;
+ width: 35%;
+ padding-top: 90px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ #reservationcheckbox {
+ border-style: solid;
+ border-radius: 2px;
+ border-width: 2px;
+ background-color: color($colors, darkest);
+ }
+
+ #numpadmodal {
+ height: 100%;
+ width: 56%;
+ margin: auto;
+ }
+
+ .localbutton {
+ margin-top: 20px;
+ }
+}
diff --git a/src/pages/tables/add-party.ts b/src/pages/tables/add-party.ts
new file mode 100644
index 00000000..4dd02d64
--- /dev/null
+++ b/src/pages/tables/add-party.ts
@@ -0,0 +1,177 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams } from 'ionic-angular'
+import { ModalController, ViewController, AlertController } from 'ionic-angular';;
+import { Party } from './tables';
+import { DateTimeService } from '../util/date-time';
+import { InputNumpad } from '../util/numpad';
+
+@IonicPage()
+@Component({
+ selector: 'page-add-party',
+ templateUrl: 'add-party.html',
+})
+export class AddPartyPage {
+
+ editMode: boolean;
+
+ ID: number;
+ name: string;
+ size: number;
+ contact: number;
+ time: string;
+ reservation: boolean;
+
+ party: Party;
+ parties: Party[];
+
+ constructor(public navCtrl: NavController,
+ public modalCtrl: ModalController,
+ public viewCtrl: ViewController,
+ public alertCtrl: AlertController,
+ public navParams: NavParams,
+ private datetime: DateTimeService) {
+
+ this.editMode = this.navParams.get("edit");
+
+ //
+ // Editing party mode
+ //
+ if (this.editMode) {
+ this.party = this.navParams.get("edit_party");
+
+ // Set user inputs automatically to the values of party being edited
+ this.ID = this.party.ID;
+ this.name = this.party.name;
+ this.size = this.party.size;
+ this.contact = this.party.contact;
+ this.reservation = this.party.reservation;
+ this.time = this.party.time;
+
+ //
+ // Adding new party mode
+ //
+ } else {
+ this.parties = this.navParams.get("parties");
+
+ // All inputs initially empty
+ this.ID = null;
+ this.name = null;
+ this.size = null;
+ this.contact = null;
+ this.reservation = false;
+ this.time = null;
+ }
+
+ }
+
+ submit() {
+ //
+ // Invalid Input data
+ //
+ if (!this.validData()) {
+ let alert = this.alertCtrl.create({
+ title: 'Some Information is Missing!',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Dismiss',
+ handler: () => { }
+ }
+ ]
+ });
+ alert.present();
+
+ //
+ // Valid Input Data
+ //
+ } else {
+
+ if (this.editMode) {
+ this.party.ID = this.ID;
+ this.party.name = this.name;
+ this.party.size = this.size;
+ this.party.contact = this.contact;
+ this.party.reservation = this.reservation;
+ this.party.time = this.time;
+ console.log("Saved edited Party ID: " + this.party.ID);
+
+ // Adding Party Mode
+ } else {
+ var partyTime: string;
+
+ if (this.reservation) {
+ partyTime = this.time;
+ } else {
+ partyTime = this.datetime.getTime();
+ }
+ var party = new Party(this.name, this.size, partyTime,
+ this.contact, this.reservation);
+ this.parties.push(party);
+ this.parties.sort(Party.compare);
+ console.log("Added Party ID: " + party.ID);
+ }
+
+ this.exit();
+ }
+ }
+
+ exit() {
+ console.log(this.time);
+ console.log("Exiting Add/Edit Party Page...");
+ this.navCtrl.pop();
+ }
+
+ presentSizeNumpad() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Party Size",
+ alertTitle: "Invalid Party Size",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.size = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ presentContactNumpad() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Contact Number",
+ alertTitle: "Invalid Contact Number",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0;},
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.contact = returnedNum;
+ }
+ });
+ numpadModal.present();
+ }
+
+ validData() {
+ return ((this.name != null) &&
+ (this.size != null) &&
+ (this.contact != null) &&
+ (this.reservation != null) &&
+ (!this.reservation || (this.time != null)))
+ }
+
+ getContactStr(): string {
+ if (this.contact) {
+ let phoneStr = this.contact.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.contact.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/pages/tables/add-party/add-party.html b/src/pages/tables/add-party/add-party.html
deleted file mode 100644
index 6a9eb05f..00000000
--- a/src/pages/tables/add-party/add-party.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- Party Information
-
-
-
-
- Reservation?
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/tables/add-party/add-party.scss b/src/pages/tables/add-party/add-party.scss
deleted file mode 100644
index 2b4bd867..00000000
--- a/src/pages/tables/add-party/add-party.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-page-add-party {
-
- #container {
- width: 325px;
- padding-top: 70px;
- margin-left: auto;
- margin-right: auto;
- }
-
- #reservationcheckbox {
- border-style: solid;
- border-radius: 2px;
- border-width: 2px;
- border-color: color($colors, primary);
- background-color: color($colors, darkest);
- }
-
- #timeselect {
- margin-top: 10px;
- border-style: solid;
- border-radius: 2px;
- border-width: 2px;
- padding-left: 0px;
- border-color: color($colors, primary);
- background-color: color($colors, darkest);
- }
-
- .numpadinput .button-inner {
- justify-content:flex-start;
- color: color($colors, middark);
- }
- .numpadinputhasval .button-inner{
- justify-content:flex-start;
- color: color($colors, primary);
- }
-
- .numpadinput {
- margin-top: 20px;
- margin-bottom: 20px;
- }
-
- .numpadinputhasval {
- margin-top: 20px;
- margin-bottom: 20px;
- }
-
- #numpadmodal {
- height: 100%;
- margin-left: 20%;
- margin-right: 20%;
- }
-
- .numkey {
- color: color($colors, primary);
- background-color: color($colors, darkest);
- }
-
- .numpad {
- background-color: color($colors, darkest);
- }
-
- .localbutton {
- margin-top: 20px;
- }
-}
diff --git a/src/pages/tables/add-party/add-party.ts b/src/pages/tables/add-party/add-party.ts
deleted file mode 100644
index 8a0e7ebe..00000000
--- a/src/pages/tables/add-party/add-party.ts
+++ /dev/null
@@ -1,221 +0,0 @@
-import { Component } from '@angular/core';
-import { IonicPage, NavController, NavParams } from 'ionic-angular'
-import { ModalController, ViewController } from 'ionic-angular';;
-import { Party } from '../tables';
-
-@IonicPage()
-@Component({
- selector: 'page-add-party',
- templateUrl: 'add-party.html',
-})
-export class AddPartyPage {
-
- FIELD_SIZE: string;
- FIELD_CONTACT: string;
- buttonTextSize: string;
- buttonTextContact: string;
-
- editMode: boolean;
-
- ID: number;
- name: string;
- size: number;
- contact: string;
- time: string;
- reservation: boolean;
-
- party: Party;
- parties: Party[];
-
- constructor(public navCtrl: NavController,
- public modalCtrl: ModalController,
- public viewCtrl: ViewController,
- public navParams: NavParams) {
-
- this.FIELD_SIZE = "Party Size";
- this.FIELD_CONTACT = "Contact Number";
-
- this.editMode = navParams.get("edit");
- console.log("EDIT PARTY MODE: " + this.editMode);
-
- if (this.editMode) {
- this.party = navParams.get("edit_party");
- this.buttonTextSize = String(this.party.size);
- this.buttonTextContact = String(this.party.contact);
- this.ID = this.party.ID;
- this.name = this.party.name;
- this.size = this.party.size;
- this.contact = this.party.contact;
- this.reservation = this.party.reservation;
- this.time = String(this.party.time);
- } else {
- this.parties = navParams.get("parties");
- this.buttonTextSize = "Size";
- this.buttonTextContact = "Contact Number";
- this.ID = null;
- this.name = null;
- this.size = null;
- this.contact = null;
- this.reservation = false;
- this.time = null;
- }
-
- }
-
- submit() {
- if (this.editMode) {
- this.saveEditedParty();
- } else {
- this.addParty();
- }
- console.log("about to pop add party page");
- this.navCtrl.pop();
- }
-
- presentNumpad(field: string) {
- let modal = this.modalCtrl.create(Numpad, {field: field});
- modal.onDidDismiss(data => {
- if (data != null) {
- if (field == this.FIELD_SIZE) {
- this.size = data;
- this.buttonTextSize = String(this.size);
- } else if (field == this.FIELD_CONTACT) {
- this.contact = String(data);
- this.buttonTextContact = String(this.contact);
- }
- }
-
- });
- modal.present();
- }
-
- validData() {
- return ((this.name != null) &&
- (this.size != null) &&
- (this.contact != null) &&
- (this.reservation != null));
- }
-
- cancel() {
- this.navCtrl.pop();
- }
-
- addParty() {
- var partyTime: string;
-
- if (this.reservation) {
- partyTime = this.time;
- } else {
- var d = new Date();
- var curr_hour = d.getHours();
- var curr_min = d.getMinutes();
- var a_p: string;
- if (curr_hour < 12) {
- a_p = "AM";
- } else {
- a_p = "PM";
- }
- if (curr_hour == 0) {
- curr_hour = 12;
- }
- if (curr_hour > 12) {
- curr_hour = curr_hour - 12;
- }
- partyTime = (curr_hour + ":" + curr_min + " " + a_p);
- }
-
- console.log(this.name + " " + this.size + " " + this.contact + " " + this.reservation);
-
- if (this.validData()) {
- var party = new Party(this.name, this.size, partyTime,
- this.contact, this.reservation);
- this.parties.push(party);
- console.log("PUSHED PARTY");
- }
- }
-
- saveEditedParty() {
- this.party.ID = this.ID;
- this.party.name = this.name;
- this.party.size = this.size;
- this.party.contact = this.contact;
- this.party.reservation = this.reservation;
- this.party.time = this.time;
- }
-}
-
-//------------------------------------------------------------------------------
-// Sub-View: NumPad
-//------------------------------------------------------------------------------
-@Component({
- selector: 'page-add-party',
- template: `
-
-
-
{{userInput}}
-
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
-
-
-
-
- `
-})
-export class Numpad {
-
- field: string;
- userInput: number;
-
- constructor(public navCtrl: NavController,
- public viewCtrl: ViewController,
- params: NavParams) {
- this.field = params.get('field');
- this.userInput = 0;
- }
-
- pressButton(n: number) {
- this.userInput = this.userInput * 10 + n;
- }
-
- deleteButton() {
- this.userInput = Math.floor(this.userInput / 10);
- }
-
- clearButton() {
- this.userInput = 0;
- }
-
- OK() {
- if (this.userInput > 0) {
- //let data = {'userInput': this.userInput};
- this.viewCtrl.dismiss(this.userInput);
- } else {
- this.viewCtrl.dismiss(null);
- }
- }
-
- cancel() {
- this.navCtrl.pop();
- }
-}
\ No newline at end of file
diff --git a/src/pages/tables/numpad.html b/src/pages/tables/numpad.html
index b9dad682..5841852c 100644
--- a/src/pages/tables/numpad.html
+++ b/src/pages/tables/numpad.html
@@ -1,27 +1,27 @@
{{input}}
-
-
+
+
|
- |
+ |
|
|
- |
+ |
|
|
- |
+ |
|
|
- |
+ |
|
diff --git a/src/pages/tables/tables.html b/src/pages/tables/tables.html
index dc2467c8..64faf55f 100644
--- a/src/pages/tables/tables.html
+++ b/src/pages/tables/tables.html
@@ -1,62 +1,81 @@
-
+
+
-
-
-
-
+
-
-
-
+
+
+
-
-
\ No newline at end of file
+
+
diff --git a/src/pages/tables/tables.scss b/src/pages/tables/tables.scss
index 3cb6b86d..5907ce99 100644
--- a/src/pages/tables/tables.scss
+++ b/src/pages/tables/tables.scss
@@ -1,201 +1,186 @@
page-tables {
- .background {
- background-color: color($colors, dark);
- }
-
- #headerleft, #headerright {
- padding-top: 5px;
- padding-bottom: 5px;
- padding-left: 10px;
- padding-right: 10px;
- background-color: color($colors, dark);
- }
-
- #headerleft {
- float: left;
- width: 80%;
- }
-
- #headerright {
- float:right;
- width: 20%;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-left: 10px;
- padding-right: 10px;
- }
-
- #restaurantname {
- float: left;
- width: 55%;
- padding-top: 0px;
- padding-left: 20px;
- margin: 0px;
- }
-
- #headerbuttoncontainer {
- float: right;
- width: 45%;
- }
-
- #cancelseatpartybutton {
- width: 48%;
- float: left;
- }
-
- #editlayoutbutton {
- width: 48%;
- float: right;
- }
-
- #layoutview {
- margin-right: 20%;
- width:80%;
- padding: 5px;
- }
-
- #sideview {
- margin-left: 80%;
- width:20%;
- background-color: color($colors, dark);
- }
-
- #waitlist {
- width: 100%;
- height: 100%;
- background-color: color($colors, dark);
- padding: 10px;
- }
-
-
- .resparty, .waitparty {
- padding-left: 5px;
- margin: 0px;
- border-radius: 0px;
- border-top: 0px;
- border-right: 0px;
- border-left: 0px;
- border-bottom: solid 0.7px;
- border-radius: 2px;
- border-color: color($colors, middark);
- font-size: 15px;
- font-weight: 450;
-
- .button-inner{
- justify-content:flex-start;
- }
- }
-
- .waitparty {
- color: color($colors, medium);
- }
-
- .tablediv {
- float: left;
- margin: 20px;
- height: 80px;
- width: 14%;
- }
-
-
- .tablebuttoncapacity {
- float: right;
- height: 65%;
- width: 75%;
- margin: 0px;
- padding: auto;
- }
-
- .tablebuttonID {
- float: left;
- height: 65%;
- width: 25%;
- margin: 0px;
- padding: auto;
- color: color($colors, medium);
- }
-
- .tablebuttonserver {
- width: 100%;
- height: 35%;
- float: bottom;
- margin: 0px;
- padding: auto;
- color: color($colors, medium);
- justify-content:flex-start;
- }
-
-
-
- .table, .tablenotfree, .tablechooseme {
- width: 100%;
- height: 100%;
- font-size: 28px;
- font-weight: 600;
- padding: 0px;
- margin: 0px;
- }
-
- .tablenotfree {
- //background-color: color($colors, secondary);
- color: color($colors, secondary);
- border-color: color($colors, secondary);
- }
-
- .tablechooseme {
- //background-color: color($colors, tertiary);
- color: color($colors, tertiary);
- border-color: color($colors, tertiary);
- }
-
- #tablemodal {
- background-color: color($colors, dark);
- border-radius: 5px;
- margin-top: 20%;
- margin-left: 25%;
- margin-right: 25%;
- padding-top: 15px;
- padding-bottom: 2px;
- padding-left: 30px;
- padding-right: 30px;
- }
-
- #partymodal {
- background-color: color($colors, dark);
- border-radius: 5px;
- margin-top: 22%;
- margin-left: 15%;
- margin-right: 15%;
- padding-top: 15px;
- padding-bottom: 2px;
- padding-left: 30px;
- padding-right: 30px;
- }
-
- #numpadmodal {
- height: 100%;
- margin-left: 22%;
- margin-right: 22%;
- }
-
- .numpad {
- table-layout: fixed;
- background-color: color($colors, darkest);
- border-radius: 5px;
- width: 100%;
- height: 100%;
- }
-
- .numkey {
- width: 98%;
- height: 100%;
- font-size: 28px;
- font-weight: 600;
- border-radius: 5px;
- margin: 0px;
- color: color($colors, primary);
- background-color: color($colors, darkest);
- }
+// All Nav Bar stuff, so anything up top.
+ // title
+ #topleft {
+ float: left;
+ padding-left: 25px;
+ width: 75%;
+ }
+
+ .nav-bar {
+ display: flex;
+ }
+
+ // Title black or white
+ .nav-bar h3 {
+ //color: white // comment line out to make dark
+ color: color($colors, lighter);
+ }
+
+ .nav-bar button {
+ float: right;
+ width: 150px;
+ height: 50px;
+ padding-left: 10%;
+ padding-right: 10%;
+ margin-left: 10px;
+ margin-right: 10px;
+
+ // button colors
+ //border-color: white;
+ //color: white;
+ border-color: color($colors, lighter);
+ color: color($colors, lighter);
+
+ // dark theme
+ // border-color: color($colors, dark);
+ // color: color($colors, dark);
+ }
+
+ #layoutview {
+ padding-right: 25%;
+ width:80%;
+ padding: 5px;
+ }
+
+ #sideview {
+ margin-left: 80%;
+ width:20%;
+ background-color: color($colors, dark);
+ }
+
+ #waitlist {
+ width: 100%;
+ height: 100%;
+ background-color: color($colors, dark);
+ padding: 10px;
+ }
+
+ .resparty, .selectedserver {
+ color: color($colors, primary);
+ }
+
+ .waitparty, .server {
+ color: color($colors, medium);
+ }
+
+
+ .tablediv {
+ position: absolute;
+ display: inline;
+ //margin: 20px;
+ padding: 20px;
+ height: auto;
+ width: 160px;
+ }
+
+ .table-content {
+ height:100%;
+ width:100%;
+ padding:5%;
+ }
+
+ .tablebuttoncapacity {
+ // margin-top: 40%;
+ // height: 65%;
+ // width: 75%;
+ // position: absolute;
+
+ font-size: 24px;
+
+ }
+
+ .tablebuttonID {
+ // height: 65%;
+ // width: 25%;
+ color: color($colors, medium);
+ }
+
+ .tablebuttonserver {
+ // width: 100%;
+ // height: 35%;
+ color: color($colors, medium);
+ }
+
+ .table, .tablenotfree, .tablechooseme {
+ width: 100%;
+ height: 100%;
+ font-size: 28px;
+ font-weight: 600;
+ padding: 0px;
+ margin: 0px;
+ }
+
+ .tablenotfree {
+ //background-color: color($colors, secondary);
+ color: color($colors, secondary);
+ border-color: color($colors, secondary);
+ }
+
+ .tablechooseme {
+ //background-color: color($colors, tertiary);
+ color: color($colors, tertiary);
+ border-color: color($colors, tertiary);
+ }
+
+ .modalbase {
+ h3 {
+ margin-bottom: 20px;
+ }
+ h5 {
+ margin-bottom: 10px;
+ }
+ }
+
+ #tablemodal {
+ height: 67%;
+ width: 50%;
+ margin: auto;
+ margin-top: 20%;
+ //background-color: rgba(color($colors, middark), 0.15);
+ }
+
+ #partymodal {
+ height: 55%;
+ width: 70%;
+ margin: auto;
+ margin-top: 23%;
+ //background-color: rgba(color($colors, middark), 0.15);
+ }
+
+ #servermodal {
+ border-radius: 5px;
+ padding-top: 15px;
+ padding-bottom: 2px;
+ padding-left: 30px;
+ padding-right: 30px;
+ width: 45%;
+ height: 100%;
+ margin: auto;
+ }
+
+ #numpadmodal {
+ height: 100%;
+ margin-left: 22%;
+ margin-right: 22%;
+ }
+
+ .no-scroll .scroll-content{
+ overflow: hidden;
+ }
+
+ #addtablebutton {
+ float: left;
+ height: 100%;
+ width: 50px;
+ }
+
+ #addbutton {
+ height: 45px;
+ width: 45px;
+ font-size: 30px;
+ font-weight: 650;
+ }
}
diff --git a/src/pages/tables/tables.spec.ts b/src/pages/tables/tables.spec.ts
new file mode 100644
index 00000000..6a3a2ac1
--- /dev/null
+++ b/src/pages/tables/tables.spec.ts
@@ -0,0 +1,133 @@
+import { async, TestBed, ComponentFixture } from '@angular/core/testing';
+import { IonicModule } from 'ionic-angular';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+import { AlertControllerMock } from '../../../test-config/mocks-ionic';
+
+import { TablesPage, Table, Party, Mode, Employee } from './tables';
+
+import { Component } from '@angular/core';
+import { MyApp } from '../../app/app.component';
+import { NavController, NavParams, AlertController, ViewController } from 'ionic-angular';
+import { ActionSheetController, ModalController } from 'ionic-angular';
+import { AddPartyPage } from './add-party';
+import { DateTimeService } from '../util/date-time';
+
+
+describe('TablesPage Component', () => {
+
+ let fixture: ComponentFixture
;
+ let component: TablesPage;
+ let debugElement: DebugElement;
+
+ beforeEach(async(() => {
+
+ TestBed.configureTestingModule({
+ declarations: [
+ MyApp,
+ TablesPage
+ ],
+ imports: [
+ IonicModule.forRoot(MyApp)
+ ],
+ providers: [
+ NavController, ModalController, DateTimeService,
+ {provide: NavParams, useClass: MockNavParams},
+ { provide: ViewController, useClass: MockViewController },
+ { provide: AlertController, useClass: AlertControllerMock}
+ ]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TablesPage);
+ component = fixture.componentInstance;
+ debugElement = fixture.debugElement;
+ });
+
+ afterEach(() => {
+ fixture.destroy();
+ component = null;
+ });
+/*
+ it('is created', () => {
+ expect(fixture).toBeTruthy();
+ expect(component).toBeTruthy();
+ });
+ it('is of correct page type', () => {
+ expect(component instanceof TablesPage).toBe(true);
+ });
+ it('should initially be in default mode and have no party selected', () => {
+ expect(component['mode']).toBe(Mode.Default);
+ expect(component['selectedParty']).toBeNull();
+ });
+ it('should delete the correct parties when specified', () => {
+ let parties = component['parties'];
+ let party = parties[0];
+ component.deleteParty(party);
+ expect(component['parties']).not.toContain(party);
+ });
+
+ describe('switching to seat party mode', () => {
+ let parties: Party[];
+ let party: Party;
+ beforeEach(() => {
+ parties = component['parties'];
+ party = parties[0];
+ component.switchModeTo(Mode.SeatingParty, party);
+ });
+
+ afterEach(() => {
+ component.switchModeTo(Mode.Default);
+ });
+
+ it('should be in seating party mode', () => {
+ expect(component['mode']).toBe(Mode.SeatingParty);
+ expect(component.seatingPartyMode()).toBe(true);
+ });
+ it('should set selected party to the party passed', () => {
+ expect(component['selectedParty']).toBe(party);
+ });
+
+ });
+*/
+});
+
+class MockNavParams{
+ data = {
+ };
+
+ get(param){
+ return this.data[param];
+ }
+}
+
+export class MockViewController{
+ readReady = {
+ subscribe(){
+
+ }
+ };
+ writeReady = {
+ subscribe(){
+
+ }
+ };
+
+ dismiss(){
+ console.log('View Controller Dismiss Called');
+ }
+ _setHeader(){
+
+ }
+ _setNavbar(){
+
+ }
+ _setIONContent(){
+
+ }
+ _setIONContentRef(){
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/pages/tables/tables.ts b/src/pages/tables/tables.ts
index 2efcd907..54a372ab 100644
--- a/src/pages/tables/tables.ts
+++ b/src/pages/tables/tables.ts
@@ -1,7 +1,18 @@
import { Component } from '@angular/core';
-import { NavController, NavParams, AlertController } from 'ionic-angular';
+import { NavController, NavParams, AlertController, ViewController } from 'ionic-angular';
import { ActionSheetController, ModalController } from 'ionic-angular';
-import { AddPartyPage } from './add-party/add-party';
+import { AddPartyPage } from './add-party';
+import { DateTimeService } from '../util/date-time';
+import { InputNumpad } from '../util/numpad';
+import * as interact from 'interactjs';
+//import { Employee } from '../employees/employees';
+
+/*
+ BUGS:
+ 1) Static ID for party and tables keep counting after login-logout
+ should be solved once we use ID's from DB
+ 2)
+*/
@Component({
selector: 'page-tables',
@@ -14,50 +25,204 @@ export class TablesPage {
tables: Table[];
parties: Party[];
+ servers: Employee[];
constructor(public navCtrl: NavController,
public modalCtrl: ModalController,
public alertCtrl: AlertController,
- public actionSheetCtrl: ActionSheetController) {
+ public actionSheetCtrl: ActionSheetController,
+ public viewCtrl: ViewController,
+ private datetime: DateTimeService) {
this.mode = Mode.Default;
this.selectedParty = null;
- this.tables = [ new Table(4), new Table(4), new Table(6),
- new Table(2), new Table(8), new Table(2),
- new Table(2), new Table(4), new Table(6),
- new Table(8), new Table(4), new Table(6)];
- this.parties = [ new Party("Kass", 7, "4:20pm", "608 609 5186", true),
- new Party("Casey", 4, "5:55pm", "608 608 6006", true),
- new Party("Kameron", 2, "6:15pm", "506 506 5006", false),
- new Party("Jimmie", 3, "8:01pm", "999 999 9999", false),
- new Party("Suzy", 1000, "9:00pm", "012 345 6789", false),
- new Party("Bryan", 1, "11:59pm", "666 666 6666", false)];
-
- // TODO: get tables and parties from DB
+ this.tables = [
+ new Table(4, "20", "20"), new Table(4, "150", "20"),
+ new Table(6, "280", "20"), new Table(2, "410", "20"),
+ new Table(8, "540", "20"), new Table(7, "670", "20"),
+ new Table(2, "20", "150"), new Table(2, "150", "150"),
+ new Table(4, "280", "150"), new Table(4, "410", "150"),
+ new Table(8, "540", "150"), new Table(10, "670", "150"),
+ new Table(4, "20", "280"), new Table(6, "150", "280"),
+ new Table(12, "280", "280"), new Table(1, "410", "280"),
+ new Table(14, "540", "280"), new Table(4, "670", "280")
+ ];
+ this.parties = [
+ new Party("Kass", 7, "04:20", 6086095186, true),
+ new Party("Kameron", 2, "18:15", 5065065006, false),
+ new Party("Jimmie", 3, "21:01", 9999999999, false),
+ new Party("Suzy", 1000, "09:00", 1234567890, false),
+ new Party("Casey", 4, "05:55", 6667778888, true),
+ new Party("Pete", 7, "05:54", 6969696969, false),
+ new Party("Kay", 2, "00:59", 7773331111, false),
+ new Party("Magaret", 4, "05:20", 9099099900, true),
+ new Party("Joyce", 3, "05:55", 4156937782, false),
+ new Party("Ivan", 10, "11:59", 4526565665, false),
+ new Party("Jason", 12, "11:59", 3848892467, false),
+ new Party("Ben", 5, "00:00", 5555555555, true),
+ new Party("Issac", 6, "23:59", 9876543210, true),
+ new Party("Leslie", 6, "24:59", 9119119911, false)
+ ];
+
+ this.parties.sort(Party.compare);
+
+ this.servers = [
+ new Employee("Spongebob"),
+ new Employee("Squidward"),
+ new Employee("Patrick"),
+ new Employee("Mr. Krabs"),
+ new Employee("Plankton"),
+ new Employee("Sandy"),
+ new Employee("Pearl"),
+ new Employee("Rick"),
+ new Employee("Morty"),
+ new Employee("Beth"),
+ new Employee("Jerry"),
+ new Employee("Bird Person")
+ ];
+ // TODO: get tables and parties from Database
+ // Filter "parties" by date, get only the ones for today
+ // Only reservations are going persist in database, grab those from database
+ // TODO: write sorting algorithm for the whole list
+ }
+
+ ionViewDidLoad() {
+ var i;
+ for(i = 0; i < this.tables.length; i++) {
+ let table = this.tables[i];
+ var tableElement = document.getElementById('table'+table.ID);
+ tableElement.setAttribute('data-x', table.xPos);
+ tableElement.setAttribute('data-y', table.yPos);
+ tableElement.style.webkitTransform =
+ tableElement.style.transform =
+ 'translate(' + table.xPos + 'px, ' + table.yPos + 'px)';
+ }
}
//----------------------------------------------------------------------------
- // Action Sheet: presentTableActions
+ // Button Action: onTablePress
//----------------------------------------------------------------------------
- presentTableActions(table: Table) {
+ onTablePress(table: Table) {
- var seatOrFree: string;
+ if (this.editingLayoutMode()) {
+ /*
+ let confirm = this.alertCtrl.create({
+ title: 'Confirm Table Delete',
+ message: 'This cannot be undone, are you sure?',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Delete',
+ handler: () => { this.deleteTable(table); }
+ }
+ ]
+ });
+ confirm.present();*/
+ return;
+ }
+ //
+ // Not in seating party at table mode
+ // Show table action sheet
+ //
+ if (!this.seatingPartyMode()) {
+ this.presentTableActions(table);
- if (table.free) {
- seatOrFree = "Seat Party";
+ //
+ // In seating party mode
+ // Seat the party at table
+ //
} else {
- seatOrFree = "Free Table";
+ console.log('Table tapped in seating party mode');
+ if (table.free) {
+ if (this.selectedParty.size > table.capacity) {
+ console.log('Presented table overcapacity warning');
+ let confirm = this.alertCtrl.create({
+ title: 'Table Too Small',
+ message: 'Are you sure you want to seat them there?',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { console.log('Cancelled seating overcapacity'); }
+ },
+ {
+ text: 'Seat',
+ handler: () => {
+ console.log('Selected to seat overcapacity');
+ this.displaySelectServer(table, this.selectedParty.size);
+ }
+ }
+ ]
+ });
+ confirm.present();
+
+ } else {
+ // Seat number of party size at table
+ this.displaySelectServer(table, this.selectedParty.size);
+ }
+
+ // Table is Occupied
+ } else {
+ console.log('Tried to seat at occupied table');
+ let alert = this.alertCtrl.create({
+ title: 'This table is currently occupied',
+ enableBackdropDismiss: false,
+ buttons: [ { text: 'Dismiss', handler: () => {} } ]
+ });
+ alert.present();
+ }
}
+ }
+
+ //----------------------------------------------------------------------------
+ // Button Action: onEditLayoutPress
+ //----------------------------------------------------------------------------
+ onEditLayoutPress() {
+ if (this.editingLayoutMode()) {
+ this.switchModeTo(Mode.Default);
+ this.interactjsUpdate(false);
+ console.log('mode now is ' + this.mode);
+ } else {
+ this.switchModeTo(Mode.EditingLayout);
+ this.interactjsUpdate(true);
+ console.log('mode now is ' + this.mode);
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ // Button Action: onAddPartyPress
+ //----------------------------------------------------------------------------
+ onAddPartyPress() {
+ console.log('Add Party Pressed');
+ this.navCtrl.push(AddPartyPage, {"parties" : this.parties,
+ "edit": false,
+ "edit_party": null});
+ }
+ //----------------------------------------------------------------------------
+ // Button Action: onCancelSeatingPartyPress
+ //----------------------------------------------------------------------------
+ onCancelSeatingPartyPress() {
+ this.switchModeTo(Mode.Default);
+ }
+
+ //----------------------------------------------------------------------------
+ // Action Sheet: presentTableActions
+ //----------------------------------------------------------------------------
+ presentTableActions(table: Table) {
let tableActions = this.actionSheetCtrl.create({
- title: 'Table Actions',
+ title: 'Table ' + table.ID,
buttons: [
{
- text: seatOrFree,
+ text: (table.free? "Seat Party" : "Free Table"),
handler: () => {
if (table.free) {
- console.log('Seat Party tapped on table ' + table.ID);
+ console.log('Seat Table tapped on table ' + table.ID);
this.displaySeatTableNumpad(table);
} else {
console.log('Free Table tapped on table ' + table.ID);
@@ -72,6 +237,27 @@ export class TablesPage {
this.displayTableInfo(table);
}
},
+ {
+ text: 'Delete Table',
+ handler: () => {
+ let confirm = this.alertCtrl.create({
+ title: 'Confirm Table Delete',
+ message: 'This cannot be undone, are you sure?',
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Delete',
+ handler: () => { this.deleteTable(table); }
+ }
+ ]
+ });
+ confirm.present();
+ }
+ },
{
text: 'Cancel',
role: 'cancel',
@@ -88,14 +274,13 @@ export class TablesPage {
presentPartyActions(party: Party) {
let partyActions = this.actionSheetCtrl.create({
- title: 'Party Actions',
+ title: party.name + '\'s ' + (party.reservation? "Reservation" : "Party"),
buttons: [
{
text: 'Seat Party',
handler: () => {
console.log('Selected Party ' + party.ID + ' to seat');
- // Enable seating party to table mode
- this.activateSeatingPartyMode(party);
+ this.switchModeTo(Mode.SeatingParty, party);
}
},
{
@@ -132,140 +317,162 @@ export class TablesPage {
}
//----------------------------------------------------------------------------
- // Modal Trigger: displayTableInfo
+ // MODAL TRIGGERS
//----------------------------------------------------------------------------
displayTableInfo(t: Table) {
let modal = this.modalCtrl.create(TableInfo, { table: t });
modal.present();
}
- //----------------------------------------------------------------------------
- // Modal Trigger: displayPartyInfo
- //----------------------------------------------------------------------------
displayPartyInfo(p: Party) {
let modal = this.modalCtrl.create(PartyInfo, { party: p });
modal.present();
}
- //----------------------------------------------------------------------------
- // Modal Trigger: displaySeatTableNumpad
- //----------------------------------------------------------------------------
displaySeatTableNumpad(t: Table) {
- let modal = this.modalCtrl.create(NumToSeat, { table: t });
- modal.present();
+
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Party Size",
+ alertTitle: "Invalid Party Size",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0; },
+ secondaryValidInputCondition: function(input) { return input <= t.capacity; },
+ secondaryAlertTitle: "Table is too Small",
+ secondaryAlertMsg: "Are you sure you want to seat overcapacity?",
+ secondaryAlertButton: "Seat"
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ this.displaySelectServer(t, returnedNum);
+ }
+ });
+ numpadModal.present();
}
- //----------------------------------------------------------------------------
- // Button Action: onTablePress
- //----------------------------------------------------------------------------
- onTablePress(table: Table) {
+ displaySelectServer(table: Table, numToSeat: number) {
- //
- // In seating party mode
- // Seat the party at table
- //
- if (this.seatingPartyMode()) {
- console.log('Table tapped in seating party mode');
- if (table.free) {
- if (this.selectedParty.size > table.capacity) {
- console.log('Presented table overcapacity warning');
- let confirm = this.alertCtrl.create({
- title: 'Table Too Small',
- message: 'This table is not large enough to seat that many people.Are you sure you want to seat them here?',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => { console.log('Cancelled seating overcapacity'); }
- },
- {
- text: 'Seat',
- handler: () => {
- console.log('Selected to seat overcapacity');
- // Seat number of party size at table
- table.seat(this.selectedParty.size, this.selectedParty.name);
- this.deleteParty(this.selectedParty);
- this.deactivateSeatingPartyMode();
- }
- }
- ]
- });
- confirm.present();
-
- } else {
- // Seat number of party size at table
- table.seat(this.selectedParty.size, this.selectedParty.name);
+ let modal = this.modalCtrl.create(SelectServer, {servers: this.servers});
+ modal.onDidDismiss(server => {
+ if (server != null) {
+ table.seat(numToSeat, server.name, this.datetime.getTime(), null);
+ if (this.seatingPartyMode()) {
this.deleteParty(this.selectedParty);
- this.deactivateSeatingPartyMode();
+ this.switchModeTo(Mode.Default);
}
-
- // Table is Occupied
- } else {
- console.log('Tried to seat at occupied table');
- let alert = this.alertCtrl.create({
- title: 'This table is currently occupied',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Dismiss',
- handler: () => { }
- }
- ]
- });
- alert.present();
}
-
- //
- // Not in seating party at table mode
- // Show table action sheet
- //
- } else {
- this.presentTableActions(table);
- }
- }
-
- //----------------------------------------------------------------------------
- // Button Action: onEditLayoutPress
- //----------------------------------------------------------------------------
- onEditLayoutPress() {
- console.log('Edit Layout Pressed');
- // Make layout editable
+ });
+ modal.present();
}
//----------------------------------------------------------------------------
- // Button Action: onAddPartyPress
+ // AUXILLARY FUNCTIONS
//----------------------------------------------------------------------------
- onAddPartyPress() {
- console.log('Add Party Pressed');
- this.navCtrl.push(AddPartyPage, {"parties" : this.parties,
- "edit": false,
- "edit_party": null});
+ switchModeTo(newMode: Mode, party?: Party) {
+ if (this.mode == newMode) {
+ console.log('ERROR: tried to change mode to the same mode it is in');
+ return;
+ }
+ if (Mode.SeatingParty == newMode) {
+ if (party != null) {
+ this.selectedParty = party;
+ } else {
+ console.log('ERROR: tried to change mode to Seating Party without party passed');
+ return;
+ }
+ } else {
+ this.selectedParty = null;
+ }
+ this.mode = newMode;
}
- activateSeatingPartyMode(p: Party) {
- this.mode = Mode.SeatingParty;
- this.selectedParty = p;
+ deleteParty(party: Party) {
+ this.parties.splice(this.parties.indexOf(party), 1);
}
- deactivateSeatingPartyMode() {
- this.mode = Mode.Default;
- this.selectedParty = null;
+ deleteTable(table: Table) {
+ this.tables.splice(this.tables.indexOf(table), 1);
}
- deleteParty(party: Party) {
- // Find corresponding party in list and remove
- var i;
- for (i = 0; i < this.parties.length; i++) {
- if (this.parties[i].ID == party.ID) {
- this.parties.splice(i, 1);
- }
- }
+ editingLayoutMode(): boolean {
+ return this.mode == Mode.EditingLayout;
}
-
seatingPartyMode(): boolean {
return this.mode == Mode.SeatingParty;
}
+ defaultMode(): boolean {
+ return this.mode == Mode.Default;
+ }
+
+ addTable() {
+ let numpadModal = this.modalCtrl.create(
+ InputNumpad, {
+ inputField: "Table Capacity",
+ alertTitle: "Invalid Table Capacity",
+ alertMsg: null,
+ validInputCondition: function(input) { return input > 0; },
+ secondaryValidInputCondition: null
+ }
+ );
+ numpadModal.onDidDismiss(returnedNum => {
+ if (returnedNum != null) {
+ let t = new Table(returnedNum, "0", "0")
+ this.tables.push(t);
+ }
+ });
+ numpadModal.present();
+ }
+
+ interactjsUpdate(enabled: boolean) {
+
+ if (enabled) {
+ interact('.tablediv').draggable({
+
+ snap: {
+ targets: [
+ interact.createSnapGrid({ x: 10, y: 10 })
+ ],
+ range: Infinity,
+ relativePoints: [ { x: 0, y: 0 } ]
+ },
+ // enable inertial throwing
+ inertia: false,
+ // keep the element within the area of it's parent
+ restrict: {
+ restriction: "parent",
+ endOnly: true,
+ elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
+ },
+ // enable autoScroll
+ autoScroll: true,
+
+ // call this function on every dragmove event
+ onmove: dragMoveListener,
+ // call this function on every dragend event
+ onend: function (event) { }
+ })
+ } else {
+ interact('.tablediv').draggable(false)
+ }
+
+ function dragMoveListener (event) {
+ var target = event.target,
+ // keep the dragged position in the data-x/data-y attributes
+ x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,
+ y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
+ // translate the element
+ target.style.webkitTransform =
+ target.style.transform =
+ 'translate(' + x + 'px, ' + y + 'px)';
+
+ // update the posiion attributes
+ target.setAttribute('data-x', x);
+ target.setAttribute('data-y', y);
+ //target.setAttribute('')
+ }
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -278,29 +485,29 @@ export class TablesPage {
@Component({
selector: 'page-tables',
template: `
-
-
- Table {{t.ID}}
- Capacity: {{t.capacity}}
- Status: {{t.getStatus()}}
- Current Party: {{t.partySize}}
- Server: {{t.server}}
- Guest: {{t.guestName}}
-
-
-
-
+
+
Table {{t.ID}}
+
Status: {{t.getStatus()}}
+
Capacity: {{t.capacity}}
+
Current Party: {{t.partySize}}
+
Time In: {{t.timeIn}}
+
Server: {{t.server}}
+
Guest: {{t.guest}}
+
+
+
+
`
})
export class TableInfo {
- t: Table
+ t: Table;
constructor(public navCtrl: NavController, params: NavParams) {
this.t = params.get('table');
- console.log('Passed Table ID: ', this.t.ID);
}
dismiss() {
@@ -318,26 +525,27 @@ export class TableInfo {
@Component({
selector: 'page-tables',
template: `
-
-
- {{p.name}}'s {{p.getKind()}}
- Size: {{p.size}}
- Arrival Time: {{p.time}}
- Contact: {{p.contact}}
- ID: {{p.ID}}
-
-
+
+
{{p.name}}'s {{p.getKind()}}
+
Size: {{p.size}}
+
Arrival Time: {{p.time}}
+
Contact: {{p.getContactStr()}}
+
ID: {{p.ID}}
+
+
+
+
`
})
export class PartyInfo {
- p: Party
+ p: Party;
constructor(public navCtrl: NavController, params: NavParams) {
this.p = params.get('party');
- console.log('Passed Party ID: ', this.p.ID);
}
dismiss() {
@@ -346,101 +554,54 @@ export class PartyInfo {
}
//------------------------------------------------------------------------------
-// Sub-View: NumToSeat
+// Sub-View: SelectServer
//------------------------------------------------------------------------------
@Component({
selector: 'page-tables',
template: `
-
-
-
{{numToSeat}}
-
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
- |
- |
- |
-
-
-
-
-
+
+
Select Server
+
+
+
+
+
+
+
`
})
-export class NumToSeat {
+export class SelectServer {
- table: Table;
- numToSeat: number;
+ servers: Employee[];
+ selectedServer: Employee;
- constructor(public navCtrl: NavController,
- public alertCtrl: AlertController,
- params: NavParams) {
- this.table = params.get('table');
- this.numToSeat = 0;
- console.log('Pop-up: Num To Seat');
+ constructor(public viewCtrl: ViewController,
+ private params: NavParams) {
+ this.servers = params.get('servers');
+ this.selectedServer = this.servers[0];
}
- pressButton(n: number) {
- this.numToSeat = this.numToSeat * 10 + n;
+ selectServer(s: Employee) {
+ this.selectedServer = s;
}
- deleteButton() {
- this.numToSeat = Math.floor(this.numToSeat / 10);
- }
-
- clearButton() {
- this.numToSeat = 0;
- }
-
- seat() {
- if (this.numToSeat > this.table.capacity) {
- let confirm = this.alertCtrl.create({
- title: 'Table Too Small',
- message: 'This table is not large enough to seat that many people. Are you sure you want to seat them here?',
- enableBackdropDismiss: false,
- buttons: [
- {
- text: 'Cancel',
- handler: () => {
- this.clearButton();
- }
- },
- {
- text: 'Seat',
- handler: () => {
- // Seat number of party size at table
- this.table.seat(this.numToSeat, null);
- this.navCtrl.pop();
- }
- }
- ]
- });
- confirm.present();
- } else {
- this.table.seat(this.numToSeat, null);
- this.navCtrl.pop();
- }
+ OK() {
+ this.viewCtrl.dismiss(this.selectedServer);
}
cancel() {
- this.navCtrl.pop();
+ this.viewCtrl.dismiss(null);
}
+
}
////////////////////////////////////////////////////////////////////////////////
@@ -449,79 +610,86 @@ export class NumToSeat {
export class Table {
+ // TODO: change from static ID runner to getting current ID runner from DB
static ID_runner: number = 1;
ID: number;
capacity: number;
free: boolean;
partySize: number;
+ timeIn: string;
server: string;
- guestName: string;
+ guest: string;
+
+ xPos: string;
+ yPos: string;
- constructor(capacityIn: number) {
+ constructor(capacityIn: number, xPos?: string, yPos?: string) {
this.ID = Table.ID_runner;
Table.ID_runner += 1;
this.capacity = capacityIn;
this.free = true;
this.partySize = 0;
+ this.timeIn = "N/A";
this.server = "N/A";
- this.guestName = "N/A";
- }
+ this.guest = "N/A";
- getStatus(): string {
- if (this.free) {
- return "Free";
+ if (xPos) {
+ this.xPos = xPos;
+ } else {
+ this.xPos = "0";
+ }
+ if (yPos) {
+ this.yPos = yPos;
} else {
- return "Occupied";
+ this.yPos = "0";
}
}
+ getStatus(): string {
+ return this.free? "Free" : "Occupied";
+ }
+
getButtonText(): string {
- if (this.free) {
- return this.capacity.toString();
- } else {
- return this.partySize + '/' + this.capacity;
- }
+ return this.free? String(this.capacity) : this.partySize + '/' + this.capacity
}
freeTable() {
console.log('Table ' + this.ID + ' freed');
this.free = true;
this.partySize = 0;
+ this.timeIn = "N/A";
this.server = "N/A";
- this.guestName = "N/A";
+ this.guest = "N/A";
}
- seat(size: number, name: string) {
- console.log('Seated ' + size + ' people at Table ' + this.ID);
+ seat(size: number, server: string, timeIn: string, guest: string) {
this.free = false;
this.partySize = size;
- this.server = "Manager";
- if (name != null) {
- this.guestName = name;
- } else {
- this.guestName = "N/A";
- }
+ this.timeIn = timeIn;
+ this.server = server;
+ this.guest = (guest != null)? guest : "N/A";
+ console.log('Seated ' + size + ' people at Table ' + this.ID);
}
+
+
}
export class Party {
- static ID_runner: number = 0;
+ static ID_runner: number = 1;
ID: number;
name: string;
size: number;
time: string;
- contact: string;
+ contact: number;
reservation: boolean;
constructor(name: string, size: number, time: string,
- contact: string, reservation: boolean) {
+ contact: number, reservation: boolean) {
this.ID = Party.ID_runner;
Party.ID_runner += 1;
- console.log('created party ID: '+ this.ID);
- console.log('curr ID_runner: '+ Party.ID_runner);
this.name = name;
this.size = size;
this.time = time;
@@ -530,20 +698,57 @@ export class Party {
}
getKind(): string {
- if (this.reservation) {
- return "Reservation";
- } else {
- return "Party";
- }
+ return this.reservation? "Reservation" : "Party";
}
display(): string {
return this.time + ' | ' + this.name + ' | ' + this.size;
}
+
+ getContactStr(): string {
+ if (this.contact) {
+ let phoneStr = this.contact.toString();
+ if (phoneStr.length == 10) {
+ return "("+phoneStr.slice(0,3)+") "+phoneStr.slice(3,6)+"-"+phoneStr.slice(6,10);
+ }
+ }
+ return this.contact.toString();
+ }
+
+ static compare(p1, p2) {
+ if (p1.reservation && !p2.reservation)
+ return -1;
+ if (!p1.reservation && p2.reservation)
+ return 1;
+ else {
+ var h1 = parseInt(p1.time.substring(0,2));
+ var h2 = parseInt(p2.time.substring(0,2));
+ if (h1 < h2)
+ return -1;
+ if (h1 > h2)
+ return 1;
+
+ var m1 = parseInt(p1.time.substring(3,5));
+ var m2 = parseInt(p2.time.substring(3,5));
+ if (m1 < m2)
+ return -1;
+ if (m1 > m2)
+ return 1;
+ }
+ return 0;
+ }
}
-enum Mode {
+export enum Mode {
Default = 0,
SeatingParty = 1,
EditingLayout = 2
}
+
+// Place holder server
+export class Employee {
+ name:string;
+ constructor(name: string) {
+ this.name = name;
+ }
+}
diff --git a/src/pages/timepunch/timepunch.html b/src/pages/timepunch/timepunch.html
index 1b21cbc0..d84eae46 100644
--- a/src/pages/timepunch/timepunch.html
+++ b/src/pages/timepunch/timepunch.html
@@ -1,38 +1,53 @@
-
-
+
-
Punch In/Out
-
-
-
ID: {{ID}}
+
+
Punch In/Out
+
+
{{currDateTime | date: 'EEE MMM d, yyyy'}}
+
{{currDateTime | date: 'hh:mm:ss aa'}}
+
+
+
+
ID:
+
+
+
{{getIDStr()}}
+
+
+
-
+
-
+
|
- |
+ |
|
-
+
|
- |
+ |
|
-
+
|
- |
+ |
|
-
+
|
- |
+ |
|
+
+
+
+
+
-
-
-
\ No newline at end of file
+
diff --git a/src/pages/timepunch/timepunch.scss b/src/pages/timepunch/timepunch.scss
index e1b5d6dd..8533dc3c 100644
--- a/src/pages/timepunch/timepunch.scss
+++ b/src/pages/timepunch/timepunch.scss
@@ -1,22 +1,83 @@
page-timepunch {
-
+
#container {
- width: 325px;
- padding-top: 20px;
- margin-left: auto;
+ width: auto;
+ height: 500px;
+ margin-left: auto;
margin-right: auto;
+ display: flex;
+ justify-content: center;
+ }
+
+ #idsection {
+ width: 100%;
+ height: 75px;
+ border-style: solid;
+ border-width: 2px;
+ border-radius: 3px;
+ margin-top: 10px;
+ }
+
+ .valididbox {
+ border-color: color($colors, primary);
+ }
+
+ .invalididbox {
+ border-color: color($colors, secondary);
+ }
+
+ #label {
+ width: 35%;
+ height: 100%;
+ float: left;
+ padding-left: 25px;
+ text-align: right;
+ }
+
+ #idtext {
+ width: 65%;
+ height: 100%;
+ float: left;
+ padding-left: 20px;
+ text-align: left;
}
.localbutton {
- margin: 20px auto;
+ margin-top: 25px;
+ margin-bottom: 25px;
+ }
+
+ .punch-textbox {
+ text-align: center;
+ margin-top: 185px;
+ margin-right: 40px;
}
+ .punch-textbox h2 {
+ font-size: 35px;
+ }
+
.numkey {
color: color($colors, primary);
background-color: color($colors, dark);
}
.numpad {
- background-color: color($colors, dark);
+ background-image: none;
+ background-color: transparent;
+ padding: 20px;
}
+
+ .numpad-box {
+ //background-color: color($colors, dark);
+ margin-top: 140px;
+ width: 25%;
+ height: 75%;
+ }
+
+ // for buttons spacing
+ td {
+ padding: 5px;
+ }
+
}
diff --git a/src/pages/timepunch/timepunch.spec.ts b/src/pages/timepunch/timepunch.spec.ts
new file mode 100644
index 00000000..0c36b3e2
--- /dev/null
+++ b/src/pages/timepunch/timepunch.spec.ts
@@ -0,0 +1,59 @@
+import { NavController, AlertController } from 'ionic-angular';
+import { NavControllerMock, AlertControllerMock } from 'ionic3-mocks';
+
+import { TimePunchPage } from './timepunch';
+import { DateTimeService } from '../util/date-time';
+
+describe('TimePunch Page', () => {
+
+ let navCtrl: NavController;
+ let alertCtrl: AlertController;
+ let dateTime: DateTimeService;
+ let SUT: TimePunchPage;
+
+ beforeEach(() => {
+ // MOCKS :)
+ navCtrl = NavControllerMock.instance();
+ alertCtrl = AlertControllerMock.instance();
+ dateTime = new DateTimeService();
+
+ SUT = new TimePunchPage(navCtrl, alertCtrl, dateTime);
+ });
+
+ afterEach(() => {
+ navCtrl = null;
+ alertCtrl = null;
+ dateTime = null;
+ SUT = null;
+ });
+
+ it('should be created', () => {
+ expect(SUT).toBeTruthy();
+ });
+ it('should be a Create User Page', () => {
+ expect(SUT instanceof TimePunchPage).toBe(true);
+ });
+ it('should present alert confirmation upon submission', () => {
+ SUT.submit();
+ expect(alertCtrl.create).toHaveBeenCalled();
+ });
+
+ describe('Valid ID checking', () => {
+
+ beforeEach(() => {
+ SUT.ID = 0;
+ });
+ afterEach(() => {
+ SUT.ID = 0;
+ });
+
+ it('should deny IDs <= 0', () => {
+ expect(SUT.validID()).toBe(false);
+ });
+ it('should accept ID of 1 (owner)', () => {
+ SUT.ID = 1;
+ expect(SUT.validID()).toBe(true);
+ });
+
+ })
+});
\ No newline at end of file
diff --git a/src/pages/timepunch/timepunch.ts b/src/pages/timepunch/timepunch.ts
index 3b8b3169..9a87656b 100644
--- a/src/pages/timepunch/timepunch.ts
+++ b/src/pages/timepunch/timepunch.ts
@@ -1,6 +1,8 @@
import { Component } from '@angular/core';
import { NavController, AlertController } from 'ionic-angular';
import { Observable } from 'rxjs';
+import { Employee } from '../employees/employees';
+import { DateTimeService } from '../util/date-time';
@Component({
selector: 'page-timepunch',
@@ -12,39 +14,75 @@ export class TimePunchPage {
private subscription;
ID:number = 0;
+ employeeToPunch: Employee;
- constructor(public navCtrl: NavController, private alertCtrl: AlertController) {
+ constructor(public navCtrl: NavController,
+ public alertCtrl: AlertController,
+ private dateTime: DateTimeService) {
var source = Observable.interval(1000); // 1 second subscription
- this.subscription = source.subscribe((x) => this.currDateTime = new Date());
-
+ this.subscription = source.subscribe(() => {this.currDateTime = new Date()});
+ this.employeeToPunch = null;
+
}
- presentPunchConfirmation() {
- let alert = this.alertCtrl.create({
- title: 'Confirm purchase',
- message: 'Do you want to buy this book?',
- buttons: [
- {
- text: 'Cancel',
- role: 'cancel',
- handler: () => {
- console.log('Cancel clicked');
+ submit() {
+
+ if (this.validID()) {
+ let currTime = this.dateTime.getDateTime();
+ //let employee: Employee = this.getEmployeeByID();
+
+ let alert = this.alertCtrl.create({
+ title: 'Punch for Employee ID: ' + this.ID + ' at ' + currTime + '?',
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ handler: () => { }
+ },
+ {
+ text: 'Confirm',
+ handler: () => {
+ /*if (employee.isCurrentlyWorking()) {
+ employee.punchOut(currTime);
+ } else {
+ employee.punchIn(currTime);
+ }*/
+ this.ID = 0;
+ }
}
- },
- {
- text: 'Confirm',
- handler: () => {
- this.punch(this.ID)
+ ]
+ });
+ alert.present();
+
+ } else {
+ let alert = this.alertCtrl.create({
+ title: 'Invalid Employee ID',
+ buttons: [
+ {
+ text: 'Dismiss',
+ role: 'cancel',
+ handler: () => { }
}
- }
- ]
- });
- alert.present();
+ ]
+ });
+ alert.present();
+ }
+ }
+
+ validID() {
+ // TODO: Change to check for ID in database
+ return this.ID > 0;
+ }
+
+ getEmployeeByID() {
+ return null;
}
pressButton(n: number) {
- this.ID = this.ID * 10 + n;
+ if (this.ID < 1000) {
+ this.ID = this.ID * 10 + n;
+ }
}
deleteButton() {
@@ -55,15 +93,16 @@ export class TimePunchPage {
this.ID = 0;
}
- punch(ID: number) {
- if (this.validID(ID)) {
- var time: any = new Date();
- console.log('Punched time for Employee: ' + ID + ' at ' + time);
- this.ID = 0;
+ getIDStr() {
+ if (this.ID < 10) {
+ return '000' + this.ID;
}
- }
-
- validID(ID: number) {
- return ID > 0;
+ if (this.ID < 100) {
+ return '00' + this.ID;
+ }
+ if (this.ID < 1000) {
+ return '0' + this.ID;
+ }
+ return this.ID.toString();
}
}
diff --git a/src/pages/util/DBHelper.ts b/src/pages/util/DBHelper.ts
new file mode 100644
index 00000000..cc620724
--- /dev/null
+++ b/src/pages/util/DBHelper.ts
@@ -0,0 +1,42 @@
+import { MongoClient } from 'mongodb';
+import { Injectable } from "@angular/core";
+//import * as mongodb from 'mongodb';
+//import {Db as MongoDb} from 'mongodb';
+
+@Injectable()
+export class DBHelper {
+
+ constructor(MonClient: MongoClient) {
+ // let mongodb = require('mongodb');
+ // let mongoClient: MongoClient = mongodb.MongoClient;
+
+ }
+ addUser(mail, pwd, fName, lName, pNo, rest) {
+ const MongoClient = require('mongodb').MongoClient; /////?????????????
+ const url = "mongodb+srv://cnitz:9W7LZ2Bsq9ahOli6@startingcluster-wkejy.mongodb.net/DineInDB";
+ const user = {
+ email: mail,
+ password: pwd,
+ firstName: fName,
+ lastName: lName,
+ phoneNo: pNo,
+ restaurant: rest
+ };
+ const dbName = "DineInDB"
+
+ MongoClient.connect(url, function (err, client) {
+ const db = client.db(dbName);
+ const collection = db.collection('Users');
+
+ let results = collection.insertOne({
+ email: user.email,
+ password: user.password,
+ firstName: user.firstName,
+ lastName: user.lastName,
+ phoneNo: user.phoneNo,
+ restaurant: user.restaurant
+ });
+
+ });
+ }
+}
diff --git a/src/pages/util/date-time.ts b/src/pages/util/date-time.ts
new file mode 100644
index 00000000..ee0f2ecf
--- /dev/null
+++ b/src/pages/util/date-time.ts
@@ -0,0 +1,121 @@
+import { Injectable } from "@angular/core";
+
+@Injectable()
+export class DateTimeService {
+
+ constructor() { }
+
+ getTime(): string {
+ let d = new Date();
+ return this.pad(d.getUTCHours()) + ':' + this.pad(d.getUTCMinutes());
+ }
+
+ fullDateToTime(D): string {
+ let d = new Date(D);
+ return this.pad(d.getUTCHours()) + ':' + this.pad(d.getUTCMinutes());
+ }
+
+ getDateTime(): string {
+ let d = new Date();
+ let day = d.getUTCDate();
+ let month = d.getUTCMonth() + 1;
+ let year = d.getUTCFullYear();
+ let hrs = d.getUTCHours();
+ let min = d.getUTCMinutes();
+ return (this.pad(month) + '/' + this.pad(day) + '/' + year + ' ' +
+ this.pad(hrs) + ':' + this.pad(min));
+ }
+
+ getDiffQuarterHour(t1, t2): number {
+ let d1 = new Date(t1);
+ let d2 = new Date(t2);
+ let diffHours: number = (d2.getTime() - d1.getTime()) / 3600000;
+ return parseFloat((Math.round(diffHours * 4) / 4).toFixed(2));
+ }
+
+ sameDay(t1, t2): boolean {
+ let d1 = new Date(t1);
+ let d2 = new Date(t2);
+ let day1 = d1.getUTCDate();
+ let month1 = d1.getUTCMonth() + 1;
+ let year1 = d1.getUTCFullYear();
+ let day2 = d2.getUTCDate();
+ let month2 = d2.getUTCMonth() + 1;
+ let year2 = d2.getUTCFullYear();
+ return (day1 == day2) && (month1 == month2) && (year1 == year2);
+ }
+
+ inBetween(t, tStart, tEnd): boolean {
+ let d = new Date(t);
+ let dStart = new Date(tStart);
+ let dEnd = new Date(tEnd);
+ let afterStart = (d.getTime() - dStart.getTime()) >= 0;
+ let beforeEnd = (dEnd.getTime() - d.getTime()) >= 0;
+ return afterStart && beforeEnd;
+ }
+
+ isBefore(t1, t2): boolean {
+ let d1 = new Date(t1);
+ let d2 = new Date(t2);
+ return (d2.getTime() - d1.getTime()) >= 0;
+ }
+
+ pad(n) {
+ return (n < 10)? ('0' + n) : n;
+ }
+
+ static compare(t1, t2) {
+ let d1 = new Date(t1);
+ let d2 = new Date(t2);
+ let diff = (d2.getTime() - d1.getTime());
+
+ if (diff < 0) {
+ return -1;
+ }
+ if (diff > 0) {
+ return 1;
+ }
+ return 0;
+ }
+}
+/*
+ getUTCTime() {
+ var d = new Date();
+ return this.parseTime(d.getUTCHours(), d.getUTCMinutes());
+ }
+
+ parseTime(hours: number, minutes: number) {
+ return this.pad(hours) + ':' + this.pad(minutes);
+ }
+
+ getUTCDate() {
+ var d = new Date();
+ return this.parseDate(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate());
+ }
+
+ parseDate(year: number, month: number, day: number) {
+ return year + '-' + this.pad(month) + '-' + this.pad(day);
+ }
+
+ getUTCFullDateTime() {
+ return this.getUTCDate() + 'T' + this.getUTCTime();
+ }
+
+ private pad(n) {
+ return (n < 10)? ('0' + n) : n;
+ }
+
+ calculateElapsedTime(start: string, end: string): number {
+ var hourStart: number = parseInt(start.substring(0,2));
+ var hourEnd: number = parseInt(end.substring(0,2));
+ var minuteStart: number = parseInt(start.substring(3,5));
+ var minuteEnd: number = parseInt(end.substring(3,5));
+
+ var totMinutesStart: number = hourStart * 60 + minuteStart;
+ var totMinutesEnd: number = hourEnd * 60 + minuteEnd;
+
+ var minutesElapsed = totMinutesEnd - totMinutesStart;
+
+ return minutesElapsed / 60;
+ }
+ */
\ No newline at end of file
diff --git a/src/pages/util/numpad.html b/src/pages/util/numpad.html
new file mode 100644
index 00000000..71d5f0af
--- /dev/null
+++ b/src/pages/util/numpad.html
@@ -0,0 +1,30 @@
+
+
{{inputField}}
+
{{userInput}}
+
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/util/numpad.scss b/src/pages/util/numpad.scss
new file mode 100644
index 00000000..e1dd1ff7
--- /dev/null
+++ b/src/pages/util/numpad.scss
@@ -0,0 +1,19 @@
+modal-numpad {
+
+ .numkey {
+ color: color($colors, primary);
+ //background-color: color($colors, darkest);
+ background-color: transparent;
+ }
+
+ .numpad {
+ //background-color: color($colors, darkest);
+ background-image: none;
+ background-color: rgba(color($colors, middark), 0.15);
+ }
+
+ // for buttons spacing
+ td {
+ padding: 5px;
+ }
+}
\ No newline at end of file
diff --git a/src/pages/util/numpad.ts b/src/pages/util/numpad.ts
new file mode 100644
index 00000000..475c402e
--- /dev/null
+++ b/src/pages/util/numpad.ts
@@ -0,0 +1,105 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams, ViewController, AlertController } from 'ionic-angular';
+
+@Component({
+ selector: 'modal-numpad',
+ templateUrl: 'numpad.html'
+})
+export class InputNumpad {
+
+ userInput: number;
+ inputField: string;
+
+ alertMsg: string;
+ alertTitle: string;
+ validInput: any;
+
+ secondaryAlertMsg: string;
+ secondaryAlertTitle: string;
+ secondaryAlertButton: string;
+ secondaryValidInput: any;
+
+ secondaryCondition: boolean;
+
+ constructor(public navCtrl: NavController,
+ public viewCtrl: ViewController,
+ public alertCtrl: AlertController,
+ private navParams: NavParams) {
+ this.inputField = this.navParams.get('inputField');
+
+ this.alertTitle = this.navParams.get('alertTitle');
+ this.alertMsg = this.navParams.get('alertMsg');
+ this.validInput = this.navParams.get('validInputCondition');
+
+ this.secondaryValidInput = this.navParams.get('secondaryValidInputCondition');
+ this.secondaryCondition = (this.secondaryValidInput != null);
+
+ if (this.secondaryCondition) {
+ this.secondaryAlertTitle = this.navParams.get('secondaryAlertTitle');
+ this.secondaryAlertMsg = this.navParams.get('secondaryAlertMsg');
+ this.secondaryAlertButton = this.navParams.get('secondaryAlertButton');
+ }
+
+ this.userInput = 0;
+ }
+
+ pressButton(n: number) {
+ this.userInput = this.userInput * 10 + n;
+ }
+
+ deleteButton() {
+ this.userInput = Math.floor(this.userInput / 10);
+ }
+
+ clearButton() {
+ this.userInput = 0;
+ }
+
+ OK() {
+ if (this.validInput(this.userInput)) {
+
+ if(this.secondaryCondition) {
+ if(this.secondaryValidInput(this.userInput)) {
+ this.viewCtrl.dismiss(this.userInput);
+ } else {
+ let alert = this.alertCtrl.create({
+ title: this.secondaryAlertTitle,
+ message: this.secondaryAlertMsg,
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'Cancel',
+ handler: () => { this.clearButton(); }
+ },
+ {
+ text: this.secondaryAlertButton,
+ handler: () => { this.viewCtrl.dismiss(this.userInput) }
+ }
+ ]
+ });
+ alert.present();
+ }
+ } else {
+ this.viewCtrl.dismiss(this.userInput);
+ }
+
+ } else {
+ let alert = this.alertCtrl.create({
+ title: this.alertTitle,
+ message: this.alertMsg,
+ enableBackdropDismiss: false,
+ buttons: [
+ {
+ text: 'OK',
+ handler: () => { }
+ }
+ ]
+ });
+ alert.present();
+ }
+ }
+
+ cancel() {
+ this.viewCtrl.dismiss(null);
+ }
+}
\ No newline at end of file
diff --git a/src/theme/variables.scss b/src/theme/variables.scss
index c448e1a8..f7f3b32e 100644
--- a/src/theme/variables.scss
+++ b/src/theme/variables.scss
@@ -22,21 +22,22 @@ $app-direction: ltr;
// colors so you can add, rename and remove colors as needed.
// The "primary" color is the only required color in the map.
-// old primary #DEBB58
+// old primary #DEBB58 #DEC06B #7DB9B9
$colors: (
- primary: #DEC06B,
+ primary: #7DB9A8,
secondary: #E16E62,
tertiary: #97B56C,
complementary:#6B89DE,
triadicTeal:#6BDEC0,
triadicPurple:#C06BDE,
danger: #f53d3d,
- light: #D0CDC4,
- midlight: #AEAAA2,
+ lighter: #E0D8D0,
+ light: #D0CBC0,
+ midlight: #AEA89D,
medium: #928A82,
middark: #696763,
- dark: #2E2D2C,
+ dark: #2E2D28,
darker: #252423,
darkest: #1A1815
);
@@ -55,12 +56,14 @@ $background-color: color($colors, darkest);
// --------------------------------------------------
// iOS only Sass variables can go here
+$bar-footer-height: 40px;
+
//
// BUTTON STYLING
//
$button-ios-text-color: color($colors, darkest);
$button-ios-border-radius: 3px;
-$button-ios-background-color-activated: color-shade(color($colors, primary), 75%);
+$button-ios-background-color-activated: color-shade(color($colors, primary), 50%);
$button-ios-outline-text-color-activated: color($colors, darkest);
$button-ios-outline-border-width: 2px;
@@ -87,13 +90,20 @@ $action-sheet-ios-button-border-width: 5px;
$action-sheet-ios-button-border-color: color($colors, primary);
$action-sheet-ios-button-cancel-background: color($colors, dark);
$action-sheet-ios-button-text-color: color($colors, primary);
-$action-sheet-ios-button-font-size: 2.6rem;
+$action-sheet-ios-button-font-size: 2.4rem;
$action-sheet-ios-title-color: color($colors, medium);
$action-sheet-ios-title-font-size: 2rem;
//
// ALERT STYLING
//
+//$alert-ios-background: color($colors, dark);
+$alert-ios-border-radius: 5px;
+//$alert-ios-message-text-color: color($colors, middark);
+$alert-ios-button-background-color-activated: color($colors, darkest);
+$alert-ios-button-border-color: color($colors, middark);
+//$alert-ios-button-border-width: 1px;
+$alert-ios-max-width: 300px;
$datetime-ios-placeholder-color: color($colors, middark);
diff --git a/test-config/karma-test-shim.js b/test-config/karma-test-shim.js
new file mode 100755
index 00000000..4b98239a
--- /dev/null
+++ b/test-config/karma-test-shim.js
@@ -0,0 +1,21 @@
+Error.stackTraceLimit = Infinity;
+
+require('core-js/es6');
+require('core-js/es7/reflect');
+
+require('zone.js/dist/zone');
+require('zone.js/dist/long-stack-trace-zone');
+require('zone.js/dist/proxy');
+require('zone.js/dist/sync-test');
+require('zone.js/dist/jasmine-patch');
+require('zone.js/dist/async-test');
+require('zone.js/dist/fake-async-test');
+
+var appContext = require.context('../src', true, /\.spec\.ts/);
+
+appContext.keys().forEach(appContext);
+
+var testing = require('@angular/core/testing');
+var browser = require('@angular/platform-browser-dynamic/testing');
+
+testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting());
diff --git a/test-config/karma.conf.js b/test-config/karma.conf.js
new file mode 100755
index 00000000..cf905217
--- /dev/null
+++ b/test-config/karma.conf.js
@@ -0,0 +1,62 @@
+var webpackConfig = require('./webpack.test.js');
+
+module.exports = function(config) {
+ var _config = {
+ basePath: '../',
+
+ frameworks: ['jasmine'],
+
+ files: [
+ {
+ pattern: './test-config/karma-test-shim.js',
+ watched: true
+ },
+ {
+ pattern: './src/assets/**/*',
+ watched: false,
+ included: false,
+ served: true,
+ nocache: false
+ }
+ ],
+
+ proxies: {
+ '/assets/': '/base/src/assets/'
+ },
+
+ preprocessors: {
+ './test-config/karma-test-shim.js': ['webpack', 'sourcemap']
+ },
+
+ webpack: webpackConfig,
+
+ webpackMiddleware: {
+ stats: 'errors-only'
+ },
+
+ webpackServer: {
+ noInfo: true
+ },
+
+ browserConsoleLogOptions: {
+ level: 'log',
+ format: '%b %T: %m',
+ terminal: true
+ },
+
+ coverageIstanbulReporter: {
+ reports: [ 'html', 'lcovonly' ],
+ fixWebpackSourcePaths: true
+ },
+
+ reporters: config.coverage ? ['kjhtml', 'dots', 'coverage-istanbul'] : ['kjhtml', 'dots'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false
+ };
+
+ config.set(_config);
+};
diff --git a/test-config/mocks-ionic.ts b/test-config/mocks-ionic.ts
new file mode 100644
index 00000000..5301dea2
--- /dev/null
+++ b/test-config/mocks-ionic.ts
@@ -0,0 +1,146 @@
+import { StatusBar } from '@ionic-native/status-bar';
+import { SplashScreen } from '@ionic-native/splash-screen';
+
+export class PlatformMock {
+ public ready(): Promise
{
+ return new Promise((resolve) => {
+ resolve('READY');
+ });
+ }
+
+ public getQueryParam() {
+ return true;
+ }
+
+ public registerBackButtonAction(fn: Function, priority?: number): Function {
+ return (() => true);
+ }
+
+ public hasFocus(ele: HTMLElement): boolean {
+ return true;
+ }
+
+ public doc(): HTMLDocument {
+ return document;
+ }
+
+ public is(): boolean {
+ return true;
+ }
+
+ public getElementComputedStyle(container: any): any {
+ return {
+ paddingLeft: '10',
+ paddingTop: '10',
+ paddingRight: '10',
+ paddingBottom: '10',
+ };
+ }
+
+ public onResize(callback: any) {
+ return callback;
+ }
+
+ public registerListener(ele: any, eventName: string, callback: any): Function {
+ return (() => true);
+ }
+
+ public win(): Window {
+ return window;
+ }
+
+ public raf(callback: any): number {
+ return 1;
+ }
+
+ public timeout(callback: any, timer: number): any {
+ return setTimeout(callback, timer);
+ }
+
+ public cancelTimeout(id: any) {
+ // do nothing
+ }
+
+ public getActiveElement(): any {
+ return document['activeElement'];
+ }
+}
+
+export class StatusBarMock extends StatusBar {
+ styleDefault() {
+ return;
+ }
+}
+
+export class SplashScreenMock extends SplashScreen {
+ hide() {
+ return;
+ }
+}
+
+export class NavMock {
+
+ public pop(): any {
+ return new Promise(function(resolve: Function): void {
+ resolve();
+ });
+ }
+
+ public push(): any {
+ return new Promise(function(resolve: Function): void {
+ resolve();
+ });
+ }
+
+ public getActive(): any {
+ return {
+ 'instance': {
+ 'model': 'something',
+ },
+ };
+ }
+
+ public setRoot(): any {
+ return true;
+ }
+
+ public registerChildNav(nav: any): void {
+ return ;
+ }
+
+}
+
+export class DeepLinkerMock {
+
+}
+
+export class AlertControllerMock {
+ public static instance(alertMock?: AlertMock): any {
+
+ let instance = jasmine.createSpyObj('AlertController', ['create']);
+ instance.create.and.returnValue(alertMock || AlertMock.instance());
+
+ return instance;
+ }
+}
+
+class AlertMock {
+ public static instance(): any {
+ let _dismissCallback: Function;
+ let instance = jasmine.createSpyObj('Alert', ['present', 'dismiss', 'onDidDismiss']);
+ instance.present.and.returnValue(Promise.resolve());
+
+ instance.dismiss.and.callFake(x => {
+ _dismissCallback(x);
+ return Promise.resolve();
+ });
+
+ instance.onDidDismiss.and.callFake((callback: Function) => {
+ if (callback) {
+ _dismissCallback = callback;
+ }
+ });
+
+ return instance;
+ }
+}
\ No newline at end of file
diff --git a/test-config/protractor.conf.js b/test-config/protractor.conf.js
new file mode 100644
index 00000000..8a0a7fc2
--- /dev/null
+++ b/test-config/protractor.conf.js
@@ -0,0 +1,28 @@
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+ allScriptsTimeout: 11000,
+ specs: [
+ '../e2e/**/*.e2e-spec.ts'
+ ],
+ capabilities: {
+ 'browserName': 'chrome'
+ },
+ directConnect: true,
+ baseUrl: 'http://localhost:8100/',
+ framework: 'jasmine',
+ jasmineNodeOpts: {
+ showColors: true,
+ defaultTimeoutInterval: 30000,
+ print: function() {}
+ },
+ onPrepare() {
+ require('ts-node').register({
+ project: 'e2e/tsconfig.e2e.json'
+ });
+ jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+ }
+};
diff --git a/test-config/webpack.test.js b/test-config/webpack.test.js
new file mode 100755
index 00000000..b145db40
--- /dev/null
+++ b/test-config/webpack.test.js
@@ -0,0 +1,50 @@
+var webpack = require('webpack');
+var path = require('path');
+
+module.exports = {
+ devtool: 'inline-source-map',
+
+ resolve: {
+ extensions: ['.ts', '.js']
+ },
+
+ module: {
+ rules: [{
+ test: /\.ts$/,
+ loaders: [{
+ loader: 'ts-loader'
+ }, 'angular2-template-loader']
+ },
+ {
+ test: /.+\.ts$/,
+ exclude: /(index.ts|mocks.ts|\.spec\.ts$)/,
+ loader: 'istanbul-instrumenter-loader',
+ enforce: 'post',
+ query: {
+ esModules: true
+ }
+ },
+ {
+ test: /\.html$/,
+ loader: 'html-loader?attrs=false'
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
+ loader: 'null-loader'
+ }
+ ]
+ },
+
+ plugins: [
+ new webpack.ContextReplacementPlugin(
+ // The (\\|\/) piece accounts for path separators in *nix and Windows
+ /(ionic-angular)|(angular(\\|\/)core(\\|\/)@angular)/,
+ root('./src'), // location of your src
+ {} // a map of your routes
+ )
+ ]
+};
+
+function root(localPath) {
+ return path.resolve(__dirname, localPath);
+}