puffer 0.0.5 → 0.0.6
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/.rspec +1 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +12 -0
- data/VERSION +1 -1
- data/app/cells/puffer/base/additional.html.erb +17 -0
- data/app/cells/puffer/base_cell.rb +25 -0
- data/app/controllers/admin/dashboard_controller.rb +12 -0
- data/app/views/admin/dashboard/index.html.erb +1 -0
- data/app/views/layouts/puffer.html.erb +41 -23
- data/app/views/puffer/_form.html.erb +3 -11
- data/app/views/puffer/edit.html.erb +6 -4
- data/app/views/puffer/index.html.erb +11 -38
- data/app/views/puffer/new.html.erb +5 -2
- data/app/views/puffer/show.html.erb +4 -4
- data/config/routes.rb +7 -0
- data/lib/generators/puffer/controller/controller_generator.rb +1 -1
- data/lib/generators/puffer/install/templates/puffer/javascripts/rails-src.js +399 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/rails.js +14 -175
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar-src.js +1461 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js +36 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit-src.js +369 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js +13 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox-src.js +905 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js +24 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable-src.js +428 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js +17 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-src.js +5892 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs-src.js +1145 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js +29 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right.js +95 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/stylesheets/puffer.css +168 -0
- data/lib/generators/puffer/install/templates/puffer/stylesheets/reset.css +60 -0
- data/lib/puffer.rb +2 -1
- data/lib/puffer/base.rb +15 -14
- data/lib/puffer/controller/config.rb +52 -16
- data/lib/puffer/controller/dsl.rb +27 -29
- data/lib/puffer/controller/helpers.rb +54 -9
- data/lib/puffer/controller/mutate.rb +4 -22
- data/lib/puffer/engine.rb +9 -0
- data/lib/puffer/extensions/controller.rb +5 -3
- data/lib/puffer/extensions/form.rb +14 -0
- data/lib/puffer/extensions/mapper.rb +36 -0
- data/lib/puffer/fields.rb +21 -0
- data/lib/puffer/fields/field.rb +8 -3
- data/lib/puffer/inputs.rb +23 -0
- data/lib/puffer/inputs/association.rb +11 -0
- data/lib/puffer/inputs/base.rb +39 -0
- data/lib/puffer/inputs/boolean.rb +19 -0
- data/lib/puffer/inputs/collection_association.rb +11 -0
- data/lib/puffer/inputs/date_time.rb +16 -0
- data/lib/puffer/inputs/file.rb +11 -0
- data/lib/puffer/inputs/password.rb +11 -0
- data/lib/puffer/inputs/select.rb +11 -0
- data/lib/puffer/inputs/text.rb +11 -0
- data/lib/puffer/path_set.rb +17 -0
- data/lib/puffer/resource.rb +14 -14
- data/puffer.gemspec +75 -8
- data/spec/dummy/app/controllers/admin/categories_controller.rb +4 -0
- data/spec/dummy/app/controllers/admin/posts_controller.rb +4 -0
- data/spec/dummy/app/controllers/admin/profiles_controller.rb +5 -0
- data/spec/dummy/app/controllers/admin/users_controller.rb +4 -0
- data/spec/dummy/app/models/friendship.rb +4 -0
- data/spec/dummy/app/models/profile.rb +2 -0
- data/spec/dummy/app/models/user.rb +7 -0
- data/spec/dummy/app/views/admin/users/index.html.erb +1 -0
- data/spec/dummy/config/puffer.rb +0 -0
- data/spec/dummy/db/migrate/20110107082706_create_friendships.rb +15 -0
- data/spec/dummy/db/schema.rb +9 -1
- data/spec/dummy/public/puffer/javascripts/rails-src.js +399 -0
- data/spec/dummy/public/puffer/javascripts/rails.js +14 -0
- data/spec/dummy/public/puffer/javascripts/right-calendar-src.js +1461 -0
- data/spec/dummy/public/puffer/javascripts/right-calendar.js +36 -0
- data/spec/dummy/public/puffer/javascripts/right-calendar.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-in-edit-src.js +369 -0
- data/spec/dummy/public/puffer/javascripts/right-in-edit.js +13 -0
- data/spec/dummy/public/puffer/javascripts/right-in-edit.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-lightbox-src.js +905 -0
- data/spec/dummy/public/puffer/javascripts/right-lightbox.js +24 -0
- data/spec/dummy/public/puffer/javascripts/right-lightbox.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-sortable-src.js +428 -0
- data/spec/dummy/public/puffer/javascripts/right-sortable.js +17 -0
- data/spec/dummy/public/puffer/javascripts/right-sortable.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-src.js +5892 -0
- data/spec/dummy/public/puffer/javascripts/right-tabs-src.js +1145 -0
- data/spec/dummy/public/puffer/javascripts/right-tabs.js +29 -0
- data/spec/dummy/public/puffer/javascripts/right-tabs.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right.js +95 -0
- data/spec/dummy/public/puffer/javascripts/right.js.gz +0 -0
- data/spec/dummy/public/puffer/stylesheets/puffer.css +168 -0
- data/spec/dummy/public/puffer/stylesheets/reset.css +60 -0
- data/spec/lib/fields_spec.rb +2 -0
- data/spec/lib/params_spec.rb +55 -54
- metadata +114 -23
- data/lib/generators/puffer/install/templates/puffer/javascripts/application.js +0 -2
- data/lib/generators/puffer/install/templates/puffer/javascripts/controls.js +0 -965
- data/lib/generators/puffer/install/templates/puffer/javascripts/dragdrop.js +0 -974
- data/lib/generators/puffer/install/templates/puffer/javascripts/effects.js +0 -1123
- data/lib/generators/puffer/install/templates/puffer/javascripts/prototype.js +0 -6001
- data/lib/puffer/railtie.rb +0 -5
data/.rspec
CHANGED
data/Gemfile
CHANGED
|
@@ -2,6 +2,7 @@ source "http://rubygems.org"
|
|
|
2
2
|
|
|
3
3
|
gem 'rails', '~> 3.0.3'
|
|
4
4
|
gem 'will_paginate', '~> 3.0.pre2'
|
|
5
|
+
gem 'cells', '~> 3.4.4'
|
|
5
6
|
|
|
6
7
|
group :development, :test do
|
|
7
8
|
gem "capybara", ">= 0.4.0"
|
|
@@ -11,7 +12,7 @@ group :development, :test do
|
|
|
11
12
|
gem "autotest"
|
|
12
13
|
gem 'forgery'
|
|
13
14
|
gem 'fabrication'
|
|
14
|
-
|
|
15
15
|
gem "jeweler"
|
|
16
|
+
gem "mongrel"
|
|
16
17
|
end
|
|
17
18
|
|
data/Gemfile.lock
CHANGED
|
@@ -43,16 +43,21 @@ GEM
|
|
|
43
43
|
selenium-webdriver (>= 0.0.27)
|
|
44
44
|
xpath (~> 0.1.2)
|
|
45
45
|
celerity (0.8.6)
|
|
46
|
+
cells (3.4.4)
|
|
47
|
+
cgi_multipart_eof_fix (2.5.0)
|
|
46
48
|
childprocess (0.1.6)
|
|
47
49
|
ffi (~> 0.6.3)
|
|
48
50
|
culerity (0.2.13)
|
|
51
|
+
daemons (1.1.0)
|
|
49
52
|
diff-lcs (1.1.2)
|
|
50
53
|
erubis (2.6.6)
|
|
51
54
|
abstract (>= 1.0.0)
|
|
52
55
|
fabrication (0.9.4)
|
|
56
|
+
fastthread (1.0.7)
|
|
53
57
|
ffi (0.6.3)
|
|
54
58
|
rake (>= 0.8.7)
|
|
55
59
|
forgery (0.3.6)
|
|
60
|
+
gem_plugin (0.2.3)
|
|
56
61
|
git (1.2.5)
|
|
57
62
|
i18n (0.5.0)
|
|
58
63
|
jeweler (1.5.2)
|
|
@@ -66,6 +71,11 @@ GEM
|
|
|
66
71
|
mime-types (~> 1.16)
|
|
67
72
|
treetop (~> 1.4.8)
|
|
68
73
|
mime-types (1.16)
|
|
74
|
+
mongrel (1.1.5)
|
|
75
|
+
cgi_multipart_eof_fix (>= 2.4)
|
|
76
|
+
daemons (>= 1.0.3)
|
|
77
|
+
fastthread (>= 1.0.1)
|
|
78
|
+
gem_plugin (>= 0.2.3)
|
|
69
79
|
nokogiri (1.4.4)
|
|
70
80
|
polyglot (0.3.1)
|
|
71
81
|
rack (1.2.1)
|
|
@@ -121,9 +131,11 @@ PLATFORMS
|
|
|
121
131
|
DEPENDENCIES
|
|
122
132
|
autotest
|
|
123
133
|
capybara (>= 0.4.0)
|
|
134
|
+
cells (~> 3.4.4)
|
|
124
135
|
fabrication
|
|
125
136
|
forgery
|
|
126
137
|
jeweler
|
|
138
|
+
mongrel
|
|
127
139
|
rails (~> 3.0.3)
|
|
128
140
|
rspec-rails
|
|
129
141
|
sqlite3-ruby
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.0.6
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<dl>
|
|
2
|
+
<dt>Links</dt>
|
|
3
|
+
<dd>
|
|
4
|
+
<%= link_to_unless_current t(:list, :target => resource.human), resource.index_path %>
|
|
5
|
+
<%= link_to_unless_current t(:add, :target => resource.human), resource.new_path %>
|
|
6
|
+
</dd>
|
|
7
|
+
<dt>Search</dt>
|
|
8
|
+
<dd>
|
|
9
|
+
<%= form_tag resource.index_path, {:method => :get} do %>
|
|
10
|
+
<%= text_field_tag :query, resource_session[:query] %>
|
|
11
|
+
<%= submit_tag 'Search' %>
|
|
12
|
+
<% if resource_session[:query].present? %>
|
|
13
|
+
<%= link_to 'clear', resource.index_path(:query => '') %>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% end %>
|
|
16
|
+
</dd>
|
|
17
|
+
</dl>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Puffer
|
|
2
|
+
class BaseCell < ::Cell::Rails
|
|
3
|
+
|
|
4
|
+
build do
|
|
5
|
+
self.class.to_s.gsub(/Controller$/, 'Cell').constantize rescue Puffer::BaseCell
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
helper_method :resource, :resource_session
|
|
9
|
+
|
|
10
|
+
def additional
|
|
11
|
+
render
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def resource
|
|
17
|
+
parent_controller.resource
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def resource_session
|
|
21
|
+
parent_controller.resource_session
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Dashboard!!!!!!!!!!
|
|
@@ -4,35 +4,53 @@
|
|
|
4
4
|
<title><%= [@title, 'Puffer'].compact.join(' - ') %></title>
|
|
5
5
|
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
|
6
6
|
<%= csrf_meta_tag %>
|
|
7
|
-
<%= stylesheet_link_tag '
|
|
8
|
-
<%= stylesheet_link_tag '
|
|
7
|
+
<%= stylesheet_link_tag '/puffer/stylesheets/reset' %>
|
|
8
|
+
<%= stylesheet_link_tag '/puffer/stylesheets/puffer' %>
|
|
9
9
|
<%= yield :stylesheet %>
|
|
10
|
-
|
|
11
|
-
<%= javascript_include_tag '
|
|
12
|
-
<%= javascript_include_tag '
|
|
10
|
+
|
|
11
|
+
<%= javascript_include_tag '/puffer/javascripts/right-src' %>
|
|
12
|
+
<%= javascript_include_tag '/puffer/javascripts/rails-src' %>
|
|
13
|
+
<%= javascript_include_tag '/puffer/javascripts/right-calendar-src' %>
|
|
13
14
|
<%= yield :javascript %>
|
|
14
15
|
</head>
|
|
15
16
|
<body>
|
|
16
|
-
<div class="header">
|
|
17
|
-
<div class="logo"><a href="/admin">Puffer</a></div>
|
|
18
|
-
<ul class="navigation">
|
|
19
|
-
<%= puffer_navigation do |title, path| %>
|
|
20
|
-
<li<%= raw(current_path.include?(path) ? ' class="selected"' : '') %>><%= link_to title, path %></li>
|
|
21
|
-
<% end %>
|
|
22
|
-
</ul>
|
|
23
|
-
<div class="logout">
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="additional_navigation" id="additional_navigation">
|
|
27
|
-
<%= yield :additional_navigation %>
|
|
28
|
-
</div>
|
|
29
17
|
<div class="body">
|
|
30
|
-
<div class="
|
|
31
|
-
|
|
18
|
+
<div class="header">
|
|
19
|
+
<div class="logo">
|
|
20
|
+
<%= link_to 'Puffer', admin_root_path %>
|
|
21
|
+
</div>
|
|
22
|
+
<ul class="navigation">
|
|
23
|
+
<% puffer_navigation do |title, path, current| %>
|
|
24
|
+
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title, path %></li>
|
|
25
|
+
<% end %>
|
|
26
|
+
</ul>
|
|
27
|
+
<div class="logout">
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="columns">
|
|
31
|
+
<div class="column sidebar">
|
|
32
|
+
<div class="padder">
|
|
33
|
+
<ul class="navigation">
|
|
34
|
+
<% sidebar_puffer_navigation do |title, path, current| %>
|
|
35
|
+
<li<%= raw(current ? ' class="selected"' : '') %>>
|
|
36
|
+
<%= link_to title, path %>
|
|
37
|
+
<% if current && (additional = render_cell('puffer/base', 'additional')).present? %>
|
|
38
|
+
<div class="additional">
|
|
39
|
+
<%= additional %>
|
|
40
|
+
</div>
|
|
41
|
+
<% end %>
|
|
42
|
+
</li>
|
|
43
|
+
<% end %>
|
|
44
|
+
</ul>
|
|
45
|
+
<%= yield :sidebar %>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="column">
|
|
49
|
+
<div class="content">
|
|
50
|
+
<%= yield %>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
32
53
|
</div>
|
|
33
54
|
</div>
|
|
34
|
-
<% if flash[:notice] %>
|
|
35
|
-
<div class="notice" id="notice"><%= flash[:notice] %></div>
|
|
36
|
-
<% end %>
|
|
37
55
|
</body>
|
|
38
56
|
</html>
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
<%= f.error_messages %>
|
|
2
|
-
|
|
3
1
|
<ul>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@fields = controller.create_fields || controller.form_fields
|
|
7
|
-
when 'edit' then
|
|
8
|
-
@fields = controller.update_fields || controller.form_fields
|
|
9
|
-
end %>
|
|
10
|
-
<% @fields.each do |field| -%>
|
|
11
|
-
<li><%= f.terbium_field field %></li>
|
|
2
|
+
<% (action == 'new' ? create_fields : update_fields).each do |field| -%>
|
|
3
|
+
<li><%= f.puffer_field field %></li>
|
|
12
4
|
<% end -%>
|
|
13
5
|
</ul>
|
|
14
6
|
|
|
15
7
|
<div class="buttons">
|
|
16
8
|
<%= f.submit 'Save' %>
|
|
17
9
|
<%= f.submit 'Save and exit' %>
|
|
18
|
-
<%= link_to 'cancel', request.referer %>
|
|
10
|
+
<%= link_to 'cancel', (request.referer || resource.index_path) %>
|
|
19
11
|
</div>
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
<% @title = "Edit #{
|
|
1
|
+
<% @title = "Edit #{resource.human}" %>
|
|
2
2
|
<h1><%= @title %></h1>
|
|
3
|
-
|
|
4
|
-
<%= hidden_field_tag :edit_locale, params[:edit_locale] if params[:edit_locale] %>
|
|
5
|
-
|
|
3
|
+
<%= form_for record, :url => resource.path, :html => {:multipart => true} do |f| %>
|
|
6
4
|
<%= render :partial => 'terbium/form', :locals => { :f => f, :action => 'edit' } %>
|
|
7
5
|
<% end %>
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
<% if false %>
|
|
8
9
|
<% content_for :additional_navigation do %>
|
|
9
10
|
<ul class="buttons">
|
|
10
11
|
<% 0.upto(resource_ancestors_records.length - 1) do |i| %>
|
|
@@ -18,3 +19,4 @@
|
|
|
18
19
|
<% end %>
|
|
19
20
|
</ul>
|
|
20
21
|
<% end %>
|
|
22
|
+
<% end %>
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
<% @title =
|
|
1
|
+
<% @title = resource.human %>
|
|
2
2
|
<h1><%= @title %></h1>
|
|
3
|
-
|
|
4
|
-
<%= will_paginate @records, :url => current_resource.index_path(:page => '') %>
|
|
5
|
-
<% end %>
|
|
3
|
+
<%= will_paginate @records, :url => resource.index_path(:page => '') %>
|
|
6
4
|
<div class="columns">
|
|
7
5
|
<div class="row">
|
|
8
6
|
<div class="column left_column">
|
|
9
7
|
<% if @records.empty? %>
|
|
10
|
-
<p>Sorry, but there is no records in <%=
|
|
8
|
+
<p>Sorry, but there is no records in <%= resource.human %></p>
|
|
11
9
|
<% else %>
|
|
12
10
|
<table class="list_table">
|
|
13
11
|
<thead>
|
|
@@ -25,10 +23,10 @@
|
|
|
25
23
|
<td><%= render_field record, field %></td>
|
|
26
24
|
<% end -%>
|
|
27
25
|
<td class="actions">
|
|
28
|
-
<%= link_to 'show',
|
|
29
|
-
<%= link_to 'edit',
|
|
30
|
-
<%= link_to 'destroy',
|
|
31
|
-
<%
|
|
26
|
+
<%= link_to 'show', resource.path(record), :class => 'show_entry' if controller.show_fields || resource_children.present? %>
|
|
27
|
+
<%= link_to 'edit', resource.edit_path(record), :class => 'edit_entry' if controller.update_fields || controller.form_fields %>
|
|
28
|
+
<%= link_to 'destroy', resource.path(record), :confirm => "Are you sure?", :method => :delete, :class => 'remove_entry' if configuration.destroy %>
|
|
29
|
+
<% resource.children(:post_id => record.id).each do |child| %>
|
|
32
30
|
<% if child.plural? %>
|
|
33
31
|
<p><%= link_to "#{child.human}(#{child.collection.size})", child.index_path %></p>
|
|
34
32
|
<% else %>
|
|
@@ -42,42 +40,17 @@
|
|
|
42
40
|
</table>
|
|
43
41
|
<% end %>
|
|
44
42
|
</div>
|
|
45
|
-
<div class="column right_column panel">
|
|
46
|
-
<dl>
|
|
47
|
-
<dt>Search</dt>
|
|
48
|
-
<dd>
|
|
49
|
-
<%= form_tag current_resource.index_path, {:method => :get} do %>
|
|
50
|
-
<%= text_field_tag :query, resource_session[:query] %>
|
|
51
|
-
<%= submit_tag 'Search' %>
|
|
52
|
-
<% if resource_session[:query].present? %>
|
|
53
|
-
<%= link_to 'clear', current_resource.index_path(:query => '') %>
|
|
54
|
-
<% end %>
|
|
55
|
-
<% end %>
|
|
56
|
-
</dd>
|
|
57
|
-
<% index_fields.boolean.each do |field| %>
|
|
58
|
-
<dt><%= field.label %></dt>
|
|
59
|
-
<dd>
|
|
60
|
-
<ul>
|
|
61
|
-
<% [['All', nil], ['Yes', '1'], ['No', '0'], ['Not set', 'nil']].each do |option| %>
|
|
62
|
-
<li><%= link_to_unless resource_session[:boolean][field.query_column] == option[1], option[0], current_resource.index_path(:boolean => { field.query_column => option[1]}) %></li>
|
|
63
|
-
<% end %>
|
|
64
|
-
</ul>
|
|
65
|
-
</dd>
|
|
66
|
-
<% end %>
|
|
67
|
-
</dl>
|
|
68
|
-
</div>
|
|
69
43
|
</div>
|
|
70
44
|
</div>
|
|
71
|
-
|
|
72
|
-
<%= will_paginate @records, :url => current_resource.index_path(:page => '') %>
|
|
73
|
-
<% end %>
|
|
45
|
+
<%= will_paginate @records, :url => resource.index_path(:page => '') %>
|
|
74
46
|
|
|
75
47
|
<% content_for :additional_navigation do %>
|
|
76
48
|
<ul class="buttons">
|
|
77
|
-
<%
|
|
49
|
+
<% resource.ancestors.each do |resource| %>
|
|
78
50
|
<%= link_to resource.plural? ? resource.human : resource.member.to_title, resource.index_path %>
|
|
79
51
|
<%= link_to resource.member.to_title, resource.path unless resource.plural? %>
|
|
80
52
|
<% end %>
|
|
81
|
-
<%= link_to
|
|
53
|
+
<%= link_to resource.plural? ? resource.human : resource.member.to_title, resource.index_path %>
|
|
82
54
|
</ul>
|
|
83
55
|
<% end %>
|
|
56
|
+
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
<% @title = "New #{
|
|
1
|
+
<% @title = "New #{resource.human}" %>
|
|
2
2
|
<h1><%= @title %></h1>
|
|
3
|
-
|
|
3
|
+
<%= form_for record, :url => resource.index_path, :html => {:multipart => true} do |f| %>
|
|
4
4
|
<%= render :partial => 'terbium/form', :locals => { :f => f, :action => 'new' } %>
|
|
5
5
|
<% end %>
|
|
6
|
+
|
|
7
|
+
<% if false %>
|
|
6
8
|
<% content_for :additional_navigation do %>
|
|
7
9
|
<ul class="buttons">
|
|
8
10
|
<% 0.upto(resource_ancestors_records.length - 1) do |i| %>
|
|
@@ -16,3 +18,4 @@
|
|
|
16
18
|
<% end %>
|
|
17
19
|
</ul>
|
|
18
20
|
<% end %>
|
|
21
|
+
<% end %>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<% @title = "Show #{
|
|
1
|
+
<% @title = "Show #{resource.human}" %>
|
|
2
2
|
<h1><%= @title %></h1>
|
|
3
3
|
<ul class="show_entry">
|
|
4
|
-
<% if
|
|
4
|
+
<% if resource.children.present? %>
|
|
5
5
|
<li>
|
|
6
6
|
<h2>Associations</h2>
|
|
7
|
-
<%
|
|
7
|
+
<% resource.children.each do |child| %>
|
|
8
8
|
<%= link_to child.human, child.index_path %>
|
|
9
9
|
<% end %>
|
|
10
10
|
</li>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</ul>
|
|
22
22
|
<% content_for :additional_navigation do %>
|
|
23
23
|
<ul class="buttons">
|
|
24
|
-
<% (
|
|
24
|
+
<% (resource.ancestors + [resource]).each do |resource| %>
|
|
25
25
|
<%= link_to resource.plural? ? resource.human : resource.member.to_title, resource.index_path %>
|
|
26
26
|
<%= link_to resource.member.to_title, resource.path unless resource.plural? %>
|
|
27
27
|
<% end %>
|
data/config/routes.rb
ADDED
|
@@ -11,7 +11,7 @@ class Puffer::ControllerGenerator < Rails::Generators::NamedBase
|
|
|
11
11
|
private
|
|
12
12
|
|
|
13
13
|
def controller_name
|
|
14
|
-
(
|
|
14
|
+
[(swallow_nil{@modules.first} || 'Admin'), @model_name.pluralize].join('::')
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def attributes
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Ruby On Rails plugin for RightJS
|
|
3
|
+
* http://github.com/MadRabbit/right-rails
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
|
6
|
+
*/
|
|
7
|
+
(function(window, document, RightJS) {
|
|
8
|
+
/**
|
|
9
|
+
* Underscored aliases for Ruby On Rails
|
|
10
|
+
*
|
|
11
|
+
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The Rails plugin initialization script
|
|
16
|
+
*
|
|
17
|
+
* Copyright (C) 2010 Nikolay Nemshilov
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
var R = RightJS,
|
|
21
|
+
$ = RightJS.$,
|
|
22
|
+
$$ = RightJS.$$,
|
|
23
|
+
$E = RightJS.$E,
|
|
24
|
+
Xhr = RightJS.Xhr,
|
|
25
|
+
Object = RightJS.Object;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// the language and window level aliases
|
|
30
|
+
R([
|
|
31
|
+
RightJS.String.prototype,
|
|
32
|
+
RightJS.Array.prototype,
|
|
33
|
+
RightJS.Function.prototype,
|
|
34
|
+
RightJS.Object,
|
|
35
|
+
RightJS.Options,
|
|
36
|
+
RightJS.Observer,
|
|
37
|
+
RightJS.Observer.prototype,
|
|
38
|
+
window,
|
|
39
|
+
document
|
|
40
|
+
]).each(function(object) {
|
|
41
|
+
for (var key in object) {
|
|
42
|
+
try { // some keys are not accessable
|
|
43
|
+
|
|
44
|
+
if (/[A-Z]/.test(key) && typeof(object[key]) === 'function') {
|
|
45
|
+
var u_key = R(key).underscored();
|
|
46
|
+
if (object[u_key] === null || object[u_key] === undefined) {
|
|
47
|
+
object[u_key] = object[key];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch (e) {}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// DOM package aliases
|
|
56
|
+
R([
|
|
57
|
+
RightJS.Element,
|
|
58
|
+
RightJS.Event,
|
|
59
|
+
RightJS.Form,
|
|
60
|
+
RightJS.Input
|
|
61
|
+
]).each(function(object) {
|
|
62
|
+
if (!object) { return; }
|
|
63
|
+
|
|
64
|
+
var aliases = {}, methods = object.prototype;
|
|
65
|
+
|
|
66
|
+
for (var key in methods) {
|
|
67
|
+
if (/[A-Z]/.test(key) && typeof(methods[key]) === 'function') {
|
|
68
|
+
object.prototype[R(key).underscored()] = methods[key];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// various ruby-like method aliases
|
|
74
|
+
RightJS.$alias(RightJS.String.prototype, {
|
|
75
|
+
index_of: 'indexOf',
|
|
76
|
+
last_index_of: 'lastIndexOf',
|
|
77
|
+
to_f: 'toFloat',
|
|
78
|
+
to_i: 'toInt',
|
|
79
|
+
gsub: 'replace',
|
|
80
|
+
downcase: 'toLowerCase',
|
|
81
|
+
upcase: 'toUpperCase',
|
|
82
|
+
index: 'indexOf',
|
|
83
|
+
rindex: 'lastIndexOf',
|
|
84
|
+
strip: 'trim'
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
RightJS.$alias(RightJS.Array.prototype, {
|
|
88
|
+
collect: 'map',
|
|
89
|
+
detect: 'filter',
|
|
90
|
+
index_of: 'indexOf',
|
|
91
|
+
last_index_of: 'lastIndexOf',
|
|
92
|
+
index: 'indexOf',
|
|
93
|
+
rindex: 'lastIndexOf'
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Rails 3 UJS support module
|
|
98
|
+
*
|
|
99
|
+
* Copyright (C) 2010 Nikolay Nemshilov
|
|
100
|
+
*/
|
|
101
|
+
(function() {
|
|
102
|
+
// tries to cancel the event via confirmation
|
|
103
|
+
var user_cancels = function(event, element) {
|
|
104
|
+
var message = element.get('data-confirm');
|
|
105
|
+
if (message && !confirm(message)) {
|
|
106
|
+
event.stop();
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// adds XHR events to the element
|
|
112
|
+
var add_xhr_events = function(element, options) {
|
|
113
|
+
return Object.merge({
|
|
114
|
+
onCreate: function() { element.fire('ajax:loading', this); },
|
|
115
|
+
onComplete: function() { element.fire('ajax:complete', this); },
|
|
116
|
+
onSuccess: function() { element.fire('ajax:success', this); },
|
|
117
|
+
onFailure: function() { element.fire('ajax:failure', this); }
|
|
118
|
+
}, options);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// processes link clicks
|
|
122
|
+
var try_link_submit = function(event) {
|
|
123
|
+
var link = event.target,
|
|
124
|
+
method = link.get('data-method'),
|
|
125
|
+
remote = link.get('data-remote'),
|
|
126
|
+
url = link.get('href');
|
|
127
|
+
|
|
128
|
+
if (user_cancels(event, link)) { return; }
|
|
129
|
+
if (method || remote) { event.stop(); }
|
|
130
|
+
|
|
131
|
+
if (remote) {
|
|
132
|
+
Xhr.load(url, add_xhr_events(link, {
|
|
133
|
+
method: method || 'get',
|
|
134
|
+
spinner: link.get('data-spinner')
|
|
135
|
+
}));
|
|
136
|
+
|
|
137
|
+
} else if (method) {
|
|
138
|
+
var param = $$('meta[name=csrf-param]')[0],
|
|
139
|
+
token = $$('meta[name=csrf-token]')[0],
|
|
140
|
+
form = $E('form', {action: url, method: 'post'});
|
|
141
|
+
|
|
142
|
+
if (param && token) {
|
|
143
|
+
form.insert('<input type="hidden" name="'+param.get('content')+'" value="'+token.get('content')+'" />');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
form.insert('<input type="hidden" name="_method" value="'+method+'"/>')
|
|
147
|
+
.insertTo(document.body).submit();
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// global events listeners
|
|
152
|
+
$(document).on({
|
|
153
|
+
click: function(event) {
|
|
154
|
+
var tag = event.target._.tagName;
|
|
155
|
+
if (tag === 'A' || tag === 'BUTTON') {
|
|
156
|
+
try_link_submit(event);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
submit: function(event) {
|
|
161
|
+
var form = event.target;
|
|
162
|
+
if (form.has('data-remote') && !user_cancels(event, form)) {
|
|
163
|
+
event.stop();
|
|
164
|
+
form.send(add_xhr_events(form, {
|
|
165
|
+
spinner: form.get('data-spinner') || form.first('.spinner')
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
})();
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* RR is the common ajax operations wrapper for ruby on rails
|
|
175
|
+
*
|
|
176
|
+
* Copyright (C) 2009-2010 Nikolay Nemshilov
|
|
177
|
+
*/
|
|
178
|
+
var RR = {
|
|
179
|
+
/**
|
|
180
|
+
* Basic options
|
|
181
|
+
*
|
|
182
|
+
* NOTE: DO NOT CHANGE this hash right here
|
|
183
|
+
* Use your application.js file to alter the options
|
|
184
|
+
*/
|
|
185
|
+
Options: {
|
|
186
|
+
format: 'js', // the working format for remote requests over the application
|
|
187
|
+
|
|
188
|
+
flashId: 'flashes', // the flashes element id
|
|
189
|
+
flashHideFx: 'slide', // use null if you don't want any fx in here
|
|
190
|
+
flashHideDelay: 3200, // use -1 to disable the flash element hidding
|
|
191
|
+
|
|
192
|
+
highlightUpdates: true,
|
|
193
|
+
|
|
194
|
+
removeFx: 'fade', // blocks removing fx
|
|
195
|
+
insertFx: 'fade', // blocks insertion fx
|
|
196
|
+
|
|
197
|
+
insertPosition: 'bottom', // default insert position
|
|
198
|
+
|
|
199
|
+
linkToAjaxEdit: '.ajax_edit',
|
|
200
|
+
linkToAjaxDelete: '.ajax_delete',
|
|
201
|
+
|
|
202
|
+
rescanWithScopes: true // if it should rescan only updated elements
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Updates the flashes block with the source
|
|
207
|
+
*
|
|
208
|
+
* @param String new content
|
|
209
|
+
* @return RR this
|
|
210
|
+
*/
|
|
211
|
+
update_flash: function(content) {
|
|
212
|
+
var element = $(this.Options.flashId);
|
|
213
|
+
if (element) {
|
|
214
|
+
this.replace(element, content).hide_flash();
|
|
215
|
+
}
|
|
216
|
+
return this;
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Initializes the delayed flashes hide call
|
|
221
|
+
*
|
|
222
|
+
* @return RR this
|
|
223
|
+
*/
|
|
224
|
+
hide_flash: function() {
|
|
225
|
+
if (this.Options.flashHideDelay > -1) {
|
|
226
|
+
var element = $(this.Options.flashId);
|
|
227
|
+
if (element && element.visible()) {
|
|
228
|
+
element.hide.bind(element, this.Options.flashHideFx).delay(this.Options.flashHideDelay);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return this;
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Highlights the element according to the options
|
|
236
|
+
*
|
|
237
|
+
* @param String element id
|
|
238
|
+
* @return RR this
|
|
239
|
+
*/
|
|
240
|
+
highlight: function(id) {
|
|
241
|
+
if ($(id) && this.Options.highlightUpdates) {
|
|
242
|
+
$(id).highlight();
|
|
243
|
+
}
|
|
244
|
+
return this;
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Inserts the content into the given element
|
|
249
|
+
*
|
|
250
|
+
* @param destination String destination id
|
|
251
|
+
* @param content String content
|
|
252
|
+
* @param position String position
|
|
253
|
+
* @return RR this
|
|
254
|
+
*/
|
|
255
|
+
insert: function(where, what, in_position) {
|
|
256
|
+
var position = in_position || this.Options.insertPosition, new_element,
|
|
257
|
+
container = $(where).insert(what, position);
|
|
258
|
+
|
|
259
|
+
// trying to find the new block
|
|
260
|
+
switch (position) {
|
|
261
|
+
case 'bottom': new_element = container.children().last(); break;
|
|
262
|
+
case 'top': new_element = container.first(); break;
|
|
263
|
+
case 'before': new_element = container.prev(); break;
|
|
264
|
+
case 'after': new_element = container.next(); break;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// necely displaying the new block
|
|
268
|
+
if (new_element && this.Options.insertFx) {
|
|
269
|
+
new_element.hide().show(this.Options.insertFx, {
|
|
270
|
+
onFinish: this.highlight.bind(this, new_element)
|
|
271
|
+
});
|
|
272
|
+
} else {
|
|
273
|
+
this.highlight(new_element);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return this.rescan(where);
|
|
277
|
+
},
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Replaces the given element with a new content
|
|
281
|
+
*
|
|
282
|
+
* @param destination String destination id
|
|
283
|
+
* @param content String content
|
|
284
|
+
* @return RR this
|
|
285
|
+
*/
|
|
286
|
+
replace: function(id, source) {
|
|
287
|
+
$(id).replace(source);
|
|
288
|
+
return this.highlight(id).rescan(id);
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* removes the element by id
|
|
293
|
+
*
|
|
294
|
+
* @param String element id
|
|
295
|
+
* @return RR this
|
|
296
|
+
*/
|
|
297
|
+
remove: function(id) {
|
|
298
|
+
if ($(id)) {
|
|
299
|
+
$(id).remove(this.Options.removeFx);
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Makes a remote form out of the form
|
|
305
|
+
*
|
|
306
|
+
* @param String form id
|
|
307
|
+
* @return RR this
|
|
308
|
+
*/
|
|
309
|
+
remotize_form: function(id) {
|
|
310
|
+
var form = $(id);
|
|
311
|
+
if (form) {
|
|
312
|
+
form.remotize().enable()._.action += '.'+this.Options.format;
|
|
313
|
+
}
|
|
314
|
+
return this;
|
|
315
|
+
},
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Replaces the form with new content and makes it remote
|
|
319
|
+
*
|
|
320
|
+
* @param form id String form id
|
|
321
|
+
* @param content String content
|
|
322
|
+
* @return RR this
|
|
323
|
+
*/
|
|
324
|
+
replace_form: function(id, source) {
|
|
325
|
+
var form = $(id);
|
|
326
|
+
if (form) {
|
|
327
|
+
form.replace(source);
|
|
328
|
+
this.remotize_form(id);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return this.rescan(id);
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Inserts the form source into the given element
|
|
336
|
+
*
|
|
337
|
+
* @param target id String target id
|
|
338
|
+
* @param source String form source
|
|
339
|
+
* @return RR this
|
|
340
|
+
*/
|
|
341
|
+
show_form_for: function(id, source) {
|
|
342
|
+
$(id).select('form').each('remove'); // removing old forms
|
|
343
|
+
$(id).insert(source);
|
|
344
|
+
|
|
345
|
+
return this.remotize_form($(id).first('form')).rescan(id);
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* watches link clicks and processes the ajax edit/delete operations
|
|
350
|
+
*
|
|
351
|
+
* @param Event event
|
|
352
|
+
*/
|
|
353
|
+
process_click: function(event) {
|
|
354
|
+
var link;
|
|
355
|
+
|
|
356
|
+
if ((link = event.find('a'+ this.Options.linkToAjaxEdit))) {
|
|
357
|
+
event.stop();
|
|
358
|
+
Xhr.load(link.get('href') + '.' + this.Options.format);
|
|
359
|
+
} else if ((link = event.find('a'+ this.Options.linkToAjaxDelete)) && link.has('onclick')) {
|
|
360
|
+
event.stop();
|
|
361
|
+
eval('({f:'+ link.onclick.toString().replace('.submit', '.send')+'})').f.call(link);
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Scans for updated elements
|
|
367
|
+
*
|
|
368
|
+
* @return RR this
|
|
369
|
+
*/
|
|
370
|
+
rescan: function(scope) {
|
|
371
|
+
$w('Draggable Droppable Tabs Slider Selectable').each(function(name) {
|
|
372
|
+
if (name in window) {
|
|
373
|
+
window[name].rescan(this.Options.rescanWithScopes ? scope : null);
|
|
374
|
+
}
|
|
375
|
+
}, this);
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
return this;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* the document onload hooks
|
|
385
|
+
*
|
|
386
|
+
* Copyright (C) 2010 Nikolay Nemshilov
|
|
387
|
+
*/
|
|
388
|
+
$(document).on({
|
|
389
|
+
ready: function() {
|
|
390
|
+
RR.hide_flash();
|
|
391
|
+
},
|
|
392
|
+
|
|
393
|
+
click: function(event) {
|
|
394
|
+
RR.process_click(event);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
window.RR = RR;
|
|
399
|
+
})(window, document, RightJS);
|