From 39f90b189749dc6ce6ca7230c2a50dea539c55cb Mon Sep 17 00:00:00 2001 From: weimin <540481002@qq.com> Date: Fri, 10 Mar 2017 13:26:13 +0000 Subject: [PATCH] Upload all code --- app.js | 149 +++++++++++++ debug.log | 2 + index.html | 75 +++++++ pages/admin/admin.html | 3 + pages/admin/adminCtrl.js | 67 ++++++ pages/admin/header.admin.html | 27 +++ pages/admin/main.admin.html | 50 +++++ pages/admin/main.receipt.html | 43 ++++ pages/admin/sidebar.admin.html | 46 ++++ pages/home/home.css | 353 +++++++++++++++++++++++++++++++ pages/home/home.html | 13 ++ pages/home/homeCtrl.js | 18 ++ pages/login/login.html | 69 ++++++ pages/login/loginCtrl.js | 49 +++++ pages/map/circles.json | 7 + pages/map/map.css | 3 + pages/map/map.html | 15 ++ pages/map/mapCtrl.js | 61 ++++++ pages/receipt/receipt.html | 108 ++++++++++ pages/receipt/receiptCtrl.js | 62 ++++++ pages/trader/header.trader.html | 27 +++ pages/trader/main.trader.html | 6 + pages/trader/sidebar.trader.html | 44 ++++ pages/trader/trader.html | 0 pages/trader/traderCtrl.js | 15 ++ pages/user/header.user.html | 24 +++ pages/user/icon1.png | Bin 0 -> 13465 bytes pages/user/main.leaderboard.html | 28 +++ pages/user/main.settings.html | 21 ++ pages/user/main.user.html | 90 ++++++++ pages/user/sidebar.user.html | 30 +++ pages/user/user.html | 3 + pages/user/userCtrl.js | 65 ++++++ services/authService.js | 14 ++ services/chartService.js | 56 +++++ services/uploadReceiptService.js | 6 + 36 files changed, 1649 insertions(+) create mode 100644 app.js create mode 100644 debug.log create mode 100644 index.html create mode 100644 pages/admin/admin.html create mode 100644 pages/admin/adminCtrl.js create mode 100644 pages/admin/header.admin.html create mode 100644 pages/admin/main.admin.html create mode 100644 pages/admin/main.receipt.html create mode 100644 pages/admin/sidebar.admin.html create mode 100644 pages/home/home.css create mode 100644 pages/home/home.html create mode 100644 pages/home/homeCtrl.js create mode 100644 pages/login/login.html create mode 100644 pages/login/loginCtrl.js create mode 100644 pages/map/circles.json create mode 100644 pages/map/map.css create mode 100644 pages/map/map.html create mode 100644 pages/map/mapCtrl.js create mode 100644 pages/receipt/receipt.html create mode 100644 pages/receipt/receiptCtrl.js create mode 100644 pages/trader/header.trader.html create mode 100644 pages/trader/main.trader.html create mode 100644 pages/trader/sidebar.trader.html create mode 100644 pages/trader/trader.html create mode 100644 pages/trader/traderCtrl.js create mode 100644 pages/user/header.user.html create mode 100644 pages/user/icon1.png create mode 100644 pages/user/main.leaderboard.html create mode 100644 pages/user/main.settings.html create mode 100644 pages/user/main.user.html create mode 100644 pages/user/sidebar.user.html create mode 100644 pages/user/user.html create mode 100644 pages/user/userCtrl.js create mode 100644 services/authService.js create mode 100644 services/chartService.js create mode 100644 services/uploadReceiptService.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..a8a3593 --- /dev/null +++ b/app.js @@ -0,0 +1,149 @@ +var app = angular.module( + "FoodLoop", + [ + 'ngRoute', + 'ui.router' + ] +); + +// calling order +// 1-> app.config() +// 2-> app.run() +// 3-> directive's compile functions (if they are found in the dom) +// 4-> app.controller() +// 5-> directive's link functions (again, if found) + + +app.config(function($stateProvider, $urlRouterProvider) { + // use $urlRouterProvider to catch all the illeage cases + // $urlRouterProvider.otherwise("/login"); + + $stateProvider + // if loggin as user + .state('user',{ + url:"/user", + views:{ + '': {templateUrl:'pages/home/home.html',controller:'userCtrl'}, + 'header@user': {templateUrl:'pages/user/header.user.html'}, // nested view + 'sidebar@user': {templateUrl:'pages/user/sidebar.user.html'}, + 'main@user': {templateUrl:'pages/user/main.user.html'}, + },data:{ + requireLogin: false + } + }) + .state('user.receipt',{ + url:"", + views:{ + 'main@user': {templateUrl:'pages/receipt/receipt.html',controller:"receiptCtrl"}, + } + }) + .state('user.leaderboard',{ + url:"", + views:{ + 'main@user': {templateUrl:'pages/user/main.leaderboard.html'}, + } + }) + .state('user.settings',{ + url:"", + views:{ + 'main@user': {templateUrl:'pages/user/main.settings.html'}, + } + }) + .state('user.help',{ + url:"", + views:{ + 'main@user': {templateUrl:'pages/user/main.settings.html'}, + } + }) + .state('admin.view_receipt',{ + url:"", + params: { + receipt: null, + }, + views:{ + 'main@admin': { + templateUrl:'pages/admin/main.receipt.html', + controller: function($scope,$stateParams){ + $scope.receipt = $stateParams.receipt; + console.log($scope.receipt); + }}, + },data:{ + requireLogin: false + } + } + ) + .state('admin',{ + url:"/admin", + controller: 'adminCtrl', + views:{ + '': { templateUrl: 'pages/home/home.html',controller:'adminCtrl'}, // default view} + 'header@admin': {templateUrl:'pages/admin/header.admin.html'}, // nested view + 'sidebar@admin': {templateUrl:'pages/admin/sidebar.admin.html'}, + 'main@admin': {templateUrl:'pages/admin/main.admin.html'}, + },data:{ + requireLogin: false + } + }) + .state('trader',{ + url:"/trader", + views:{ + '': { templateUrl: 'pages/home/home.html',controller:'traderCtrl'}, // default view} + 'header@trader': {templateUrl:'pages/trader/header.trader.html'}, // nested view + 'sidebar@trader': {templateUrl:'pages/trader/sidebar.trader.html'}, + 'main@trader': {templateUrl:'pages/trader/main.trader.html'}, + },data:{ + requireLogin: false + } + }) + + .state('map',{ + url: '/map', + templateUrl: 'pages/map/map.html', + controller: 'mapCtrl', + data: { + requireLogin : false + } + }) + .state('login',{ + url: '', + templateUrl: 'pages/login/login.html', + controller: 'loginCtrl', + data: { + requireLogin : false + } + }); + +}); + + +/* redirects to different page based on whether the user is login or not and */ +/* if log on, check user type and redirect/construct a custom dashboard page */ +/* to extend, users may have a custome dashboard with different layout, this */ +/* needs to be handled using HTML page which is specifically constucted by */ +/* page'controller and obtain variable setting from server */ +// /* if not, redirect to login in page */ +app.run(function ($rootScope,$state,authService) { // kickstart the application + // listening to the when a state change start + console.log("State changes"); + $rootScope.$on('$stateChangeStart', function (event, toState, toParams) { + console.log(toState); + // var requireLogin = toState.data.requireLogin; + // redirect to login page if satisfy the following conditions + // 1. seesion expired and user tries to access a page + // if ((requireLogin && typeof $rootScope.currentUser === 'undefined')) { + // event.preventDefault(); + // $state.transitionTo('login'); + // } + }); + // Testing, configuration to firebase + var config = { + apiKey: "AIzaSyDypwjmMD818GQTTfyhTpx76ChJpDsZGek", + authDomain: "foodloop-666db.firebaseapp.com", + databaseURL: "https://foodloop-666db.firebaseio.com", + storageBucket: "foodloop-666db.appspot.com", + messagingSenderId: "832579459759" + }; + firebase.initializeApp(config); + +}) + diff --git a/debug.log b/debug.log new file mode 100644 index 0000000..eebd912 --- /dev/null +++ b/debug.log @@ -0,0 +1,2 @@ +[0212/144844:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004 +[0212/144844:ERROR:node_debugger.cc(86)] Cannot start debugger server diff --git a/index.html b/index.html new file mode 100644 index 0000000..a40bae9 --- /dev/null +++ b/index.html @@ -0,0 +1,75 @@ + + + + + + + + + FoodLoop Login + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/admin/admin.html b/pages/admin/admin.html new file mode 100644 index 0000000..b3514c6 --- /dev/null +++ b/pages/admin/admin.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/pages/admin/adminCtrl.js b/pages/admin/adminCtrl.js new file mode 100644 index 0000000..1fcfdf9 --- /dev/null +++ b/pages/admin/adminCtrl.js @@ -0,0 +1,67 @@ +/* this controller specifies the logic layer of the admin page */ +/* including the content to be display, sidebar, header */ +/* functionailities involve for an admin */ +app.controller('adminCtrl', function($scope,$state) { + $scope.users; + $scope.controllby = "admin"; + // Initialize Firebase + $scope.pending_receipt_sum = 2; + $scope.pending_receipt = [ + { + receipt_ref: "r1", + submitted_by : "John Lemon", + submitted_time: "31", + submitted_amount: "8.66", + details: "sjadsjoiadsj iasdn aisdn alsdi jadi jasdi ajsdoi ndi snd" + } + , + { + submitted_by : "User007", + submitted_time: "21", + submitted_amount: "22.22" + } + ]; + + + /* section for receipt management start * / + /* review a pending receipt */ + /* fetch a list of pending receipt from server */ + /* fetch a list of approve receipt from server */ + $scope.reviewReceipt = function(myReceipt){ + // testing + console.log("[DEBUG]: reviewReceipt called"); + // show page for review this receipt + $state.go('admin.view_receipt', {receipt: myReceipt}) + // + + } + + $scope.approve_receipt = function(receipt_ref){ + // call api to approve a pending receipt + // notify user + } + + + $scope.fetch_pending_receipt = function(){ + + } + + $scope.fetch_submitted_receipt = function(){ + + } + /* section for receipt management end */ + + + // Get a reference to the database service + var database = firebase.database(); + firebase.database().ref('/users/').once('value').then(function(snapshot) { + $scope.users = snapshot.val(); + }); + + $scope.test = function(){ + + console.log("CLiced "); + console.log($scope.users); + } +}); + diff --git a/pages/admin/header.admin.html b/pages/admin/header.admin.html new file mode 100644 index 0000000..1ba87f4 --- /dev/null +++ b/pages/admin/header.admin.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/pages/admin/main.admin.html b/pages/admin/main.admin.html new file mode 100644 index 0000000..2a36196 --- /dev/null +++ b/pages/admin/main.admin.html @@ -0,0 +1,50 @@ +
+ +
+
+
+
Section toolbox
+
+
+
+
+
List/Table
+
+ + + + + + + + + + + + + + + + + + + + + + +
Action#FromWhenAmount
+ + + {{$index + 1}}{{receipt.submitted_by}}{{receipt.submitted_time}} minutes ago£{{receipt.submitted_amount}}
+
+ {{receipt.details}} +
+
+
+ +
+
+
+ + +
diff --git a/pages/admin/main.receipt.html b/pages/admin/main.receipt.html new file mode 100644 index 0000000..cdfa6c0 --- /dev/null +++ b/pages/admin/main.receipt.html @@ -0,0 +1,43 @@ +
+ +
+
+
+
Section toolbox
+
+
+
+
+
{{receipt.receipt_ref}}
+
+ + + + + + + + + + + + + + + + + +
#FromWhenAmount
{{$index + 1}}{{receipt.submitted_by}}{{receipt.submitted_time}} minutes ago£{{receipt.submitted_amount}}
+
+ +
+
+
+ +
+ +
+ +
+ +
diff --git a/pages/admin/sidebar.admin.html b/pages/admin/sidebar.admin.html new file mode 100644 index 0000000..e8a423a --- /dev/null +++ b/pages/admin/sidebar.admin.html @@ -0,0 +1,46 @@ + + diff --git a/pages/home/home.css b/pages/home/home.css new file mode 100644 index 0000000..6780648 --- /dev/null +++ b/pages/home/home.css @@ -0,0 +1,353 @@ +/* + * Base structure + */ + +/* Move down content because we have a fixed navbar that is 50px tall */ +body { + padding-top: 50px; + background-color: whitesmoke; +} + +/* + * Typography + */ + +h1 { + margin-bottom: 20px; + padding-bottom: 9px; + border-bottom: 1px solid #eee; +} + +main{ + background-color: whitesmoke; +} +/* + * Sidebar + */ + +.sidebar { + position: fixed; + top: 51px; + bottom: 0; + left: 0; + z-index: 1000; + padding: 20px; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ + border-right: 1px solid #eee; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + +} + +/* Sidebar navigation */ +.sidebar { + margin-top: -16px; + padding-left: 0; + padding-right: 0; +} + +.sidebar .nav { + margin-bottom: 20px; +} + +.sidebar .nav-item { + width: 100%; +} + +.sidebar .nav-item + .nav-item { + margin-left: 0; +} + +.sidebar .nav-link { + border-radius: 0; +} + +.profile-pic { + border-radius: 80%; + background-color: transparent; + width: 100%; + height: 100%; + background-color: dodgerblue; + +} + + + +.profilePic{ + padding: 16px; + background-color: transparent; + max-width: 100%; + height: 130px; + background-color: dodgerblue; +} + +.profileInfo{ + color:white; + padding: 16px; + padding-top: 30px; + height: 130px; + background-color: dodgerblue; +} + +.profileTitle{ + font-size: 0.8em; +} + +/* + * Dashboard + */ + + /* Placeholders */ +.placeholders { + padding-bottom: 3rem; +} + +.placeholder img { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.title{ + color: black; +} +.flCard{ + color:black; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + /*width: 100%;*/ + height: 110px;; + margin-top: 16px; + background-color: white; + border: green; + padding:16px; + +} + + + + + +.rankCard{ + color:black; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + height: 300px;; + margin-top: 16px; + background-color: white; + border: green; + +} + +.rankCardHeader{ + border-radius: 3px 3px 0 0; + padding: 3px; + color:white; + height:30px; + background-color: dodgerblue; +} + +.chartCardHeader{ + border-radius: 3px 3px 0 0; + padding: 3px; + color:white; + height:30px; + background-color: orangered; +} + +.rankCardContent{ + padding: 3px; + /*color:white;*/ + /*background-color: dodgerblue;*/ +} + +.flCardHeader{ + height: 25px; +} +.flCardMain{ + margin: -16px; + font-size: 3.0em; + color: dimgray; + text-align: center; +} + +.chartCard{ + color:black; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + height: 300px;; + margin-top: 16px; + background-color: white; + +} +.flCardNote{ + font-size: 0.8em; + color: dodgerblue; + text-align: right; +} +#receiptTable{ + padding: 16px; +} + + +/* CSS FOR RECEIPT */ + +.receiptItem{ + color:black; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + padding: 16px; + background-color: white; +} + +.receiptCard{ + color:black; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + margin-top: 16px; + padding:16px; + background-color: white; +} + +.receiptCardHeader{ + border-radius: 3px 3px 0 0; + padding: 3px; + color:white; + padding: 16px; + background-color: dodgerblue; +} + + +.receiptDetailCard{ + color:black; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + height: 300px; + margin-top: 16px; + background-color: lightcyan; +} + +.addButton{ + background-color: transparent; + font-size: 1.0em; + margin-left: 50%; + +} + +.dragImageBox:hover{ + background-color: whitesmoke; +} +.dragImageBox{ + border: 2px dashed dodgerblue; + border-radius: 4px; + background-color:white; + height: 150px; + transition: 0.3s; +} + + +.thumb{ + color:black; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + background-color: white; + width: 50px; + height: 130px; +} + +/* TEMPALTE CSS FOR DISPLAY A CUSTOM CARD */ + +.pearCard{ + color:black; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + background-color: white; +} + +/* On mouse-over, add a deeper shadow */ +.pearCard:hover { + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); +} + +.pearCardFooter{ + width: 100%; + margin-bottom: -16px; + background-color: lightcyan; +} +.pearAutoHeight{ + height: auto; +} +.pearCardHeader{ + border-radius: 3px 3px 0 0; + padding: 9px; + color:white; + background-color: dodgerblue; +} + +.pearOrange{ + background-color: orangered; +} +.pearBlue{ + background-color: dodgerblue; +} +.pearGreen{ + background-color: lawngreen; +} +.pearYellow{ + background-color: yellow; +} +.pearPurple{ + background-color: purple; +} + +.padding16{ + padding: 16px; +} + +.margin16{ + margin-top:16px; +} + + + +/* LOGIN CSS */ +.mainSection{ + margin-top: 20%; + padding:16px; + color:black; + box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2); + transition: 0.3s; + border-radius: 3px; + font-size: 1em; + /*height: 150px;*/ + background-color: white; +} + +.mainItem{ + + padding: 16px; +} + +.mainItem input[type=text] { + /*border: 2px solid ;*/ + border-radius: 4px; +} + +.mainItem input[type=password] { + /*border: 2px solid ;*/ + border-radius: 4px; +} \ No newline at end of file diff --git a/pages/home/home.html b/pages/home/home.html new file mode 100644 index 0000000..37db6f8 --- /dev/null +++ b/pages/home/home.html @@ -0,0 +1,13 @@ + + + + + + + + + + +
+
+
diff --git a/pages/home/homeCtrl.js b/pages/home/homeCtrl.js new file mode 100644 index 0000000..24fa916 --- /dev/null +++ b/pages/home/homeCtrl.js @@ -0,0 +1,18 @@ +app.controller('homeCtrl', function($scope) { + + // $stateProvider.state('contacts', { + // template: '

My Contacts

' + // }) $scope.username = "user"; + $scope.controllby = "home"; + + // $rootScope.userType = "admin"; + // $scope.getViewByUserType = function(){ + // return { + // '': {templateUrl: 'pages/home/home.html',controller:'adminCtrl'}, // default view + // 'header@home-admin': {templateUrl:'pages/admin/header.admin.html'}, // nested view + // 'sidebar@home-admin': {templateUrl:'pages/admin/sidebar.admin.html'}, + // 'main@home-admin': {templateUrl:'pages/admin/main.admin.html'}, + // } + // } + // $scope.header = "i m not a header"; +}); diff --git a/pages/login/login.html b/pages/login/login.html new file mode 100644 index 0000000..903df87 --- /dev/null +++ b/pages/login/login.html @@ -0,0 +1,69 @@ + +
+
+ +
+ +
+
+
+ Username/Email +
+ +
+ +
+
+ +
+
+ Password +
+ +
+ +
+
+ +
+ + + +
+
+
+
+ + +
+ diff --git a/pages/login/loginCtrl.js b/pages/login/loginCtrl.js new file mode 100644 index 0000000..29e929c --- /dev/null +++ b/pages/login/loginCtrl.js @@ -0,0 +1,49 @@ +app.controller('loginCtrl', function($scope,$state,$http,$rootScope,authService) { + /* login variables */ + $scope.username = "user"; + $scope.password = "Doe"; + $scope.fullName = function() { + return $scope.firstName + " " + $scope.lastName; + }; + + + + + // 1. send request to server to authenticate login information + // 2. on succeed, redirect to page + // 2.1 on failed, display error message + $scope.signin = function(){ + var foodloop_token_url_login = "http://192.168.2.172:3000/login"; + var loginData = JSON.stringify({ + email : this.username, + password: this.password + }); + console.log("Attempting to login in"); + + $http.post(foodloop_token_url_login,loginData).success(function(repsonse){ + console.log("Resolving response from server"); + console.log(repsonse.data); + },function(repsonse){ + console.log("Ooops, Something went wrong"); + }); + authService.setUsername($scope.username); + // $state.go("user"); + // if($scope.username === "admin"){ + // $state.go('admin'); + // } + // else if($scope.username === "user"){ + // $state.go('user'); + // } + // else{ + // $state.go('home'); + // } + } + + + + $scope.createAccount = function(){ + + console.log("Create account button clicked"); + } + +}); diff --git a/pages/map/circles.json b/pages/map/circles.json new file mode 100644 index 0000000..8f55900 --- /dev/null +++ b/pages/map/circles.json @@ -0,0 +1,7 @@ +{"objects":[ +{"circle":{"coordinates":[54.0472, -2.8018]}}, +{"circle":{"coordinates":[-41.29,174.76]}}, +{"circle":{"coordinates":[-41.30,174.79]}}, +{"circle":{"coordinates":[-41.27,174.80]}}, +{"circle":{"coordinates":[-41.29,174.78]}} +]} \ No newline at end of file diff --git a/pages/map/map.css b/pages/map/map.css new file mode 100644 index 0000000..ecd882d --- /dev/null +++ b/pages/map/map.css @@ -0,0 +1,3 @@ +#mapid { height: 180px; } + +#map { width:600px; height: 600px } \ No newline at end of file diff --git a/pages/map/map.html b/pages/map/map.html new file mode 100644 index 0000000..0d15c99 --- /dev/null +++ b/pages/map/map.html @@ -0,0 +1,15 @@ +
+
+
+
+ +
+
+
+ + + + +
+
+
\ No newline at end of file diff --git a/pages/map/mapCtrl.js b/pages/map/mapCtrl.js new file mode 100644 index 0000000..bd0f2cc --- /dev/null +++ b/pages/map/mapCtrl.js @@ -0,0 +1,61 @@ +app.controller('mapCtrl',function($scope,$http,uploadReceiptService) { + + + // data + var traderGeoData = [ + { Latitude:54.04,Longitude:2.80,trader:"sample_1" }, + { Latitude:54.04,Longitude:2.80,trader:"sample_2" }, + { Latitude:54.01,Longitude:2.78,trader:"sample_3" }, + ]; + + var map = L.map('map').setView([54.0472, -2.8018], 13); + mapLink = + 'OpenStreetMap'; + L.tileLayer( + 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© ' + mapLink + ' Contributors', + maxZoom: 18, + }).addTo(map); + +var svgLayer = L.svg(); +svgLayer.addTo(map); + +var svg = d3.select("#map").select("svg"); +var g = d3.select("#map").select("svg").select('g'); +g.attr("class", "leaflet-zoom-hide"); + + + /* We simply pick up the SVG from the map object */ + var svg = d3.select("#map").select("svg"), + g = svg.append("g"); + + d3.json("../pages/map/circles.json", function(collection) { + /* Add a LatLng object to each item in the dataset */ + collection.objects.forEach(function(d) { + d.LatLng = new L.LatLng(d.circle.coordinates[0], + d.circle.coordinates[1]) + }) + + var feature = g.selectAll("circle") + .data(collection.objects) + .enter().append("circle") + .style("stroke", "black") + .style("opacity", .6) + .style("fill", "red") + .attr("r", 20); + + map.on("viewreset", update); + update(); + + function update() { + console.log("update!"); + feature.attr("transform", + function(d) { + return "translate("+ + map.latLngToLayerPoint(d.LatLng).x +","+ + map.latLngToLayerPoint(d.LatLng).y +")"; + } + ) + } + }) +}) \ No newline at end of file diff --git a/pages/receipt/receipt.html b/pages/receipt/receipt.html new file mode 100644 index 0000000..2ffa42a --- /dev/null +++ b/pages/receipt/receipt.html @@ -0,0 +1,108 @@ +
+
+ +
+
+
+
Fill in to submit
+
+ +
+ +
+ +
+
+ +
+
+
+
    +
  • {{store.store_id}}
  • +
  • {{store.store_name}}
  • +
  • {{store.store_address}}
  • +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ filename:{{receiptPhoto.filename}}
filesize:{{receiptPhoto.filesize}}
+
+
+
+
+
+ +
+
+ + +
+
+ + + +
+ +
+ +
+ + +
+
+
Pending receipt + 5
+ + + + + + + + + + + + + + + + +
#WhenAmount
{{$index + 1}}{{receipt.submitted_time}}{{receipt.submitted_amount}}
+
+
+ +
+ + + + +
diff --git a/pages/receipt/receiptCtrl.js b/pages/receipt/receiptCtrl.js new file mode 100644 index 0000000..62d41de --- /dev/null +++ b/pages/receipt/receiptCtrl.js @@ -0,0 +1,62 @@ +app.controller('receiptCtrl',function($scope,$http,uploadReceiptService) { + + // display the list of all exsiting store, validated and not validated + $scope.storelist; + + // require param for upload api + $scope.microCurrencyValue; + $scope.transactionAdditionType; + $scope.addValidatedId; + + $scope.storename; + + // photo and path to the photo + $scope.receiptPhoto; + $scope.receiptPhotoSrc; + + // list of pending reciepts await for approval from admin + $scope.pending_list = [ + {submitted_time: 30 },{submitted_time:20},{submitted_time:10},{submitted_time:5},{submitted_time:1} + ]; + + + var foodloop_token_url_search = "http://192.168.2.172:3000/search"; + + + // get the latest store list + $scope.getStoreList = function(){ + var data = { + "searchName": "", + "searchLocation": "" + }; + $http.post(foodloop_token_url_search,data).then(function(response){ + console.log(response); + }); + + // API call to /search to fetch a list of store + } + + $scope.storelist = $scope.getStoreList(); + + // select the image + $scope.getImage = function(element) { + var reader = new FileReader(); + reader.onload = function(event) { + $scope.$apply(function($scope) { + $scope.receiptPhoto = element.files[0]; + $scope.receiptPhotoSrc = event.target.result + }); + } + reader.readAsDataURL(element.files[0]); + } + + // upload the receipt to the server + $scope.uploadReceipt = function(){ + uploadReceiptService.uploadReceipt(); + } + + + // test + // firebase api to upload an image + +}); diff --git a/pages/trader/header.trader.html b/pages/trader/header.trader.html new file mode 100644 index 0000000..1ba87f4 --- /dev/null +++ b/pages/trader/header.trader.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/pages/trader/main.trader.html b/pages/trader/main.trader.html new file mode 100644 index 0000000..bc6c7e2 --- /dev/null +++ b/pages/trader/main.trader.html @@ -0,0 +1,6 @@ +
+
+ i m the main content in trader page +
+ +
\ No newline at end of file diff --git a/pages/trader/sidebar.trader.html b/pages/trader/sidebar.trader.html new file mode 100644 index 0000000..b0eaa4c --- /dev/null +++ b/pages/trader/sidebar.trader.html @@ -0,0 +1,44 @@ + + diff --git a/pages/trader/trader.html b/pages/trader/trader.html new file mode 100644 index 0000000..e69de29 diff --git a/pages/trader/traderCtrl.js b/pages/trader/traderCtrl.js new file mode 100644 index 0000000..5c09157 --- /dev/null +++ b/pages/trader/traderCtrl.js @@ -0,0 +1,15 @@ +app.controller('traderCtrl', function($scope,$location) { + + $scope.content = "I am not a header"; + $scope.headerContent = "FoodLoop Admin Portal"; + + + /* This block of code handles recepit management */ + $scope.receiptNumber = 0; + + + /* This block of code handles user management */ + /* Including the management of registered user, trader */ + $scope.registeredUsers = 1; + +}); diff --git a/pages/user/header.user.html b/pages/user/header.user.html new file mode 100644 index 0000000..54f09c2 --- /dev/null +++ b/pages/user/header.user.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/pages/user/icon1.png b/pages/user/icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6c1828391fc594b6f9de1001494e645eb0a516 GIT binary patch literal 13465 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 +
+
+ + + + + + + + + + + + + + + + + + + +
PositionNamePear pointsRetailers spent withReceipt submitted
{{$index + 1}}{{user.name}}{{user.pear_points}}{{user.retailer_spent}}{{user.receipt_submitted}}
+
+ +
+ + \ No newline at end of file diff --git a/pages/user/main.settings.html b/pages/user/main.settings.html new file mode 100644 index 0000000..d16c56f --- /dev/null +++ b/pages/user/main.settings.html @@ -0,0 +1,21 @@ +
+
+
+
+
Personal details
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+ +
\ No newline at end of file diff --git a/pages/user/main.user.html b/pages/user/main.user.html new file mode 100644 index 0000000..493713c --- /dev/null +++ b/pages/user/main.user.html @@ -0,0 +1,90 @@ +
+ +
+ +
+
+
+
Rank
+
+
1
+
+
+ +
+
+
Points
+
888
+
+
+ +
+
+
Spend
+
£100
+
+
+ + +
+
+
Re-spend
+
£5.00
+
+
+
+ + +
+ + +
+
+
My receipt
+
+ Pending receipt 5 +
+
+ Submit a receipt +
+
+ +
+ + +
+
+
Personal overview
+ + +
+ +
+ + +
+
+
Top players of the month
+
+ + + + + + + + + + + + + +
#UsernamePointsReceipts submitted
+
+
+
+ +
+ + +
\ No newline at end of file diff --git a/pages/user/sidebar.user.html b/pages/user/sidebar.user.html new file mode 100644 index 0000000..8f13d7b --- /dev/null +++ b/pages/user/sidebar.user.html @@ -0,0 +1,30 @@ + + diff --git a/pages/user/user.html b/pages/user/user.html new file mode 100644 index 0000000..b18dbfb --- /dev/null +++ b/pages/user/user.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/pages/user/userCtrl.js b/pages/user/userCtrl.js new file mode 100644 index 0000000..4bfa4cc --- /dev/null +++ b/pages/user/userCtrl.js @@ -0,0 +1,65 @@ +app.controller('userCtrl', function($scope,$location) { + $scope.user_rank = 1; + $scope.controllby = "user"; + $scope.username = "John Smith"; + $scope.email = "test007@test.com"; + $scope.createChart = function(){ + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + type: 'line', + data: { + labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1 + }] + }, + options: { + responsive: true, + scales: { + yAxes: [{ + ticks: { + beginAtZero:true + } + }] + } + } + }); + } + + + $scope.displayChart = function(){ + // chart sample + var flData = [{x: 100, y: 100}, {x: 200, y: 200}, {x: 300, y: 300}]; + var svg = d3.select("flChart").append("svg") + .attr("width","300px").attr("height","300px"); + svg + .selectAll("circle").data(flData) + .enter().append("circle") + .attr("cx", function(d) { return d.x; }) + .attr("cy", function(d) { return d.y; }) + .attr("r", 2.5); + + console.log(svg); + } + + + +}); diff --git a/services/authService.js b/services/authService.js new file mode 100644 index 0000000..e322f0e --- /dev/null +++ b/services/authService.js @@ -0,0 +1,14 @@ +/* this service handles all the authentication between client and server */ +app.service('authService', function ($http) { + // send a login information to server + // upon success, set sessionToken and store data in dataService + // upon failed, return error + this.username = ""; + this.getUsername = function(){ + return this.username; + } + + this.setUsername = function(setTo){ + this.username = setTo; + } +}); \ No newline at end of file diff --git a/services/chartService.js b/services/chartService.js new file mode 100644 index 0000000..ec9d410 --- /dev/null +++ b/services/chartService.js @@ -0,0 +1,56 @@ +/* this service handles all the authentication between client and server */ +app.service('chartService', function () { + // send a login information to server + // upon success, set sessionToken and store data in dataService + // upon failed, return error + this.username = ""; + this.getUsername = function(){ + return this.username; + } + + this.setUsername = function(setTo){ + this.username = setTo; + } + + + this.createChart = function(){ + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + type: 'line', + data: { + labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1 + }] + }, + options: { + responsive: true, + scales: { + yAxes: [{ + ticks: { + beginAtZero:true + } + }] + } + } + }); + } +}); \ No newline at end of file diff --git a/services/uploadReceiptService.js b/services/uploadReceiptService.js new file mode 100644 index 0000000..e5948ea --- /dev/null +++ b/services/uploadReceiptService.js @@ -0,0 +1,6 @@ +/* this service handles receipt upload process */ +app.service('uploadReceiptService', function () { + this.uploadReceipt = function(){ + console.log("Upload successful"); + } +}); \ No newline at end of file