diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e6321b..6502546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ # Next Release +# v0.0.3 + +* Customer Leaderboards added +* Map made available to Customers +* Clustering added to Map +* Map renamed from "Supplier Map" to "Purchase Map" to fall in line with +previous change +* Added placeholder while password reset is not present +* Fixed error on store list during a transaction + + # v0.0.2 * Supplier map added to organisation view diff --git a/bin/build-releases b/bin/build-releases index 0a840d2..1abdb98 100755 --- a/bin/build-releases +++ b/bin/build-releases @@ -2,19 +2,24 @@ VERSION=`git describe --tags` +if [ ! -d ../WebApp-Releases ]; then + echo "Making new Releases Directory" + mkdir ../WebApp-Releases +fi + echo "Building releases for $VERSION" echo "Building Prod Release..." ng build --prod -tar -czf ../LocalLoop-Web-prod-$VERSION.tar.gz dist +tar -czf ../WebApp-Releases/LocalLoop-Web-prod-$VERSION.tar.gz dist echo "Building Dev Release..." ng build --dev -tar -cvzf ../LocalLoop-Web-dev-$VERSION.tar.gz dist +tar -czf ../WebApp-Releases/LocalLoop-Web-dev-$VERSION.tar.gz dist echo "Cleaning up build artefacts..." diff --git a/e2e/login.e2e-spec.ts b/e2e/login.e2e-spec.ts index 7fc72be..2bb5bd5 100644 --- a/e2e/login.e2e-spec.ts +++ b/e2e/login.e2e-spec.ts @@ -12,9 +12,9 @@ describe('Login Page', () => { expect(page.getLoginHeaderText()).toEqual('Login'); }); - it('should have a username box of type text', () => { + it('should have a username box of type email', () => { expect(page.isUsernameFieldPresent()).toBeTruthy(); - expect(page.getUsernameFieldType()).toBe('text'); + expect(page.getUsernameFieldType()).toEqual('email'); }); it('should have a password box of type password', () => { diff --git a/package-lock.json b/package-lock.json index b3325ee..b05c84c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "localloop-web", - "version": "0.0.1", + "version": "0.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -9,6 +9,11 @@ "resolved": "https://registry.npmjs.org/@agm/core/-/core-1.0.0-beta.1.tgz", "integrity": "sha512-IVwQGmcaE42SmYY2e5QwqOC0vrSXZCW8BhATY0Vpy3NjbiydSXi9T81hVqKLvuKaB3ves1sv3W++SB1Wj+5B6A==" }, + "@agm/js-marker-clusterer": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@agm/js-marker-clusterer/-/js-marker-clusterer-1.0.0-beta.2.tgz", + "integrity": "sha512-sQzNo+2NwjgVAiy/AU3deYvemoH3CHtYvh+aH/3jq9yIK+2ZiuwhZ2oKmoBsVPEMzLjOqF07FhDLowrAAZfVRw==" + }, "@angular-devkit/build-optimizer": { "version": "0.0.13", "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.13.tgz", @@ -4650,6 +4655,11 @@ "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", "dev": true }, + "js-marker-clusterer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/js-marker-clusterer/-/js-marker-clusterer-1.0.0.tgz", + "integrity": "sha1-yUvoWuiJaBnlHBMfiR3StVVY3Rc=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index 5560151..2a5c6eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "localloop-web", - "version": "0.0.2", + "version": "0.0.3", "description": "LocalLoop Web - Web interface for LocalLoop app", "author": "", "url": "http://www.peartrade.org", @@ -19,6 +19,7 @@ "private": true, "dependencies": { "@agm/core": "^1.0.0-beta.1", + "@agm/js-marker-clusterer": "^1.0.0-beta.2", "@angular/common": "4.0.3", "@angular/compiler": "4.0.3", "@angular/core": "4.0.3", @@ -32,6 +33,7 @@ "angular-in-memory-web-api": "^0.3.1", "chart.js": "2.5.0", "core-js": "2.4.1", + "js-marker-clusterer": "^1.0.0", "moment": "^2.18.1", "ng2-charts": "1.6.0", "ng2-validation-manager": "^0.3.1", diff --git a/src/app/auth/login.component.html b/src/app/auth/login.component.html index 5c02b96..9a87e9b 100644 --- a/src/app/auth/login.component.html +++ b/src/app/auth/login.component.html @@ -10,7 +10,7 @@
@ - +
@@ -31,8 +31,9 @@
- +
+
diff --git a/src/app/auth/register.component.html b/src/app/auth/register.component.html index 1a0c868..34c50ca 100644 --- a/src/app/auth/register.component.html +++ b/src/app/auth/register.component.html @@ -40,7 +40,7 @@ diff --git a/src/app/dashboard/add-data.component.html b/src/app/dashboard/add-data.component.html index 3a78b96..948f868 100644 --- a/src/app/dashboard/add-data.component.html +++ b/src/app/dashboard/add-data.component.html @@ -31,7 +31,7 @@ Enter the name of the organisation money was spent. Choose existing ones from below or if not found, enter the details below. - +
diff --git a/src/app/dashboard/add-data.component.ts b/src/app/dashboard/add-data.component.ts index 359c294..c894a84 100644 --- a/src/app/dashboard/add-data.component.ts +++ b/src/app/dashboard/add-data.component.ts @@ -32,7 +32,7 @@ export class AddDataComponent implements OnInit { organisationPostcode: string; amount: number; transactionAdditionType = 1; - storeList; + storeList = []; showAddStore = false; submitReceipt = false; transactionFormInvalid = true; @@ -108,7 +108,7 @@ export class AddDataComponent implements OnInit { } // handle the case when the storelist is empty if (this.storeList.length < 1) { - this.storeList = null; + this.storeList = []; this.showAddStore = true; this.transactionAdditionType = 3; } @@ -135,7 +135,7 @@ export class AddDataComponent implements OnInit { const val = ev.target.value; // Filter the store list so search seems quicker - if (val && val.trim() !== '' && this.storeList !== null) { + if (val && val.trim() !== '' && this.storeList.length > 0) { this.storeList = this.storeList.filter( (item) => { return ( item.name.toLowerCase().indexOf( val.toLowerCase() ) > -1 ); @@ -237,7 +237,7 @@ export class AddDataComponent implements OnInit { town: '', postcode: '', }; - this.storeList = null; + this.storeList = []; this.amount = null; this.transactionFormInvalid = true; this.showAddStore = false; diff --git a/src/app/dashboard/dashboard.module.ts b/src/app/dashboard/dashboard.module.ts index a8c59b0..341e833 100644 --- a/src/app/dashboard/dashboard.module.ts +++ b/src/app/dashboard/dashboard.module.ts @@ -5,6 +5,7 @@ import { ChartsModule } from 'ng2-charts/ng2-charts'; import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; import { NgxPaginationModule } from 'ngx-pagination'; import { AgmCoreModule, GoogleMapsAPIWrapper } from '@agm/core'; +import { AgmJsMarkerClustererModule } from '@agm/js-marker-clusterer'; import { CurrencyPipe } from '@angular/common'; @@ -15,6 +16,7 @@ import { AddDataComponent } from './add-data.component'; import { FeedbackComponent } from './feedback.component'; import { TransactionLogComponent } from './transaction-log.component'; import { PayrollLogComponent } from './payroll-log.component'; +import { LeaderboardComponent } from './leaderboard.component'; import { MapComponent } from './map.component'; import { GraphWidget } from '../widgets/graph-widget.component'; @@ -26,6 +28,7 @@ import { OrgResultComponent } from '../shared/org-result.component'; import { OrgTableComponent } from '../shared/org-table.component'; import { TransactionResultComponent } from '../shared/transaction-result.component'; import { PayrollResultComponent } from '../shared/payroll-result.component'; +import { LeaderboardResultComponent } from '../shared/leaderboard-result.component'; // API key env variable import import { environment } from '../../environments/environment'; @@ -40,6 +43,7 @@ import { environment } from '../../environments/environment'; AgmCoreModule.forRoot({ apiKey: environment.mapApiKey }), + AgmJsMarkerClustererModule, BsDropdownModule, NgxPaginationModule, DashboardRoutingModule, @@ -55,6 +59,8 @@ import { environment } from '../../environments/environment'; TransactionResultComponent, PayrollLogComponent, PayrollResultComponent, + LeaderboardComponent, + LeaderboardResultComponent, MapComponent, FeedbackComponent, GraphWidget, diff --git a/src/app/dashboard/dashboard.routing.ts b/src/app/dashboard/dashboard.routing.ts index f28c65e..9794cfe 100644 --- a/src/app/dashboard/dashboard.routing.ts +++ b/src/app/dashboard/dashboard.routing.ts @@ -13,6 +13,7 @@ import { AddDataComponent } from './add-data.component'; import { FeedbackComponent } from './feedback.component'; import { TransactionLogComponent } from './transaction-log.component'; import { PayrollLogComponent } from './payroll-log.component'; +import { LeaderboardComponent } from './leaderboard.component'; import { MapComponent } from './map.component'; // Using child path to allow for FullLayout theming @@ -38,13 +39,19 @@ const routes: Routes = [ { path: 'account-edit', component: AccountEditComponent, - data: { title: 'Leaderboards' }, + data: { title: 'Edit Account' }, }, { path: 'add-data', component: AddDataComponent, data: { title: 'Add Transaction' }, }, + { + path: 'leaderboard', + component: LeaderboardComponent, + data: { title: 'Leaderboards' }, + canActivate: [CustomerGuard], + }, { path: 'transaction-log', component: TransactionLogComponent, @@ -53,8 +60,7 @@ const routes: Routes = [ { path: 'map', component: MapComponent, - data: { title: 'Supplier Map' }, - canActivate: [OrgGuard], + data: { title: 'Purchase Map' }, }, { path: 'payroll-log', diff --git a/src/app/dashboard/leaderboard.component.html b/src/app/dashboard/leaderboard.component.html new file mode 100644 index 0000000..34345f3 --- /dev/null +++ b/src/app/dashboard/leaderboard.component.html @@ -0,0 +1,61 @@ +
+
+
+
+
+ Leaderboard + By default this loads the page with your position. +
+
+
+ +
+ + + + + + + + + + + +
PositionValuePurchase Time
+ + + +
+
+ No Leaderboard available. +
+
+
+
+
diff --git a/src/app/dashboard/leaderboard.component.ts b/src/app/dashboard/leaderboard.component.ts new file mode 100644 index 0000000..ebc669c --- /dev/null +++ b/src/app/dashboard/leaderboard.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Http, Response } from '@angular/http'; +import { ApiService } from '../providers/api-service'; +// import { PaginatePipe } from 'ngx-pagination'; +import {PaginationInstance} from 'ngx-pagination'; +// import { PaginationControlsComponent } from 'ngx-pagination'; +// import { PaginationControlsDirective } from 'ngx-pagination'; +// import { TransactionResultComponent } from '../shared/transaction-result.component'; +import 'rxjs/add/operator/map'; + +@Component({ + templateUrl: 'leaderboard.component.html', +}) +export class LeaderboardComponent implements OnInit { + + leaderboardList; + noLeaderboardList = false; + public p: any; + + leaderboardData: Array; + currentPos: number; + listType: any = 'weekly_total'; + + public paginateConfig: PaginationInstance = { + id: 'leadpaginate', + itemsPerPage: 10, + currentPage: 1, + totalItems: 0 + }; + + constructor( + private http: Http, + private api: ApiService, + ) { } + + ngOnInit(): void { + this.loadLeaderboard(0); + } + + // private fetchLeaderboard() { + // this.peopleService.leaderboard(this.listType) + // .subscribe( + // result => { + // this.leaderboardData = result.leaderboard; + // this.currentPos = result.user_position; + // } + // ); + // } + + public changeLeaderboard(event) { + this.loadLeaderboard(0); + } + + + loadLeaderboard(leadPage: number) { + console.log(leadPage, this.listType); + this.api.leaderboard_fetch(this.listType,leadPage).subscribe( + result => { + if (result.leaderboard.length > 0) { + this.leaderboardList = result.leaderboard; + // TODO Rename in server + this.paginateConfig.totalItems = result.count; + this.paginateConfig.currentPage = result.page; + this.noLeaderboardList = false; + } else { + // handle the case when the leaderboardList is empty + this.leaderboardList = null; + this.noLeaderboardList = true; + } + }, + error => { + console.log(error); + } + ); + } + + // // dynamically changes the row style based on player's position + // // for instance, top three player and the player him/herself should + // // be hightlighted + // public getClass(item) { + // if( item.position < 4 ) { + // return "topThree"; + // } else if( item.position == this.currentPos ) { + // return "user"; + // } + // return "otherUsers"; + // } + // + // // show changes by using icon, trending up and trending down or no trend. + // public getTrendIcon(item){ + // if( item.trend < 0 ){ + // return "md-trending-up"; + // } else if( item.trend > 0 ){ + // return "md-trending-down"; + // } + // return "md-remove"; + // } + // + // // need to merge this function with getIcon + // // this function shows different icon color based on the direction of the position shifted + // public getTrendIconColor(item){ + // if( item.trend < 0 ) { + // return "secondary"; + // } else if( item.trend > 0 ){ + // return "danger"; + // } + // return "dark"; + // } + +} diff --git a/src/app/dashboard/map.component.html b/src/app/dashboard/map.component.html index 1c408a4..bcff523 100644 --- a/src/app/dashboard/map.component.html +++ b/src/app/dashboard/map.component.html @@ -3,7 +3,7 @@
- Supplier Map + Purchase Map Required Data marked in bold.
@@ -22,16 +22,18 @@ [zoom]="zoom" [scaleControl]="true" (idle)="viewBoundsChanged($event)"> - + + - - {{m.name}} - - + + {{m.name}} + + +
diff --git a/src/app/layouts/full-layout.component.html b/src/app/layouts/full-layout.component.html index 4fc7f4c..959ef60 100644 --- a/src/app/layouts/full-layout.component.html +++ b/src/app/layouts/full-layout.component.html @@ -40,9 +40,14 @@ Enter Feedback - +