puffer 0.0.32 → 0.1.0
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/.gitignore +7 -0
- data/Gemfile +1 -26
- data/Gemfile.lock +66 -64
- data/README.md +34 -23
- data/Rakefile +1 -11
- data/VERSION +1 -1
- data/app/assets/javascripts/puffer/application.js +6 -1
- data/app/assets/javascripts/puffer/associations.js +18 -0
- data/app/assets/javascripts/puffer/puffer.js +7 -0
- data/app/assets/javascripts/puffer/right-calendar-src.js +19 -3
- data/app/assets/javascripts/puffer/right-dnd-src.js +591 -0
- data/app/assets/javascripts/puffer/right-in-edit-src.js +373 -0
- data/app/assets/javascripts/puffer/right-keys-src.js +87 -0
- data/app/assets/javascripts/puffer/{paginator.js → right-paginator-src.js} +0 -0
- data/app/assets/javascripts/puffer/right-slider-src.js +29 -32
- data/app/assets/javascripts/puffer/right-sortable-src.js +430 -0
- data/app/assets/javascripts/puffer/right-src.js +358 -99
- data/app/assets/stylesheets/puffer/puffer.css +29 -4
- data/app/components/base/form.html.erb +8 -14
- data/app/components/base_component.rb +1 -1
- data/app/components/boolean/form.html.erb +5 -3
- data/app/components/boolean/index.html.erb +6 -2
- data/app/components/boolean_component.rb +2 -2
- data/app/components/date_time/filter.html.erb +9 -0
- data/app/components/date_time/form.html.erb +8 -4
- data/app/components/date_time_component.rb +21 -5
- data/app/components/file/form.html.erb +8 -4
- data/app/components/hidden/form.html.erb +3 -1
- data/app/components/nested_attributes_many/form.html.erb +47 -0
- data/app/components/nested_attributes_many_component.rb +7 -0
- data/app/components/nested_attributes_one/form.html.erb +48 -0
- data/app/components/nested_attributes_one_component.rb +7 -0
- data/app/components/password/form.html.erb +8 -4
- data/app/components/password_component.rb +1 -1
- data/app/components/references_many/index.html.erb +1 -1
- data/app/components/references_one/choose.html.erb +1 -1
- data/app/components/references_one/form.html.erb +10 -9
- data/app/components/references_one_component.rb +0 -1
- data/app/components/render_component.rb +13 -0
- data/app/components/select/filter.html.erb +4 -2
- data/app/components/select/form.html.erb +8 -4
- data/app/components/text/form.html.erb +8 -4
- data/app/controllers/admin/sessions_controller.rb +1 -21
- data/app/controllers/puffer/base.rb +10 -3
- data/app/controllers/puffer/dashboard_base.rb +7 -1
- data/app/controllers/puffer/{sessions_base.rb → sessions/base.rb} +10 -7
- data/app/controllers/puffer/sessions/clearance.rb +29 -0
- data/app/controllers/puffer/{sessions_devise_base.rb → sessions/devise.rb} +1 -1
- data/app/controllers/puffer/sessions/simple.rb +28 -0
- data/app/controllers/puffer/tree_base.rb +1 -1
- data/app/models/puffer_user.rb +3 -0
- data/app/views/layouts/puffer.html.erb +3 -3
- data/app/views/puffer/base/_edit.html.erb +15 -0
- data/app/views/puffer/base/_index.html.erb +26 -0
- data/app/views/puffer/base/_show.html.erb +13 -0
- data/app/views/puffer/base/_table.html.erb +1 -1
- data/app/views/puffer/base/edit.html.erb +1 -15
- data/app/views/puffer/base/edit.js.erb +1 -0
- data/app/views/puffer/base/index.html.erb +1 -20
- data/app/views/puffer/base/index.js.erb +1 -0
- data/app/views/puffer/base/new.html.erb +1 -1
- data/app/views/puffer/base/show.html.erb +1 -22
- data/app/views/puffer/base/show.js.erb +1 -0
- data/app/views/puffer/base/update.js.erb +1 -0
- data/app/views/puffer/sessions/base/new.html.erb +11 -0
- data/app/views/puffer/tree_base/_record.html.erb +1 -1
- data/lib/puffer/component.rb +14 -47
- data/lib/puffer/controller/auth.rb +13 -9
- data/lib/puffer/controller/config.rb +18 -0
- data/lib/puffer/controller/mutate.rb +8 -8
- data/lib/puffer/engine.rb +5 -0
- data/lib/puffer/field.rb +5 -11
- data/lib/puffer/filters.rb +86 -56
- data/lib/puffer/helpers/component_helper.rb +24 -0
- data/lib/puffer/helpers/puffer_helper.rb +65 -0
- data/lib/puffer/helpers/puffer_tree_helper.rb +19 -0
- data/lib/puffer/orm_adapter/active_record.rb +40 -11
- data/lib/puffer/orm_adapter/base.rb +9 -0
- data/lib/puffer/orm_adapter/mongoid.rb +32 -9
- data/lib/puffer/resource/node.rb +2 -2
- data/lib/puffer/resource/routing.rb +30 -16
- data/lib/puffer/resource.rb +20 -20
- data/lib/puffer/version.rb +3 -0
- data/lib/puffer.rb +26 -5
- data/puffer.gemspec +34 -296
- data/spec/app/components/base_component_spec.rb +1 -1
- data/spec/app/components/boolean_component_spec.rb +2 -0
- data/spec/app/components/date_time_component_spec.rb +1 -0
- data/spec/app/components/file_component_spec.rb +1 -0
- data/spec/app/components/hidden_component_spec.rb +1 -0
- data/spec/app/components/password_component_spec.rb +2 -0
- data/spec/app/components/select_component_spec.rb +1 -0
- data/spec/app/components/string_component_spec.rb +1 -0
- data/spec/app/components/text_component_spec.rb +1 -0
- data/spec/dummy/app/controllers/admin/news_controller.rb +2 -0
- data/spec/dummy/app/controllers/admin/profiles_controller.rb +1 -1
- data/spec/dummy/app/controllers/admin/users_controller.rb +2 -0
- data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +8 -0
- data/spec/dummy/app/helpers/news_helper.rb +7 -0
- data/spec/dummy/app/models/active_record_orm/has_many_reference.rb +5 -0
- data/spec/dummy/app/models/active_record_orm/has_one_reference.rb +5 -0
- data/spec/dummy/app/models/active_record_orm/primal.rb +4 -0
- data/spec/dummy/config/environments/development.rb +1 -1
- data/spec/dummy/db/migrate/20111120144025_create_active_record_orm_has_one_references.rb +10 -0
- data/spec/dummy/db/migrate/20111122203304_create_active_record_orm_has_many_references.rb +10 -0
- data/spec/dummy/db/schema.rb +15 -1
- data/spec/helpers/puffer_helper_spec.rb +1 -1
- data/spec/lib/fields_spec.rb +0 -9
- data/spec/lib/filters_spec.rb +4 -8
- data/spec/lib/orm_adapter/base_shared.rb +22 -0
- data/spec/spec_helper.rb +1 -1
- metadata +89 -60
- data/app/components/string/form.html.erb +0 -5
- data/app/helpers/puffer_helper.rb +0 -51
- data/app/helpers/puffer_tree_helper.rb +0 -15
- data/app/views/puffer/sessions_base/new.html.erb +0 -11
- data/lib/puffer/extensions/form.rb +0 -16
data/.gitignore
ADDED
data/Gemfile
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
1
|
source "http://rubygems.org"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
gem 'kaminari'
|
|
5
|
-
gem 'orm_adapter'
|
|
6
|
-
|
|
7
|
-
group :development, :test do
|
|
8
|
-
gem "sqlite3"
|
|
9
|
-
gem "mongoid"
|
|
10
|
-
gem "bson_ext"
|
|
11
|
-
|
|
12
|
-
gem 'devise'
|
|
13
|
-
|
|
14
|
-
gem "rspec-rails"
|
|
15
|
-
gem "capybara"
|
|
16
|
-
gem 'database_cleaner'
|
|
17
|
-
gem 'ammeter'
|
|
18
|
-
|
|
19
|
-
gem 'guard'
|
|
20
|
-
gem 'libnotify'
|
|
21
|
-
gem 'guard-rspec'
|
|
22
|
-
|
|
23
|
-
gem 'forgery'
|
|
24
|
-
gem 'fabrication'
|
|
25
|
-
gem "jeweler"
|
|
26
|
-
|
|
27
|
-
gem 'nested_set'
|
|
28
|
-
end
|
|
3
|
+
gemspec
|
data/Gemfile.lock
CHANGED
|
@@ -1,33 +1,41 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
puffer (0.1.0)
|
|
5
|
+
kaminari
|
|
6
|
+
orm_adapter
|
|
7
|
+
rails (~> 3.1.0)
|
|
8
|
+
|
|
1
9
|
GEM
|
|
2
10
|
remote: http://rubygems.org/
|
|
3
11
|
specs:
|
|
4
|
-
actionmailer (3.1.
|
|
5
|
-
actionpack (= 3.1.
|
|
12
|
+
actionmailer (3.1.3)
|
|
13
|
+
actionpack (= 3.1.3)
|
|
6
14
|
mail (~> 2.3.0)
|
|
7
|
-
actionpack (3.1.
|
|
8
|
-
activemodel (= 3.1.
|
|
9
|
-
activesupport (= 3.1.
|
|
15
|
+
actionpack (3.1.3)
|
|
16
|
+
activemodel (= 3.1.3)
|
|
17
|
+
activesupport (= 3.1.3)
|
|
10
18
|
builder (~> 3.0.0)
|
|
11
19
|
erubis (~> 2.7.0)
|
|
12
20
|
i18n (~> 0.6)
|
|
13
|
-
rack (~> 1.3.
|
|
21
|
+
rack (~> 1.3.5)
|
|
14
22
|
rack-cache (~> 1.1)
|
|
15
23
|
rack-mount (~> 0.8.2)
|
|
16
24
|
rack-test (~> 0.6.1)
|
|
17
|
-
sprockets (~> 2.0.
|
|
18
|
-
activemodel (3.1.
|
|
19
|
-
activesupport (= 3.1.
|
|
25
|
+
sprockets (~> 2.0.3)
|
|
26
|
+
activemodel (3.1.3)
|
|
27
|
+
activesupport (= 3.1.3)
|
|
20
28
|
builder (~> 3.0.0)
|
|
21
29
|
i18n (~> 0.6)
|
|
22
|
-
activerecord (3.1.
|
|
23
|
-
activemodel (= 3.1.
|
|
24
|
-
activesupport (= 3.1.
|
|
30
|
+
activerecord (3.1.3)
|
|
31
|
+
activemodel (= 3.1.3)
|
|
32
|
+
activesupport (= 3.1.3)
|
|
25
33
|
arel (~> 2.2.1)
|
|
26
34
|
tzinfo (~> 0.3.29)
|
|
27
|
-
activeresource (3.1.
|
|
28
|
-
activemodel (= 3.1.
|
|
29
|
-
activesupport (= 3.1.
|
|
30
|
-
activesupport (3.1.
|
|
35
|
+
activeresource (3.1.3)
|
|
36
|
+
activemodel (= 3.1.3)
|
|
37
|
+
activesupport (= 3.1.3)
|
|
38
|
+
activesupport (3.1.3)
|
|
31
39
|
multi_json (~> 1.0)
|
|
32
40
|
ammeter (0.2.1)
|
|
33
41
|
activesupport (~> 3.0)
|
|
@@ -39,7 +47,7 @@ GEM
|
|
|
39
47
|
bson (1.4.1)
|
|
40
48
|
bson_ext (1.4.0)
|
|
41
49
|
builder (3.0.0)
|
|
42
|
-
capybara (1.1.
|
|
50
|
+
capybara (1.1.2)
|
|
43
51
|
mime-types (>= 1.16)
|
|
44
52
|
nokogiri (>= 1.3.3)
|
|
45
53
|
rack (>= 1.0.0)
|
|
@@ -48,42 +56,37 @@ GEM
|
|
|
48
56
|
xpath (~> 0.1.4)
|
|
49
57
|
childprocess (0.2.2)
|
|
50
58
|
ffi (~> 1.0.6)
|
|
51
|
-
database_cleaner (0.
|
|
52
|
-
devise (1.
|
|
59
|
+
database_cleaner (0.7.0)
|
|
60
|
+
devise (1.5.1)
|
|
53
61
|
bcrypt-ruby (~> 3.0)
|
|
54
62
|
orm_adapter (~> 0.0.3)
|
|
55
|
-
warden (~> 1.
|
|
63
|
+
warden (~> 1.1)
|
|
56
64
|
diff-lcs (1.1.3)
|
|
57
65
|
erubis (2.7.0)
|
|
58
66
|
fabrication (1.2.0)
|
|
59
|
-
ffi (1.0.
|
|
67
|
+
ffi (1.0.11)
|
|
60
68
|
forgery (0.5.0)
|
|
61
|
-
|
|
62
|
-
guard (0.8.4)
|
|
69
|
+
guard (0.8.8)
|
|
63
70
|
thor (~> 0.14.6)
|
|
64
|
-
guard-rspec (0.5.
|
|
71
|
+
guard-rspec (0.5.5)
|
|
65
72
|
guard (>= 0.8.4)
|
|
66
73
|
hike (1.2.1)
|
|
67
74
|
i18n (0.6.0)
|
|
68
|
-
jeweler (1.6.4)
|
|
69
|
-
bundler (~> 1.0)
|
|
70
|
-
git (>= 1.2.5)
|
|
71
|
-
rake
|
|
72
75
|
json (1.6.1)
|
|
73
76
|
json_pure (1.6.1)
|
|
74
77
|
kaminari (0.12.4)
|
|
75
78
|
rails (>= 3.0.0)
|
|
76
|
-
libnotify (0.5.
|
|
79
|
+
libnotify (0.5.9)
|
|
77
80
|
mail (2.3.0)
|
|
78
81
|
i18n (>= 0.4.0)
|
|
79
82
|
mime-types (~> 1.16)
|
|
80
83
|
treetop (~> 1.4.8)
|
|
81
|
-
mime-types (1.
|
|
84
|
+
mime-types (1.17.2)
|
|
82
85
|
mongo (1.4.1)
|
|
83
86
|
bson (= 1.4.1)
|
|
84
|
-
mongoid (2.3.
|
|
87
|
+
mongoid (2.3.3)
|
|
85
88
|
activemodel (~> 3.1)
|
|
86
|
-
mongo (~> 1.
|
|
89
|
+
mongo (~> 1.3)
|
|
87
90
|
tzinfo (~> 0.3.22)
|
|
88
91
|
multi_json (1.0.3)
|
|
89
92
|
nested_set (1.6.8)
|
|
@@ -91,8 +94,8 @@ GEM
|
|
|
91
94
|
railties (>= 3.0.0)
|
|
92
95
|
nokogiri (1.5.0)
|
|
93
96
|
orm_adapter (0.0.5)
|
|
94
|
-
polyglot (0.3.
|
|
95
|
-
rack (1.3.
|
|
97
|
+
polyglot (0.3.3)
|
|
98
|
+
rack (1.3.5)
|
|
96
99
|
rack-cache (1.1)
|
|
97
100
|
rack (>= 0.4)
|
|
98
101
|
rack-mount (0.8.3)
|
|
@@ -101,55 +104,56 @@ GEM
|
|
|
101
104
|
rack
|
|
102
105
|
rack-test (0.6.1)
|
|
103
106
|
rack (>= 1.0)
|
|
104
|
-
rails (3.1.
|
|
105
|
-
actionmailer (= 3.1.
|
|
106
|
-
actionpack (= 3.1.
|
|
107
|
-
activerecord (= 3.1.
|
|
108
|
-
activeresource (= 3.1.
|
|
109
|
-
activesupport (= 3.1.
|
|
107
|
+
rails (3.1.3)
|
|
108
|
+
actionmailer (= 3.1.3)
|
|
109
|
+
actionpack (= 3.1.3)
|
|
110
|
+
activerecord (= 3.1.3)
|
|
111
|
+
activeresource (= 3.1.3)
|
|
112
|
+
activesupport (= 3.1.3)
|
|
110
113
|
bundler (~> 1.0)
|
|
111
|
-
railties (= 3.1.
|
|
112
|
-
railties (3.1.
|
|
113
|
-
actionpack (= 3.1.
|
|
114
|
-
activesupport (= 3.1.
|
|
114
|
+
railties (= 3.1.3)
|
|
115
|
+
railties (3.1.3)
|
|
116
|
+
actionpack (= 3.1.3)
|
|
117
|
+
activesupport (= 3.1.3)
|
|
115
118
|
rack-ssl (~> 1.3.2)
|
|
116
119
|
rake (>= 0.8.7)
|
|
117
120
|
rdoc (~> 3.4)
|
|
118
121
|
thor (~> 0.14.6)
|
|
119
|
-
rake (0.9.2)
|
|
120
|
-
rdoc (3.
|
|
122
|
+
rake (0.9.2.2)
|
|
123
|
+
rdoc (3.11)
|
|
121
124
|
json (~> 1.4)
|
|
122
|
-
rspec (2.
|
|
123
|
-
rspec-core (~> 2.
|
|
124
|
-
rspec-expectations (~> 2.
|
|
125
|
-
rspec-mocks (~> 2.
|
|
126
|
-
rspec-core (2.
|
|
127
|
-
rspec-expectations (2.
|
|
125
|
+
rspec (2.7.0)
|
|
126
|
+
rspec-core (~> 2.7.0)
|
|
127
|
+
rspec-expectations (~> 2.7.0)
|
|
128
|
+
rspec-mocks (~> 2.7.0)
|
|
129
|
+
rspec-core (2.7.1)
|
|
130
|
+
rspec-expectations (2.7.0)
|
|
128
131
|
diff-lcs (~> 1.1.2)
|
|
129
|
-
rspec-mocks (2.
|
|
130
|
-
rspec-rails (2.
|
|
132
|
+
rspec-mocks (2.7.0)
|
|
133
|
+
rspec-rails (2.7.0)
|
|
131
134
|
actionpack (~> 3.0)
|
|
132
135
|
activesupport (~> 3.0)
|
|
133
136
|
railties (~> 3.0)
|
|
134
|
-
rspec (~> 2.
|
|
137
|
+
rspec (~> 2.7.0)
|
|
135
138
|
rubyzip (0.9.4)
|
|
136
|
-
selenium-webdriver (2.
|
|
139
|
+
selenium-webdriver (2.13.0)
|
|
137
140
|
childprocess (>= 0.2.1)
|
|
138
|
-
ffi (
|
|
141
|
+
ffi (~> 1.0.9)
|
|
139
142
|
json_pure
|
|
140
143
|
rubyzip
|
|
141
|
-
sprockets (2.0.
|
|
144
|
+
sprockets (2.0.3)
|
|
142
145
|
hike (~> 1.2)
|
|
143
146
|
rack (~> 1.0)
|
|
144
147
|
tilt (~> 1.1, != 1.3.0)
|
|
145
148
|
sqlite3 (1.3.4)
|
|
146
149
|
thor (0.14.6)
|
|
147
150
|
tilt (1.3.3)
|
|
151
|
+
timecop (0.3.5)
|
|
148
152
|
treetop (1.4.10)
|
|
149
153
|
polyglot
|
|
150
154
|
polyglot (>= 0.3.1)
|
|
151
|
-
tzinfo (0.3.
|
|
152
|
-
warden (1.0
|
|
155
|
+
tzinfo (0.3.31)
|
|
156
|
+
warden (1.1.0)
|
|
153
157
|
rack (>= 1.0)
|
|
154
158
|
xpath (0.1.4)
|
|
155
159
|
nokogiri (~> 1.3)
|
|
@@ -167,12 +171,10 @@ DEPENDENCIES
|
|
|
167
171
|
forgery
|
|
168
172
|
guard
|
|
169
173
|
guard-rspec
|
|
170
|
-
jeweler
|
|
171
|
-
kaminari
|
|
172
174
|
libnotify
|
|
173
175
|
mongoid
|
|
174
176
|
nested_set
|
|
175
|
-
|
|
176
|
-
rails (~> 3.1.0)
|
|
177
|
+
puffer!
|
|
177
178
|
rspec-rails
|
|
178
179
|
sqlite3
|
|
180
|
+
timecop
|
data/README.md
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
# Puffer
|
|
1
|
+
# Puffer — YARAI (Yet Another Rails Admin Interface)
|
|
2
2
|
|
|
3
|
-
Puffer was created to help a project owner or moderators view and
|
|
3
|
+
Puffer was created to help a project owner or moderators view and
|
|
4
|
+
edit all the project's data models.
|
|
5
|
+
|
|
6
|
+
**It's compatible with Rails 3.1 only.**
|
|
4
7
|
|
|
5
8
|
## Discussion and help
|
|
6
9
|
|
|
7
|
-
puffer@conference.jabber.org
|
|
10
|
+
<xmpp:puffer@conference.jabber.org>
|
|
8
11
|
|
|
9
12
|
## Key features
|
|
10
13
|
|
|
11
|
-
* Full Rails integration. Puffer has no configuration,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* Puffer
|
|
15
|
-
|
|
14
|
+
* Full Ruby on Rails integration. Puffer has no configuration files, but a
|
|
15
|
+
DSL to define administration interfaces. This DSL follows the Rails
|
|
16
|
+
conventions.
|
|
17
|
+
* Flexibility. Puffer designed to provide much flexibility as possible,
|
|
18
|
+
so you can create your own extensions without any design issues.
|
|
19
|
+
* Internationalization. Surely, enjoy the native Rails i18n subsystem.
|
|
20
|
+
* Puffer supports different ORMs or ODMs through the `orm_adapter` gem.
|
|
21
|
+
Currently, we can work with ActiveRecord and Mongoid.
|
|
16
22
|
|
|
17
23
|
## Installation.
|
|
18
24
|
|
|
@@ -26,9 +32,9 @@ Or in Gemfile:
|
|
|
26
32
|
|
|
27
33
|
## Introduction.
|
|
28
34
|
|
|
29
|
-
Let's assume this is the data structure of your
|
|
35
|
+
Let's assume this is the data structure of your application:
|
|
30
36
|
|
|
31
|
-
```
|
|
37
|
+
```ruby
|
|
32
38
|
create_table "users", :force => true do |t|
|
|
33
39
|
t.string "email"
|
|
34
40
|
t.string "password"
|
|
@@ -47,7 +53,7 @@ end
|
|
|
47
53
|
|
|
48
54
|
And let's also assume your models look like this:
|
|
49
55
|
|
|
50
|
-
```
|
|
56
|
+
```ruby
|
|
51
57
|
class User < ActiveRecord::Base
|
|
52
58
|
has_many :posts
|
|
53
59
|
validates_presence_of :email, :password
|
|
@@ -60,7 +66,7 @@ class Profile < ActiveRecord::Base
|
|
|
60
66
|
end
|
|
61
67
|
```
|
|
62
68
|
|
|
63
|
-
First, let's generate Puffer controllers:
|
|
69
|
+
First, let's generate the Puffer controllers:
|
|
64
70
|
|
|
65
71
|
`rails g puffer:controller User`
|
|
66
72
|
|
|
@@ -68,9 +74,9 @@ and
|
|
|
68
74
|
|
|
69
75
|
`rails g puffer:controller Post`
|
|
70
76
|
|
|
71
|
-
This will generate
|
|
77
|
+
This will generate the following code:
|
|
72
78
|
|
|
73
|
-
```
|
|
79
|
+
```ruby
|
|
74
80
|
class Admin::PostsController < Puffer::Base
|
|
75
81
|
setup do
|
|
76
82
|
group :posts
|
|
@@ -97,9 +103,9 @@ class Admin::PostsController < Puffer::Base
|
|
|
97
103
|
end
|
|
98
104
|
```
|
|
99
105
|
|
|
100
|
-
Puffer's
|
|
106
|
+
Puffer's DSL creates all the actions you need. Next step is routing.
|
|
101
107
|
|
|
102
|
-
```
|
|
108
|
+
```ruby
|
|
103
109
|
namespace :admin do
|
|
104
110
|
resources :users do
|
|
105
111
|
resources :posts
|
|
@@ -108,21 +114,23 @@ namespace :admin do
|
|
|
108
114
|
end
|
|
109
115
|
```
|
|
110
116
|
|
|
111
|
-
Let me explain this feature. Puffer tracks all the nested resources.
|
|
117
|
+
Let me explain this feature. Puffer tracks all the nested resources.
|
|
118
|
+
For instance, according to our routing definitions, we can access only
|
|
119
|
+
specified posts of our user:
|
|
112
120
|
|
|
113
121
|
`/admin/users/1/post`
|
|
114
122
|
|
|
115
|
-
Routing nesting
|
|
123
|
+
Routing nesting implies the admin resources nesting.
|
|
116
124
|
|
|
117
125
|
## Advanced usage
|
|
118
126
|
|
|
119
|
-
Puffer can
|
|
127
|
+
Puffer can work in different namespaces:
|
|
120
128
|
|
|
121
129
|
`rails g puffer:controller moderator/posts`
|
|
122
130
|
|
|
123
131
|
And we'll get posts controller for moderators:
|
|
124
132
|
|
|
125
|
-
```
|
|
133
|
+
```ruby
|
|
126
134
|
class Moderator::PostsController < Puffer::Base
|
|
127
135
|
before_filter :require_moderator
|
|
128
136
|
|
|
@@ -147,12 +155,15 @@ class Moderator::PostsController < Puffer::Base
|
|
|
147
155
|
end
|
|
148
156
|
```
|
|
149
157
|
|
|
150
|
-
As you can see, moderators can't destroy posts. The moderator's post
|
|
158
|
+
As you can see, moderators can't destroy posts. The moderator's post
|
|
159
|
+
controller is placed in the Posting tab of the admin interface.
|
|
151
160
|
|
|
152
161
|
Finally, don't forget about routing:
|
|
153
162
|
|
|
154
|
-
```
|
|
163
|
+
```ruby
|
|
155
164
|
namespace :moderator do
|
|
156
165
|
resources :posts
|
|
157
166
|
end
|
|
158
|
-
```
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Have a nice day and let Puffer rock for you.
|
data/Rakefile
CHANGED
|
@@ -24,14 +24,4 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
|
24
24
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
require
|
|
28
|
-
|
|
29
|
-
Jeweler::Tasks.new do |gem|
|
|
30
|
-
gem.name = "puffer"
|
|
31
|
-
gem.summary = %Q{Admin interface builder}
|
|
32
|
-
gem.description = %Q{In Soviet Russia puffer admins you}
|
|
33
|
-
gem.email = "kinwizard@gmail.com"
|
|
34
|
-
gem.homepage = "http://github.com/puffer/puffer"
|
|
35
|
-
gem.authors = ["pyromaniac"]
|
|
36
|
-
end
|
|
37
|
-
Jeweler::GemcutterTasks.new
|
|
27
|
+
require "bundler/gem_tasks"
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.0.33
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
//= require puffer/right-src
|
|
2
|
+
//= require puffer/right-dnd-src
|
|
3
|
+
//= require puffer/right-keys-src
|
|
2
4
|
//= require puffer/right-dialog-src
|
|
3
5
|
//= require puffer/right-slider-src
|
|
6
|
+
//= require puffer/right-in-edit-src
|
|
4
7
|
//= require puffer/right-calendar-src
|
|
8
|
+
//= require puffer/right-sortable-src
|
|
5
9
|
//= require puffer/right-autocompleter-src
|
|
6
|
-
//= require puffer/paginator
|
|
10
|
+
//= require puffer/right-paginator-src
|
|
7
11
|
//= require puffer/rails
|
|
8
12
|
//= require puffer/puffer
|
|
13
|
+
//= require puffer/associations
|
|
9
14
|
|
|
10
15
|
//= require_all ./puffer
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"a[data-insert]".on('click', function(event) {
|
|
2
|
+
if (event.which != 1) return;
|
|
3
|
+
|
|
4
|
+
if (this.data('insert').element) {
|
|
5
|
+
var new_id = new Date().getTime();
|
|
6
|
+
$(this.data('insert').element).insert(this.data('insert').content.replace(/new_nested_index/g, new_id));
|
|
7
|
+
}
|
|
8
|
+
if (this.data('insert').remove) {
|
|
9
|
+
$(this.data('insert').remove).remove();
|
|
10
|
+
}
|
|
11
|
+
if (this.data('insert').show) {
|
|
12
|
+
$(this.data('insert').show).show();
|
|
13
|
+
}
|
|
14
|
+
if (this.data('insert').hide) {
|
|
15
|
+
$(this.data('insert').hide).hide();
|
|
16
|
+
}
|
|
17
|
+
event.stop();
|
|
18
|
+
});
|
|
@@ -19,4 +19,11 @@ var association_done = function(event) {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
dialog.load(this.get('data-dialog-uri'));
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
'a[data-new-dialog-uri]'.on('click', function(event) {
|
|
25
|
+
if (event.which != 1) return;
|
|
26
|
+
event.stop();
|
|
27
|
+
|
|
28
|
+
new Dialog({expandable: true}).load(this.get('data-new-dialog-uri'));
|
|
22
29
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RightJS-UI Calendar v2.
|
|
2
|
+
* RightJS-UI Calendar v2.3.0
|
|
3
3
|
* http://rightjs.org/ui/calendar
|
|
4
4
|
*
|
|
5
5
|
* Copyright (C) 2009-2011 Nikolay Nemshilov
|
|
@@ -430,7 +430,7 @@ var Calendar = new Widget({
|
|
|
430
430
|
include: [Toggler, Assignable],
|
|
431
431
|
|
|
432
432
|
extend: {
|
|
433
|
-
version: '2.
|
|
433
|
+
version: '2.3.0',
|
|
434
434
|
|
|
435
435
|
EVENTS: $w('show hide change done'),
|
|
436
436
|
|
|
@@ -458,6 +458,8 @@ var Calendar = new Widget({
|
|
|
458
458
|
update: null, // a reference to an input element to assign to
|
|
459
459
|
trigger: null, // a reference to a trigger element that would be paired too
|
|
460
460
|
|
|
461
|
+
highlight: null, // a list of dates to highlight
|
|
462
|
+
|
|
461
463
|
cssRule: '*[data-calendar]' // css rule for calendar related elements
|
|
462
464
|
},
|
|
463
465
|
|
|
@@ -694,6 +696,12 @@ var Calendar = new Widget({
|
|
|
694
696
|
this.assignTo(options.update, options.trigger);
|
|
695
697
|
}
|
|
696
698
|
|
|
699
|
+
if (isArray(options.highlight)) {
|
|
700
|
+
options.highlight = R(options.highlight).map(function(date) {
|
|
701
|
+
return isString(date) ? this.parse(date) : date;
|
|
702
|
+
}, this);
|
|
703
|
+
}
|
|
704
|
+
|
|
697
705
|
return this;
|
|
698
706
|
},
|
|
699
707
|
|
|
@@ -900,6 +908,14 @@ var Month = new Class(Element, {
|
|
|
900
908
|
cell.className = 'disabled';
|
|
901
909
|
}
|
|
902
910
|
|
|
911
|
+
if (isArray(options.highlight)) {
|
|
912
|
+
if (options.highlight.first(function(d) {
|
|
913
|
+
return d.getFullYear() === date.getFullYear() &&
|
|
914
|
+
d.getMonth() === date.getMonth() &&
|
|
915
|
+
d.getDate() === date.getDate()
|
|
916
|
+
})) { cell.className += ' highlighted'; }
|
|
917
|
+
}
|
|
918
|
+
|
|
903
919
|
week[day_num].date = new Date(date);
|
|
904
920
|
}
|
|
905
921
|
|
|
@@ -1448,7 +1464,7 @@ $(document).on({
|
|
|
1448
1464
|
|
|
1449
1465
|
|
|
1450
1466
|
var embed_style = document.createElement('style'),
|
|
1451
|
-
embed_rules = document.createTextNode(".rui-panel{margin:0;padding:.5em;position:relative;background-color:#EEE;border:1px solid #BBB;border-radius:.3em;-moz-border-radius:.3em;-webkit-border-radius:.3em;box-shadow:.15em .3em .5em #BBB;-moz-box-shadow:.15em .3em .5em #BBB;-webkit-box-shadow:.15em .3em .5em #BBB;cursor:default} *.rui-button{display:inline-block; *display:inline; *zoom:1;height:1em;line-height:1em;margin:0;padding:.2em .5em;text-align:center;border:1px solid #CCC;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em;cursor:pointer;color:#333;background-color:#FFF;user-select:none;-moz-user-select:none;-webkit-user-select:none} *.rui-button:hover{color:#111;border-color:#999;background-color:#DDD;box-shadow:#888 0 0 .1em;-moz-box-shadow:#888 0 0 .1em;-webkit-box-shadow:#888 0 0 .1em} *.rui-button:active{color:#000;border-color:#777;text-indent:1px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none} *.rui-button-disabled, *.rui-button-disabled:hover, *.rui-button-disabled:active{color:#888;background:#DDD;border-color:#CCC;cursor:default;text-indent:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}div.rui-re-anchor{margin:0;padding:0;background:none;border:none;float:none;display:inline;position:absolute;z-index:9999}div.rui-calendar .swaps,div.rui-calendar .greed,div.rui-calendar .timepicker,div.rui-calendar .buttons,div.rui-calendar table,div.rui-calendar table tr,div.rui-calendar table th,div.rui-calendar table td,div.rui-calendar table tbody,div.rui-calendar table thead,div.rui-calendar table caption{background:none;border:none;width:auto;height:auto;margin:0;padding:0}div.rui-calendar-inline{position:relative;display:inline-block; *display:inline; *zoom:1;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}div.rui-calendar .swaps{position:relative}div.rui-calendar .swaps .rui-button{position:absolute;float:left;width:1em;padding:.15em .4em}div.rui-calendar .swaps .next-month{right:0em;_right:.5em}div.rui-calendar .swaps .prev-year{left:2.05em}div.rui-calendar .swaps .next-year{right:2.05em;_right:2.52em}div.rui-calendar .greed{border-spacing:0px;border-collapse:collapse;border-size:0}div.rui-calendar .greed td{vertical-align:top;padding-left:.4em}div.rui-calendar .greed>tbody>tr>td:first-child{padding:0}div.rui-calendar .month{margin-top:.2em;border-spacing:1px;border-collapse:separate}div.rui-calendar .month caption{text-align:center}div.rui-calendar .month th{color:#666;text-align:center}div.rui-calendar .month td{text-align:right;padding:.1em .3em;background-color:#FFF;border:1px solid #CCC;cursor:pointer;color:#555;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em}div.rui-calendar .month td:hover{background-color:#CCC;border-color:#AAA;color:#000}div.rui-calendar .month td.blank{background:transparent;cursor:default;border:none}div.rui-calendar .month td.selected{background-color:#BBB;border-color:#AAA;color:#222;font-weight:bold;padding:.1em .2em}div.rui-calendar .month td.disabled{color:#888;background:#EEE;border-color:#CCC;cursor:default}div.rui-calendar .timepicker{border-top:1px solid #ccc;margin-top:.3em;padding-top:.5em;text-align:center}div.rui-calendar .timepicker select{margin:0 .4em}div.rui-calendar .buttons{position:relative;margin-top:.5em}div.rui-calendar .buttons div.rui-button{width:4em;padding:.25em .5em}div.rui-calendar .buttons .done{position:absolute;right:0em;top:0}");
|
|
1467
|
+
embed_rules = document.createTextNode(".rui-panel{margin:0;padding:.5em;position:relative;background-color:#EEE;border:1px solid #BBB;border-radius:.3em;-moz-border-radius:.3em;-webkit-border-radius:.3em;box-shadow:.15em .3em .5em #BBB;-moz-box-shadow:.15em .3em .5em #BBB;-webkit-box-shadow:.15em .3em .5em #BBB;cursor:default} *.rui-button{display:inline-block; *display:inline; *zoom:1;height:1em;line-height:1em;margin:0;padding:.2em .5em;text-align:center;border:1px solid #CCC;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em;cursor:pointer;color:#333;background-color:#FFF;user-select:none;-moz-user-select:none;-webkit-user-select:none} *.rui-button:hover{color:#111;border-color:#999;background-color:#DDD;box-shadow:#888 0 0 .1em;-moz-box-shadow:#888 0 0 .1em;-webkit-box-shadow:#888 0 0 .1em} *.rui-button:active{color:#000;border-color:#777;text-indent:1px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none} *.rui-button-disabled, *.rui-button-disabled:hover, *.rui-button-disabled:active{color:#888;background:#DDD;border-color:#CCC;cursor:default;text-indent:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}div.rui-re-anchor{margin:0;padding:0;background:none;border:none;float:none;display:inline;position:absolute;z-index:9999}div.rui-calendar .swaps,div.rui-calendar .greed,div.rui-calendar .timepicker,div.rui-calendar .buttons,div.rui-calendar table,div.rui-calendar table tr,div.rui-calendar table th,div.rui-calendar table td,div.rui-calendar table tbody,div.rui-calendar table thead,div.rui-calendar table caption{background:none;border:none;width:auto;height:auto;margin:0;padding:0}div.rui-calendar-inline{position:relative;display:inline-block; *display:inline; *zoom:1;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}div.rui-calendar .swaps{position:relative}div.rui-calendar .swaps .rui-button{position:absolute;float:left;width:1em;padding:.15em .4em}div.rui-calendar .swaps .next-month{right:0em;_right:.5em}div.rui-calendar .swaps .prev-year{left:2.05em}div.rui-calendar .swaps .next-year{right:2.05em;_right:2.52em}div.rui-calendar .greed{border-spacing:0px;border-collapse:collapse;border-size:0}div.rui-calendar .greed td{vertical-align:top;padding-left:.4em}div.rui-calendar .greed>tbody>tr>td:first-child{padding:0}div.rui-calendar .month{margin-top:.2em;border-spacing:1px;border-collapse:separate}div.rui-calendar .month caption{text-align:center}div.rui-calendar .month th{color:#666;text-align:center}div.rui-calendar .month td{text-align:right;padding:.1em .3em;background-color:#FFF;border:1px solid #CCC;cursor:pointer;color:#555;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em}div.rui-calendar .month td:hover{background-color:#CCC;border-color:#AAA;color:#000}div.rui-calendar .month td.blank{background:transparent;cursor:default;border:none}div.rui-calendar .month td.selected{background-color:#BBB;border-color:#AAA;color:#222;font-weight:bold;padding:.1em .2em}div.rui-calendar .month td.disabled{color:#888;background:#EEE;border-color:#CCC;cursor:default}div.rui-calendar .month td.highlighted{background-color:#DDD;border-color:#bbb;color:#111}div.rui-calendar .timepicker{border-top:1px solid #ccc;margin-top:.3em;padding-top:.5em;text-align:center}div.rui-calendar .timepicker select{margin:0 .4em}div.rui-calendar .buttons{position:relative;margin-top:.5em}div.rui-calendar .buttons div.rui-button{width:4em;padding:.25em .5em}div.rui-calendar .buttons .done{position:absolute;right:0em;top:0}");
|
|
1452
1468
|
|
|
1453
1469
|
embed_style.type = 'text/css';
|
|
1454
1470
|
document.getElementsByTagName('head')[0].appendChild(embed_style);
|