typus 3.0.4 → 3.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,30 +2,48 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem "acts_as_list"
6
- gem "acts_as_tree"
7
- gem "dragonfly", "~>0.8.1"
8
- gem "factory_girl"
5
+ gem 'acts_as_list'
6
+ gem 'acts_as_tree'
7
+ gem 'dragonfly', '~>0.8.1'
8
+ gem 'factory_girl'
9
+ gem 'paperclip'
10
+ gem 'rack-cache', :require => 'rack/cache'
11
+ gem 'rails', '~> 3.0'
9
12
 
10
13
  group :test do
11
- gem "mysql"
12
- gem "pg"
14
+ gem 'shoulda'
15
+ gem 'tartare', :git => 'https://github.com/fesplugas/rails-tartare.git', :require => false
16
+
17
+ gem 'mocha'
13
18
  end
14
19
 
15
- gem "paperclip"
20
+ group :development, :test do
16
21
 
17
- gem "rack-cache", :require => "rack/cache"
18
- gem "rails", "~> 3.0"
22
+ platforms :jruby do
23
+ gem 'activerecord-jdbc-adapter', :require => false
24
+ # gem 'activerecord-jdbcpostgresql-adapter'
25
+ gem 'jdbc-mysql'
26
+ gem 'jdbc-postgres'
27
+ gem 'jdbc-sqlite3'
28
+ end
19
29
 
20
- gem 'sqlite3-ruby', '1.2.1'
30
+ platforms :ruby do
31
+ gem 'mysql2'
32
+ gem 'pg'
33
+ gem 'sqlite3'
34
+ end
21
35
 
22
- # Keep this here because I use it as reference for development.
23
- gem "fastercsv", "1.5.3" if RUBY_VERSION < '1.9'
24
- gem "render_inheritable"
25
- gem "will_paginate", "~> 3.0.pre2"
36
+ end
37
+
38
+ group :production do
39
+
40
+ platforms :jruby do
41
+ gem 'activerecord-jdbc-adapter'
42
+ gem 'jdbc-sqlite3'
43
+ end
44
+
45
+ platforms :ruby do
46
+ gem 'sqlite3'
47
+ end
26
48
 
27
- group :test do
28
- gem "shoulda"
29
- gem "tartare", :git => "https://github.com/fesplugas/rails-tartare.git", :require => false
30
- gem "mocha"
31
49
  end
@@ -9,8 +9,8 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- typus (3.0.3)
13
- fastercsv (= 1.5.3)
12
+ typus (3.0.4)
13
+ fastercsv (~> 1.5)
14
14
  render_inheritable
15
15
  will_paginate (~> 3.0.pre2)
16
16
 
@@ -48,7 +48,7 @@ GEM
48
48
  acts_as_tree (0.1.1)
49
49
  arel (2.0.7)
50
50
  builder (2.1.2)
51
- capybara (0.4.0)
51
+ capybara (0.4.1.1)
52
52
  celerity (>= 0.7.9)
53
53
  culerity (>= 0.2.4)
54
54
  mime-types (>= 1.16)
@@ -56,22 +56,22 @@ GEM
56
56
  rack (>= 1.0.0)
57
57
  rack-test (>= 0.5.4)
58
58
  selenium-webdriver (>= 0.0.27)
59
- xpath (~> 0.1.2)
59
+ xpath (~> 0.1.3)
60
60
  celerity (0.8.7)
61
61
  childprocess (0.1.6)
62
62
  ffi (~> 0.6.3)
63
- culerity (0.2.14)
63
+ culerity (0.2.15)
64
64
  dragonfly (0.8.2)
65
65
  rack
66
66
  erubis (2.6.6)
67
67
  abstract (>= 1.0.0)
68
68
  factory_girl (1.3.3)
69
- fastercsv (1.5.3)
69
+ fastercsv (1.5.4)
70
70
  ffi (0.6.3)
71
71
  rake (>= 0.8.7)
72
72
  i18n (0.5.0)
73
- json_pure (1.4.6)
74
- mail (2.2.14)
73
+ json_pure (1.5.1)
74
+ mail (2.2.15)
75
75
  activesupport (>= 2.3.6)
76
76
  i18n (>= 0.4.0)
77
77
  mime-types (~> 1.16)
@@ -79,12 +79,12 @@ GEM
79
79
  mime-types (1.16)
80
80
  mocha (0.9.10)
81
81
  rake
82
- mysql (2.8.1)
82
+ mysql2 (0.2.6)
83
83
  nokogiri (1.4.4)
84
84
  paperclip (2.3.8)
85
85
  activerecord
86
86
  activesupport
87
- pg (0.10.0)
87
+ pg (0.10.1)
88
88
  polyglot (0.3.1)
89
89
  rack (1.2.1)
90
90
  rack-cache (1.0)
@@ -116,7 +116,7 @@ GEM
116
116
  json_pure
117
117
  rubyzip
118
118
  shoulda (2.11.3)
119
- sqlite3-ruby (1.2.1)
119
+ sqlite3 (1.3.3)
120
120
  thor (0.14.6)
121
121
  treetop (1.4.9)
122
122
  polyglot (>= 0.3.1)
@@ -129,20 +129,21 @@ PLATFORMS
129
129
  ruby
130
130
 
131
131
  DEPENDENCIES
132
+ activerecord-jdbc-adapter
132
133
  acts_as_list
133
134
  acts_as_tree
134
135
  dragonfly (~> 0.8.1)
135
136
  factory_girl
136
- fastercsv (= 1.5.3)
137
+ jdbc-mysql
138
+ jdbc-postgres
139
+ jdbc-sqlite3
137
140
  mocha
138
- mysql
141
+ mysql2
139
142
  paperclip
140
143
  pg
141
144
  rack-cache
142
145
  rails (~> 3.0)
143
- render_inheritable
144
146
  shoulda
145
- sqlite3-ruby (= 1.2.1)
147
+ sqlite3
146
148
  tartare!
147
149
  typus!
148
- will_paginate (~> 3.0.pre2)
data/README.md CHANGED
@@ -18,8 +18,8 @@ Français, Magyar, Italiano, Portuguese, Russian, 中文)
18
18
  - Integrated [paperclip][1] and [dragonfly][2] attachments viewer.
19
19
  - Low memory footprint.
20
20
  - Works with `Rails 3.0`.
21
- - Tested with `Ruby 1.8.7-p300` and `Ruby 1.9.2-p136`.
22
- - Tested with SQLite, MySQL and PostgreSQL.
21
+ - Tested with `Ruby 1.8.7-p300` and `Ruby 1.9.2-p136` and `JRuby 1.5.6`.
22
+ - Tested with `SQLite`, `MySQL` and `PostgreSQL`.
23
23
  - MIT License, the same as Rails.
24
24
 
25
25
  ## Links
@@ -38,6 +38,9 @@ Add **Typus** to your `Gemfile`
38
38
 
39
39
  gem 'typus', :git => 'https://github.com/fesplugas/typus.git'
40
40
 
41
+ # If you have problems with "Smart HTTP" use the "Git Transfer Protocol".
42
+ # gem 'typus', :git => 'git://github.com/fesplugas/typus.git'
43
+
41
44
  Update your bundle
42
45
 
43
46
  $ bundle install
@@ -52,9 +55,28 @@ Start the application server
52
55
 
53
56
  and go to <http://0.0.0.0:3000/admin>.
54
57
 
55
- ## License
58
+ ## MIT License
59
+
60
+ Copyright (c) 2007-2011 Francesc Esplugas Marti
61
+
62
+ Permission is hereby granted, free of charge, to any person obtaining
63
+ a copy of this software and associated documentation files (the
64
+ "Software"), to deal in the Software without restriction, including
65
+ without limitation the rights to use, copy, modify, merge, publish,
66
+ distribute, sublicense, and/or sell copies of the Software, and to
67
+ permit persons to whom the Software is furnished to do so, subject to
68
+ the following conditions:
69
+
70
+ The above copyright notice and this permission notice shall be
71
+ included in all copies or substantial portions of the Software.
56
72
 
57
- Copyright © 2007-2011 Francesc Esplugas, released under the MIT license.
73
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
74
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
75
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
76
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
77
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
78
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
79
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
58
80
 
59
81
  [1]: http://rubygems.org/gems/paperclip
60
82
  [2]: http://rubygems.org/gems/dragonfly
data/Rakefile CHANGED
@@ -38,6 +38,9 @@ task :release => :build do
38
38
  system "git push && git push --tags"
39
39
  system "gem push typus-#{Typus::VERSION}.gem"
40
40
  system "git clean -fd && rm -f typus-#{Typus::VERSION}.gem"
41
+ system "git branch -D 3-0-stable"
42
+ system "git checkout -b 3-0-stable && git push -f"
43
+ system "git checkout master"
41
44
  end
42
45
 
43
46
  desc 'Deploy'
@@ -21,8 +21,8 @@ class Admin::ResourcesController < Admin::BaseController
21
21
  # your formats.
22
22
  #
23
23
  def index
24
- add_action(:action_name => default_action.titleize, :action => default_action)
25
- add_action(:action_name => "Trash", :action => "destroy", :confirm => "#{Typus::I18n.t("Trash")}?", :method => 'delete')
24
+ add_resource_action(default_action.titleize, {:action => default_action}, {})
25
+ add_resource_action("Trash", {:action => "destroy"}, {:confirm => "#{Typus::I18n.t("Trash")}?", :method => 'delete'})
26
26
 
27
27
  get_objects
28
28
 
@@ -34,8 +34,7 @@ class Admin::ResourcesController < Admin::BaseController
34
34
 
35
35
  def new
36
36
  item_params = params.dup
37
- rejections = %w(controller action resource resource_id back_to selected)
38
- item_params.delete_if { |k, v| rejections.include?(k) }
37
+ item_params.delete_if { |k, v| !@resource.columns.map(&:name).include?(k) }
39
38
  @item = @resource.new(item_params)
40
39
  end
41
40
 
@@ -57,8 +56,8 @@ class Admin::ResourcesController < Admin::BaseController
57
56
  end
58
57
 
59
58
  def edit
60
- add_action(:action_name => default_action.titleize, :action => default_action)
61
- add_action(:action_name => "Unrelate", :action => "unrelate", :confirm => "#{Typus::I18n.t("Unrelate")}?", :resource => @resource.model_name, :resource_id => @item.id)
59
+ add_resource_action(default_action.titleize, {:action => default_action}, {})
60
+ add_resource_action("Unrelate", {:action => "unrelate", :resource => @resource.model_name, :resource_id => @item.id}, {:confirm => "#{Typus::I18n.t("Unrelate")}?"})
62
61
  end
63
62
 
64
63
  def show
@@ -81,7 +80,8 @@ class Admin::ResourcesController < Admin::BaseController
81
80
 
82
81
  def detach
83
82
  if @item.update_attributes(params[:attribute] => nil)
84
- redirect_on_success
83
+ notice = Typus::I18n.t("%{model} successfully updated.", :model => @resource.model_name.human)
84
+ redirect_to :back, :notice => notice
85
85
  else
86
86
  render :edit
87
87
  end
@@ -184,7 +184,7 @@ class Admin::ResourcesController < Admin::BaseController
184
184
 
185
185
  case item_class.relationship_with(@resource)
186
186
  when :has_one
187
- association_name = @resource.model_name.downcase.to_sym
187
+ association_name = @resource.model_name.underscore.to_sym
188
188
  worked = item.send(association_name).delete
189
189
  else
190
190
  association_name ||= @resource.model_name.tableize.to_sym
@@ -249,19 +249,24 @@ class Admin::ResourcesController < Admin::BaseController
249
249
 
250
250
  def redirect_on_success
251
251
  action = @resource.typus_options_for(:action_after_save)
252
+ path = params.dup.cleanup
253
+ path.merge!(:action => action)
252
254
 
253
255
  case params[:action]
254
256
  when "create"
255
- path = { :action => action }
256
257
  path.merge!(:id => @item.id) unless action.eql?("index")
257
258
  notice = Typus::I18n.t("%{model} successfully created.", :model => @resource.model_name.human)
258
259
  when "update", "detach"
259
- path = case action
260
- when "index"
261
- params[:back_to] ? "#{params[:back_to]}##{@resource.to_resource}" : { :action => action }
262
- else
263
- { :action => action, :id => @item.id, :back_to => params[:back_to] }
264
- end
260
+ case action
261
+ when "index"
262
+ if params[:back_to]
263
+ path = "#{params[:back_to]}##{@resource.to_resource}"
264
+ else
265
+ path.delete_if { |k, v| %w(action id).include?(k) }
266
+ end
267
+ else
268
+ path.merge!(:action => action) #, :id => @item.id)
269
+ end
265
270
  notice = Typus::I18n.t("%{model} successfully updated.", :model => @resource.model_name.human)
266
271
  end
267
272
 
@@ -339,7 +344,7 @@ class Admin::ResourcesController < Admin::BaseController
339
344
  case item_class.relationship_with(@resource)
340
345
  when :has_one
341
346
  # Order#invoice = @item
342
- association_name = @resource.model_name.downcase.to_sym
347
+ association_name = @resource.model_name.underscore.to_sym
343
348
  item.send("#{association_name}=", @item)
344
349
  worked = true
345
350
  when :has_and_belongs_to_many
@@ -352,6 +357,10 @@ class Admin::ResourcesController < Admin::BaseController
352
357
  if item
353
358
  worked = @item.send(association_name).push(item)
354
359
  end
360
+ when :has_many
361
+ # Dog#image_holders
362
+ association_name = @resource.model_name.tableize.to_sym
363
+ worked = item.send(association_name).push(@item)
355
364
  end
356
365
 
357
366
  association = @resource.reflect_on_association(association_name)
@@ -375,7 +384,7 @@ class Admin::ResourcesController < Admin::BaseController
375
384
  if worked
376
385
  notice = Typus::I18n.t("%{model} successfully updated.", :model => item_class.model_name.human)
377
386
  else
378
- alert = @item.error.full_messages
387
+ alert = @item.errors.full_messages
379
388
  end
380
389
  end
381
390
 
@@ -405,7 +414,7 @@ class Admin::ResourcesController < Admin::BaseController
405
414
  item = item_class.find(params[:resource_id]) if params[:resource_id]
406
415
 
407
416
  if item_class.relationship_with(@resource) == :has_one
408
- association_name = @resource.model_name.downcase.to_sym
417
+ association_name = @resource.model_name.underscore.to_sym
409
418
  if item.send(association_name)
410
419
  render :text => "Not allowed!", :status => :unprocessable_entity
411
420
  end
@@ -11,14 +11,14 @@ module Admin
11
11
  end
12
12
 
13
13
  def link_to_detach_attribute(attribute)
14
- validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map { |i| i.attributes.to_s }.flatten
14
+ validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map { |i| i.attributes }.flatten.map { |i| i.to_s }
15
15
 
16
16
  attachment = @item.send(attribute)
17
17
 
18
18
  field = case get_type_of_attachment(attachment)
19
- when :dragonfly then attribute
20
- when :paperclip then "#{attribute}_file_name"
21
- end
19
+ when :dragonfly then attribute
20
+ when :paperclip then "#{attribute}_file_name"
21
+ end
22
22
 
23
23
  if !validators.include?(field) && attachment
24
24
  attribute_i18n = @item.class.human_attribute_name(attribute)
@@ -2,7 +2,7 @@ module Admin
2
2
 
3
3
  module FiltersHelper
4
4
 
5
- def build_filters(resource = @resource)
5
+ def build_filters(resource = @resource, params = params)
6
6
  typus_filters = resource.typus_filters
7
7
 
8
8
  return if typus_filters.empty?
@@ -24,7 +24,17 @@ module Admin
24
24
  { :filter => filter, :items => items }
25
25
  end
26
26
 
27
- render "admin/helpers/filters/filters", :filters => filters
27
+ hidden_filters = params.dup
28
+
29
+ # Remove default params.
30
+ rejections = %w(controller action locale utf8 sort_order order_by)
31
+ hidden_filters.delete_if { |k, v| rejections.include?(k) }
32
+
33
+ # Remove also custom params.
34
+ rejections = filters.map { |i| i[:filter] }
35
+ hidden_filters.delete_if { |k, v| rejections.include?(k) }
36
+
37
+ render "admin/helpers/filters/filters", :filters => filters, :hidden_filters => hidden_filters
28
38
  end
29
39
 
30
40
  def set_filter(key, value)
@@ -44,7 +54,7 @@ module Admin
44
54
  class_name = att_assoc.options[:class_name] || filter.capitalize.camelize
45
55
  resource = class_name.typus_constantize
46
56
 
47
- items = [[Typus::I18n.t("View belongs all %{attribute}", :attribute => @resource.human_attribute_name(filter).downcase.pluralize), ""]]
57
+ items = [[Typus::I18n.t("View all %{attribute}", :attribute => @resource.human_attribute_name(filter).downcase.pluralize), ""]]
48
58
  items += resource.order(resource.typus_order_by).map { |v| [v.to_label, v.id] }
49
59
  end
50
60
 
@@ -70,23 +80,10 @@ module Admin
70
80
  end
71
81
 
72
82
  def string_filter(filter)
73
- values = @resource::const_get(filter.to_s.upcase)
74
-
83
+ values = @resource::const_get(filter.to_s.upcase).to_a
75
84
  items = [[Typus::I18n.t("Show by %{attribute}", :attribute => @resource.human_attribute_name(filter).downcase), ""]]
76
-
77
- array = case values
78
- when Hash
79
- values
80
- when Array
81
- if values.first.is_a?(Array)
82
- keys, values = values.map { |i| i.first }, values.map { |i| i.last }
83
- keys.to_hash_with(values)
84
- else
85
- values.to_hash_with(values)
86
- end
87
- end
88
-
89
- items += array.to_a
85
+ array = values.first.is_a?(Array) ? values : values.map { |i| [i, i] }
86
+ items += array
90
87
  end
91
88
 
92
89
  def predefined_filters
@@ -0,0 +1,20 @@
1
+ module Admin
2
+
3
+ module ListHelper
4
+
5
+ def resources_actions
6
+ @resources_actions ||= []
7
+ end
8
+
9
+ def list_actions
10
+ resources_actions.map do |body, url, options|
11
+ if admin_user.can?(url[:action], @resource.name)
12
+ path = params.dup.merge!(url)
13
+ link_to Typus::I18n.t(body), path.cleanup, options # .merge(:target => "_parent")
14
+ end
15
+ end.compact.join(" / ").html_safe
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -2,6 +2,7 @@ module Admin
2
2
 
3
3
  module ResourcesHelper
4
4
 
5
+ include Admin::ListHelper
5
6
  include Admin::FiltersHelper
6
7
  include Admin::FormHelper
7
8
  include Admin::RelationshipsHelper
@@ -2,12 +2,14 @@ module Admin
2
2
 
3
3
  module SearchHelper
4
4
 
5
- def search(resource = @resource)
5
+ def search(resource = @resource, params = params)
6
6
  if (typus_search = resource.typus_defaults_for(:search)) && typus_search.any?
7
- search_params = params.dup
8
- %w(action controller id search page utf8).each { |p| search_params.delete(p) }
9
- options = { :hidden_params => search_params.map { |k, v| hidden_field_tag(k, v) } }
10
- render "admin/helpers/search/search", options
7
+
8
+ hidden_filters = params.dup
9
+ rejections = %w(controller action locale utf8 sort_order order_by search)
10
+ hidden_filters.delete_if { |k, v| rejections.include?(k) }
11
+
12
+ render "admin/helpers/search/search", :hidden_filters => hidden_filters
11
13
  end
12
14
  end
13
15
 
@@ -47,16 +47,16 @@ module Admin
47
47
  fields.map { |k, v| send("table_#{v}_field", k, item) }
48
48
  end
49
49
 
50
- def actions
51
- @actions ||= []
50
+ def resource_actions
51
+ @resource_actions ||= []
52
52
  end
53
53
 
54
54
  def table_actions(model, item, association_name = nil)
55
- actions.map do |action|
56
- if admin_user.can?(action[:action], model.name)
57
- link_to Typus::I18n.t(action[:action_name]),
58
- { :controller => model.to_resource, :action => action[:action], :id => item.id, :resource => action[:resource], :resource_id => action[:resource_id], :association_name => association_name },
59
- { :confirm => action[:confirm], :method => action[:method], :target => "_parent" }
55
+ resource_actions.map do |body, url, options|
56
+ if admin_user.can?(url[:action], model.name)
57
+ link_to Typus::I18n.t(body),
58
+ params.dup.cleanup.merge(url).merge(:controller => model.to_resource, :id => item.id),
59
+ options.merge(:target => "_parent")
60
60
  end
61
61
  end.compact.join(" / ").html_safe
62
62
  end
@@ -137,8 +137,8 @@ module Admin
137
137
 
138
138
  def table_boolean_field(attribute, item)
139
139
  status = item.send(attribute)
140
- boolean_hash = item.class.typus_boolean(attribute).invert
141
- human_boolean = status ? boolean_hash["true"] : boolean_hash["false"]
140
+ boolean_assoc = item.class.typus_boolean(attribute)
141
+ human_boolean = (status ? boolean_assoc.rassoc("true") : boolean_assoc.rassoc("false")).first
142
142
 
143
143
  options = { :controller => "/admin/#{item.class.to_resource}",
144
144
  :action => "toggle",
@@ -5,7 +5,11 @@
5
5
  <% filters.each do |filter| %>
6
6
  <li><%= select_tag filter[:filter], options_for_select(filter[:items], params[filter[:filter]]) %></li>
7
7
  <% end %>
8
- <%= hidden_field_tag :search, params[:search] if params[:search] %>
8
+
9
+ <% hidden_filters.each do |key, value| %>
10
+ <%= hidden_field_tag key, value %>
11
+ <% end %>
12
+
9
13
  <li><%= submit_tag Typus::I18n.t("Filter"), :name => nil %></li>
10
14
  </ul>
11
15
  </div>
@@ -1,12 +1,15 @@
1
1
  <div id="search">
2
2
 
3
- <%= form_tag url_for(:controller => params[:controller]), :method => :get do %>
3
+ <%= form_tag nil, :method => :get do %>
4
+
4
5
  <ul>
5
6
  <li><%= search_field_tag "search", nil, :id => "quicksearch", :title => (params[:search] || Typus::I18n.t("Search")) %></li>
6
7
  </ul>
7
- <% hidden_params.each do |field| %>
8
- <%= field %>
8
+
9
+ <% hidden_filters.each do |key, value| %>
10
+ <%= hidden_field_tag key, value %>
9
11
  <% end %>
12
+
10
13
  <% end %>
11
14
 
12
15
  </div>
@@ -9,6 +9,7 @@
9
9
 
10
10
  <h2>
11
11
  <%= page_title %>
12
+ <small><%= list_actions %></small>
12
13
  </h2>
13
14
 
14
15
  <%= display_link_to_previous %>
@@ -16,11 +17,7 @@
16
17
  <%= render 'edit' %>
17
18
 
18
19
  <%
19
- options = { :action => "update",
20
- :id => @item.id ,
21
- :back_to => params[:back_to],
22
- :resource => params[:resource],
23
- :resource_id => params[:resource_id] }
20
+ options = params.dup.cleanup.merge!(:action => 'update')
24
21
  button = Typus::I18n.t("Save %{resource}", :resource => @resource.model_name.human)
25
22
  %>
26
23
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  <h2>
9
9
  <%= page_title %>
10
+ <small><%= list_actions %></small>
10
11
  </h2>
11
12
 
12
13
  <%= display_flash_message %>
@@ -15,7 +16,7 @@
15
16
 
16
17
  <ul class="predefined_filters">
17
18
  <% predefined_filters.each do |filter, action, scope| %>
18
- <li><%= link_to Typus::I18n.t(filter), :action => action %> (<%= @resource.send(scope).count %>)</li>
19
+ <li><%= link_to Typus::I18n.t(filter), params.dup.cleanup.merge(:action => action) %> (<%= @resource.send(scope).count %>)</li>
19
20
  <% end %>
20
21
  </ul>
21
22
 
@@ -30,5 +31,5 @@
30
31
  <%= raw build_list(@resource, @fields, @items) %>
31
32
  <%= will_paginate(@items, Typus.pagination) %>
32
33
  <% else %>
33
- <p><%= Typus::I18n.t("No %{resources} found.", :resources => @resource.model_name.human.pluralize.downcase) %></p>
34
+ <p><%= Typus::I18n.t("No %{resources} found.", :resources => @resource.model_name.human.downcase.pluralize) %></p>
34
35
  <% end %>
@@ -7,17 +7,14 @@
7
7
 
8
8
  <h2>
9
9
  <%= page_title %>
10
+ <small><%= list_actions %></small>
10
11
  </h2>
11
12
 
12
13
  <%= display_link_to_previous %>
13
14
  <%= render 'new' %>
14
15
 
15
16
  <%
16
- options = { :action => 'create',
17
- :back_to => params[:back_to],
18
- :selected => params[:selected],
19
- :resource => params[:resource],
20
- :resource_id => params[:resource_id] }
17
+ options = params.dup.cleanup.merge(:action => 'create')
21
18
  button = Typus::I18n.t("Create %{resource}", :resource => @resource.model_name.human)
22
19
  %>
23
20
 
@@ -7,20 +7,20 @@
7
7
 
8
8
  <h2>
9
9
  <%= page_title %>
10
+ <small><%= list_actions %></small>
10
11
  </h2>
11
12
 
12
13
  <%= display_flash_message %>
13
14
  <%= render 'show' %>
14
15
 
15
16
  <dl>
16
- <%- @fields.each do |field| -%>
17
- <dt><%=h @resource.human_attribute_name(field.first) %></dt>
17
+ <%- @fields.each do |key, value| -%>
18
+ <dt><%=h @resource.human_attribute_name(key) %></dt>
18
19
  <%-
19
- data_type = field.last
20
- raw_data = @item.send(field.first)
21
- data = case data_type
20
+ raw_data = @item.send(key)
21
+ data = case value
22
22
  when :boolean
23
- @resource.typus_boolean(field.first).invert[raw_data.to_s]
23
+ @resource.typus_boolean(key).invert[raw_data.to_s]
24
24
  when :belongs_to
25
25
  if raw_data
26
26
  link_to raw_data.to_label, { :controller => raw_data.class.to_resource,
@@ -28,9 +28,13 @@
28
28
  :id => raw_data }
29
29
  end
30
30
  when :file
31
- typus_file_preview(@item, field.first)
31
+ typus_file_preview(@item, key)
32
32
  when :selector
33
- @item.mapping(field.first)
33
+ @item.mapping(key)
34
+ when :datetime
35
+ if raw_data
36
+ I18n.localize(raw_data, :format => @resource.typus_date_format(key))
37
+ end
34
38
  else
35
39
  raw_data
36
40
  end
@@ -1,7 +1,7 @@
1
1
  <div class="box_relationships" id="<%= association_name %>">
2
2
 
3
3
  <h2>
4
- <%= association_name.capitalize.pluralize %>
4
+ <%= association_name.humanize.pluralize %>
5
5
  <small><%= add_new %></small>
6
6
  </h2>
7
7
 
@@ -11,7 +11,7 @@
11
11
  <%= table %>
12
12
  <%= will_paginate(@items, Typus.pagination.merge(:anchor => association_name)) %>
13
13
  <% else %>
14
- <p><%= Typus::I18n.t("No %{resources} found.", :resources => association_name.pluralize.downcase) %></p>
14
+ <p><%= Typus::I18n.t("No %{resources} found.", :resources => association_name.humanize.downcase.pluralize) %></p>
15
15
  <% end %>
16
16
 
17
17
  </div>
@@ -8,7 +8,7 @@
8
8
  <meta name="apple-mobile-web-app-capable" content="yes" />
9
9
  <meta name="generator" content="Typus <%= Typus::VERSION %>" />
10
10
 
11
- <title><%= yield :title %></title>
11
+ <title><%= Typus.admin_title %> &mdash; <%= yield :title %></title>
12
12
 
13
13
  <%= stylesheet_link_tag "/admin/stylesheets/screen",
14
14
  "/admin/stylesheets/application",
@@ -8,7 +8,7 @@
8
8
  <meta name="apple-mobile-web-app-capable" content="yes" />
9
9
  <meta name="generator" content="Typus <%= Typus::VERSION %>" />
10
10
 
11
- <title><%= yield :title %></title>
11
+ <title><%= Typus.admin_title %> &mdash; <%= yield :title %></title>
12
12
 
13
13
  <%= stylesheet_link_tag "/admin/stylesheets/screen",
14
14
  "/admin/stylesheets/application" %>
@@ -2,7 +2,7 @@ class ActiveRecord::Base
2
2
 
3
3
  def self.relationship_with(model)
4
4
  association = reflect_on_association(model.table_name.to_sym) ||
5
- reflect_on_association(model.model_name.downcase.to_sym)
5
+ reflect_on_association(model.model_name.underscore.to_sym)
6
6
  association.macro
7
7
  end
8
8
 
@@ -35,19 +35,9 @@ class ActiveRecord::Base
35
35
  # => "Publicado"
36
36
  #++
37
37
  def mapping(attribute)
38
- values = self.class::const_get(attribute.to_s.upcase)
39
-
40
- if values.is_a?(Array)
41
- case values.first
42
- when Array
43
- array_keys, array_values = values.transpose
44
- else
45
- array_keys = array_values = values
46
- end
47
- values = array_keys.to_hash_with(array_values)
48
- end
49
-
50
- values.invert[send(attribute)]
38
+ values = self.class::const_get(attribute.to_s.upcase).to_a
39
+ array = values.first.is_a?(Array) ? values : values.map { |i| [i, i] }
40
+ array.rassoc(send(attribute)).first
51
41
  end
52
42
 
53
43
  def to_label
@@ -4,4 +4,14 @@ class Hash
4
4
  delete_if { |k, v| v.blank? }
5
5
  end
6
6
 
7
+ def cleanup
8
+ whitelist = %w(controller action id
9
+ CKEditor CKEditorFuncNum langCode
10
+ layout
11
+ resource resource_id resource_action
12
+ selected
13
+ back_to)
14
+ delete_if { |k, v| !whitelist.include?(k) }
15
+ end
16
+
7
17
  end
@@ -1,7 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require "support/active_record"
4
- require "support/array"
5
4
  require "support/hash"
6
5
  require "support/object"
7
6
  require "support/string"
@@ -4,22 +4,36 @@ module Typus
4
4
 
5
5
  protected
6
6
 
7
- def add_action(*args)
8
- options = args.extract_options!
9
- @actions ||= []
10
- @actions << options
7
+ def add_resource_action(*args)
8
+ @resource_actions ||= []
9
+ @resource_actions << args
11
10
  end
12
11
 
13
- def prepend_action(*args)
14
- options = args.extract_options!
15
- @actions ||= []
16
- @actions = @actions.unshift(options)
12
+ def prepend_resource_action(*args)
13
+ @resource_actions ||= []
14
+ @resource_actions = @resource_actions.unshift(args)
17
15
  end
18
16
 
19
- def append_action(*args)
20
- options = args.extract_options!
21
- @actions ||= []
22
- @actions = @actions.concat([options])
17
+ def append_resource_action(*args)
18
+ @resource_actions ||= []
19
+ @resource_actions = @resource_actions.concat([args])
20
+ end
21
+
22
+ # FIXME: I know this is ugly but first of all I want to see it working.
23
+
24
+ def add_resources_action(*args)
25
+ @resources_actions ||= []
26
+ @resources_actions << args
27
+ end
28
+
29
+ def prepend_resources_action(*args)
30
+ @resources_actions ||= []
31
+ @resources_actions = @resources_actions.unshift(args)
32
+ end
33
+
34
+ def append_resources_action(*args)
35
+ @resources_actions ||= []
36
+ @resources_actions = @resources_actions.concat([args])
23
37
  end
24
38
 
25
39
  end
@@ -29,7 +29,7 @@ module Typus
29
29
  data = read_model_config['fields']
30
30
  fields = data[filter.to_s] || data['default'] || ""
31
31
 
32
- virtual_fields = instance_methods - model_fields.keys.map { |i| i.to_s }
32
+ virtual_fields = instance_methods.map { |i| i.to_s } - model_fields.keys.map { |i| i.to_s }
33
33
 
34
34
  fields.extract_settings.map { |f| f.to_sym }.each do |field|
35
35
  if reflect_on_association(field)
@@ -176,7 +176,7 @@ module Typus
176
176
  ["True", "False"]
177
177
  end
178
178
 
179
- { boolean.first => "true", boolean.last => "false" }
179
+ [[boolean.first, "true"], [boolean.last, "false"]]
180
180
  end
181
181
 
182
182
  #--
@@ -1,3 +1,3 @@
1
1
  module Typus
2
- VERSION = "3.0.4"
2
+ VERSION = "3.0.5"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typus
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
8
  - 0
9
- - 4
10
- version: 3.0.4
9
+ - 5
10
+ version: 3.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Francesc Esplugas
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-21 00:00:00 +01:00
18
+ date: 2011-01-28 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -24,14 +24,13 @@ dependencies:
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - "="
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  hash: 5
30
30
  segments:
31
31
  - 1
32
32
  - 5
33
- - 3
34
- version: 1.5.3
33
+ version: "1.5"
35
34
  type: :runtime
36
35
  version_requirements: *id001
37
36
  - !ruby/object:Gem::Dependency
@@ -85,6 +84,7 @@ files:
85
84
  - app/helpers/admin/file_preview_helper.rb
86
85
  - app/helpers/admin/filters_helper.rb
87
86
  - app/helpers/admin/form_helper.rb
87
+ - app/helpers/admin/list_helper.rb
88
88
  - app/helpers/admin/relationships_helper.rb
89
89
  - app/helpers/admin/resources_helper.rb
90
90
  - app/helpers/admin/search_helper.rb
@@ -212,7 +212,6 @@ files:
212
212
  - lib/generators/typus/typus_generator.rb
213
213
  - lib/generators/typus/views_generator.rb
214
214
  - lib/support/active_record.rb
215
- - lib/support/array.rb
216
215
  - lib/support/fake_user.rb
217
216
  - lib/support/hash.rb
218
217
  - lib/support/object.rb
@@ -1,13 +0,0 @@
1
- class Array
2
-
3
- #--
4
- # Taken from http://snippets.dzone.com/posts/show/302
5
- #
6
- # >> %W{ a b c }.to_hash_with( %W{ 1 2 3 } )
7
- # => {"a"=>"1", "b"=>"2", "c"=>"3"}
8
- #++
9
- def to_hash_with(other)
10
- Hash[ *(0...self.size()).inject([]) { |arr, ix| arr.push(self[ix], other[ix]) } ]
11
- end
12
-
13
- end