bookkeeper 0.0.1.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +22 -0
- data/Rakefile +44 -0
- data/app/assets/javascripts/bookkeeper.js +10 -0
- data/app/assets/javascripts/bookkeeper/bootstrap-datepicker.js +470 -0
- data/app/assets/stylesheets/bookkeeper.css +13 -0
- data/app/assets/stylesheets/bookkeeper/datepicker.css +182 -0
- data/app/assets/stylesheets/bookkeeper/scaffold.css +56 -0
- data/app/controllers/bookkeeper/application_controller.rb +5 -0
- data/app/controllers/bookkeeper/purchases_controller.rb +74 -0
- data/app/helpers/bookkeeper/application_helper.rb +4 -0
- data/app/inputs/datepicker_input.rb +9 -0
- data/app/models/bookkeeper/purchase.rb +11 -0
- data/app/uploaders/receipt_uploader.rb +57 -0
- data/app/views/bookkeeper/purchases/_form.html.erb +17 -0
- data/app/views/bookkeeper/purchases/edit.html.erb +6 -0
- data/app/views/bookkeeper/purchases/index.html.erb +34 -0
- data/app/views/bookkeeper/purchases/new.html.erb +5 -0
- data/app/views/bookkeeper/purchases/show.html.erb +34 -0
- data/app/views/layouts/bookkeeper/application.html.erb +14 -0
- data/config/initializers/carrierwave.rb +6 -0
- data/config/initializers/simple_form.rb +142 -0
- data/config/initializers/simple_form_bootstrap.rb +45 -0
- data/config/initializers/validates_timeliness.rb +40 -0
- data/config/locales/simple_form.en.yml +26 -0
- data/config/locales/validates_timeliness.en.yml +16 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20130215165240_create_bookkeeper_purchases.rb +13 -0
- data/lib/bookkeeper.rb +4 -0
- data/lib/bookkeeper/engine.rb +17 -0
- data/lib/bookkeeper/version.rb +3 -0
- data/lib/tasks/bookkeeper_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/spec/assets/images/receipt.jpg +0 -0
- data/spec/controllers/bookkeeper/purchases_controller_spec.rb +156 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/images/glyphicons-halflings-white.png +0 -0
- data/spec/dummy/app/assets/images/glyphicons-halflings.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/app/assets/javascripts/bootstrap.js +2268 -0
- data/spec/dummy/app/assets/stylesheets/application.css +14 -0
- data/spec/dummy/app/assets/stylesheets/bootstrap-responsive.css +1109 -0
- data/spec/dummy/app/assets/stylesheets/bootstrap.css +6158 -0
- data/spec/dummy/app/assets/stylesheets/font-awesome-ie7.min.css +22 -0
- data/spec/dummy/app/assets/stylesheets/font-awesome.min.css +33 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +65 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +26 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/font/FontAwesome.otf +0 -0
- data/spec/dummy/public/font/fontawesome-webfont.eot +0 -0
- data/spec/dummy/public/font/fontawesome-webfont.svg +284 -0
- data/spec/dummy/public/font/fontawesome-webfont.ttf +0 -0
- data/spec/dummy/public/font/fontawesome-webfont.woff +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/bookkeeper_purchases.rb +15 -0
- data/spec/models/bookkeeper/purchase_spec.rb +51 -0
- data/spec/routing/bookkeeper/purchases_routing_spec.rb +37 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/uploaders/receipt_uploader_spec.rb +26 -0
- data/spec/views/bookkeeper/purchases/edit.html.erb_spec.rb +22 -0
- data/spec/views/bookkeeper/purchases/index.html.erb_spec.rb +26 -0
- data/spec/views/bookkeeper/purchases/new.html.erb_spec.rb +22 -0
- data/spec/views/bookkeeper/purchases/show.html.erb_spec.rb +19 -0
- metadata +396 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree './bookkeeper'
|
13
|
+
*/
|
@@ -0,0 +1,182 @@
|
|
1
|
+
/*!
|
2
|
+
* Datepicker for Bootstrap
|
3
|
+
*
|
4
|
+
* Copyright 2012 Stefan Petre
|
5
|
+
* Licensed under the Apache License v2.0
|
6
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
*
|
8
|
+
*/
|
9
|
+
.datepicker {
|
10
|
+
top: 0;
|
11
|
+
left: 0;
|
12
|
+
padding: 4px;
|
13
|
+
/* margin-top: 1px; */
|
14
|
+
-webkit-border-radius: 4px;
|
15
|
+
-moz-border-radius: 4px;
|
16
|
+
border-radius: 4px;
|
17
|
+
/*.dow {
|
18
|
+
border-top: 1px solid #ddd !important;
|
19
|
+
}*/
|
20
|
+
|
21
|
+
}
|
22
|
+
.datepicker:before {
|
23
|
+
content: '';
|
24
|
+
display: inline-block;
|
25
|
+
border-left: 7px solid transparent;
|
26
|
+
border-right: 7px solid transparent;
|
27
|
+
border-bottom: 7px solid #ccc;
|
28
|
+
border-bottom-color: rgba(0, 0, 0, 0.2);
|
29
|
+
position: absolute;
|
30
|
+
top: -7px;
|
31
|
+
left: 6px;
|
32
|
+
}
|
33
|
+
.datepicker:after {
|
34
|
+
content: '';
|
35
|
+
display: inline-block;
|
36
|
+
border-left: 6px solid transparent;
|
37
|
+
border-right: 6px solid transparent;
|
38
|
+
border-bottom: 6px solid #ffffff;
|
39
|
+
position: absolute;
|
40
|
+
top: -6px;
|
41
|
+
left: 7px;
|
42
|
+
}
|
43
|
+
.datepicker > div {
|
44
|
+
display: none;
|
45
|
+
}
|
46
|
+
.datepicker table {
|
47
|
+
width: 100%;
|
48
|
+
margin: 0;
|
49
|
+
}
|
50
|
+
.datepicker td,
|
51
|
+
.datepicker th {
|
52
|
+
text-align: center;
|
53
|
+
width: 20px;
|
54
|
+
height: 20px;
|
55
|
+
-webkit-border-radius: 4px;
|
56
|
+
-moz-border-radius: 4px;
|
57
|
+
border-radius: 4px;
|
58
|
+
}
|
59
|
+
.datepicker td.day:hover {
|
60
|
+
background: #eeeeee;
|
61
|
+
cursor: pointer;
|
62
|
+
}
|
63
|
+
.datepicker td.day.disabled {
|
64
|
+
color: #eeeeee;
|
65
|
+
}
|
66
|
+
.datepicker td.old,
|
67
|
+
.datepicker td.new {
|
68
|
+
color: #999999;
|
69
|
+
}
|
70
|
+
.datepicker td.active,
|
71
|
+
.datepicker td.active:hover {
|
72
|
+
color: #ffffff;
|
73
|
+
background-color: #006dcc;
|
74
|
+
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
75
|
+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
76
|
+
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
77
|
+
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
78
|
+
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
|
79
|
+
background-repeat: repeat-x;
|
80
|
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
|
81
|
+
border-color: #0044cc #0044cc #002a80;
|
82
|
+
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
83
|
+
*background-color: #0044cc;
|
84
|
+
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
85
|
+
|
86
|
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
87
|
+
color: #fff;
|
88
|
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
89
|
+
}
|
90
|
+
.datepicker td.active:hover,
|
91
|
+
.datepicker td.active:hover:hover,
|
92
|
+
.datepicker td.active:focus,
|
93
|
+
.datepicker td.active:hover:focus,
|
94
|
+
.datepicker td.active:active,
|
95
|
+
.datepicker td.active:hover:active,
|
96
|
+
.datepicker td.active.active,
|
97
|
+
.datepicker td.active:hover.active,
|
98
|
+
.datepicker td.active.disabled,
|
99
|
+
.datepicker td.active:hover.disabled,
|
100
|
+
.datepicker td.active[disabled],
|
101
|
+
.datepicker td.active:hover[disabled] {
|
102
|
+
color: #ffffff;
|
103
|
+
background-color: #0044cc;
|
104
|
+
*background-color: #003bb3;
|
105
|
+
}
|
106
|
+
.datepicker td.active:active,
|
107
|
+
.datepicker td.active:hover:active,
|
108
|
+
.datepicker td.active.active,
|
109
|
+
.datepicker td.active:hover.active {
|
110
|
+
background-color: #003399 \9;
|
111
|
+
}
|
112
|
+
.datepicker td span {
|
113
|
+
display: block;
|
114
|
+
width: 47px;
|
115
|
+
height: 54px;
|
116
|
+
line-height: 54px;
|
117
|
+
float: left;
|
118
|
+
margin: 2px;
|
119
|
+
cursor: pointer;
|
120
|
+
-webkit-border-radius: 4px;
|
121
|
+
-moz-border-radius: 4px;
|
122
|
+
border-radius: 4px;
|
123
|
+
}
|
124
|
+
.datepicker td span:hover {
|
125
|
+
background: #eeeeee;
|
126
|
+
}
|
127
|
+
.datepicker td span.active {
|
128
|
+
color: #ffffff;
|
129
|
+
background-color: #006dcc;
|
130
|
+
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
131
|
+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
132
|
+
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
133
|
+
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
134
|
+
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
|
135
|
+
background-repeat: repeat-x;
|
136
|
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
|
137
|
+
border-color: #0044cc #0044cc #002a80;
|
138
|
+
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
139
|
+
*background-color: #0044cc;
|
140
|
+
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
|
141
|
+
|
142
|
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
143
|
+
color: #fff;
|
144
|
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
145
|
+
}
|
146
|
+
.datepicker td span.active:hover,
|
147
|
+
.datepicker td span.active:focus,
|
148
|
+
.datepicker td span.active:active,
|
149
|
+
.datepicker td span.active.active,
|
150
|
+
.datepicker td span.active.disabled,
|
151
|
+
.datepicker td span.active[disabled] {
|
152
|
+
color: #ffffff;
|
153
|
+
background-color: #0044cc;
|
154
|
+
*background-color: #003bb3;
|
155
|
+
}
|
156
|
+
.datepicker td span.active:active,
|
157
|
+
.datepicker td span.active.active {
|
158
|
+
background-color: #003399 \9;
|
159
|
+
}
|
160
|
+
.datepicker td span.old {
|
161
|
+
color: #999999;
|
162
|
+
}
|
163
|
+
.datepicker th.switch {
|
164
|
+
width: 145px;
|
165
|
+
}
|
166
|
+
.datepicker th.next,
|
167
|
+
.datepicker th.prev {
|
168
|
+
font-size: 21px;
|
169
|
+
}
|
170
|
+
.datepicker thead tr:first-child th {
|
171
|
+
cursor: pointer;
|
172
|
+
}
|
173
|
+
.datepicker thead tr:first-child th:hover {
|
174
|
+
background: #eeeeee;
|
175
|
+
}
|
176
|
+
.input-append.date .add-on i,
|
177
|
+
.input-prepend.date .add-on i {
|
178
|
+
display: block;
|
179
|
+
cursor: pointer;
|
180
|
+
width: 16px;
|
181
|
+
height: 16px;
|
182
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
div.field, div.actions {
|
20
|
+
margin-bottom: 10px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#notice {
|
24
|
+
color: green;
|
25
|
+
}
|
26
|
+
|
27
|
+
.field_with_errors {
|
28
|
+
padding: 2px;
|
29
|
+
background-color: red;
|
30
|
+
display: table;
|
31
|
+
}
|
32
|
+
|
33
|
+
#error_explanation {
|
34
|
+
width: 450px;
|
35
|
+
border: 2px solid red;
|
36
|
+
padding: 7px;
|
37
|
+
padding-bottom: 0;
|
38
|
+
margin-bottom: 20px;
|
39
|
+
background-color: #f0f0f0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#error_explanation h2 {
|
43
|
+
text-align: left;
|
44
|
+
font-weight: bold;
|
45
|
+
padding: 5px 5px 5px 15px;
|
46
|
+
font-size: 12px;
|
47
|
+
margin: -7px;
|
48
|
+
margin-bottom: 0px;
|
49
|
+
background-color: #c00;
|
50
|
+
color: #fff;
|
51
|
+
}
|
52
|
+
|
53
|
+
#error_explanation ul li {
|
54
|
+
font-size: 12px;
|
55
|
+
list-style: square;
|
56
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_dependency "bookkeeper/application_controller"
|
2
|
+
|
3
|
+
module Bookkeeper
|
4
|
+
class PurchasesController < ApplicationController
|
5
|
+
def index
|
6
|
+
@purchases = Purchase.all
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.json { render json: @purchases }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def show
|
15
|
+
@purchase = Purchase.find(params[:id])
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
format.html
|
19
|
+
format.json { render json: @purchase }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def new
|
24
|
+
@purchase = Purchase.new
|
25
|
+
|
26
|
+
respond_to do |format|
|
27
|
+
format.html
|
28
|
+
format.json { render json: @purchase }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def edit
|
33
|
+
@purchase = Purchase.find(params[:id])
|
34
|
+
end
|
35
|
+
|
36
|
+
def create
|
37
|
+
@purchase = Purchase.new(params[:purchase])
|
38
|
+
|
39
|
+
respond_to do |format|
|
40
|
+
if @purchase.save
|
41
|
+
format.html { redirect_to purchases_path, notice: 'Purchase was successfully created.' }
|
42
|
+
format.json { render json: @purchase, status: :created, location: @purchase }
|
43
|
+
else
|
44
|
+
format.html { render action: "new" }
|
45
|
+
format.json { render json: @purchase.errors, status: :unprocessable_entity }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def update
|
51
|
+
@purchase = Purchase.find(params[:id])
|
52
|
+
|
53
|
+
respond_to do |format|
|
54
|
+
if @purchase.update_attributes(params[:purchase])
|
55
|
+
format.html { redirect_to purchases_path, notice: 'Purchase was successfully updated.' }
|
56
|
+
format.json { head :no_content }
|
57
|
+
else
|
58
|
+
format.html { render action: "edit" }
|
59
|
+
format.json { render json: @purchase.errors, status: :unprocessable_entity }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def destroy
|
65
|
+
@purchase = Purchase.find(params[:id])
|
66
|
+
@purchase.destroy
|
67
|
+
|
68
|
+
respond_to do |format|
|
69
|
+
format.html { redirect_to purchases_url }
|
70
|
+
format.json { head :no_content }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class DatepickerInput < SimpleForm::Inputs::Base
|
2
|
+
def input
|
3
|
+
"#{@builder.text_field(attribute_name, input_html_options.merge(datepicker_options(object.send(attribute_name))))}".html_safe
|
4
|
+
end
|
5
|
+
|
6
|
+
def datepicker_options(value = nil)
|
7
|
+
datepicker_options = {:class => 'input-small datepicker string', :value => value.nil?? nil : value.strftime("%d/%m/%Y")}
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Bookkeeper
|
2
|
+
class Purchase < ActiveRecord::Base
|
3
|
+
mount_uploader :receipt, ReceiptUploader
|
4
|
+
|
5
|
+
attr_accessible :description, :purchase_date, :title, :warranty_duration, :receipt
|
6
|
+
|
7
|
+
validates_presence_of :title
|
8
|
+
validates_numericality_of :warranty_duration, allow_nil: true
|
9
|
+
validates_date :purchase_date, allow_nil: true, allow_blank: true
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class ReceiptUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
# Include RMagick or MiniMagick support:
|
6
|
+
include CarrierWave::RMagick
|
7
|
+
# include CarrierWave::MiniMagick
|
8
|
+
|
9
|
+
# Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
|
10
|
+
# include Sprockets::Helpers::RailsHelper
|
11
|
+
# include Sprockets::Helpers::IsolatedHelper
|
12
|
+
|
13
|
+
permissions 0600
|
14
|
+
|
15
|
+
# Choose what kind of storage to use for this uploader:
|
16
|
+
storage :file
|
17
|
+
# storage :fog
|
18
|
+
|
19
|
+
# Override the directory where uploaded files will be stored.
|
20
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
21
|
+
# def store_dir
|
22
|
+
# "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
23
|
+
# end
|
24
|
+
|
25
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
26
|
+
def default_url
|
27
|
+
# For Rails 3.1+ asset pipeline compatibility:
|
28
|
+
asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
|
29
|
+
|
30
|
+
"/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
31
|
+
end
|
32
|
+
|
33
|
+
# Process files as they are uploaded:
|
34
|
+
process :resize_to_fit => [1000, 1000]
|
35
|
+
#
|
36
|
+
# def scale(width, height)
|
37
|
+
# # do something
|
38
|
+
# end
|
39
|
+
|
40
|
+
# Create different versions of your uploaded files:
|
41
|
+
version :thumb do
|
42
|
+
process :resize_to_fill => [64, 64]
|
43
|
+
end
|
44
|
+
|
45
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
46
|
+
# For images you might use something like this:
|
47
|
+
def extension_white_list
|
48
|
+
%w(jpg jpeg gif png pdf)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Override the filename of the uploaded files:
|
52
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
53
|
+
# def filename
|
54
|
+
# "something.jpg" if original_filename
|
55
|
+
# end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= simple_form_for @purchase, html: { class: 'form-horizontal' } do |f| %>
|
2
|
+
|
3
|
+
<%= f.error_notification %>
|
4
|
+
|
5
|
+
<div class="form-inputs">
|
6
|
+
<%= f.input :title %>
|
7
|
+
<%= f.input :description, input_html: { class: 'input-xxlarge', rows: 4 } %>
|
8
|
+
<%= f.input :purchase_date, :wrapper => :prepend do %>
|
9
|
+
<%= content_tag :span, '<i class="icon-th"></i>'.html_safe, class: "add-on calendar" %><%= f.input_field :purchase_date, as: :datepicker, data: { 'date-format' => 'dd/mm/yyyy' } %>
|
10
|
+
<% end %>
|
11
|
+
<%= f.input :warranty_duration, collection: [["6 months", 6], ["1 year", 12], ["2 years", 24], ["3 years", 36]], input_html: { class: 'input-small' } %>
|
12
|
+
<%= f.input :receipt %>
|
13
|
+
</div>
|
14
|
+
<div class="form-actions">
|
15
|
+
<%= button_tag '<i class="icon-ok"></i> Save'.html_safe, class: 'btn' %>
|
16
|
+
</div>
|
17
|
+
<% end %>
|