typus 3.1.5 → 3.1.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/{CHANGELOG → CHANGELOG.md} +73 -22
- data/Gemfile +6 -6
- data/README.md +1 -1
- data/app/controllers/admin/resources_controller.rb +1 -1
- data/app/helpers/admin/resources/data_types/integer_helper.rb +10 -0
- data/app/helpers/admin/resources/data_types/position_helper.rb +1 -1
- data/app/helpers/admin/resources/filters_helper.rb +2 -1
- data/app/helpers/admin/resources/form_helper.rb +7 -3
- data/app/helpers/admin/resources/relationships_helper.rb +2 -1
- data/app/views/admin/templates/_has_many.html.erb +5 -1
- data/app/views/admin/templates/_position.html.erb +1 -1
- data/config/routes.rb +3 -6
- data/lib/typus.rb +5 -2
- data/lib/typus/controller/format.rb +1 -1
- data/lib/typus/orm/active_record/class_methods.rb +5 -14
- data/lib/typus/orm/active_record/search.rb +2 -66
- data/lib/typus/orm/base/class_methods.rb +180 -0
- data/lib/typus/orm/base/search.rb +91 -0
- data/lib/typus/orm/mongoid.rb +12 -1
- data/lib/typus/orm/mongoid/class_methods.rb +55 -1
- data/lib/typus/orm/mongoid/instance_methods.rb +18 -0
- data/lib/typus/orm/mongoid/search.rb +46 -0
- data/lib/typus/version.rb +1 -1
- data/typus.gemspec +2 -2
- data/vendor/assets/fancybox/{jquery.fancybox-1.3.4.css → jquery.fancybox-1.3.4.css.erb} +33 -33
- metadata +22 -18
- data/lib/typus/orm/base.rb +0 -167
data/{CHANGELOG → CHANGELOG.md}
RENAMED
@@ -1,4 +1,23 @@
|
|
1
|
-
|
1
|
+
CHANGELOG
|
2
|
+
=========
|
3
|
+
|
4
|
+
3.1.6 (2012-01-02)
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* [FIXED] "Save and continue editing" button was shown even when the
|
8
|
+
user didn't have acess to it.
|
9
|
+
|
10
|
+
* [CHANGED] Improved MongoDB support.
|
11
|
+
|
12
|
+
* [NEW] We can now filter by integer.
|
13
|
+
|
14
|
+
* [FIXED] Independent paginators when showing associations.
|
15
|
+
|
16
|
+
Changes: <https://github.com/fesplugas/typus/compare/v3.1.5...v3.1.6>
|
17
|
+
|
18
|
+
|
19
|
+
3.1.5 (2011-12-10)
|
20
|
+
------------------
|
2
21
|
|
3
22
|
* [CHANGED] Association tables now contain a "show" link.
|
4
23
|
|
@@ -10,11 +29,19 @@
|
|
10
29
|
|
11
30
|
* [CHANGED] Repository moved again to http://github.com/fesplugas/typus
|
12
31
|
|
13
|
-
|
32
|
+
Changes: <https://github.com/fesplugas/typus/compare/v3.1.4...v3.1.5>
|
33
|
+
|
34
|
+
|
35
|
+
3.1.4
|
36
|
+
-----
|
14
37
|
|
15
38
|
* [FIXED] Belongs to helper was not creating properly class ids.
|
16
39
|
|
17
|
-
|
40
|
+
Changes: <https://github.com/fesplugas/typus/compare/v3.1.3...v3.1.4>
|
41
|
+
|
42
|
+
|
43
|
+
3.1.3
|
44
|
+
-----
|
18
45
|
|
19
46
|
* [CHANGED] Added `Typus.chosen` so we can disable "Chosen". This will
|
20
47
|
be in Typus until "Chosen" supports remote data calls.
|
@@ -37,14 +64,20 @@
|
|
37
64
|
|
38
65
|
* [FIXED] Detaching a Paperclip was not working.
|
39
66
|
|
40
|
-
|
67
|
+
Changes: <https://github.com/fesplugas/typus/compare/v3.1.2...v3.1.3>
|
68
|
+
|
69
|
+
|
70
|
+
3.1.2
|
71
|
+
-----
|
41
72
|
|
42
73
|
* [CHANGED] Images, links and belongs_to associations do not have links
|
43
74
|
when popup mode. This will avoid an "Inception" problem.
|
44
75
|
|
45
76
|
* [FIXED] Problems on HABTM associations when generating association names.
|
46
77
|
|
47
|
-
|
78
|
+
|
79
|
+
3.1.1
|
80
|
+
-----
|
48
81
|
|
49
82
|
* [CHANGED] Removed user guide. Docs can now be found at http://docs.typuscmf.com/
|
50
83
|
|
@@ -65,7 +98,9 @@
|
|
65
98
|
|
66
99
|
* [CHANGED] Default development/test database is now **Postgresql**.
|
67
100
|
|
68
|
-
|
101
|
+
|
102
|
+
3.1.0
|
103
|
+
-----
|
69
104
|
|
70
105
|
* [NEW] Filter with scopes.
|
71
106
|
|
@@ -146,27 +181,37 @@
|
|
146
181
|
|
147
182
|
* [CHANGED] Configuration files are now generated by model not by groups.
|
148
183
|
|
149
|
-
|
184
|
+
|
185
|
+
3.0.12
|
186
|
+
------
|
150
187
|
|
151
188
|
* [FIXED] Use will_paginate 3.0.0.
|
152
189
|
|
153
|
-
|
190
|
+
|
191
|
+
3.0.9
|
192
|
+
-----
|
154
193
|
|
155
194
|
* [NEW] Refactored and renamed `User` extensions to `AdminUserV1`.
|
156
195
|
|
157
196
|
* [NEW] `AdminUserV2` which uses `bcrypt` and it's simpler. This will be the
|
158
197
|
default authentication mechanism for my new apps.
|
159
198
|
|
160
|
-
|
199
|
+
|
200
|
+
3.0.8
|
201
|
+
-----
|
161
202
|
|
162
203
|
* [FIXED] Missing alias. (Commit 2af7d4cfd98bb0)
|
163
204
|
|
164
|
-
= 3.0.7
|
165
205
|
|
166
|
-
|
167
|
-
|
206
|
+
3.0.7
|
207
|
+
-----
|
208
|
+
|
209
|
+
* [CHANGED] Updated assets. Please run the `typus:assets` generator in order
|
210
|
+
to create the new files on the new location.
|
168
211
|
|
169
|
-
|
212
|
+
|
213
|
+
3.0.3
|
214
|
+
-----
|
170
215
|
|
171
216
|
* [NEW] Support for has many through relationships. [jmeiss]
|
172
217
|
|
@@ -247,7 +292,9 @@
|
|
247
292
|
|
248
293
|
* [NEW] Better application templates.
|
249
294
|
|
250
|
-
|
295
|
+
|
296
|
+
3.0.2
|
297
|
+
-----
|
251
298
|
|
252
299
|
* [FIXED] Use Arel to get the data on lists. After moving to will_paginate I
|
253
300
|
broke the data method, on each list we where "selecting ALL on the table of
|
@@ -257,25 +304,31 @@
|
|
257
304
|
to Rails caching mechanism this was not affecting to the performance. Now we
|
258
305
|
only see the @current_user once. (As it should be.)
|
259
306
|
|
260
|
-
|
307
|
+
|
308
|
+
3.0.1
|
309
|
+
-----
|
261
310
|
|
262
311
|
* [FIXED] After moving from a vendored paginator to will_paginate I removed
|
263
312
|
some stuff which shouldn't be removed, so the 3.0.0 gem is totally broken.
|
264
313
|
|
265
314
|
* [FIXED] Force query with postgresql adapter to not be case sensitive [jmeiss]
|
266
315
|
|
267
|
-
|
316
|
+
|
317
|
+
3.0.0
|
318
|
+
-----
|
268
319
|
|
269
320
|
* [NEW] New gem version compatible with Rails 3.
|
270
321
|
|
271
|
-
|
322
|
+
|
323
|
+
Previously
|
324
|
+
----------
|
272
325
|
|
273
326
|
Why a 3.0.0 version? After considering the work done for the Rails 3 transition
|
274
327
|
I though it would be a good idea to keep versions syncronized with Rails.
|
275
328
|
|
276
|
-
Typus will have the same version numbers as Rails as I considered it's
|
277
|
-
tied to it. With each release of Rails, we will take the latest features
|
278
|
-
Typus
|
329
|
+
**Typus** will have the same version numbers as Rails as I considered it's
|
330
|
+
pretty tied to it. With each release of Rails, we will take the latest features
|
331
|
+
into **Typus**.
|
279
332
|
|
280
333
|
Pending stuff that someday will be done, donations and collaborations are
|
281
334
|
accepted.
|
@@ -289,5 +342,3 @@ accepted.
|
|
289
342
|
* Nested models.
|
290
343
|
|
291
344
|
* Contextual content depending on the role logged.
|
292
|
-
|
293
|
-
* Replace typus authentication by devise.
|
data/Gemfile
CHANGED
@@ -8,9 +8,9 @@ gemspec
|
|
8
8
|
# Gems used only for assets and not required
|
9
9
|
# in production environments by default.
|
10
10
|
group :assets do
|
11
|
-
gem 'sass-rails',
|
12
|
-
gem 'coffee-rails',
|
13
|
-
gem 'uglifier'
|
11
|
+
gem 'sass-rails', '~> 3.1.5'
|
12
|
+
gem 'coffee-rails', '~> 3.1.1'
|
13
|
+
gem 'uglifier', '>= 1.0.3'
|
14
14
|
end
|
15
15
|
|
16
16
|
# Database adapters
|
@@ -31,7 +31,7 @@ end
|
|
31
31
|
# And this stuff needed for the demo application.
|
32
32
|
gem "acts_as_list"
|
33
33
|
gem "acts_as_tree"
|
34
|
-
gem "factory_girl_rails", "~> 1.
|
34
|
+
gem "factory_girl_rails", "~> 1.4.0"
|
35
35
|
gem "rails-permalink", "~> 1.0.0"
|
36
36
|
gem "rails-trash", "~> 1.1.2"
|
37
37
|
|
@@ -42,14 +42,14 @@ gem "jquery-rails"
|
|
42
42
|
gem "ckeditor-rails", "0.0.2"
|
43
43
|
|
44
44
|
# Alternative authentication
|
45
|
-
gem "devise", "~> 1.
|
45
|
+
gem "devise", "~> 1.5.2"
|
46
46
|
|
47
47
|
# Asset Management with Dragonfly
|
48
48
|
gem "dragonfly", "~> 0.9.8"
|
49
49
|
gem "rack-cache", :require => "rack/cache"
|
50
50
|
|
51
51
|
# Asset Management with Paperclip
|
52
|
-
gem "paperclip", "~> 2.4.
|
52
|
+
gem "paperclip", "~> 2.4.5"
|
53
53
|
|
54
54
|
# MongoDB
|
55
55
|
gem "mongoid", "~> 2.3.4"
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Typus: Admin Panel for Ruby on Rails applications
|
2
2
|
|
3
|
-
[](http://travis-ci.org/fesplugas/typus)
|
4
4
|
|
5
5
|
**Typus** is a control panel for [Ruby on Rails][rails] applications to
|
6
6
|
allow trusted users edit structured content.
|
@@ -149,7 +149,7 @@ class Admin::ResourcesController < Admin::BaseController
|
|
149
149
|
set_wheres
|
150
150
|
set_joins
|
151
151
|
check_resources_ownership if @resource.typus_options_for(:only_user_items)
|
152
|
-
set_order
|
152
|
+
set_order if @resource.respond_to?(:order)
|
153
153
|
set_eager_loading
|
154
154
|
end
|
155
155
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Admin::Resources::DataTypes::IntegerHelper
|
2
|
+
|
3
|
+
def integer_filter(filter)
|
4
|
+
values = set_context.send(filter.to_s.pluralize).to_a
|
5
|
+
items = [[Typus::I18n.t("Show by %{attribute}", :attribute => @resource.human_attribute_name(filter).downcase), ""]]
|
6
|
+
array = values.first.is_a?(Array) ? values : values.map { |i| [i, i] }
|
7
|
+
items += array
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -10,7 +10,7 @@ module Admin::Resources::DataTypes::PositionHelper
|
|
10
10
|
|
11
11
|
unless first_item || last_item
|
12
12
|
options = { :controller => "/admin/#{item.class.to_resource}", :action => "position", :id => item.id, :go => key }
|
13
|
-
locals[:html_position] << link_to(Typus::I18n.t(value), params.merge(options))
|
13
|
+
locals[:html_position] << link_to(Typus::I18n.t(value), params.merge(options), { :class => Typus::I18n.t(value).downcase })
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -5,7 +5,8 @@ module Admin::Resources::FiltersHelper
|
|
5
5
|
locals = {}
|
6
6
|
|
7
7
|
locals[:filters] = typus_filters.map do |key, value|
|
8
|
-
{ :key => set_filter(key, value),
|
8
|
+
{ :key => set_filter(key, value),
|
9
|
+
:value => send("#{value}_filter", key) }
|
9
10
|
end
|
10
11
|
|
11
12
|
rejections = %w(controller action locale utf8 sort_order order_by) + locals[:filters].map { |f| f[:key] }
|
@@ -59,9 +59,13 @@ module Admin::Resources::FormHelper
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def save_options
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
options = {}
|
63
|
+
options["_addanother"] = "Save and add another"
|
64
|
+
if admin_user.can?('edit', @resource.model_name)
|
65
|
+
options["_continue"] = "Save and continue editing"
|
66
|
+
end
|
67
|
+
options["_save"] = "Save"
|
68
|
+
options
|
65
69
|
end
|
66
70
|
|
67
71
|
def save_options_for_headless_mode
|
@@ -11,7 +11,8 @@ module Admin::Resources::RelationshipsHelper
|
|
11
11
|
def build_pagination
|
12
12
|
items_per_page = @model_to_relate.typus_options_for(:per_page)
|
13
13
|
data = @item.send(@field).order(@model_to_relate.typus_order_by).where(set_conditions)
|
14
|
-
|
14
|
+
page = params["#{@association_name}_page"]
|
15
|
+
@items = data.page(page).per(items_per_page)
|
15
16
|
end
|
16
17
|
|
17
18
|
def build_relationship_table
|
@@ -1,3 +1,7 @@
|
|
1
|
+
<%
|
2
|
+
param_name = "#{association_name}_page"
|
3
|
+
%>
|
4
|
+
|
1
5
|
<div class="box_relationships" id="<%= association_name %>">
|
2
6
|
|
3
7
|
<h2>
|
@@ -7,7 +11,7 @@
|
|
7
11
|
|
8
12
|
<% if @items.any? -%>
|
9
13
|
<%= table %>
|
10
|
-
<%= paginate(@items, Typus.pagination.merge(:anchor => association_name)) %>
|
14
|
+
<%= paginate(@items, Typus.pagination.merge(:anchor => association_name, :param_name => param_name)) %>
|
11
15
|
<% else %>
|
12
16
|
<p><%= Typus::I18n.t("No %{resources} found.", :resources => association_name.humanize.downcase.pluralize) %></p>
|
13
17
|
<% end %>
|
data/config/routes.rb
CHANGED
@@ -21,13 +21,9 @@ Rails.application.routes.draw do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
Typus.models.map(&:to_resource)
|
25
|
-
|
26
|
-
end
|
24
|
+
controllers = Typus.models.map(&:to_resource) + Typus.resources.map(&:underscore)
|
25
|
+
controllers.each { |c| match "#{c}(/:action(/:id))(.:format)", :controller => c }
|
27
26
|
|
28
|
-
Typus.resources.map(&:underscore).each do |resource|
|
29
|
-
match "#{resource}(/:action(/:id))(.:format)", :controller => resource
|
30
|
-
end
|
31
27
|
end
|
32
28
|
|
33
29
|
if Typus.subdomain
|
@@ -37,4 +33,5 @@ Rails.application.routes.draw do
|
|
37
33
|
else
|
38
34
|
scope "admin", {:module => :admin, :as => "admin"}, &routes_block
|
39
35
|
end
|
36
|
+
|
40
37
|
end
|
data/lib/typus.rb
CHANGED
@@ -4,11 +4,14 @@ require "support/object"
|
|
4
4
|
require "support/string"
|
5
5
|
|
6
6
|
require "typus/engine"
|
7
|
-
require "typus/orm/base"
|
8
|
-
require "typus/orm/active_record"
|
9
7
|
require "typus/regex"
|
10
8
|
require "typus/version"
|
11
9
|
|
10
|
+
require "typus/orm/base/class_methods"
|
11
|
+
require "typus/orm/base/search"
|
12
|
+
require "typus/orm/active_record"
|
13
|
+
require "typus/orm/mongoid"
|
14
|
+
|
12
15
|
require "kaminari"
|
13
16
|
|
14
17
|
autoload :FakeUser, "support/fake_user"
|
@@ -27,7 +27,7 @@ module Typus
|
|
27
27
|
options = { :conditions => @conditions, :batch_size => 1000 }
|
28
28
|
|
29
29
|
::CSV.open(filename, 'w') do |csv|
|
30
|
-
csv << fields.keys
|
30
|
+
csv << fields.keys.map { |k| @resource.human_attribute_name(k) }
|
31
31
|
@resource.find_in_batches(options) do |records|
|
32
32
|
records.each do |record|
|
33
33
|
csv << fields.map do |key, value|
|
@@ -3,7 +3,7 @@ module Typus
|
|
3
3
|
module ActiveRecord
|
4
4
|
module ClassMethods
|
5
5
|
|
6
|
-
include Typus::Orm::Base
|
6
|
+
include Typus::Orm::Base::ClassMethods
|
7
7
|
|
8
8
|
# Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
|
9
9
|
def model_fields
|
@@ -51,10 +51,6 @@ module Typus
|
|
51
51
|
filter.to_sym.eql?(:index) ? ['id'] : model_fields.keys
|
52
52
|
end
|
53
53
|
|
54
|
-
def virtual_fields
|
55
|
-
instance_methods.map(&:to_s) - model_fields.keys.map(&:to_s)
|
56
|
-
end
|
57
|
-
|
58
54
|
def virtual_attribute?(field)
|
59
55
|
:virtual if virtual_fields.include?(field.to_s)
|
60
56
|
end
|
@@ -79,15 +75,6 @@ module Typus
|
|
79
75
|
reflect_on_association(field).macro if reflect_on_association(field)
|
80
76
|
end
|
81
77
|
|
82
|
-
def custom_attribute?(field)
|
83
|
-
case field.to_s
|
84
|
-
when 'parent', 'parent_id' then :tree
|
85
|
-
when /password/ then :password
|
86
|
-
when 'position' then :position
|
87
|
-
when /\./ then :transversal
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
78
|
def typus_filters
|
92
79
|
ActiveSupport::OrderedHash.new.tap do |fields_with_type|
|
93
80
|
get_typus_filters.each do |field|
|
@@ -101,6 +88,10 @@ module Typus
|
|
101
88
|
data.extract_settings.map(&:to_sym)
|
102
89
|
end
|
103
90
|
|
91
|
+
def typus_user_id?
|
92
|
+
columns.map(&:name).include?(Typus.user_foreign_key)
|
93
|
+
end
|
94
|
+
|
104
95
|
end
|
105
96
|
end
|
106
97
|
end
|
@@ -3,6 +3,8 @@ module Typus
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Search
|
5
5
|
|
6
|
+
include Typus::Orm::Base::Search
|
7
|
+
|
6
8
|
def build_search_conditions(key, value)
|
7
9
|
Array.new.tap do |search|
|
8
10
|
query = ::ActiveRecord::Base.connection.quote_string(value.downcase)
|
@@ -25,76 +27,10 @@ module Typus
|
|
25
27
|
end.join(" OR ")
|
26
28
|
end
|
27
29
|
|
28
|
-
def build_boolean_conditions(key, value)
|
29
|
-
{ key => (value == 'true') ? true : false }
|
30
|
-
end
|
31
|
-
|
32
|
-
def build_datetime_conditions(key, value)
|
33
|
-
tomorrow = Time.zone.now.beginning_of_day.tomorrow
|
34
|
-
|
35
|
-
interval = case value
|
36
|
-
when 'today' then 0.days.ago.beginning_of_day..tomorrow
|
37
|
-
when 'last_few_days' then 3.days.ago.beginning_of_day..tomorrow
|
38
|
-
when 'last_7_days' then 6.days.ago.beginning_of_day..tomorrow
|
39
|
-
when 'last_30_days' then 30.days.ago.beginning_of_day..tomorrow
|
40
|
-
end
|
41
|
-
|
42
|
-
build_filter_interval(interval, key)
|
43
|
-
end
|
44
|
-
|
45
|
-
def build_date_conditions(key, value)
|
46
|
-
tomorrow = 0.days.ago.tomorrow.to_date
|
47
|
-
|
48
|
-
interval = case value
|
49
|
-
when 'today' then 0.days.ago.to_date..tomorrow
|
50
|
-
when 'last_few_days' then 3.days.ago.to_date..tomorrow
|
51
|
-
when 'last_7_days' then 6.days.ago.to_date..tomorrow
|
52
|
-
when 'last_30_days' then 30.days.ago.to_date..tomorrow
|
53
|
-
end
|
54
|
-
|
55
|
-
build_filter_interval(interval, key)
|
56
|
-
end
|
57
|
-
|
58
30
|
def build_filter_interval(interval, key)
|
59
31
|
["#{table_name}.#{key} BETWEEN ? AND ?", interval.first.to_s(:db), interval.last.to_s(:db)]
|
60
32
|
end
|
61
33
|
|
62
|
-
def build_string_conditions(key, value)
|
63
|
-
{ key => value }
|
64
|
-
end
|
65
|
-
|
66
|
-
alias_method :build_integer_conditions, :build_string_conditions
|
67
|
-
alias_method :build_belongs_to_conditions, :build_string_conditions
|
68
|
-
|
69
|
-
# TODO: Detect the primary_key for this object.
|
70
|
-
def build_has_many_conditions(key, value)
|
71
|
-
["#{key}.id = ?", value]
|
72
|
-
end
|
73
|
-
|
74
|
-
##
|
75
|
-
# To build conditions we reject all those params which are not model
|
76
|
-
# fields.
|
77
|
-
#
|
78
|
-
# Note: We still want to be able to search so the search param is not
|
79
|
-
# rejected.
|
80
|
-
#
|
81
|
-
def build_conditions(params)
|
82
|
-
Array.new.tap do |conditions|
|
83
|
-
query_params = params.dup
|
84
|
-
|
85
|
-
query_params.reject! do |k, v|
|
86
|
-
!model_fields.keys.include?(k.to_sym) &&
|
87
|
-
!model_relationships.keys.include?(k.to_sym) &&
|
88
|
-
!(k.to_sym == :search)
|
89
|
-
end
|
90
|
-
|
91
|
-
query_params.compact.each do |key, value|
|
92
|
-
filter_type = model_fields[key.to_sym] || model_relationships[key.to_sym] || key
|
93
|
-
conditions << send("build_#{filter_type}_conditions", key, value)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
34
|
def build_my_joins(params)
|
99
35
|
query_params = params.dup
|
100
36
|
query_params.reject! { |k, v| !model_relationships.keys.include?(k.to_sym) }
|