lipsiadmin 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,6 +1,15 @@
1
+ 2009-05-15
2
+ * Bumped version to 4.1.0
3
+ * Now admin can be completly translated in any languages
4
+ * Refactored generation of grids
5
+ * Improved documentation of helpers
6
+ * Fixed rdoc typos
7
+ * Imporved backend helpers and rdoc
8
+
1
9
  2009-05-11
2
10
  * Bumped version to 4.0.0
3
- * Refactored backend.js so javascript in tabs are evalued after render so you can interact with tabs
11
+ * Added editable grids
12
+ * Refactored backend.js so javascript in tabs are evaluated after render so you can interact with tabs
4
13
  * Refactored Backend.window so now you can do much more with your grids/forms. See rdoc for examples.
5
14
  * Small refactor to attachment processor, now original attachments are saved without "_original_" in the filename.
6
15
 
data/README CHANGED
@@ -28,12 +28,12 @@ Haml 2+
28
28
 
29
29
  Then in your config/environment.rb
30
30
 
31
- config.gem "lipsiadmin", :version => "< 4.0"
31
+ config.gem "lipsiadmin", :version => "< 5.0"
32
32
 
33
33
  Why we need to specify version?
34
34
 
35
- Simply because we mantain backward compatibility until a 4.0 version.
36
- This mean that before v 4.0 we only do small improvemets, bug fix, doc etc...
35
+ Simply because we mantain backward compatibility until a 5.0 version.
36
+ This mean that before v 5.0 we only do small improvemets, bug fix, doc etc...
37
37
 
38
38
  If you want install the edge version you can simply do:
39
39
 
@@ -52,6 +52,7 @@ So you can do:
52
52
  $ script/generate backend # Generate the base admin
53
53
  $ script/generate backend_page yourmodel # Generate a "scaffold" for your model
54
54
  $ script/generate state_session # Create a "scaffold" for store extjs grid settings in db
55
+ $ script/generate loops # Generate background workers
55
56
  $ script/generate frontend # Generate the base frontend
56
57
  $ script/generate attachment # Generate the an attachments
57
58
  $ script/generate pdf PdfName # Generate a new pdf document
@@ -155,9 +155,9 @@ module Lipsiadmin
155
155
  return @allowed.uniq
156
156
  end
157
157
 
158
- # Return the original name or try to humanize the symbol
158
+ # Return the original name or try to translate or humanize the symbol
159
159
  def human_name
160
- return @name.is_a?(Symbol) ? @name.to_s.humanize : @name
160
+ return @name.is_a?(Symbol) ? I18n.t("backend.menus.#{@name}", :default => @name.to_s.humanize) : @name
161
161
  end
162
162
 
163
163
  # Return a unique id for the given project module
@@ -167,9 +167,9 @@ module Lipsiadmin
167
167
 
168
168
  # Return ExtJs Config for this project module
169
169
  def config
170
- options = @options.merge(:id => uid, :text => human_name)
170
+ options = @options.merge(:text => human_name)
171
171
  options.merge!(:menu => @menus.collect(&:config)) if @menus.size > 0
172
- options.merge!(:handler => ActiveSupport::JSON::Variable.new("function(){ Backend.app.load('#{url_for(@url.merge(:only_path => true))}') }")) if @url
172
+ options.merge!(:handler => "function(){ Backend.app.load('#{url_for(@url.merge(:only_path => true))}') }".to_l) if @url
173
173
  return options
174
174
  end
175
175
  end
@@ -202,9 +202,9 @@ module Lipsiadmin
202
202
  return @allowed.uniq
203
203
  end
204
204
 
205
- # Return the original name or try to humanize the symbol
205
+ # Return the original name or try to translate or humanize the symbol
206
206
  def human_name
207
- return @name.is_a?(Symbol) ? @name.to_s.humanize : @name
207
+ return @name.is_a?(Symbol) ? I18n.t("backend.menus.#{@name}", :default => @name.to_s.humanize) : @name
208
208
  end
209
209
 
210
210
  # Return a unique id for the given project module
@@ -214,9 +214,9 @@ module Lipsiadmin
214
214
 
215
215
  # Return ExtJs Config for this menu
216
216
  def config
217
- options = @options.merge(:id => uid, :text => human_name)
217
+ options = @options.merge(:text => human_name)
218
218
  options.merge!(:menu => @items.collect(&:config)) if @items.size > 0
219
- options.merge!(:handler => ActiveSupport::JSON::Variable.new("function(){ Backend.app.load('#{url_for(@url.merge(:only_path => true))}') }")) if @url
219
+ options.merge!(:handler => "function(){ Backend.app.load('#{url_for(@url.merge(:only_path => true))}') }".to_l) if @url
220
220
  return options
221
221
  end
222
222
  end
@@ -10,6 +10,7 @@ module Lipsiadmin
10
10
  # @column_store = column_store_for Debtor do |cm|
11
11
  # cm.add :id
12
12
  # cm.add "full_name_or_company.upcase", "Full Name", :sortable => true, :dataIndex => :company
13
+ # cm.add :surname # Header will be autogenerated
13
14
  # cm.add :email, "Email", :sortable => true
14
15
  # cm.add :piva, "Piva", :sortable => true
15
16
  # cm.add :created_at, "Creato il", :sortable => true, :renderer => :date, :align => :right
@@ -62,14 +63,18 @@ module Lipsiadmin
62
63
  end
63
64
 
64
65
  # Method for add columns to the Column Model
65
- def add(method, header=nil, options={})
66
- options[:method] = method
67
- # Setting hidden and removing query for
68
- # items that don't have headers
69
- if header.blank?
70
- options[:hidden] = true
71
- options[:query] = false
72
- end
66
+ def add(*args)
67
+ options = { :method => args[0] }
68
+ options[:header] = args[1].is_a?(String) || args[1].is_a?(Symbol) ? args[1].to_s : nil
69
+
70
+ args.each { |a| options.merge!(a) if a.is_a?(Hash) }
71
+
72
+ # Add some defaults
73
+ options[:header] ||= options[:method].to_s
74
+ options[:sortable] ||= true
75
+
76
+ # Try to translate header
77
+ options[:header] = @model.human_attribute_name(options[:header].to_s)
73
78
 
74
79
  # Reformat DataIndex
75
80
  if options[:dataIndex].is_a?(Array)
@@ -101,9 +106,6 @@ module Lipsiadmin
101
106
  gsub(/-+$/, '_').
102
107
  gsub(/^-+$/, '_')
103
108
 
104
- # Reformat header
105
- options[:header] = header || options[:dataIndex].to_s.humanize
106
-
107
109
  @data << options
108
110
  end
109
111
 
@@ -158,13 +160,6 @@ module Lipsiadmin
158
160
  end
159
161
  end
160
162
 
161
- # Returns an object whose <tt>to_json</tt> evaluates to +code+. Use this to pass a literal JavaScript
162
- # expression as an argument to another JavaScriptGenerator method.
163
- #
164
- def literal(code)
165
- ActiveSupport::JSON::Variable.new(code.to_s)
166
- end
167
- alias_method :l, :literal
168
163
  end
169
164
  end
170
165
  end
data/lib/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Lipsiadmin
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 4
4
- MINOR = 0
4
+ MINOR = 1
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -2,7 +2,7 @@ module Lipsiadmin
2
2
  module View
3
3
  module Helpers
4
4
  module BackendHelper
5
- # This method work like builtin Rails error_message_for but use an Ext.Message.
5
+ # This method work like builtin Rails error_message_for but use an Ext.Message.show({..})
6
6
  def simple_error_messages_for(*params)
7
7
  options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {}
8
8
  objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
@@ -20,21 +20,132 @@ module Lipsiadmin
20
20
  end
21
21
  end
22
22
 
23
- # This method add tab for in your view
23
+ # This method add tab for in your view.
24
+ #
25
+ # First argument is the name and title of the tab, an interesting thing wose that this helper
26
+ # try to translate itself to your current locale ex:
27
+ #
28
+ # # Look for: I18n.t("backend.tabs.settings", :default => "Settings")
29
+ # tab :settings do
30
+ # ...
31
+ #
32
+ # The second argument specify if is necessary 10px of padding inside the tab, default is +true+
33
+ #
34
+ # Third argument is an hash that accepts:
35
+ #
36
+ # <tt>:id</tt>:: The id of the tab
37
+ # <tt>:style</tt>:: Custom style of the tab
38
+ #
24
39
  def tab(name, padding=true, options={}, &block)
25
- options[:id] ||= name.to_s.downcase.gsub(/[^a-z0-9]+/, '_').gsub(/-+$/, '').gsub(/^-+$/, '')
26
- options[:style] = "padding:10px;#{options[:style]}" if padding
27
- options[:title] = name
40
+ options[:id] ||= name.to_s.downcase.gsub(/[^a-z0-9]+/, '_').gsub(/-+$/, '').gsub(/^-+$/, '')
41
+ options[:style] ||= "padding:10px;#{options[:style]}" if padding
42
+ options[:title] = I18n.t("backend.tabs.#{name.to_s.downcase}", :default => name.to_s.humanize)
28
43
  options[:tabbed] = true
29
44
  options[:class] = "x-hide-display"
30
45
  concat content_tag(:div, capture(&block), options)
31
46
  end
32
47
 
33
- # Set the title of the page
48
+ # Set the title of the page.
49
+ #
50
+ # An interesting thing wose that this helper
51
+ # try to translate itself to your current locale ex:
52
+ #
53
+ # # Look for: I18n.t("backend.titles.welcome_here", :default => "Welcome Here")
54
+ # title :welcome_here
55
+ #
34
56
  def title(title)
57
+ title = I18n.t("backend.titles.#{title.to_s.downcase}", :default => title.to_s.humanize)
35
58
  content_tag(:script, "Backend.app.setTitle(#{title.to_json})", :type => Mime::JS)
36
59
  end
37
60
 
61
+ # Get the title for grids of the specified model based on your
62
+ # current locale.
63
+ #
64
+ # The locale file for this translation is located: config/locales/backend
65
+ #
66
+ # # Generate: List all Accounts
67
+ # list_title_for(Account)
68
+ #
69
+ # # Generate: List all My Accounts
70
+ # list_title_for("My Accounts")
71
+ #
72
+ def list_title_for(text)
73
+ I18n.t("backend.general.list", :model => text.is_a?(String) ? text : text.send(:human_name))
74
+ end
75
+
76
+ # Get the title for edit action of a form based on your current locale
77
+ #
78
+ # The locale file for this translation is located: config/locales/backend
79
+ #
80
+ # # Generate: Edit Account 18
81
+ # edit_title_for(Account, @account.id)
82
+ #
83
+ # # Generate: Edit My Account Foo Bar
84
+ # edit_title_for("My Account", @account.full_name)
85
+ #
86
+ def edit_title_for(text, value)
87
+ title I18n.t("backend.general.editForm", :model => text.is_a?(String) ? text : text.send(:human_name), :value => value)
88
+ end
89
+
90
+ # Get the title for new action of a form based on your current locale
91
+ #
92
+ # The locale file for this translation is located: config/locales/backend
93
+ #
94
+ # # Generate: New Account
95
+ # new_title_for(Account)
96
+ #
97
+ # # Generate: New My Account
98
+ # new_title_for("My Account")
99
+ #
100
+ def new_title_for(text)
101
+ title I18n.t("backend.general.newForm", :model => text.is_a?(String) ? text : text.send(:human_name))
102
+ end
103
+
104
+ # Try to translate the given word
105
+ #
106
+ # # Generate: I18n.t("backend.labels.add", :default => "Add")
107
+ # tl("Add")
108
+ #
109
+ def translate_label(text)
110
+ I18n.t("backend.labels.#{text.to_s.downcase.gsub(/\s/, "_")}", :default => text.to_s.humanize)
111
+ end
112
+ alias_method :tl, :translate_label
113
+
114
+ # Try to translate the given pharse
115
+ #
116
+ # # Generate: I18n.t("backend.labels.lipsiadmin_is_beautifull", :default => "Lipsiadmin is beautifull")
117
+ # tt("Lipsiadmin is beautifull")
118
+ #
119
+ def translate_text(text)
120
+ I18n.t("backend.texts.#{text.to_s.downcase.gsub(/\s/, "_")}", :default => text.to_s.humanize)
121
+ end
122
+ alias_method :tt, :translate_text
123
+
124
+ # Return the translated attribute based on your current locale
125
+ #
126
+ # # In config/locales/backend/models/en.yml
127
+ # en:
128
+ # activerecord:
129
+ # attributes:
130
+ # account:
131
+ # name: "Account Name"
132
+ # suranme: "Custom Title For Surname"
133
+ # role: "Im a"
134
+ #
135
+ # # Generates:
136
+ # # Account Name
137
+ # # Custom Title For Surname
138
+ # # Im a
139
+ # # Attribute not translated
140
+ # human_name_for :account, :name
141
+ # human_name_for :account, :surname
142
+ # human_name_for :account, :role
143
+ # human_name_for :account, :attribute_not_translated
144
+ #
145
+ def human_name_for(instance, method)
146
+ I18n.t("activerecord.attributes.#{instance}.#{method}", :default => method.to_s.humanize)
147
+ end
148
+
38
149
  # Store the location to come back from for example an extjs grid
39
150
  def back_to(location)
40
151
  content_tag(:script, "Backend.app.backTo(#{url_for(location)})", :type => Mime::JS)
@@ -43,7 +154,7 @@ module Lipsiadmin
43
154
  # Generate the menu from the Lispiadmin::AccessControl
44
155
  def backend_menu
45
156
  config = current_account.maps.collect(&:project_modules)[0].collect(&:config)
46
- config << { :text => "Backend.locale.buttons.help".to_l, :handler => "function() { Backend.app.openHelp() }".to_l }
157
+ config << { :text => I18n.t("backend.menus.help", :default => "Help"), :handler => "function() { Backend.app.openHelp() }".to_l }
47
158
  return config.to_json
48
159
  end
49
160
 
@@ -1,14 +1,23 @@
1
1
  # If you translate this other language or have something to fix please send me an email at: d.dagostino@lipsiasoft.com
2
2
  en:
3
3
  backend:
4
+ tabs:
5
+ general: "General"
6
+ titles:
7
+ welcome: "Welcome"
4
8
  general:
9
+ list: "List {{model}}"
5
10
  editForm: "Edit {{model}} {{value}}"
6
11
  newForm: "New {{model}}"
7
12
  cantDelete: "You cannot delete this record."
8
13
  sessions:
9
14
  wrong: "Wrong email or password"
10
15
  logout: "Correctly Logged Out"
11
-
16
+ menus:
17
+ account: "Account"
18
+ list: "List"
19
+ new: "New"
20
+ help: "Help"
12
21
  javascripts:
13
22
  buttons:
14
23
  add: "Add"
@@ -1,13 +1,22 @@
1
1
  it:
2
2
  backend:
3
+ tabs:
4
+ general: "Generale"
5
+ titles:
6
+ welcome: "Benvenuto"
3
7
  general:
8
+ list: "Elenco {{model}}"
4
9
  editForm: "Modifica {{model}} {{value}}"
5
- newForm: "Nuova {{model}}"
10
+ newForm: "Nuovo {{model}}"
6
11
  cantDelete: "Non puoi cancellare questo record."
7
12
  sessions:
8
13
  wrong: "Email o password sbagliati"
9
14
  logout: "Sei correttamente uscito dal sistema"
10
-
15
+ menus:
16
+ help: "Aiuto"
17
+ account: "Account"
18
+ list: "Elenco"
19
+ new: "Nuovo"
11
20
  javascripts:
12
21
  buttons:
13
22
  add: "Aggiungi"
@@ -1,15 +1,15 @@
1
1
  # Questo file è utizzato per tradurre il nome dei modell/tabelle e dei suoi attributi/colonne
2
2
  it:
3
3
  activerecord:
4
- # Translate model names. Used in Model.human_name().
5
- #models:
6
- # For example,
7
- # user: "Dude"
8
- # will translate User model name to "Dude"
9
-
10
- # Translate model attribute names. Used in Model.human_attribute_name(attribute).
11
- #attributes:
12
- # For example,
13
- # user:
14
- # login: "Handle"
15
- # will translate User attribute "login" as "Handle"
4
+ models:
5
+ account: Account
6
+ attributes:
7
+ account:
8
+ name: Nome
9
+ surname: Cognome
10
+ created_at: Creato Il
11
+ updated_at: Aggiornato Il
12
+ role: Gruppo
13
+ password_confirmation: Conferma Password
14
+ created_at: Creato il
15
+ updated_at: Aggiornato il
@@ -2,11 +2,11 @@ class Backend::AccountsController < BackendController
2
2
  def index
3
3
  params[:limit] ||= 50
4
4
  @column_store = column_store_for Account do |cm|
5
- cm.add :name, "Name", :sortable => true
6
- cm.add :surname, "Surname", :sortable => true
7
- cm.add :email, "Email", :sortable => true
8
- cm.add :created_at, "Created at", :sortable => true, :renderer => :datetime, :align => :right
9
- cm.add :updated_at, "Updated at", :sortable => true, :renderer => :datetime, :align => :right
5
+ cm.add :name
6
+ cm.add :surname
7
+ cm.add :email
8
+ cm.add :created_at, :renderer => :datetime, :align => :right
9
+ cm.add :updated_at, :renderer => :datetime, :align => :right
10
10
  end
11
11
 
12
12
  respond_to do |format|
@@ -2,9 +2,22 @@ class AccountAccess < Lipsiadmin::AccessControl::Base
2
2
 
3
3
  roles_for :administrator do |role|
4
4
  # Shared Permission
5
+ role.allow_all_actions "/backend"
5
6
  role.allow_all_actions "/backend/base"
6
7
 
7
- role.project_module :Account do |project|
8
+ # Remember that it will try to translate the menu in your current
9
+ # locale
10
+ #
11
+ # # Look for: I18n.t("backend.menus.account") in /config/locales/backend/yourlocale.yml
12
+ # project_module :account
13
+ # # Look for: I18n.t("backend.menus.list") in /config/locales/backend/yourlocale.yml
14
+ # project.menu :list
15
+ #
16
+ # It not necessary have a translation you can provide a classic strings like:
17
+ #
18
+ # role.project_module "My Menu Name"
19
+ #
20
+ role.project_module :account do |project|
8
21
  project.menu :list, "/backend/accounts.js" do |submenu|
9
22
  submenu.add :new, "/backend/accounts/new"
10
23
  end
@@ -1,21 +1,21 @@
1
1
  =simple_error_messages_for :account
2
- -tab "General" do
2
+ -tab :general do
3
3
  %table
4
4
  %tr
5
- %td Name
5
+ %td=human_name_for :account, :name
6
6
  %td=text_field :account, :name
7
7
  %tr
8
- %td Surname
8
+ %td=human_name_for :account, :surname
9
9
  %td=text_field :account, :surname
10
10
  %tr
11
- %td Email
11
+ %td=human_name_for :account, :email
12
12
  %td=text_field :account, :email
13
13
  %tr
14
- %td Password
14
+ %td=human_name_for :account, :password
15
15
  %td=password_field :account, :password
16
16
  %tr
17
- %td Password Confirmation
17
+ %td=human_name_for :account, :password_confirmation
18
18
  %td=password_field :account, :password_confirmation
19
19
  %tr
20
- %td Role
20
+ %td=human_name_for :account, :role
21
21
  %td=select :account, :role, AccountAccess.roles
@@ -1,3 +1,3 @@
1
- =title "Edit Account n. #{@account.id}"
1
+ =edit_title_for(Account, @account.name)
2
2
  -form_tag({:action => :update, :id => @account}, :method => :put) do
3
3
  =render :partial => "form"
@@ -1,6 +1,6 @@
1
1
  page.grid do |grid|
2
2
  grid.id "grid-accounts"
3
- grid.title "List All Accounts"
3
+ grid.title list_title_for(Account)
4
4
  grid.base_path "/backend/accounts"
5
5
  grid.forgery_protection_token request_forgery_protection_token
6
6
  grid.authenticity_token form_authenticity_token
@@ -9,6 +9,7 @@ page.grid do |grid|
9
9
  store.url "/backend/accounts.json"
10
10
  store.fields @column_store.store_fields
11
11
  end
12
+ grid.before << "groupingStore.setDefaultSort('accounts.created_at', 'DESC');"
12
13
  grid.columns do |columns|
13
14
  columns.fields @column_store.column_fields
14
15
  end
@@ -1,3 +1,3 @@
1
- =title "New Account"
1
+ =new_title_for(Account)
2
2
  -form_tag(:action => :create) do
3
3
  =render :partial => "form"
@@ -3,5 +3,6 @@
3
3
 
4
4
  Added a new resource in routes.rb
5
5
  Added a new rules in app/models/account_access.rb
6
+ Translate your attributes in config/locales/models
6
7
 
7
8
  ================================================================
@@ -5,7 +5,7 @@ class Backend::<%= controller_class_name %>Controller < BackendController
5
5
 
6
6
  @column_store = column_store_for <%= model_name %> do |cm|
7
7
  <%- model_instance.class.content_columns.collect do |column| -%>
8
- cm.add :<%= column.name.downcase %>, "<%= model_instance.class.human_attribute_name(column.name) %>", :sortable => true<% if column.type == :date %>, :renderer => :date <% elsif column.type == :datetime %>, :renderer => :datetime <% end %>
8
+ cm.add :<%= column.name.downcase %><% if column.type == :date %>, :renderer => :date <% elsif column.type == :datetime %>, :renderer => :datetime <% end %>
9
9
  <%- end -%>
10
10
  end
11
11
 
@@ -1,5 +1,5 @@
1
1
  =simple_error_messages_for :<%= singular_name %>
2
- -tab "General" do
2
+ -tab :general do
3
3
  %table
4
4
  <%= template_for_inclusion %>
5
5
 
@@ -1,3 +1,3 @@
1
- =title "Edit <%= model_instance.class.human_name %> n. #{@<%= singular_name %>.id}"
1
+ =edit_title_for(<%= model_instance.class.name %>, <%= "@"+singular_name+".id" %>)
2
2
  -form_tag({:action => :update, :id => @<%= singular_name %>}, :method => :put) do
3
3
  =render :partial => "form"
@@ -1,6 +1,6 @@
1
1
  page.grid do |grid|
2
2
  grid.id "grid-<%= plural_name %>"
3
- grid.title "List all <%= model_instance.class.human_name %>"
3
+ grid.title list_title_for(<%= model_instance.class.name %>)
4
4
  grid.base_path "/backend/<%= plural_name %>"
5
5
  grid.forgery_protection_token request_forgery_protection_token
6
6
  grid.authenticity_token form_authenticity_token
@@ -1,3 +1,3 @@
1
- =title "New <%= model_instance.class.human_name %>"
1
+ =new_title_for(<%= model_instance.class.name %>)
2
2
  -form_tag({:action => :create}, :method => :post) do
3
3
  =render :partial => "form"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lipsiadmin
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davide D'Agostino
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-11 00:00:00 +02:00
12
+ date: 2009-05-15 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency