Skip to content

Commit 20e341d

Browse files
committed
terminal: implement add code to user feature
1 parent 43802f9 commit 20e341d

File tree

5 files changed

+80
-38
lines changed

5 files changed

+80
-38
lines changed

app/api/store.js

+11
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ api.route('/codes/:code')
4949
.catch(err => next(err));
5050
});
5151

52+
api.route('/users')
53+
.get((req, res, next) => {
54+
Store.populate(req.store, 'accesses.user')
55+
.then(store => store.accesses.map(access => access.user))
56+
.then(users => {
57+
users.sort((lhs, rhs) => lhs.name.localeCompare(rhs.name));
58+
res.json({ users });
59+
})
60+
.catch(err => next(err));
61+
});
62+
5263
api.route('/users/:id/codes')
5364
.post((req, res, next) => {
5465
if (!req.body.code) {

src/terminal/app.js

+35-31
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,11 @@ angular.module('strecku.terminal', [
2727
});
2828

2929
// Log entries
30-
$scope.updatePurchases = () => {
31-
$http.get('/api/v1/purchases?limit=25')
32-
.then(function(res){
33-
$scope.log = res.data.purchases;
34-
// Listen to new in realtime
35-
StoreLog.on('purchase', (purchase) => $scope.log.push(purchase));
36-
})
37-
.catch(err => console.error('err', err));
38-
};
39-
$scope.updatePurchases();
40-
41-
// Additional user data
42-
$scope.$watch('item.user', function(user){
43-
if (user) $q.all([
44-
$http.get(`/api/v1/purchases?user=${user._id}&limit=5`),
45-
// $http.get(`/api/v1/stores/this/summary?user=${user._id}`)
46-
]).then(function(res) {
47-
$scope.item.purchases = res[0].data.purchases;
48-
// $scope.item.summary = res[1].data;
49-
});
50-
});
30+
$http.get('/api/v1/purchases?limit=25').then(res => {
31+
$scope.log = res.data.purchases;
32+
// Listen to new in realtime
33+
StoreLog.on('purchase', (purchase) => $scope.log.push(purchase));
34+
})
5135

5236
// Code scanner callback
5337
$scope.onCode = function(code){
@@ -81,7 +65,14 @@ angular.module('strecku.terminal', [
8165
// Set/reset current
8266
else {
8367
timeout();
84-
$scope.item = item;
68+
if (item.type === 'user') {
69+
$http.get(`/api/v1/purchases?user=${item.user._id}&limit=5`).then(res => {
70+
item.purchases = res.data.purchases;
71+
$scope.item = item;
72+
});
73+
} else {
74+
$scope.item = item;
75+
}
8576
}
8677
}
8778
function onNull(code){
@@ -105,8 +96,19 @@ angular.module('strecku.terminal', [
10596
timeout();
10697
}, timeout);
10798
}
108-
// Reset current
109-
else $scope.item = null;
99+
// cancel new code
100+
else if ($scope.item && $scope.item.pendingCode === code){
101+
$scope.item = null;
102+
}
103+
// new code = show list of users
104+
else {
105+
$http.get(`/api/v1/users`).then(res => {
106+
$scope.item = {
107+
pendingCode: code,
108+
users: res.data.users,
109+
};
110+
});
111+
}
110112
}
111113

112114
// Helper functions
@@ -118,20 +120,17 @@ angular.module('strecku.terminal', [
118120
$scope.item.product._id == item.product._id));
119121
}
120122
function timeout(){
121-
$scope.codeConfirm = null;
122123
$timeout.cancel($scope.timeout);
123-
($scope.timeout = $timeout(5000)).then(function(){
124-
if (!$scope.codeConfirm) $scope.item = null;
124+
($scope.timeout = $timeout(5000)).then(() => {
125+
$scope.item = null;
125126
});
126127
}
127128
// Action implementations
128129
function buyProduct(user, product){
129-
return $http.post(`/api/v1/purchases`, {user, product})
130-
.then(() => {
131-
$scope.updatePurchases();
132-
});
130+
return $http.post(`/api/v1/purchases`, { user, product });
133131
};
134132
function addCode(target, code){
133+
$timeout.cancel($scope.timeout);
135134
$scope.codeConfirm = code;
136135
return $mdDialog.show({
137136
controller: () => {},
@@ -142,4 +141,9 @@ angular.module('strecku.terminal', [
142141
controllerAs: 'ctrl'
143142
}).then(() => code);
144143
}
144+
145+
$scope.assignCode = (code, user) => {
146+
$http.post(`/api/v1/users/${user._id}/codes`, { code });
147+
$scope.item = null;
148+
};
145149
}]);

static/strecku/css/style.css

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
md-sidenav md-list-item.md-2-line:before {
2-
position: absolute;
3-
width: 100%;
4-
height: 100%;
5-
visibility: initial;
6-
background: linear-gradient(45deg, rgba(0, 0, 0, 0.4), transparent);
2+
content: none;
73
}
84
md-sidenav md-list {
95
padding: 0;

static/strecku/terminal/css/terminal.css

+17-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,20 @@ md-sidenav.md-sidenav-right {
66
height: 128px;
77
border-radius: 50%;
88
object-fit: cover;
9-
}
9+
}
10+
md-sidenav md-list-item.md-2-line {
11+
background: linear-gradient(45deg, rgba(0, 0, 0, 0.2), transparent);
12+
}
13+
.user-list {
14+
display: flex;
15+
max-height: 400px;
16+
overflow-y: scroll;
17+
flex-wrap: wrap;
18+
justify-content: space-around;
19+
}
20+
.user-list .user {
21+
flex: 0 0 calc(33% - 8px);
22+
height: 64px;
23+
margin: 4px;
24+
border-radius: 16px;
25+
}

static/strecku/terminal/index.html

+16-1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ <h3><b>{{purchase.product.name || purchase.note}}</b></h3>
8484
<span ng-if="!item.product.available">(Unavailable)</span>
8585
</div>
8686
</div>
87+
88+
89+
<!-- Add code to user -->
90+
<div ng-show="item.pendingCode" layout="column" layout-align="start center" layout-padding
91+
class="pulse" ng-class="{ animated: item.pendingCode }">
92+
<div style="text-align: center;">
93+
<div class="md-headline">Assign '{{ item.pendingCode }}' to user:</div>
94+
<div class ="user-list">
95+
<button ng-repeat="user in item.users" class="user"
96+
ng-click="assignCode(item.pendingCode, user)">
97+
{{ user.name }}
98+
</button>
99+
</div>
100+
</div>
101+
</div>
87102
</md-content>
88103

89104
<!-- Log sidenav -->
@@ -93,7 +108,7 @@ <h1 class="md-toolbar-tools">{{store.name}} recent purchases</h1>
93108
</md-toolbar>
94109
<md-content>
95110
<md-list>
96-
<md-list-item class="md-table-row md-2-line animated"
111+
<md-list-item class="md-table-row md-2-line animated" style="position: relative;"
97112
ng-repeat="purchase in log | orderBy:'time':1 | limitTo:25">
98113
<div flex="50" class="md-list-item-text">
99114
<h3><b>{{purchase.product.name || purchase.note}}</b></h3>

0 commit comments

Comments
 (0)