Skip to content

Commit c244e85

Browse files
committed
create transaction
1 parent 46534ca commit c244e85

File tree

4 files changed

+182
-2
lines changed

4 files changed

+182
-2
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require 'rack/request'
2+
3+
module Ledger
4+
module Controller
5+
class TransactionCreate
6+
def initialize(api_client)
7+
@api_client = api_client
8+
end
9+
10+
def call(env)
11+
req = Rack::Request.new(env)
12+
13+
@api_client.create_transaction(req.POST)
14+
15+
[302, { 'Location' => req.referrer }, []]
16+
end
17+
end
18+
end
19+
end

app/ledger/templates/layout.erb

Lines changed: 134 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,78 @@
1010
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
1111
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
1212
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
13+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"></script>
14+
<script type="text/javascript">
15+
$(document).ready(function() {
16+
var accounts = [<%= accounts.map { |a| "'#{a['name']}'" }.join(',') %>];
17+
18+
var search = new Bloodhound({
19+
datumTokenizer: Bloodhound.tokenizers.nonword,
20+
queryTokenizer: Bloodhound.tokenizers.nonword,
21+
local: accounts
22+
});
23+
24+
$('.typeahead').typeahead({
25+
hint: true,
26+
highlight: true,
27+
minLength: 3
28+
},
29+
{
30+
name: 'accounts',
31+
source: search
32+
});
33+
34+
$('.twitter-typeahead').css('display', 'inline');
35+
});
36+
</script>
37+
<style>
38+
.tt-query {
39+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
40+
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
41+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
42+
}
43+
44+
.tt-hint {
45+
color: #999
46+
}
47+
48+
.tt-menu {
49+
width: 422px;
50+
margin: 12px 0;
51+
padding: 8px 0;
52+
background-color: #fff;
53+
border: 1px solid #ccc;
54+
border: 1px solid rgba(0, 0, 0, 0.2);
55+
-webkit-border-radius: 8px;
56+
-moz-border-radius: 8px;
57+
border-radius: 8px;
58+
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
59+
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
60+
box-shadow: 0 5px 10px rgba(0,0,0,.2);
61+
}
62+
63+
.tt-suggestion {
64+
padding: 3px 20px;
65+
font-size: 18px;
66+
line-height: 24px;
67+
}
68+
69+
.tt-suggestion:hover {
70+
cursor: pointer;
71+
color: #fff;
72+
background-color: #0097cf;
73+
}
74+
75+
.tt-suggestion.tt-cursor {
76+
color: #fff;
77+
background-color: #0097cf;
78+
79+
}
80+
81+
.tt-suggestion p {
82+
margin: 0;
83+
}
84+
</style>
1385
</head>
1486
<body role="document">
1587
<nav class="navbar navbar-inverse">
@@ -27,14 +99,74 @@
2799
<ul class="nav navbar-nav">
28100
<li><a href="/">Accounts</a></li>
29101
<li><a href="#budget">Budget</a></li>
30-
<li><button class="btn btn-success navbar-btn">Add Transaction</button></li>
102+
<li><button class="btn btn-success navbar-btn" data-toggle="modal" data-target="#add_transaction">Add Transaction</button></li>
31103
</ul>
32-
</div><!--/.nav-collapse -->
104+
</div>
33105
</div>
34106
</nav>
35107

36108
<div class="container-fluid" role="main">
37109
<%== body %>
38110
</div>
111+
112+
<div class="modal fade" id="add_transaction" tabindex="-1" role="dialog" aria-labelledby="addTransactionLabel">
113+
<div class="modal-dialog" role="document">
114+
<div class="modal-content">
115+
<form action="/transactions" method="post" class="form-horizontal">
116+
<div class="modal-header">
117+
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
118+
<h4 class="modal-title" id="addTransactionLabel">Add Transaction</h4>
119+
</div>
120+
<div class="modal-body">
121+
<div class="form-group">
122+
<label for="add_transaction_payee" class="col-sm-2 control-label">Payee</label>
123+
<div class="col-sm-10">
124+
<input type="text" class="form-control" id="add_transaction_payee" name="payee" placeholder="Payee">
125+
</div>
126+
</div>
127+
<div class="form-group">
128+
<label for="add_transaction_date" class="col-sm-2 control-label">Date</label>
129+
<div class="col-sm-10">
130+
<input type="date" class="form-control" id="add_transaction_date" name="date" placeholder="Date">
131+
</div>
132+
</div>
133+
134+
<fieldset>
135+
<legend>Accounts</legend>
136+
<div class="form-group">
137+
<div class="col-sm-6">
138+
<input type="text" class="form-control typeahead" id="add_transaction_account_0" name="add_transaction_account[]" placeholder="Account">
139+
</div>
140+
<div class="col-sm-6">
141+
<input type="text" class="form-control" id="add_transaction_value_0" name="add_transaction_value[]" placeholder="Value">
142+
</div>
143+
</div>
144+
<div class="form-group">
145+
<div class="col-sm-6">
146+
<input type="text" class="form-control typeahead" id="add_transaction_account_1" name="add_transaction_account[]" placeholder="Account">
147+
</div>
148+
<div class="col-sm-6">
149+
<input type="text" class="form-control" id="add_transaction_value_1" name="add_transaction_value[]" placeholder="Value">
150+
</div>
151+
</div>
152+
<div class="form-group">
153+
<div class="col-sm-10"></div>
154+
<div class="col-sm-2">
155+
<button type="button" class="btn btn-success btn-sm">
156+
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
157+
</button>
158+
</div>
159+
</div>
160+
</fieldset>
161+
162+
</div>
163+
<div class="modal-footer">
164+
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
165+
<button type="submit" class="btn btn-primary">Save</button>
166+
</div>
167+
</form>
168+
</div>
169+
</div>
170+
</div>
39171
</body>
40172
</html>

config/routes.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'ledger/api/client'
33
require_relative '../app/ledger/controller/root'
44
require_relative '../app/ledger/controller/account'
5+
require_relative '../app/ledger/controller/transaction_create'
56

67
module Ledger
78
class Routes
@@ -10,12 +11,15 @@ def routes
1011
api_client = Api::Client.new('http://localhost:8080/')
1112
root_controller = Controller::Root.new(api_client)
1213
account_controller = Controller::Account.new(api_client)
14+
create_transaction = Controller::TransactionCreate.new(api_client)
1315

1416
router = Rack::Router.new
1517

1618
router.get('/' => root_controller.method(:call))
1719
router.get('/accounts/:name' => account_controller.method(:call))
1820

21+
router.post('/transactions' => create_transaction.method(:call))
22+
1923
run router
2024
end
2125
end

lib/ledger/api/client.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,31 @@ def account_transactions(name)
4747
}
4848
end
4949

50+
def create_transaction(data_hash)
51+
account_count = 0
52+
accounts = []
53+
data_hash['add_transaction_account'].each do |row|
54+
accounts << {
55+
:name => row,
56+
:amount => data_hash['add_transaction_value'][account_count],
57+
}
58+
59+
account_count+=1
60+
end
61+
62+
json_data = MultiJson.dump({
63+
:date => data_hash['date'],
64+
:payee => data_hash['payee'],
65+
:accounts => accounts,
66+
})
67+
68+
Typhoeus.post(
69+
"#{@base_url}transactions",
70+
:body => json_data,
71+
:headers => {'Content-Type' => 'application/json'},
72+
)
73+
end
74+
5075
class Error < StandardError; end
5176
end
5277
end

0 commit comments

Comments
 (0)