aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app.js4
-rw-r--r--public/assets/css/images/animated-overlay.gif (renamed from public/css/images/animated-overlay.gif)bin1738 -> 1738 bytes
-rw-r--r--public/assets/css/images/ui-bg_flat_0_aaaaaa_40x100.png (renamed from public/css/images/ui-bg_flat_0_aaaaaa_40x100.png)bin212 -> 212 bytes
-rw-r--r--public/assets/css/images/ui-bg_flat_75_ffffff_40x100.png (renamed from public/css/images/ui-bg_flat_75_ffffff_40x100.png)bin208 -> 208 bytes
-rw-r--r--public/assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png (renamed from public/css/images/ui-bg_glass_55_fbf9ee_1x400.png)bin335 -> 335 bytes
-rw-r--r--public/assets/css/images/ui-bg_glass_65_ffffff_1x400.png (renamed from public/css/images/ui-bg_glass_65_ffffff_1x400.png)bin207 -> 207 bytes
-rw-r--r--public/assets/css/images/ui-bg_glass_75_dadada_1x400.png (renamed from public/css/images/ui-bg_glass_75_dadada_1x400.png)bin262 -> 262 bytes
-rw-r--r--public/assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png (renamed from public/css/images/ui-bg_glass_75_e6e6e6_1x400.png)bin262 -> 262 bytes
-rw-r--r--public/assets/css/images/ui-bg_glass_95_fef1ec_1x400.png (renamed from public/css/images/ui-bg_glass_95_fef1ec_1x400.png)bin332 -> 332 bytes
-rw-r--r--public/assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png (renamed from public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png)bin280 -> 280 bytes
-rw-r--r--public/assets/css/images/ui-icons_222222_256x240.png (renamed from public/css/images/ui-icons_222222_256x240.png)bin6922 -> 6922 bytes
-rw-r--r--public/assets/css/images/ui-icons_2e83ff_256x240.png (renamed from public/css/images/ui-icons_2e83ff_256x240.png)bin4549 -> 4549 bytes
-rw-r--r--public/assets/css/images/ui-icons_454545_256x240.png (renamed from public/css/images/ui-icons_454545_256x240.png)bin6992 -> 6992 bytes
-rw-r--r--public/assets/css/images/ui-icons_888888_256x240.png (renamed from public/css/images/ui-icons_888888_256x240.png)bin6999 -> 6999 bytes
-rw-r--r--public/assets/css/images/ui-icons_cd0a0a_256x240.png (renamed from public/css/images/ui-icons_cd0a0a_256x240.png)bin4549 -> 4549 bytes
-rw-r--r--public/css/calculator.less6
-rw-r--r--public/js/report.coffee47
-rw-r--r--routes/transactions.js55
-rw-r--r--routes/users.js3
-rw-r--r--src/app.coffee2
-rw-r--r--src/routes/transactions.coffee43
-rw-r--r--src/routes/users.coffee2
-rw-r--r--views/transactions/index.html21
23 files changed, 132 insertions, 51 deletions
diff --git a/app.js b/app.js
index e5fa6f70..b568e65a 100644
--- a/app.js
+++ b/app.js
@@ -133,6 +133,10 @@
app.post('/:user/transactions', transactions.create);
+ app.post('/transactions/:txid', transactions.update);
+
+ app["delete"]('/:user/transactions/:txid', transactions["delete"]);
+
app.get('/:user/report', authorize, transactions.index);
app.get('/:user.json', users.json);
diff --git a/public/css/images/animated-overlay.gif b/public/assets/css/images/animated-overlay.gif
index d441f75e..d441f75e 100644
--- a/public/css/images/animated-overlay.gif
+++ b/public/assets/css/images/animated-overlay.gif
Binary files differ
diff --git a/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/public/assets/css/images/ui-bg_flat_0_aaaaaa_40x100.png
index 9aab30b1..9aab30b1 100644
--- a/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png
+++ b/public/assets/css/images/ui-bg_flat_0_aaaaaa_40x100.png
Binary files differ
diff --git a/public/css/images/ui-bg_flat_75_ffffff_40x100.png b/public/assets/css/images/ui-bg_flat_75_ffffff_40x100.png
index 0b2088de..0b2088de 100644
--- a/public/css/images/ui-bg_flat_75_ffffff_40x100.png
+++ b/public/assets/css/images/ui-bg_flat_75_ffffff_40x100.png
Binary files differ
diff --git a/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/public/assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png
index b1e1380b..b1e1380b 100644
--- a/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png
+++ b/public/assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png
Binary files differ
diff --git a/public/css/images/ui-bg_glass_65_ffffff_1x400.png b/public/assets/css/images/ui-bg_glass_65_ffffff_1x400.png
index 0850cce5..0850cce5 100644
--- a/public/css/images/ui-bg_glass_65_ffffff_1x400.png
+++ b/public/assets/css/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/public/css/images/ui-bg_glass_75_dadada_1x400.png b/public/assets/css/images/ui-bg_glass_75_dadada_1x400.png
index 7d57debb..7d57debb 100644
--- a/public/css/images/ui-bg_glass_75_dadada_1x400.png
+++ b/public/assets/css/images/ui-bg_glass_75_dadada_1x400.png
Binary files differ
diff --git a/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png b/public/assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png
index 4061d4a2..4061d4a2 100644
--- a/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png
+++ b/public/assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png
Binary files differ
diff --git a/public/css/images/ui-bg_glass_95_fef1ec_1x400.png b/public/assets/css/images/ui-bg_glass_95_fef1ec_1x400.png
index 83e61bc8..83e61bc8 100644
--- a/public/css/images/ui-bg_glass_95_fef1ec_1x400.png
+++ b/public/assets/css/images/ui-bg_glass_95_fef1ec_1x400.png
Binary files differ
diff --git a/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/public/assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
index 7d58f386..7d58f386 100644
--- a/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
+++ b/public/assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
Binary files differ
diff --git a/public/css/images/ui-icons_222222_256x240.png b/public/assets/css/images/ui-icons_222222_256x240.png
index c1cb1170..c1cb1170 100644
--- a/public/css/images/ui-icons_222222_256x240.png
+++ b/public/assets/css/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/public/css/images/ui-icons_2e83ff_256x240.png b/public/assets/css/images/ui-icons_2e83ff_256x240.png
index 84b601bf..84b601bf 100644
--- a/public/css/images/ui-icons_2e83ff_256x240.png
+++ b/public/assets/css/images/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/public/css/images/ui-icons_454545_256x240.png b/public/assets/css/images/ui-icons_454545_256x240.png
index b6db1acd..b6db1acd 100644
--- a/public/css/images/ui-icons_454545_256x240.png
+++ b/public/assets/css/images/ui-icons_454545_256x240.png
Binary files differ
diff --git a/public/css/images/ui-icons_888888_256x240.png b/public/assets/css/images/ui-icons_888888_256x240.png
index feea0e20..feea0e20 100644
--- a/public/css/images/ui-icons_888888_256x240.png
+++ b/public/assets/css/images/ui-icons_888888_256x240.png
Binary files differ
diff --git a/public/css/images/ui-icons_cd0a0a_256x240.png b/public/assets/css/images/ui-icons_cd0a0a_256x240.png
index ed5b6b09..ed5b6b09 100644
--- a/public/css/images/ui-icons_cd0a0a_256x240.png
+++ b/public/assets/css/images/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/public/css/calculator.less b/public/css/calculator.less
index 4ba5058a..316fd9cd 100644
--- a/public/css/calculator.less
+++ b/public/css/calculator.less
@@ -53,3 +53,9 @@ td#total { font-weight: bold; text-align: right; }
background-image: url('../img/coinos_logo.svg') !important;
background-size: 300px 80px;
}
+
+@media screen and (min-width: 768px) {
+ .modal-dialog {
+ width: 400px; /* either % (e.g. 60%) or px (400px) */
+ }
+}
diff --git a/public/js/report.coffee b/public/js/report.coffee
index 99a0df25..72000fc8 100644
--- a/public/js/report.coffee
+++ b/public/js/report.coffee
@@ -56,20 +56,57 @@ display = (transactions) ->
else
$('.alert').hide()
$.each(transactions, ->
- exchange = parseFloat(this.exchange)
- received = parseFloat(this.received)
+ exchange = parseFloat(@exchange)
+ received = parseFloat(@received)
amount = received * exchange
+ notes = @notes
+ txid = @txid
+ date = moment(@date, 'YYYY-MM-DD h:mm:ss').format('MMM D h:mma')
- $('.report tbody').append("""
- <tr>
- <td>#{moment(this.date, 'YYYY-MM-DD h:mm:ss').format('MMM D h:mma')}</td>
+ row = $("""
+ <tr id='#{@txid}'>
+ <td>#{date}&nbsp;&nbsp;<span class='glyphicon glyphicon-tag hidden'></span></td>
<td>#{exchange.toFixed(2)}</td>
<td>#{received.toFixed(8)}</td>
<td>#{amount.toFixed(2)}</td>
</tr>
""")
+
+ if notes
+ row.attr('data-notes', notes)
+ row.find('span').removeClass('hidden')
+
+ $('.report tbody').append(row)
+
+ row.click(->
+ notes = $(this).attr('data-notes')
+
+ $('#modal').modal()
+ $('#modal textarea').val('')
+
+ $('#modal .btn-danger').off().click(->
+ $.ajax(type: 'delete', url: "/#{$('#user').val()}/transactions/#{txid}")
+ $('#modal').modal('hide')
+ row.remove()
+ )
+
+ $('#modal textarea').off().change(->
+ notes = $(this).val()
+ $.post("/transactions/#{txid}", notes: $(this).val()) if txid
+
+ row.find('span').addClass('hidden')
+ if notes
+ row.find('span').removeClass('hidden')
+
+ row.attr('data-notes', $(this).val())
+ )
+
+ if notes
+ $('#modal textarea').val(notes)
+ )
)
+
btc = 0
$('table.report tbody td:nth-child(3)').each(->
btc += parseFloat($(this).html())
diff --git a/routes/transactions.js b/routes/transactions.js
index 83ec441f..171163bc 100644
--- a/routes/transactions.js
+++ b/routes/transactions.js
@@ -4,6 +4,19 @@
db = require('../redis');
module.exports = {
+ index: function(req, res) {
+ return res.render('transactions/index', {
+ user: req.params.user,
+ layout: 'layout',
+ navigation: true,
+ js: (function() {
+ return global.js;
+ }),
+ css: (function() {
+ return global.css;
+ })
+ });
+ },
json: function(req, res) {
var r, user;
user = req.params.user;
@@ -12,26 +25,25 @@
};
return db.lrange("" + user + ":transactions", 0, -1, function(err, transactions) {
var cb, i, txid;
+ txid = function() {
+ var x;
+ x = transactions[i++];
+ if (typeof x !== "number") {
+ return x;
+ }
+ return user + ":transactions:" + x;
+ };
cb = function(err, t) {
- var txid;
r.transactions.push(t);
if (i >= transactions.length) {
res.write(JSON.stringify(r));
return res.end();
} else {
- txid = transactions[i++];
- if (parseInt(txid)) {
- txid = user + ":transactions:" + txid;
- }
- return db.hgetall(txid, cb);
+ return db.hgetall(txid(), cb);
}
};
i = 0;
- txid = transactions[i++];
- if (parseInt(txid)) {
- txid = user + ":transactions:" + txid;
- }
- return db.hgetall(txid, cb);
+ return db.hgetall(txid(), cb);
});
},
create: function(req, res) {
@@ -56,17 +68,16 @@
});
});
},
- index: function(req, res) {
- return res.render('transactions/index', {
- user: req.params.user,
- layout: 'layout',
- navigation: true,
- js: (function() {
- return global.js;
- }),
- css: (function() {
- return global.css;
- })
+ update: function(req, res) {
+ return db.hset(req.params.txid, 'notes', req.body.notes, function() {
+ return res.end();
+ });
+ },
+ "delete": function(req, res) {
+ return db.del(req.params.txid, function() {
+ return db.lrem(req.params.user + ":transactions", 0, req.params.txid, function() {
+ return res.end();
+ });
});
}
};
diff --git a/routes/users.js b/routes/users.js
index 8065e4f1..2b4a31ef 100644
--- a/routes/users.js
+++ b/routes/users.js
@@ -115,9 +115,6 @@
});
},
update: function(req, res) {
- if (!(req.params.user === req.user.username || req.user.username === 'admin')) {
- return;
- }
if (req.body.password === '') {
delete req.body.password;
}
diff --git a/src/app.coffee b/src/app.coffee
index 4198754c..01e6fb15 100644
--- a/src/app.coffee
+++ b/src/app.coffee
@@ -77,6 +77,8 @@ app.post('/:user', authorize, users.update)
app.get('/:user/transactions.json', authorize, transactions.json)
app.post('/:user/transactions', transactions.create)
+app.post('/transactions/:txid', transactions.update)
+app.delete('/:user/transactions/:txid', transactions.delete)
app.get('/:user/report', authorize, transactions.index)
app.get('/:user.json', users.json)
diff --git a/src/routes/transactions.coffee b/src/routes/transactions.coffee
index 06636a15..8163748a 100644
--- a/src/routes/transactions.coffee
+++ b/src/routes/transactions.coffee
@@ -1,11 +1,25 @@
db = require('../redis')
module.exports =
+ index: (req, res) ->
+ res.render('transactions/index',
+ user: req.params.user,
+ layout: 'layout',
+ navigation: true,
+ js: (-> global.js),
+ css: (-> global.css)
+ )
+
json: (req, res) ->
user = req.params.user
r = 'transactions': []
db.lrange("#{user}:transactions", 0, -1, (err, transactions) ->
+ txid = ->
+ x = transactions[i++]
+ return x if typeof x != "number"
+ return user + ":transactions:" + x
+
cb = (err, t) ->
r.transactions.push t
@@ -13,19 +27,10 @@ module.exports =
res.write(JSON.stringify(r))
res.end()
else
- txid = transactions[i++]
- if parseInt(txid)
- txid = user + ":transactions:" + txid
-
- db.hgetall(txid, cb)
+ db.hgetall(txid(), cb)
i = 0
-
- txid = transactions[i++]
- if parseInt(txid)
- txid = user + ":transactions:" + txid
-
- db.hgetall(txid, cb)
+ db.hgetall(txid(), cb)
)
create: (req, res) ->
@@ -48,12 +53,14 @@ module.exports =
)
)
- index: (req, res) ->
- res.render('transactions/index',
- user: req.params.user,
- layout: 'layout',
- navigation: true,
- js: (-> global.js),
- css: (-> global.css)
+ update: (req, res) ->
+ db.hset(req.params.txid, 'notes', req.body.notes, ->
+ res.end()
)
+ delete: (req, res) ->
+ db.del(req.params.txid, ->
+ db.lrem(req.params.user + ":transactions", 0, req.params.txid, ->
+ res.end()
+ )
+ )
diff --git a/src/routes/users.coffee b/src/routes/users.coffee
index a213f678..0af8a097 100644
--- a/src/routes/users.coffee
+++ b/src/routes/users.coffee
@@ -81,8 +81,6 @@ module.exports = (sessions) ->
)
update: (req, res) ->
- return unless req.params.user is req.user.username or
- req.user.username is 'admin'
if req.body.password is ''
delete req.body.password
db.hmset("user:"+req.params.user, req.body, ->
diff --git a/views/transactions/index.html b/views/transactions/index.html
index 633fa212..3584e832 100644
--- a/views/transactions/index.html
+++ b/views/transactions/index.html
@@ -15,7 +15,7 @@
<p class="alert alert-warning" style="display: none">No transactions were found for the specified time period</p>
-<table class="table table-striped report" style="display: none">
+<table class="table table-striped table-hover report" style="cursor: pointer; display: none">
<thead>
<tr>
<th>Time</th>
@@ -34,3 +34,22 @@
</tr>
</tfoot>
</table>
+
+<!-- Modal -->
+<div class="modal fade" id="modal" tabindex="-1" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+ <h4 class="modal-title">Transaction</h4>
+ </div>
+ <div class="modal-body">
+ <textarea style="width: 100%; height: 100px;" placeholder="Notes"></textarea>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-danger">Delete Transaction</button>
+ <button type="button" class="btn btn-default" data-dismiss="modal">Done</button>
+ </div>
+ </div>
+ </div>
+</div>