bowtie 0.3 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bowtie.gemspec +1 -1
- data/lib/bowtie/admin.rb +9 -5
- data/lib/bowtie/core_extensions.rb +28 -1
- data/lib/bowtie/public/css/bowtie.css +23 -9
- data/lib/bowtie/views/field.erb +7 -3
- data/lib/bowtie/views/form.erb +1 -1
- data/lib/bowtie/views/row.erb +1 -1
- metadata +2 -1
data/bowtie.gemspec
CHANGED
data/lib/bowtie/admin.rb
CHANGED
@@ -67,7 +67,7 @@ module Bowtie
|
|
67
67
|
end
|
68
68
|
|
69
69
|
post "/:model" do
|
70
|
-
@resource = model.create(params[:resource].
|
70
|
+
@resource = model.create(params[:resource].prepare_for_query(model))
|
71
71
|
if @resource.valid? and @resource.save
|
72
72
|
redirect "/#{model.pluralize}?notice=created"
|
73
73
|
else
|
@@ -94,11 +94,15 @@ module Bowtie
|
|
94
94
|
end
|
95
95
|
|
96
96
|
put "/:model/:id" do
|
97
|
-
if
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
if request.xhr? # dont pass through hooks or put the boolean stuff
|
98
|
+
if resource.update!(params[:resource].filter_inaccessible_in(model).normalize)
|
99
|
+
resource.to_json
|
100
|
+
else
|
101
101
|
false
|
102
|
+
end
|
103
|
+
else # normal request
|
104
|
+
if resource.update(params[:resource].prepare_for_query(model))
|
105
|
+
redirect("/#{model.pluralize}/#{params[:id]}?notice=updated")
|
102
106
|
else
|
103
107
|
@resource = resource
|
104
108
|
erb :show
|
@@ -20,6 +20,14 @@ class Class
|
|
20
20
|
self.to_s.pluralize
|
21
21
|
end
|
22
22
|
|
23
|
+
def field_names
|
24
|
+
self.properties.collect{|p| p.name }
|
25
|
+
end
|
26
|
+
|
27
|
+
def boolean_fields
|
28
|
+
self.properties.map{|a| a.name if a.class == DataMapper::Property::Boolean}.compact
|
29
|
+
end
|
30
|
+
|
23
31
|
def searchable_fields
|
24
32
|
self.properties.map{|a| a.name if a.class == DataMapper::Property::String}.compact
|
25
33
|
end
|
@@ -45,10 +53,29 @@ end
|
|
45
53
|
|
46
54
|
class Hash
|
47
55
|
|
56
|
+
def prepare_for_query(model)
|
57
|
+
self.filter_inaccessible_in(model).include_missing_booleans_in(model).normalize
|
58
|
+
end
|
59
|
+
|
60
|
+
def filter_inaccessible_in(model)
|
61
|
+
fields = model.field_names
|
62
|
+
self.delete_if { |key,val| !fields.include?(key.to_sym) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def include_missing_booleans_in(model)
|
66
|
+
model.boolean_fields.each do |bool|
|
67
|
+
self[bool] = false unless self.has_key?(bool.to_s)
|
68
|
+
end
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
48
72
|
# this is for checkboxes which give us a param of 'on' on the params hash
|
49
73
|
def normalize
|
74
|
+
replacements = { 'on' => true, '' => nil}
|
50
75
|
normalized = {}
|
51
|
-
self.each_pair
|
76
|
+
self.each_pair do |key,val|
|
77
|
+
normalized[key] = replacements.has_key?(val) ? replacements[val] : val
|
78
|
+
end
|
52
79
|
normalized
|
53
80
|
end
|
54
81
|
|
@@ -141,10 +141,6 @@ table{
|
|
141
141
|
text-align: left;
|
142
142
|
}
|
143
143
|
|
144
|
-
table tr:hover{
|
145
|
-
background: #efefef;
|
146
|
-
}
|
147
|
-
|
148
144
|
table tr td, table tr th {
|
149
145
|
border:1px solid #ccc;
|
150
146
|
padding:6px;
|
@@ -187,21 +183,35 @@ table .check-column{
|
|
187
183
|
text-align: center;
|
188
184
|
}
|
189
185
|
|
190
|
-
table tr.
|
191
|
-
|
186
|
+
table tr.active,
|
187
|
+
table tr.enabled{
|
188
|
+
border-left: 5px solid #528e00;
|
189
|
+
}
|
190
|
+
|
191
|
+
table tr.active td,
|
192
|
+
table tr.enabled td{
|
193
|
+
background: #ebf9eb;
|
192
194
|
}
|
193
195
|
|
194
|
-
table tr.
|
196
|
+
table tr.cancelled,
|
197
|
+
table tr.disabled,
|
198
|
+
table tr.suspended{
|
199
|
+
border-left: 5px solid #a00;
|
200
|
+
}
|
201
|
+
|
202
|
+
table tr.cancelled td,
|
203
|
+
table tr.disabled td,
|
204
|
+
table tr.suspended td{
|
195
205
|
/* background-color: #fbf5dc;*/
|
196
206
|
background-color: #FFEFEF;
|
197
207
|
}
|
198
208
|
|
199
209
|
table th.rel{
|
200
210
|
background: #999;
|
201
|
-
color: #fff
|
211
|
+
color: #fff;
|
202
212
|
}
|
203
213
|
table td.rel {
|
204
|
-
background: #
|
214
|
+
background: #eee;
|
205
215
|
}
|
206
216
|
|
207
217
|
table .icon{
|
@@ -211,6 +221,10 @@ table .icon{
|
|
211
221
|
margin-top: -3px;
|
212
222
|
}
|
213
223
|
|
224
|
+
table tr:hover td{
|
225
|
+
background: #ffffed;
|
226
|
+
}
|
227
|
+
|
214
228
|
/* forms
|
215
229
|
-------------------------------------------------------------*/
|
216
230
|
|
data/lib/bowtie/views/field.erb
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
|
3
3
|
html =''
|
4
4
|
name = @p.name.to_s
|
5
|
-
|
5
|
+
begin
|
6
|
+
value = @resource.send(@p.name)
|
7
|
+
rescue NoMethodError
|
8
|
+
value = ''
|
9
|
+
end
|
6
10
|
|
7
11
|
case @p.class.to_s.gsub("DataMapper::Property::",'')
|
8
12
|
when "Array", /Class/ # weird how datamapper names enum classes
|
@@ -13,10 +17,10 @@
|
|
13
17
|
end
|
14
18
|
html += '</select>'
|
15
19
|
when "TrueClass", "FalseClass", /Boolean/
|
16
|
-
checked =
|
20
|
+
checked = value == true ? 'checked="checked"' : ''
|
17
21
|
html += '<input name="resource['+name+']" type="checkbox" '+checked+' />'
|
18
22
|
else
|
19
|
-
html += '<input class="string" type="text" name="resource['+name+']" value="'+value+'" />'
|
23
|
+
html += '<input class="string" type="text" name="resource['+name+']" value="'+value.to_s+'" />'
|
20
24
|
end
|
21
25
|
html
|
22
26
|
|
data/lib/bowtie/views/form.erb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
<% unless [:created_at, :id].include?(p.name) %>
|
9
9
|
<% @p = p %>
|
10
10
|
<tr>
|
11
|
-
<td class="left-col"><%= p.name.to_s.titleize %> <small>(<%= p.class.name.to_s.gsub("DataMapper::Property::",'') %>)</small></td>
|
11
|
+
<td class="left-col"><%= p.name.to_s.titleize %> <small>(<%= p.class.name.to_s.gsub("DataMapper::Property::",'') || 'Enum' %>)</small></td>
|
12
12
|
<td class="right-col"><%= partial(:field) %></td>
|
13
13
|
</tr>
|
14
14
|
<% end %>
|
data/lib/bowtie/views/row.erb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<tr id="resource-<%= @r.key.first.to_s %>" class="<%= @r.
|
1
|
+
<tr id="resource-<%= @r.key.first.to_s %>" class="<%= @r.state.to_s if @r.respond_to?(:state) %>">
|
2
2
|
<td class="<%= @model.key.first.name.to_s %>-col"><a href="<%= url_for(@r) %>"><%= @r.key.first.to_s %></a></td>
|
3
3
|
<% @r.attributes.each do |a| %>
|
4
4
|
<% next if a[0] == @model.key.first.name %>
|