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":"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","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\tParty Size\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 {{field}}\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

+
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameShift StartShift EndHours 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: ` -
- {{field}} - {{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 @@
{{title}} {{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 @@ -
-
- Placeholder Restaurant -
-
-
- -
-
- -
-
-
-
- + + + -
+ +
+ + - -
-
- -
-
+ + +
+
+ -
- - +
+ + -
- \ 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: ` -
- Party Size - {{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 - {{currDateTime | date: 'EEE MMM d, yyyy'}} - {{currDateTime | date: 'hh:mm:ss aa'}} - 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); +}