typus 3.0.4 → 3.0.5

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/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