typus 3.1.0.rc19 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG +6 -31
  2. data/Gemfile +2 -2
  3. data/app/assets/javascripts/typus/jquery.application.js +15 -2
  4. data/app/controllers/admin/account_controller.rb +1 -2
  5. data/app/controllers/admin/base_controller.rb +5 -4
  6. data/app/controllers/admin/resources_controller.rb +16 -18
  7. data/app/controllers/admin/session_controller.rb +5 -5
  8. data/app/helpers/admin/resources/data_types/belongs_to_helper.rb +19 -23
  9. data/app/helpers/admin/resources/data_types/dragonfly_helper.rb +1 -1
  10. data/app/helpers/admin/resources/data_types/has_and_belongs_to_many_helper.rb +9 -13
  11. data/app/helpers/admin/resources/data_types/has_many_helper.rb +4 -6
  12. data/app/helpers/admin/resources/data_types/has_one_helper.rb +2 -2
  13. data/app/helpers/admin/resources/form_helper.rb +1 -4
  14. data/app/views/admin/resources/edit.html.erb +13 -0
  15. data/app/views/admin/templates/_dragonfly_form_preview.html.erb +0 -3
  16. data/app/views/admin/templates/_text_with_ckeditor_and_assets.html.erb +1 -1
  17. data/app/views/helpers/admin/base/_apps.html.erb +1 -3
  18. data/lib/generators/templates/config/initializers/typus.rb +3 -3
  19. data/lib/generators/templates/config/typus/README +7 -9
  20. data/lib/generators/templates/config/typus/application.yml +0 -2
  21. data/lib/generators/templates/config/typus/application_roles.yml +1 -3
  22. data/lib/generators/templates/config/typus/typus.yml +0 -2
  23. data/lib/generators/templates/config/typus/typus_roles.yml +0 -2
  24. data/lib/generators/typus/config_generator.rb +22 -67
  25. data/lib/generators/typus/controller_generator.rb +1 -1
  26. data/lib/generators/typus/initializers_generator.rb +1 -3
  27. data/lib/generators/typus/typus_generator.rb +1 -1
  28. data/lib/generators/typus/views_generator.rb +1 -1
  29. data/lib/support/hash.rb +1 -6
  30. data/lib/typus/authentication/base.rb +4 -0
  31. data/lib/typus/controller/bulk.rb +4 -4
  32. data/lib/typus/controller/headless.rb +5 -21
  33. data/lib/typus/orm/base.rb +4 -4
  34. data/lib/typus/version.rb +1 -1
  35. data/lib/typus.rb +1 -1
  36. data/vendor/assets/chosen/chosen.css +18 -18
  37. data/vendor/assets/fancybox/jquery.fancybox-1.3.4.css +17 -17
  38. metadata +15 -12
data/CHANGELOG CHANGED
@@ -1,38 +1,7 @@
1
1
  = 3.2.0 (unreleased)
2
2
 
3
- * [PLANNED] Models without a controller defined should use the "Resources"
4
- controller.
5
-
6
- * [PLANNED] New theme and theme support.
7
-
8
3
  = 3.1.0 (unreleased)
9
4
 
10
- * [PLANNED] Block changing uploaded files.
11
-
12
- * [PLANNED] Use roles when using `:none` authentication.
13
-
14
- * [PLANNED] Fix bulk actions combo separator. (UI)
15
-
16
- * [PLANNED] Remove "Versions" stuff from demo sidebar.
17
-
18
- * [PLANNED] Fix selector UI problems.
19
-
20
- * [PLANNED] Reload data on forms only if data has changed. (UI)
21
-
22
- * [PLANNED] Take back "Add New" on "BelongsTo" associations.
23
-
24
- * [PLANNED] Document: `text_with_ckeditor_with_assets`.
25
-
26
- * [PLANNED] Document: Migrate from `3.0` to `3.1`.
27
-
28
- * [PLANNED] Document: How to test an admin controller?
29
-
30
- * [PLANNED] Namespace filters to avoid collision with model attributes.
31
-
32
- * [PLANNED] Helpers for `display_dragonfly` and `display_paperclip`.
33
-
34
- * [NEW] Mountable apps support!
35
-
36
5
  * [NEW] Filter with scopes.
37
6
 
38
7
  * [NEW] Three different actions to save a record.
@@ -106,6 +75,12 @@
106
75
 
107
76
  * [CHANGED] Custom actions are back!
108
77
 
78
+ * [REMOVED] Read Only option has been removed from configuration files. This
79
+ wasn't really protecting the forms. We are now using `attr_protected` with
80
+ roles: `attr_protected :title, :as => :admin`.
81
+
82
+ * [CHANGED] Configuration files are now generated by model not by groups.
83
+
109
84
  = 3.0.12
110
85
 
111
86
  * [FIXED] Use will_paginate 3.0.0.
data/Gemfile CHANGED
@@ -64,6 +64,6 @@ end
64
64
  # make sense to have this here.
65
65
  group :development do
66
66
  gem "guard-livereload"
67
- gem "rb-fsevent"
68
- gem "growl_notify"
67
+ # gem "rb-fsevent"
68
+ # gem "growl_notify"
69
69
  end
@@ -11,7 +11,7 @@ $(document).ready(function() {
11
11
  'scrolling': false,
12
12
  });
13
13
 
14
- $(".iframe_with_reload").fancybox({
14
+ $(".iframe_with_form_reload").fancybox({
15
15
  'width': 720,
16
16
  'height': '90%',
17
17
  'autoScale': false,
@@ -20,7 +20,14 @@ $(document).ready(function() {
20
20
  'type': 'iframe',
21
21
  'centerOnScroll': true,
22
22
  'scrolling': false,
23
- onClosed: function() { parent.location.reload(true); },
23
+ onClosed: function() {
24
+ // console.log(arguments);
25
+ var attribute = Typus.resource_attribute;
26
+ var text = Typus.resource_to_label;
27
+ var value = Typus.resource_id;
28
+ $(attribute).append(new Option(text, value, true, true));
29
+ $(".chzn-select").trigger("liszt:updated");
30
+ },
24
31
  });
25
32
 
26
33
  $(".iframe").fancybox({
@@ -32,6 +39,10 @@ $(document).ready(function() {
32
39
  'type': 'iframe',
33
40
  'centerOnScroll': true,
34
41
  'scrolling': false,
42
+ onClosed: function() {
43
+ if (Typus.parent_location_reload)
44
+ parent.location.reload(true);
45
+ },
35
46
  });
36
47
 
37
48
  // This method is used by Typus::Controller::Bulk
@@ -45,6 +56,8 @@ $(document).ready(function() {
45
56
 
46
57
  });
47
58
 
59
+ Typus = {}
60
+
48
61
  function setConfirmUnload(on) {
49
62
  window.onbeforeunload = (on) ? unloadMessage : null;
50
63
  }
@@ -18,8 +18,7 @@ class Admin::AccountController < Admin::BaseController
18
18
  redirect_to user ? { :action => "show", :id => user.token } : { :action => :new }
19
19
  end
20
20
 
21
- def forgot_password
22
- end
21
+ def forgot_password; end
23
22
 
24
23
  def send_password
25
24
  if user = Typus.user_class.find_by_email(params[:typus_user][:email])
@@ -7,6 +7,7 @@ class Admin::BaseController < ActionController::Base
7
7
  before_filter :set_locale
8
8
 
9
9
  helper_method :admin_user
10
+ helper_method :current_role
10
11
 
11
12
  def user_guide; end
12
13
 
@@ -18,10 +19,10 @@ class Admin::BaseController < ActionController::Base
18
19
 
19
20
  def set_locale
20
21
  I18n.locale = if admin_user && admin_user.respond_to?(:locale)
21
- admin_user.locale
22
- else
23
- Typus::I18n.default_locale
24
- end
22
+ admin_user.locale
23
+ else
24
+ Typus::I18n.default_locale
25
+ end
25
26
  end
26
27
 
27
28
  def zero_users
@@ -22,12 +22,8 @@ class Admin::ResourcesController < Admin::BaseController
22
22
 
23
23
  respond_to do |format|
24
24
  format.html do
25
- if headless_mode_with_custom_action_is_enabled?
26
- set_headless_resource_actions
27
- else
28
- set_default_action
29
- add_resource_action("Trash", {:action => "destroy"}, {:confirm => "#{Typus::I18n.t("Trash")}?", :method => 'delete'})
30
- end
25
+ set_default_action
26
+ add_resource_action("Trash", {:action => "destroy"}, {:confirm => "#{Typus::I18n.t("Trash")}?", :method => 'delete'})
31
27
  generate_html
32
28
  end
33
29
 
@@ -36,9 +32,7 @@ class Admin::ResourcesController < Admin::BaseController
36
32
  end
37
33
 
38
34
  def new
39
- item_params = params.dup
40
- item_params.delete_if { |k, v| !@resource.columns.map(&:name).include?(k) }
41
- @item = @resource.new(item_params)
35
+ @item = @resource.new(params[:resource])
42
36
 
43
37
  respond_to do |format|
44
38
  format.html # new.html.erb
@@ -47,8 +41,13 @@ class Admin::ResourcesController < Admin::BaseController
47
41
  end
48
42
 
49
43
  def create
44
+ # Note that we still can still assign the item to another model. To change
45
+ # this behavior we need only to change how we merge the params.
46
+ item_params = params[:resource] || {}
47
+ item_params.merge!(params[@object_name])
48
+
50
49
  @item = @resource.new
51
- @item.assign_attributes(params[@object_name], :as => :admin)
50
+ @item.assign_attributes(item_params, :as => current_role)
52
51
 
53
52
  set_attributes_on_create
54
53
 
@@ -84,11 +83,10 @@ class Admin::ResourcesController < Admin::BaseController
84
83
  end
85
84
 
86
85
  def update
87
- attributes = params[:attribute] ? { params[:attribute] => nil } : params[@object_name]
86
+ attributes = params[:_nullify] ? { params[:_nullify] => nil } : params[@object_name]
88
87
 
89
88
  respond_to do |format|
90
- role = admin_user.is_root? ? :admin : :default
91
- if @item.update_attributes(attributes, :as => role)
89
+ if @item.update_attributes(attributes, :as => current_role)
92
90
  set_attributes_on_update
93
91
  format.html { redirect_on_success }
94
92
  format.json { render :json => @item }
@@ -200,18 +198,18 @@ class Admin::ResourcesController < Admin::BaseController
200
198
  def redirect_on_success
201
199
  path = params.dup.cleanup
202
200
 
203
- if params[:_save]
204
- path.delete_if { |k, v| %w(action id).include?(k) } # Redirects to { :action => 'index' }
201
+ options = if params[:_save]
202
+ { :action => nil, :id => nil }
205
203
  elsif params[:_addanother]
206
- path.merge!(:action => 'new', :id => nil) # Redirects to { :action => 'new' }
204
+ { :action => 'new', :id => nil }
207
205
  elsif params[:_continue]
208
- path.merge!(:action => 'edit', :id => @item.id) # Redirects to { :action => 'edit' => :id => @item.id }
206
+ { :action => 'edit', :id => @item.id }
209
207
  end
210
208
 
211
209
  message = params[:action].eql?('create') ? "%{model} successfully created." : "%{model} successfully updated."
212
210
  notice = Typus::I18n.t(message, :model => @resource.model_name.human)
213
211
 
214
- redirect_to path, :notice => notice
212
+ redirect_to path.merge!(options).compact, :notice => notice
215
213
  end
216
214
 
217
215
  def set_default_action
@@ -11,11 +11,11 @@ class Admin::SessionController < Admin::BaseController
11
11
  user = user_scope.authenticate(params[:typus_user][:email], params[:typus_user][:password])
12
12
 
13
13
  path = if user
14
- session[:typus_user_id] = user.id
15
- params[:back_to] || admin_dashboard_index_path
16
- else
17
- new_admin_session_path(:back_to => params[:back_to])
18
- end
14
+ session[:typus_user_id] = user.id
15
+ params[:back_to] || admin_dashboard_index_path
16
+ else
17
+ new_admin_session_path(:back_to => params[:back_to])
18
+ end
19
19
 
20
20
  redirect_to path
21
21
  end
@@ -4,29 +4,28 @@ module Admin::Resources::DataTypes::BelongsToHelper
4
4
  association = @resource.reflect_on_association(attribute.to_sym)
5
5
 
6
6
  related = if defined?(set_belongs_to_context)
7
- set_belongs_to_context.send(attribute.pluralize.to_sym)
8
- else
9
- association.class_name.constantize
10
- end
11
- related_fk = association.foreign_key
7
+ set_belongs_to_context.send(attribute.pluralize.to_sym)
8
+ else
9
+ association.class_name.constantize
10
+ end
12
11
 
12
+ related_fk = association.foreign_key
13
13
  html_options = { :disabled => attribute_disabled?(attribute) }
14
14
  label_text = @resource.human_attribute_name(attribute)
15
+ options = { :attribute => "#{@resource.name.downcase}_#{related_fk}" }
15
16
 
16
17
  label_text = @resource.human_attribute_name(attribute)
17
- if (text = build_label_text_for_belongs_to(related, html_options))
18
+ if (text = build_label_text_for_belongs_to(related, html_options, options))
18
19
  label_text += "<small>#{text}</small>"
19
20
  end
20
21
 
21
22
  values = if related.respond_to?(:roots)
22
- expand_tree_into_select_field(related.roots, related_fk)
23
- else
24
- related.order(related.typus_order_by).map { |p| [p.to_label, p.id] }
25
- end
23
+ expand_tree_into_select_field(related.roots, related_fk)
24
+ else
25
+ related.order(related.typus_order_by).map { |p| [p.to_label, p.id] }
26
+ end
26
27
 
27
28
  render "admin/templates/belongs_to",
28
- :association => association,
29
- :resource => @resource,
30
29
  :attribute => attribute,
31
30
  :attribute_id => "#{@resource.table_name}_#{attribute}",
32
31
  :form => form,
@@ -66,23 +65,20 @@ module Admin::Resources::DataTypes::BelongsToHelper
66
65
  items += resource.order(resource.typus_order_by).map { |v| [v.to_label, v.id] }
67
66
  end
68
67
 
69
- def build_label_text_for_belongs_to(klass, html_options)
68
+ def build_label_text_for_belongs_to(klass, html_options, options)
70
69
  if html_options[:disabled] == true
71
70
  Typus::I18n.t("Read only")
72
71
  elsif admin_user.can?('create', klass) && !headless_mode?
73
- build_add_new_for_belongs_to(klass)
72
+ build_add_new_for_belongs_to(klass, options)
74
73
  end
75
74
  end
76
75
 
77
- def build_add_new_for_belongs_to(klass)
78
- options = { :controller => "/admin/#{klass.to_resource}",
79
- :action => 'new',
80
- :resource => @resource.model_name,
81
- :layout => 'admin/headless' }
82
- # Pass the resource_id only to edit/update because only there is where
83
- # the record actually exists.
84
- options.merge!(:resource_id => @item.id) if %w(edit update).include?(params[:action])
85
- link_to Typus::I18n.t("Add New"), options, { :class => 'iframe' }
76
+ def build_add_new_for_belongs_to(klass, options)
77
+ default_options = { :controller => "/admin/#{klass.to_resource}",
78
+ :action => 'new',
79
+ :attribute => options[:attribute],
80
+ :_popup => true }
81
+ link_to Typus::I18n.t("Add New"), default_options, { :class => 'iframe_with_form_reload' }
86
82
  end
87
83
 
88
84
  end
@@ -12,7 +12,7 @@ module Admin::Resources::DataTypes::DragonflyHelper
12
12
  attribute_i18n = @item.class.human_attribute_name(attribute)
13
13
  label_text = <<-HTML
14
14
  #{attribute_i18n}
15
- <small>#{link_to Typus::I18n.t("Remove"), { :action => 'update', :id => @item.id, :attribute => attribute, :_continue => true }, :confirm => Typus::I18n.t("Are you sure?")}</small>
15
+ <small>#{link_to Typus::I18n.t("Remove"), { :action => 'update', :id => @item.id, :_nullify => attribute, :_continue => true }, :confirm => Typus::I18n.t("Are you sure?")}</small>
16
16
  HTML
17
17
  label_text.html_safe
18
18
  end
@@ -12,8 +12,10 @@ module Admin::Resources::DataTypes::HasAndBelongsToManyHelper
12
12
 
13
13
  html_options = { :disabled => attribute_disabled?(resource_ids.to_sym) }
14
14
 
15
+ options = { :attribute => "#{@resource.name.downcase}_#{attribute}" }
16
+
15
17
  label_text = @resource.human_attribute_name(attribute)
16
- if (text = build_label_text_for_has_and_belongs_to_many(klass, html_options))
18
+ if (text = build_label_text_for_has_and_belongs_to_many(klass, html_options, options))
17
19
  label_text += "<small>#{text}</small>"
18
20
  end
19
21
 
@@ -30,27 +32,21 @@ module Admin::Resources::DataTypes::HasAndBelongsToManyHelper
30
32
  render "admin/templates/has_and_belongs_to_many", locals
31
33
  end
32
34
 
33
- def build_label_text_for_has_and_belongs_to_many(klass, html_options)
35
+ def build_label_text_for_has_and_belongs_to_many(klass, html_options, options)
34
36
  if html_options[:disabled] == true
35
37
  Typus::I18n.t("Read only")
36
- =begin
37
- # TODO: Take this back at some point in the future. Adding a new item
38
- # using the pop-up should update the items on the selector. I know
39
- # this might be the most trivial thing in the world, but I don't
40
- # know how to do it.
41
38
  elsif admin_user.can?('create', klass) && !headless_mode?
42
- build_add_new_for_has_and_belongs_to_many(klass)
43
- =end
39
+ build_add_new_for_has_and_belongs_to_many(klass, options)
44
40
  end
45
41
  end
46
42
 
47
- def build_add_new_for_has_and_belongs_to_many(klass)
43
+ def build_add_new_for_has_and_belongs_to_many(klass, options)
48
44
  options = { :controller => "/admin/#{klass.to_resource}",
49
45
  :action => "new",
50
- :layout => "admin/headless",
51
- :return_to => request.path }
46
+ :attribute => options[:attribute],
47
+ :_popup => true }
52
48
 
53
- link_to Typus::I18n.t("Add New"), options, { :class => "iframe" }
49
+ link_to Typus::I18n.t("Add New"), options, { :class => "iframe_with_form_reload" }
54
50
  end
55
51
 
56
52
  end
@@ -14,15 +14,13 @@ module Admin::Resources::DataTypes::HasManyHelper
14
14
  def typus_form_has_many(field)
15
15
  setup_relationship(field)
16
16
 
17
- options = { @reflection.foreign_key => @item.id }
17
+ options = { "resource[#{@reflection.foreign_key}]" => @item.id }
18
18
 
19
19
  if @reflection.options && (as = @reflection.options[:as])
20
20
  klass = @resource.is_sti? ? @resource.superclass : @resource
21
21
  options.merge!("#{as}_type" => klass)
22
22
  end
23
23
 
24
- count_items_to_relate = @model_to_relate.order(@model_to_relate.typus_order_by).count - @item.send(field).count
25
-
26
24
  build_pagination
27
25
  set_has_many_resource_actions
28
26
 
@@ -37,14 +35,14 @@ module Admin::Resources::DataTypes::HasManyHelper
37
35
  if admin_user.can?("create", klass)
38
36
  default_options = { :controller => "/admin/#{klass.to_resource}",
39
37
  :action => "new",
40
- :layout => "admin/headless" }
38
+ :_popup => true }
41
39
 
42
- link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe_with_reload" }
40
+ link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe" }
43
41
  end
44
42
  end
45
43
 
46
44
  def set_has_many_resource_actions
47
- @resource_actions = [["Edit", { :action => "edit", :layout => 'admin/headless' }, { :class => 'iframe' }],
45
+ @resource_actions = [["Edit", { :action => "edit", :_popup => true }, { :class => 'iframe' }],
48
46
  ["Trash", { :action => "destroy" }, { :confirm => "Trash?" } ]]
49
47
  end
50
48
 
@@ -11,7 +11,7 @@ module Admin::Resources::DataTypes::HasOneHelper
11
11
  locals = { :association_name => @association_name, :table => build_relationship_table, :add_new => nil }
12
12
 
13
13
  if @items.empty?
14
- options = { :resource_id => nil, @reflection.foreign_key => @item.id }
14
+ options = { "resource[#{@reflection.foreign_key}]" => @item.id }
15
15
  locals[:add_new] = build_add_new_for_has_one(@model_to_relate, field, options)
16
16
  end
17
17
 
@@ -22,7 +22,7 @@ module Admin::Resources::DataTypes::HasOneHelper
22
22
  if admin_user.can?("create", klass)
23
23
  default_options = { :controller => "/admin/#{klass.to_resource}",
24
24
  :action => "new",
25
- :layout => "admin/headless" }
25
+ :_popup => true }
26
26
 
27
27
  link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe" }
28
28
  end
@@ -33,11 +33,9 @@ module Admin::Resources::FormHelper
33
33
 
34
34
  label_text = @resource.human_attribute_name(attribute)
35
35
 
36
- =begin
37
36
  if options[:disabled] == true
38
37
  label_text += "<small>#{Typus::I18n.t("Read only")}</small>"
39
38
  end
40
- =end
41
39
 
42
40
  locals = { :resource => @resource,
43
41
  :attribute => attribute,
@@ -52,8 +50,7 @@ module Admin::Resources::FormHelper
52
50
 
53
51
  def attribute_disabled?(attribute)
54
52
  if protected_attributes = @resource._protected_attributes
55
- role = admin_user.is_root? ? :admin : :default
56
- protected_attributes[role].include?(attribute)
53
+ protected_attributes[current_role].include?(attribute)
57
54
  end
58
55
  end
59
56
 
@@ -9,6 +9,19 @@
9
9
  <small><%= list_actions %></small>
10
10
  </h2>
11
11
 
12
+ <% if headless_mode? && params[:action] == 'edit' %>
13
+ <script type="text/javascript">
14
+ $(document).ready(function () {
15
+ parent.Typus.resource_attribute = "#<%= params[:attribute] %>";
16
+ parent.Typus.resource_id = '<%= @item.id %>';
17
+ parent.Typus.resource_to_label = '<%= @item.to_label %>';
18
+ <% if flash.keys.any? && !params[:_input] %>
19
+ parent.Typus.parent_location_reload = true;
20
+ <% end %>
21
+ });
22
+ </script>
23
+ <% end %>
24
+
12
25
  <%= display_flash_message %>
13
26
  <%= render 'edit' %>
14
27
 
@@ -10,9 +10,6 @@
10
10
  <ul style="margin: 0 0 0 15px!important;">
11
11
  <li><strong>File name:</strong> <%= attachment.name %></li>
12
12
  <li><strong>File type:</strong> <%= attachment.mime_type %></li>
13
- <% if @item.respond_to?(:created_at) %>
14
- <li><strong>Upload date:</strong> <%= @item.created_at %></li>
15
- <% end %>
16
13
  <li><strong>Dimensions:</strong> <%= attachment.width %> x <%= attachment.height %></li>
17
14
  </ul>
18
15
  </div>
@@ -27,7 +27,7 @@
27
27
  insert_picture = <<-DATA
28
28
  <small>
29
29
  #{link_to "Insert picture",
30
- {:controller => "/admin/assets", :layout => 'admin/headless', :input => input},
30
+ {:controller => "/admin/assets", :_popup => true, :_input => input},
31
31
  {:class => "iframe", :style => "font-size: 10px; background: black; color: white; padding: 2px 5px; -moz-border-radius: 3px; -webkit-border-radius: 3px;"}}
32
32
  </small>
33
33
  DATA
@@ -10,10 +10,8 @@
10
10
 
11
11
  <% admin_user.applications.each do |application| %>
12
12
 
13
- <% app_id = application.parameterize %>
14
-
15
13
  <%
16
- apps = admin_user.application(application)
14
+ app_id, apps = application.parameterize, admin_user.application(application)
17
15
  if (params[:application] == app_id) || (@resource && apps.include?(@resource.model_name))
18
16
  klass = 'active'
19
17
  end
@@ -1,7 +1,7 @@
1
1
  Typus.setup do |config|
2
2
 
3
3
  # Application name.
4
- config.admin_title = "<%= options[:admin_title] %>"
4
+ # config.admin_title = "Typus"
5
5
  # config.admin_sub_title = ""
6
6
 
7
7
  # When mailer_sender is set, password recover is enabled. This email
@@ -13,7 +13,7 @@ Typus.setup do |config|
13
13
  # config.action_mailer.default_url_options = { :host => 'localhost:3000' }
14
14
  #
15
15
  # This is a required Rails configuration. In production it must be the actual
16
- # actual host of your application
16
+ # actual host of your application.
17
17
  #
18
18
  # config.mailer_sender = "admin@example.com"
19
19
 
@@ -25,7 +25,7 @@ Typus.setup do |config|
25
25
  # Run `rails g typus:migration` if you need an advanced authentication system.
26
26
  # config.authentication = :none
27
27
 
28
- # Define username and password for +:http_basic+ authentication
28
+ # Define username and password for +:http_basic+ authentication.
29
29
  # config.username = "admin"
30
30
  # config.password = "columbia"
31
31
 
@@ -1,10 +1,9 @@
1
1
  # Models
2
2
 
3
3
  This is an example of a **Typus** enabled model with all available options.
4
- You can use this example to customize your YAML files which only have set the
5
- most common settings.
4
+ Use this example as reference to customize your YAML files.
6
5
 
7
- Post:
6
+ Entry:
8
7
  fields:
9
8
  default: id, title, category_id, created_at, is_published?
10
9
  list: id, title, category_id, created_at, is_published?
@@ -40,17 +39,16 @@ most common settings.
40
39
 
41
40
  # Roles
42
41
 
43
- In this file you can configure the actions available for each of your models
44
- on the application. You can also use the 'all' shortcut to allow the user the
45
- access to all actions.
42
+ This is an example of a roles file. Use this example as reference to customize
43
+ your YAML files.
46
44
 
47
45
  admin:
48
- Post: create, read, update, delete
46
+ Entry: create, read, update, delete
49
47
  Category: create, read, update, delete
50
- TypusUser: all
48
+ AdminUser: all
51
49
 
52
50
  editor:
53
- Post: create, read, update
51
+ Entry: create, read, update
54
52
  Category: read, update
55
53
 
56
54
  You can also define `resources` which are not related to a model, for example
@@ -1,5 +1,3 @@
1
- # Typus Models Configuration File
2
- #
3
1
  # Use the README file as a reference to customize settings.
4
2
 
5
3
  <%= configuration[:base] %>
@@ -1,6 +1,4 @@
1
- # Typus Roles Configuration File
2
- #
3
1
  # Use the README file as a reference to customize settings.
4
2
 
5
3
  admin:
6
- <%= configuration[:roles] %>
4
+ <%= configuration[:roles] %>
@@ -1,5 +1,3 @@
1
- # Typus Models Configuration File
2
- #
3
1
  # Use the README file as a reference to customize settings.
4
2
 
5
3
  <%= options[:user_class_name] %>:
@@ -1,5 +1,3 @@
1
- # Typus Roles Configuration File
2
- #
3
1
  # Use the README file as a reference to customize settings.
4
2
 
5
3
  admin:
@@ -4,99 +4,54 @@ module Typus
4
4
 
5
5
  source_root File.expand_path("../../templates", __FILE__)
6
6
 
7
- class_option :admin_title, :default => Rails.root.basename
8
-
9
7
  desc <<-MSG
10
8
  Description:
11
- Creates configuration files and stores them in `config/typus`.
9
+ Creates configuration files.
12
10
 
13
11
  MSG
14
12
 
15
13
  def generate_config
16
14
  copy_file "config/typus/README"
17
- if (@configuration = generate_yaml_files)[:base].present?
18
- %w(application.yml application_roles.yml).each do |file|
19
- template "config/typus/#{file}", "config/typus/#{timestamp}_#{file}"
15
+ generate_yaml.each do |key, value|
16
+ if (@configuration = value)[:base].present?
17
+ template "config/typus/application.yml", "config/typus/#{key}.yml"
18
+ template "config/typus/application_roles.yml", "config/typus/#{key}_roles.yml"
20
19
  end
21
20
  end
22
21
  end
23
22
 
24
23
  protected
25
24
 
26
- def timestamp
27
- Time.zone.now.to_s(:number)
28
- end
29
-
30
25
  def configuration
31
26
  @configuration
32
27
  end
33
28
 
34
- def generate_yaml_files
29
+ def generate_yaml
35
30
  Typus.reload!
36
31
 
37
- configuration = { :base => "", :roles => "" }
38
-
39
- Typus.application_models.sort { |x,y| x <=> y }.each do |model|
40
-
41
- next if Typus.models.include?(model)
42
-
43
- klass = model.constantize
44
-
45
- # Detect all relationships except polymorphic belongs_to using reflection.
46
- relationships = [ :belongs_to, :has_and_belongs_to_many, :has_many, :has_one ].map do |relationship|
47
- klass.reflect_on_all_associations(relationship).reject { |i| i.options[:polymorphic] }.map { |i| i.name.to_s }
48
- end.flatten.sort
32
+ configuration = {}
33
+ models = Typus.application_models.reject { |m| Typus.models.include?(m) }.map { |m| m.constantize }
49
34
 
50
- ##
51
- # Model fields for:
52
- #
53
- # - Default
54
- # - Form
55
- #
35
+ models.each do |model|
36
+ configuration[model.table_name] = {}
56
37
 
57
- rejections = %w( ^id$
58
- created_at created_on updated_at updated_on deleted_at
59
- salt crypted_password
60
- password_salt persistence_token single_access_token perishable_token
61
- _type$ type
62
- _file_size$ )
38
+ relationships = [ :has_many, :has_one ].map do |relationship|
39
+ model.reflect_on_all_associations(relationship).map { |i| i.name.to_s }
40
+ end.flatten.join(", ")
63
41
 
64
- default_rejections = (rejections + %w( password password_confirmation )).join("|")
65
- form_rejections = (rejections + %w( position )).join("|")
42
+ rejections = %w( ^id$ _type$ type created_at created_on updated_at updated_on deleted_at ).join("|")
43
+ fields = model.columns.map(&:name).reject { |f| f.match(rejections) }.join(", ")
66
44
 
67
- fields = klass.columns.map(&:name)
68
- default = fields.reject { |f| f.match(default_rejections) }
69
- form = fields.reject { |f| f.match(form_rejections) }
70
-
71
- # Model defaults.
72
- order_by = "position" if default.include?("position")
73
- filters = "created_at" if fields.include?("created_at")
74
- search = ( %w(name title) & default ).join(", ")
75
-
76
- # We want attributes of belongs_to relationships to be shown in our
77
- # field collections if those are not polymorphic.
78
- [ default, form ].each do |fields|
79
- fields << klass.reflect_on_all_associations(:belongs_to).reject { |i| i.options[:polymorphic] }.map { |i| i.name.to_s }
80
- fields.flatten!
81
- end
82
-
83
- configuration[:base] << <<-RAW
84
- #{klass}:
45
+ configuration[model.table_name][:base] = <<-RAW
46
+ #{model}:
85
47
  fields:
86
- default: #{default.join(", ")}
87
- form: #{form.join(", ")}
88
- order_by: #{order_by}
89
- relationships: #{relationships.join(", ")}
90
- filters: #{filters}
91
- search: #{search}
92
- application: #{options[:admin_title]}
93
-
94
- RAW
95
-
96
- configuration[:roles] << <<-RAW
97
- #{klass}: create, read, update, delete
48
+ default: #{fields}
49
+ form: #{fields}
50
+ relationships: #{relationships}
51
+ application: Application
98
52
  RAW
99
53
 
54
+ configuration[model.table_name][:roles] = "#{model}: create, read, update, delete"
100
55
  end
101
56
 
102
57
  configuration
@@ -8,7 +8,7 @@ module Typus
8
8
 
9
9
  desc <<-MSG
10
10
  Description:
11
- Generates admin controllers for the given resource
11
+ Generates admin controllers for the given resource.
12
12
 
13
13
  MSG
14
14
 
@@ -4,11 +4,9 @@ module Typus
4
4
 
5
5
  source_root File.expand_path("../../templates", __FILE__)
6
6
 
7
- class_option :admin_title, :default => Rails.root.basename
8
-
9
7
  desc <<-MSG
10
8
  Description:
11
- Copies all Typus initializers into your application.
9
+ Copies Typus initializers into your application.
12
10
 
13
11
  MSG
14
12
 
@@ -19,7 +19,7 @@ Description:
19
19
  This generator creates required files to enable an admin panel which allows
20
20
  trusted users to edit structured content.
21
21
 
22
- To enable session authentication run `rails g typus:migration`.
22
+ To enable session authentication run `rails generate typus:migration`.
23
23
 
24
24
  DESC
25
25
 
@@ -6,7 +6,7 @@ module Typus
6
6
 
7
7
  desc <<-MSG
8
8
  Description:
9
- Copies all Typus views to your application.
9
+ Copies Typus views into your application.
10
10
 
11
11
  MSG
12
12
 
data/lib/support/hash.rb CHANGED
@@ -5,12 +5,7 @@ class Hash
5
5
  end
6
6
 
7
7
  def cleanup
8
- whitelist = %w(controller action id
9
- input
10
- layout
11
- resource resource_id resource_action
12
- selected
13
- back_to)
8
+ whitelist = %w(controller action id _input _popup resource attribute)
14
9
  delete_if { |k, v| !whitelist.include?(k) }
15
10
  end
16
11
 
@@ -6,6 +6,10 @@ module Typus
6
6
  @admin_user
7
7
  end
8
8
 
9
+ def current_role
10
+ admin_user.role.to_sym
11
+ end
12
+
9
13
  def authenticate; end
10
14
  def check_if_user_can_perform_action_on_user; end
11
15
  def check_if_user_can_perform_action_on_resources; end
@@ -25,10 +25,10 @@ module Typus
25
25
  send(params[:batch_action], ids)
26
26
  else
27
27
  notice = if action.empty?
28
- Typus::I18n.t("No bulk action selected.")
29
- else
30
- Typus::I18n.t("Items must be selected in order to perform actions on them. No items have been changed.")
31
- end
28
+ Typus::I18n.t("No bulk action selected.")
29
+ else
30
+ Typus::I18n.t("Items must be selected in order to perform actions on them. No items have been changed.")
31
+ end
32
32
  redirect_to :back, :notice => notice
33
33
  end
34
34
  end
@@ -6,7 +6,7 @@ module Typus
6
6
  base.before_filter :set_resources_action_for_headless_on_index, :only => [:index, :trash]
7
7
  base.before_filter :set_resources_action_for_headless, :only => [:new, :create, :edit, :show]
8
8
  base.helper_method :headless_mode?
9
- base.layout :set_headless_layout
9
+ base.layout :headless_layout
10
10
  end
11
11
 
12
12
  def set_resources_action_for_headless_on_index
@@ -19,29 +19,13 @@ module Typus
19
19
  end
20
20
  private :set_resources_action_for_headless
21
21
 
22
- def set_headless_layout
23
- params[:layout] || "admin/base"
24
- end
25
- private :set_headless_layout
26
-
27
- def headless_mode_with_custom_action_is_enabled?
28
- headless_mode? && params[:resource_action]
29
- end
30
- private :headless_mode_with_custom_action_is_enabled?
31
-
32
- def set_headless_resource_actions
33
- body = params[:resource_action].titleize
34
- url = { :controller => params[:resource].tableize,
35
- :action => params[:resource_action],
36
- :resource => params[:resource],
37
- :resource_id => params[:resource_id],
38
- :return_to => params[:return_to] }
39
- options = { :target => "_parent" }
40
- add_resource_action(body, url, options)
22
+ def headless_layout
23
+ headless_mode? ? "admin/headless" : "admin/base"
41
24
  end
25
+ private :headless_layout
42
26
 
43
27
  def headless_mode?
44
- params[:layout] == "admin/headless"
28
+ params[:_popup]
45
29
  end
46
30
 
47
31
  end
@@ -101,10 +101,10 @@ module Typus
101
101
  options = read_model_config['fields']['options']
102
102
 
103
103
  boolean = if options && options['booleans'] && boolean = options['booleans'][attribute.to_s]
104
- boolean.is_a?(String) ? boolean.extract_settings : boolean
105
- else
106
- ["True", "False"]
107
- end
104
+ boolean.is_a?(String) ? boolean.extract_settings : boolean
105
+ else
106
+ ["True", "False"]
107
+ end
108
108
 
109
109
  [[boolean.first, "true"], [boolean.last, "false"]]
110
110
  end
data/lib/typus/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Typus
2
- VERSION = "3.1.0.rc19"
2
+ VERSION = "3.1.0"
3
3
  end
data/lib/typus.rb CHANGED
@@ -197,7 +197,7 @@ module Typus
197
197
  detect_application_models.map do |model|
198
198
  class_name = model.sub(/\.rb$/,"").camelize
199
199
  klass = class_name.split("::").inject(Object) { |klass,part| klass.const_get(part) }
200
- class_name if is_active_record?(klass) || is_mongoid?(klass)
200
+ class_name if is_active_record?(klass) && !is_mongoid?(klass)
201
201
  end.compact
202
202
  end
203
203
 
@@ -81,7 +81,7 @@
81
81
  width: 18px;
82
82
  }
83
83
  .chzn-container-single .chzn-single div b {
84
- background: url('../chosen-sprite.png') no-repeat 0 1px;
84
+ background: url('/assets/chosen-sprite.png') no-repeat 0 1px;
85
85
  display: block;
86
86
  width: 100%;
87
87
  height: 100%;
@@ -92,14 +92,14 @@
92
92
  white-space: nowrap;
93
93
  }
94
94
  .chzn-container-single .chzn-search input {
95
- background: #fff url('../chosen-sprite.png') no-repeat 100% -20px;
96
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
97
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
98
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
99
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
100
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
101
- background: url('../chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
102
- background: url('../chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
95
+ background: #fff url('/assets/chosen-sprite.png') no-repeat 100% -20px;
96
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
97
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
98
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
99
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
100
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
101
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
102
+ background: url('/assets/chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
103
103
  margin: 1px 0;
104
104
  padding: 4px 20px 4px 5px;
105
105
  outline: 0;
@@ -196,7 +196,7 @@
196
196
  width: 8px;
197
197
  height: 9px;
198
198
  font-size: 1px;
199
- background: url('../chosen-sprite.png') right top no-repeat;
199
+ background: url('/assets/chosen-sprite.png') right top no-repeat;
200
200
  }
201
201
  .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
202
202
  background-position: right -9px;
@@ -321,14 +321,14 @@
321
321
  .chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
322
322
  .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
323
323
  .chzn-rtl .chzn-search input {
324
- background: url('../chosen-sprite.png') no-repeat -38px -20px, #ffffff;
325
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
326
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
327
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
328
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
329
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
330
- background: url('../chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
331
- background: url('../chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
324
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, #ffffff;
325
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
326
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
327
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
328
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
329
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
330
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
331
+ background: url('/assets/chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
332
332
  padding: 4px 5px 4px 20px;
333
333
  }
334
334
  /* @end */
@@ -35,7 +35,7 @@
35
35
  left: 0;
36
36
  width: 40px;
37
37
  height: 480px;
38
- background-image: url('../fancybox.png');
38
+ background-image: url('/assets/fancybox.png');
39
39
  }
40
40
 
41
41
  #fancybox-overlay {
@@ -99,7 +99,7 @@
99
99
  right: -15px;
100
100
  width: 30px;
101
101
  height: 30px;
102
- background: transparent url('../fancybox.png') -40px 0px;
102
+ background: transparent url('/assets/fancybox.png') -40px 0px;
103
103
  cursor: pointer;
104
104
  z-index: 1103;
105
105
  display: none;
@@ -137,7 +137,7 @@
137
137
  width: 35%;
138
138
  cursor: pointer;
139
139
  outline: none;
140
- background: transparent url('../blank.gif');
140
+ background: transparent url('/assets/blank.gif');
141
141
  z-index: 1102;
142
142
  display: none;
143
143
  }
@@ -163,12 +163,12 @@
163
163
  }
164
164
 
165
165
  #fancybox-left-ico {
166
- background-image: url('../fancybox.png');
166
+ background-image: url('/assets/fancybox.png');
167
167
  background-position: -40px -30px;
168
168
  }
169
169
 
170
170
  #fancybox-right-ico {
171
- background-image: url('../fancybox.png');
171
+ background-image: url('/assets/fancybox.png');
172
172
  background-position: -40px -60px;
173
173
  }
174
174
 
@@ -199,13 +199,13 @@
199
199
  top: -20px;
200
200
  left: 0;
201
201
  width: 100%;
202
- background-image: url('../fancybox-x.png');
202
+ background-image: url('/assets/fancybox-x.png');
203
203
  }
204
204
 
205
205
  #fancybox-bg-ne {
206
206
  top: -20px;
207
207
  right: -20px;
208
- background-image: url('../fancybox.png');
208
+ background-image: url('/assets/fancybox.png');
209
209
  background-position: -40px -162px;
210
210
  }
211
211
 
@@ -213,14 +213,14 @@
213
213
  top: 0;
214
214
  right: -20px;
215
215
  height: 100%;
216
- background-image: url('../fancybox-y.png');
216
+ background-image: url('/assets/fancybox-y.png');
217
217
  background-position: -20px 0px;
218
218
  }
219
219
 
220
220
  #fancybox-bg-se {
221
221
  bottom: -20px;
222
222
  right: -20px;
223
- background-image: url('../fancybox.png');
223
+ background-image: url('/assets/fancybox.png');
224
224
  background-position: -40px -182px;
225
225
  }
226
226
 
@@ -228,14 +228,14 @@
228
228
  bottom: -20px;
229
229
  left: 0;
230
230
  width: 100%;
231
- background-image: url('../fancybox-x.png');
231
+ background-image: url('/assets/fancybox-x.png');
232
232
  background-position: 0px -20px;
233
233
  }
234
234
 
235
235
  #fancybox-bg-sw {
236
236
  bottom: -20px;
237
237
  left: -20px;
238
- background-image: url('../fancybox.png');
238
+ background-image: url('/assets/fancybox.png');
239
239
  background-position: -40px -142px;
240
240
  }
241
241
 
@@ -243,13 +243,13 @@
243
243
  top: 0;
244
244
  left: -20px;
245
245
  height: 100%;
246
- background-image: url('../fancybox-y.png');
246
+ background-image: url('/assets/fancybox-y.png');
247
247
  }
248
248
 
249
249
  #fancybox-bg-nw {
250
250
  top: -20px;
251
251
  left: -20px;
252
- background-image: url('../fancybox.png');
252
+ background-image: url('/assets/fancybox.png');
253
253
  background-position: -40px -122px;
254
254
  }
255
255
 
@@ -282,7 +282,7 @@
282
282
 
283
283
  #fancybox-title-over {
284
284
  padding: 10px;
285
- background-image: url('../fancy_title_over.png');
285
+ background-image: url('/assets/fancy_title_over.png');
286
286
  display: block;
287
287
  }
288
288
 
@@ -306,7 +306,7 @@
306
306
 
307
307
  #fancybox-title-float-left {
308
308
  padding: 0 0 0 15px;
309
- background: url('../fancybox.png') -40px -90px no-repeat;
309
+ background: url('/assets/fancybox.png') -40px -90px no-repeat;
310
310
  }
311
311
 
312
312
  #fancybox-title-float-main {
@@ -314,12 +314,12 @@
314
314
  line-height: 29px;
315
315
  font-weight: bold;
316
316
  padding: 0 0 3px 0;
317
- background: url('../fancybox-x.png') 0px -40px;
317
+ background: url('/assets/fancybox-x.png') 0px -40px;
318
318
  }
319
319
 
320
320
  #fancybox-title-float-right {
321
321
  padding: 0 0 0 15px;
322
- background: url('../fancybox.png') -55px -90px no-repeat;
322
+ background: url('/assets/fancybox.png') -55px -90px no-repeat;
323
323
  }
324
324
 
325
325
  /* IE6 */
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typus
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0.rc19
5
- prerelease: 6
4
+ version: 3.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Francesc Esplugas
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-31 00:00:00.000000000Z
12
+ date: 2011-09-02 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jquery-rails
16
- requirement: &70366422637200 !ruby/object:Gem::Requirement
16
+ requirement: &70152604331140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70366422637200
24
+ version_requirements: *70152604331140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: kaminari
27
- requirement: &70366422636760 !ruby/object:Gem::Requirement
27
+ requirement: &70152604330700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70366422636760
35
+ version_requirements: *70152604330700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rails
38
- requirement: &70366422636260 !ruby/object:Gem::Requirement
38
+ requirement: &70152604330180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 3.1.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70366422636260
46
+ version_requirements: *70152604330180
47
47
  description: Ruby on Rails Admin Panel (Engine) to allow trusted users edit structured
48
48
  content.
49
49
  email:
@@ -320,13 +320,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
320
320
  version: '0'
321
321
  segments:
322
322
  - 0
323
- hash: -1042388540158321156
323
+ hash: 4352251271305818957
324
324
  required_rubygems_version: !ruby/object:Gem::Requirement
325
325
  none: false
326
326
  requirements:
327
- - - ! '>'
327
+ - - ! '>='
328
328
  - !ruby/object:Gem::Version
329
- version: 1.3.1
329
+ version: '0'
330
+ segments:
331
+ - 0
332
+ hash: 4352251271305818957
330
333
  requirements: []
331
334
  rubyforge_project: typus
332
335
  rubygems_version: 1.8.9