togo 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/togo/admin/admin.rb +1 -1
- data/lib/togo/admin/public/css/screen.css +7 -0
- data/lib/togo/admin/public/js/togo.js +0 -3
- data/lib/togo/admin/views/edit.erb +1 -1
- data/lib/togo/admin/views/index.erb +4 -4
- data/lib/togo/admin/views/new.erb +5 -3
- data/lib/togo/model/model.rb +20 -7
- data/lib/togo/model/types/belongs_to.erb +6 -11
- data/lib/togo/model/types/datetime.erb +1 -1
- data/lib/togo/model/types/has_n.erb +5 -5
- data/lib/togo/model/types/many_to_many.erb +63 -0
- metadata +5 -4
data/lib/togo/admin/admin.rb
CHANGED
@@ -157,34 +157,41 @@ body {
|
|
157
157
|
#main form fieldset input[type=text]:focus {
|
158
158
|
border: 1px solid #ABABAB;
|
159
159
|
}
|
160
|
+
#main form fieldset.many_to_many,
|
160
161
|
#main form fieldset.belongs_to,
|
161
162
|
#main form fieldset.has_n {
|
162
163
|
padding-right: 20px;
|
163
164
|
}
|
165
|
+
#main form fieldset.many_to_many input[type=text],
|
164
166
|
#main form fieldset.belongs_to input[type=text],
|
165
167
|
#main form fieldset.has_n input[type=text] {
|
166
168
|
width: 190px;
|
167
169
|
}
|
170
|
+
#main form fieldset.many_to_many label,
|
168
171
|
#main form fieldset.belongs_to label,
|
169
172
|
#main form fieldset.has_n label {
|
170
173
|
float: left;
|
171
174
|
}
|
175
|
+
#main form fieldset.many_to_many div.search,
|
172
176
|
#main form fieldset.belongs_to div.search,
|
173
177
|
#main form fieldset.has_n div.search {
|
174
178
|
display: none;
|
175
179
|
width: 100%;
|
176
180
|
text-align: right;
|
177
181
|
}
|
182
|
+
#main form fieldset.many_to_many div.paging,
|
178
183
|
#main form fieldset.belongs_to div.paging,
|
179
184
|
#main form fieldset.has_n div.paging {
|
180
185
|
float: right;
|
181
186
|
margin-left: 10px;
|
182
187
|
line-height: 30px;
|
183
188
|
}
|
189
|
+
#main form fieldset.many_to_many .checkbox,
|
184
190
|
#main form fieldset.belongs_to .checkbox,
|
185
191
|
#main form fieldset.has_n .checkbox {
|
186
192
|
display: none;
|
187
193
|
}
|
194
|
+
#main form fieldset.many_to_many .active,
|
188
195
|
#main form fieldset.belongs_to .active,
|
189
196
|
#main form fieldset.has_n .active {
|
190
197
|
display: table-cell;
|
@@ -221,7 +221,6 @@ AssociationManager.prototype.adjustRelatedList = function() {
|
|
221
221
|
};
|
222
222
|
|
223
223
|
AssociationManager.prototype.setToModifyState = function() {
|
224
|
-
console.log('setToModifyState');
|
225
224
|
ajax({
|
226
225
|
url: "/search/" + this.model,
|
227
226
|
success: this.searchResultsHandler(this)
|
@@ -293,7 +292,6 @@ AssociationManager.prototype.tableHandler = function(handler) {
|
|
293
292
|
if (e.target.getAttribute('type') == 'radio') {
|
294
293
|
handler.relatedIds = {};
|
295
294
|
handler.relatedIds[e.target.value] = e.target.checked;
|
296
|
-
console.log(handler.relatedIds);
|
297
295
|
}
|
298
296
|
};
|
299
297
|
};
|
@@ -331,7 +329,6 @@ AssociationManager.prototype.searchResultsHandler = function(handler) {
|
|
331
329
|
handler.pageCount = Math.ceil(handler.count/10);
|
332
330
|
handler.pageCountField.innerHTML = handler.pageCount;
|
333
331
|
handler.pageNumberField.innerHTML = handler.pageNumber;
|
334
|
-
console.log(data);
|
335
332
|
if (data.results.length > 0) {
|
336
333
|
var out = [];
|
337
334
|
for (var i = 0, len = data.results.length; i < len; i++) {
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<form action="/update/<%= @model.name %>/<%= @content.id %>" method="post" id="edit-form">
|
3
3
|
<div class="wrapper">
|
4
4
|
<% if @errors %><div id="save_errors" class="errors"><%= @errors %></div><% end %>
|
5
|
-
<% @model.
|
5
|
+
<% @model.get_form_properties.each do |p| %>
|
6
6
|
<fieldset id="property-<%= p.name %>" class="<%= @model.field_class_for(p) %>">
|
7
7
|
<%= @model.form_for(p,@content) %>
|
8
8
|
</fieldset>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<h1><%= @model.display_name %></h1>
|
2
2
|
<div id="paging">
|
3
|
-
<%= @count %>
|
3
|
+
<%= @count %> item<%= @count != 1 ? 's' : '' %>
|
4
4
|
<% if @page_count > 1 %>
|
5
5
|
Page <span class="page-number"><%= @p %></span> of <span class="page-count"><%= @page_count %></span>
|
6
6
|
<% prev_link, next_link = paging_links(@p, @page_count, :q => params[:q]) %>
|
@@ -20,7 +20,7 @@
|
|
20
20
|
<% if not @content.empty? %>
|
21
21
|
<th></th>
|
22
22
|
<% end %>
|
23
|
-
<% @model.
|
23
|
+
<% @model.get_list_properties.each do |p| %>
|
24
24
|
<th><%= p.name.to_s.humanize.titleize %></th>
|
25
25
|
<% end %>
|
26
26
|
</tr>
|
@@ -28,13 +28,13 @@
|
|
28
28
|
<tbody>
|
29
29
|
<% if @content.empty? %>
|
30
30
|
<tr>
|
31
|
-
<td colspan="<%= @model.
|
31
|
+
<td colspan="<%= @model.get_list_properties.size %>"><% if params[:q] %>No results for '<%= params[:q] %>'<% else %>No content has been created yet.<% end %></td>
|
32
32
|
</tr>
|
33
33
|
<% else %>
|
34
34
|
<% @content.each do |c| %>
|
35
35
|
<tr>
|
36
36
|
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="1" id="selection_<%= c.id %>" /></td>
|
37
|
-
<% @model.
|
37
|
+
<% @model.get_list_properties.each_with_index do |p,i| %>
|
38
38
|
<td><% if i == 0 %><a href="/edit/<%= @model.name %>/<%= c.id %>"><%= c.send(p.name.to_sym) || '-' %></a><% else %><%= c.send(p.name.to_sym) %><% end %></td>
|
39
39
|
<% end %>
|
40
40
|
</tr>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<h1><a href="/<%= @model.name %>"><%= @model.display_name %></a> / New</h1>
|
2
|
-
<form action="/create/<%= @model.name %>" method="post">
|
2
|
+
<form action="/create/<%= @model.name %>" method="post" id="edit-form">
|
3
3
|
<div class="wrapper">
|
4
4
|
<% if @errors %><div id="save_errors" class="errors"><%= @errors %></div><% end %>
|
5
|
-
<% @model.
|
6
|
-
<fieldset id="
|
5
|
+
<% @model.get_form_properties.each do |p| %>
|
6
|
+
<fieldset id="property-<%= p.name %>" class="<%= @model.field_class_for(p) %>">
|
7
7
|
<%= @model.form_for(p,@content) %>
|
8
8
|
</fieldset>
|
9
9
|
<% end %>
|
@@ -12,3 +12,5 @@
|
|
12
12
|
<button type="submit" class="create">Create</button>
|
13
13
|
</div>
|
14
14
|
</form>
|
15
|
+
<script type="text/javascript" src="/js/edit.js"></script>
|
16
|
+
|
data/lib/togo/model/model.rb
CHANGED
@@ -9,6 +9,8 @@ module Togo
|
|
9
9
|
base.extend ClassMethods
|
10
10
|
base.send(:class_variable_set, :@@list_properties, [])
|
11
11
|
base.send(:class_variable_set, :@@form_properties, [])
|
12
|
+
base.send(:class_variable_set, :@@user_list_properties, [])
|
13
|
+
base.send(:class_variable_set, :@@user_form_properties, [])
|
12
14
|
base.send(:class_variable_set, :@@custom_form_templates, {})
|
13
15
|
base.send(:class_variable_set, :@@property_options, {})
|
14
16
|
if MODELS.include?(base) # support code reloading
|
@@ -22,12 +24,12 @@ module Togo
|
|
22
24
|
|
23
25
|
# Let the user determine what properties to show in list view
|
24
26
|
def list_properties(*args)
|
25
|
-
|
27
|
+
class_variable_set(:@@user_list_properties, args.to_a)
|
26
28
|
end
|
27
29
|
|
28
30
|
# Let the user determine what properties to show in form view
|
29
31
|
def form_properties(*args)
|
30
|
-
|
32
|
+
class_variable_set(:@@user_form_properties, args.to_a)
|
31
33
|
end
|
32
34
|
|
33
35
|
def configure_property(property,opts = {})
|
@@ -52,9 +54,9 @@ module Togo
|
|
52
54
|
def stage_content(content,attrs)
|
53
55
|
content.attributes = properties.inject({}){|m,p| attrs[p.name.to_sym] ? m.merge!(p.name.to_sym => attrs[p.name.to_sym]) : m}
|
54
56
|
relationships.each do |r|
|
55
|
-
|
56
|
-
next if not
|
57
|
-
content = RelationshipManager.new(content, r, :ids =>
|
57
|
+
val = attrs["related_#{r[0]}".to_sym]
|
58
|
+
next if not val or val == 'unset'
|
59
|
+
content = RelationshipManager.new(content, r, :ids => val).relate
|
58
60
|
end
|
59
61
|
content
|
60
62
|
end
|
@@ -89,6 +91,14 @@ module Togo
|
|
89
91
|
type_from_property(property)
|
90
92
|
end
|
91
93
|
|
94
|
+
def get_list_properties
|
95
|
+
pick_properties(:list, class_variable_get(:@@user_list_properties))
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_form_properties
|
99
|
+
pick_properties(:form, class_variable_get(:@@user_form_properties))
|
100
|
+
end
|
101
|
+
|
92
102
|
private
|
93
103
|
|
94
104
|
def custom_template_for(property,template)
|
@@ -99,6 +109,8 @@ module Togo
|
|
99
109
|
case property
|
100
110
|
when ::DataMapper::Property
|
101
111
|
Extlib::Inflection.demodulize(property.type || property.class).downcase # type seems to be deprecated in 1.0
|
112
|
+
when ::DataMapper::Associations::ManyToMany::Relationship
|
113
|
+
'many_to_many'
|
102
114
|
when ::DataMapper::Associations::ManyToOne::Relationship
|
103
115
|
'belongs_to'
|
104
116
|
when ::DataMapper::Associations::OneToMany::Relationship
|
@@ -108,7 +120,7 @@ module Togo
|
|
108
120
|
end
|
109
121
|
end
|
110
122
|
|
111
|
-
def pick_properties(selection
|
123
|
+
def pick_properties(selection, args)
|
112
124
|
if class_variable_get(:"@@#{selection}_properties").empty?
|
113
125
|
args = shown_properties.map{|p| p.name} if args.empty?
|
114
126
|
class_variable_set(:"@@#{selection}_properties", args.collect{|a| shown_properties.select{|s| s.name == a}.first}.compact)
|
@@ -117,7 +129,8 @@ module Togo
|
|
117
129
|
end
|
118
130
|
|
119
131
|
def shown_properties
|
120
|
-
|
132
|
+
skip = relationships.values.collect{|r| r.through if r.respond_to?(:through) }.compact.uniq # don't include join models
|
133
|
+
properties.select{|p| not BLACKLIST.include?(p.name) and not p.name =~ /_id$/} + relationships.values.select{|r| not skip.include?(r)}
|
121
134
|
end
|
122
135
|
|
123
136
|
def search_properties
|
@@ -15,23 +15,18 @@
|
|
15
15
|
<thead>
|
16
16
|
<tr>
|
17
17
|
<th class="checkbox"></th>
|
18
|
-
<% related_model.
|
18
|
+
<% related_model.get_list_properties.each do |p| %>
|
19
19
|
<th><%= p.name.to_s.humanize.titleize %></th>
|
20
20
|
<% end %>
|
21
|
-
<% if related_model.list_properties.size < 2 %>
|
22
|
-
<th></th>
|
23
|
-
<% end %>
|
24
21
|
</tr>
|
25
22
|
</thead>
|
26
23
|
<tfoot>
|
27
24
|
<tr>
|
28
25
|
<td class="checkbox"></td>
|
29
|
-
<td>
|
30
|
-
<span class="associated-count-display" style="
|
26
|
+
<td colspan="<%= related_model.get_form_properties.size-2 %>">
|
27
|
+
<span class="associated-count-display" style="display: none;">
|
31
28
|
...and <span class="associated-count"><%= content_count-related_content.size %></span> more associated items
|
32
29
|
</span>
|
33
|
-
</td>
|
34
|
-
<td colspan="<%= related_model.form_properties.size-1 %>">
|
35
30
|
<button class="association-modify">Modify</button>
|
36
31
|
</td>
|
37
32
|
</tr>
|
@@ -39,13 +34,13 @@
|
|
39
34
|
<tbody>
|
40
35
|
<% if related_content.empty? %>
|
41
36
|
<tr>
|
42
|
-
<td colspan="<%= related_model.
|
37
|
+
<td colspan="<%= related_model.get_form_properties.size %>">No Content Associated.</td>
|
43
38
|
</tr>
|
44
39
|
<% else %>
|
45
40
|
<% related_content.each do |c| %>
|
46
41
|
<tr>
|
47
42
|
<td class="checkbox"><input type="radio" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
48
|
-
<% related_model.
|
43
|
+
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
49
44
|
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= c.send(p.name.to_sym) || '-' %></a><% else %><%= c.send(p.name.to_sym) %><% end %></td>
|
50
45
|
<% end %>
|
51
46
|
</tr>
|
@@ -58,7 +53,7 @@
|
|
58
53
|
relationship: 'belongs_to',
|
59
54
|
name: '<%= property.name %>',
|
60
55
|
model: '<%= related_model.name %>',
|
61
|
-
fields: <%= related_model.
|
56
|
+
fields: <%= related_model.get_list_properties.map(&:name).to_json %>,
|
62
57
|
count: <%= content_count %>,
|
63
58
|
related_ids: <%= related_ids.to_json %>
|
64
59
|
});
|
@@ -1,2 +1,2 @@
|
|
1
1
|
<label for="<%= property.name %>"><%= property.model.property_options[property.name][:label] rescue property.name.to_s.humanize.titleize %></label>
|
2
|
-
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name.to_sym).strftime("%B %d, %Y %I:%M%p")
|
2
|
+
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= (content.send(property.name.to_sym) || Time.now).strftime("%B %d, %Y %I:%M%p") %>" />
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<thead>
|
16
16
|
<tr>
|
17
17
|
<th class="checkbox"></th>
|
18
|
-
<% related_model.
|
18
|
+
<% related_model.get_list_properties.each do |p| %>
|
19
19
|
<th><%= p.name.to_s.humanize.titleize %></th>
|
20
20
|
<% end %>
|
21
21
|
</tr>
|
@@ -28,7 +28,7 @@
|
|
28
28
|
...and <span class="associated-count"><%= content_count-related_content.size %></span> more associated items
|
29
29
|
</span>
|
30
30
|
</td>
|
31
|
-
<td colspan="<%= related_model.
|
31
|
+
<td colspan="<%= related_model.get_form_properties.size-1 %>">
|
32
32
|
<button class="association-modify">Modify</button>
|
33
33
|
</td>
|
34
34
|
</tr>
|
@@ -36,13 +36,13 @@
|
|
36
36
|
<tbody>
|
37
37
|
<% if related_content.empty? %>
|
38
38
|
<tr>
|
39
|
-
<td colspan="<%= related_model.
|
39
|
+
<td colspan="<%= related_model.get_form_properties.size %>">No Content Associated.</td>
|
40
40
|
</tr>
|
41
41
|
<% else %>
|
42
42
|
<% related_content.each do |c| %>
|
43
43
|
<tr>
|
44
44
|
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
45
|
-
<% related_model.
|
45
|
+
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
46
46
|
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= c.send(p.name.to_sym) || '-' %></a><% else %><%= c.send(p.name.to_sym) %><% end %></td>
|
47
47
|
<% end %>
|
48
48
|
</tr>
|
@@ -55,7 +55,7 @@
|
|
55
55
|
relationship: 'has_n',
|
56
56
|
name: '<%= property.name %>',
|
57
57
|
model: '<%= related_model.name %>',
|
58
|
-
fields: <%= related_model.
|
58
|
+
fields: <%= related_model.get_list_properties.map(&:name).to_json %>,
|
59
59
|
count: <%= content_count %>,
|
60
60
|
related_ids: <%= related_ids.to_json %>
|
61
61
|
});
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<% content_count = content.send(property.name.to_sym).size %>
|
2
|
+
<% related_ids = content.send(property.name.to_sym).map(&:id) %>
|
3
|
+
<% related_content = content.send(property.name.to_sym)[0...10] %>
|
4
|
+
<% related_model = property.child_model %>
|
5
|
+
<input type="hidden" name="related_<%= property.name %>" class="related_ids" value="unset" />
|
6
|
+
<label for="<%= property.name %>"><%= related_model.display_name %></label>
|
7
|
+
<div class="search" id="search-<%= related_model.name %>">
|
8
|
+
<input type="text" name="search-<%= property.name %>" value="Search..." />
|
9
|
+
<div class="paging">
|
10
|
+
Page <span class="page-number">1</span> of <span class="page-count"><%= (content_count/10).ceil %></span>
|
11
|
+
<a href="#" rel="prev">« Previous</a> <a href="#" rel="next">Next »</a>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<table>
|
15
|
+
<thead>
|
16
|
+
<tr>
|
17
|
+
<th class="checkbox"></th>
|
18
|
+
<% related_model.get_list_properties.each do |p| %>
|
19
|
+
<th><%= p.name.to_s.humanize.titleize %></th>
|
20
|
+
<% end %>
|
21
|
+
</tr>
|
22
|
+
</thead>
|
23
|
+
<tfoot>
|
24
|
+
<tr>
|
25
|
+
<td class="checkbox"></td>
|
26
|
+
<td>
|
27
|
+
<span class="associated-count-display" style="<%= (content_count == 0 or content_count < 10) ? 'display: none;' : '' %>">
|
28
|
+
...and <span class="associated-count"><%= content_count-related_content.size %></span> more associated items
|
29
|
+
</span>
|
30
|
+
</td>
|
31
|
+
<td colspan="<%= related_model.get_form_properties.size-1 %>">
|
32
|
+
<button class="association-modify">Modify</button>
|
33
|
+
</td>
|
34
|
+
</tr>
|
35
|
+
</tfoot>
|
36
|
+
<tbody>
|
37
|
+
<% if related_content.empty? %>
|
38
|
+
<tr>
|
39
|
+
<td colspan="<%= related_model.get_form_properties.size %>">No Content Associated.</td>
|
40
|
+
</tr>
|
41
|
+
<% else %>
|
42
|
+
<% related_content.each do |c| %>
|
43
|
+
<tr>
|
44
|
+
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
45
|
+
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
46
|
+
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= c.send(p.name.to_sym) || '-' %></a><% else %><%= c.send(p.name.to_sym) %><% end %></td>
|
47
|
+
<% end %>
|
48
|
+
</tr>
|
49
|
+
<% end %>
|
50
|
+
<% end %>
|
51
|
+
</tbody>
|
52
|
+
</table>
|
53
|
+
<script type="text/javascript">
|
54
|
+
new AssociationManager({
|
55
|
+
relationship: 'many_to_many',
|
56
|
+
name: '<%= property.name %>',
|
57
|
+
model: '<%= related_model.name %>',
|
58
|
+
fields: <%= related_model.get_list_properties.map(&:name).to_json %>,
|
59
|
+
count: <%= content_count %>,
|
60
|
+
related_ids: <%= related_ids.to_json %>
|
61
|
+
});
|
62
|
+
</script>
|
63
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: togo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt King
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-16 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/togo/model/types/float.erb
|
90
90
|
- lib/togo/model/types/has_n.erb
|
91
91
|
- lib/togo/model/types/integer.erb
|
92
|
+
- lib/togo/model/types/many_to_many.erb
|
92
93
|
- lib/togo/model/types/string.erb
|
93
94
|
- lib/togo/model/types/text.erb
|
94
95
|
- lib/togo/model.rb
|