lipsiadmin 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG 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