diff options
| -rw-r--r-- | app.js | 4 | ||||
| -rw-r--r-- | public/assets/css/images/animated-overlay.gif (renamed from public/css/images/animated-overlay.gif) | bin | 1738 -> 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) | bin | 212 -> 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) | bin | 208 -> 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) | bin | 335 -> 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) | bin | 207 -> 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) | bin | 262 -> 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) | bin | 262 -> 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) | bin | 332 -> 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) | bin | 280 -> 280 bytes | |||
| -rw-r--r-- | public/assets/css/images/ui-icons_222222_256x240.png (renamed from public/css/images/ui-icons_222222_256x240.png) | bin | 6922 -> 6922 bytes | |||
| -rw-r--r-- | public/assets/css/images/ui-icons_2e83ff_256x240.png (renamed from public/css/images/ui-icons_2e83ff_256x240.png) | bin | 4549 -> 4549 bytes | |||
| -rw-r--r-- | public/assets/css/images/ui-icons_454545_256x240.png (renamed from public/css/images/ui-icons_454545_256x240.png) | bin | 6992 -> 6992 bytes | |||
| -rw-r--r-- | public/assets/css/images/ui-icons_888888_256x240.png (renamed from public/css/images/ui-icons_888888_256x240.png) | bin | 6999 -> 6999 bytes | |||
| -rw-r--r-- | public/assets/css/images/ui-icons_cd0a0a_256x240.png (renamed from public/css/images/ui-icons_cd0a0a_256x240.png) | bin | 4549 -> 4549 bytes | |||
| -rw-r--r-- | public/css/calculator.less | 6 | ||||
| -rw-r--r-- | public/js/report.coffee | 47 | ||||
| -rw-r--r-- | routes/transactions.js | 55 | ||||
| -rw-r--r-- | routes/users.js | 3 | ||||
| -rw-r--r-- | src/app.coffee | 2 | ||||
| -rw-r--r-- | src/routes/transactions.coffee | 43 | ||||
| -rw-r--r-- | src/routes/users.coffee | 2 | ||||
| -rw-r--r-- | views/transactions/index.html | 21 |
23 files changed, 132 insertions, 51 deletions
@@ -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 Binary files differindex d441f75e..d441f75e 100644 --- a/public/css/images/animated-overlay.gif +++ b/public/assets/css/images/animated-overlay.gif 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/public/css/images/ui-icons_222222_256x240.png b/public/assets/css/images/ui-icons_222222_256x240.png Binary files differindex c1cb1170..c1cb1170 100644 --- a/public/css/images/ui-icons_222222_256x240.png +++ b/public/assets/css/images/ui-icons_222222_256x240.png diff --git a/public/css/images/ui-icons_2e83ff_256x240.png b/public/assets/css/images/ui-icons_2e83ff_256x240.png Binary files differindex 84b601bf..84b601bf 100644 --- a/public/css/images/ui-icons_2e83ff_256x240.png +++ b/public/assets/css/images/ui-icons_2e83ff_256x240.png diff --git a/public/css/images/ui-icons_454545_256x240.png b/public/assets/css/images/ui-icons_454545_256x240.png Binary files differindex b6db1acd..b6db1acd 100644 --- a/public/css/images/ui-icons_454545_256x240.png +++ b/public/assets/css/images/ui-icons_454545_256x240.png diff --git a/public/css/images/ui-icons_888888_256x240.png b/public/assets/css/images/ui-icons_888888_256x240.png Binary files differindex feea0e20..feea0e20 100644 --- a/public/css/images/ui-icons_888888_256x240.png +++ b/public/assets/css/images/ui-icons_888888_256x240.png diff --git a/public/css/images/ui-icons_cd0a0a_256x240.png b/public/assets/css/images/ui-icons_cd0a0a_256x240.png Binary files differindex ed5b6b09..ed5b6b09 100644 --- a/public/css/images/ui-icons_cd0a0a_256x240.png +++ b/public/assets/css/images/ui-icons_cd0a0a_256x240.png 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} <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">×</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> |
