inline_forms 1.3.6 → 1.3.7

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.
Files changed (34) hide show
  1. data/Gemfile.lock +1 -1
  2. data/bin/inline_forms +2 -1
  3. data/lib/app/assets/stylesheets/inline_forms.css +34 -0
  4. data/lib/app/controllers/inline_forms_application_controller.rb +21 -0
  5. data/lib/app/controllers/inline_forms_controller.rb +222 -189
  6. data/lib/app/helpers/form_elements/text_area.rb +1 -1
  7. data/lib/app/helpers/form_elements/text_area_without_ckeditor.rb +13 -0
  8. data/lib/app/helpers/inline_forms_helper.rb +33 -19
  9. data/lib/app/validators/is_a_curacao_id_number_validator.rb +4 -6
  10. data/lib/app/validators/is_email_address_validator.rb +0 -4
  11. data/lib/app/validators/must_be_a_value_validator.rb +0 -1
  12. data/lib/app/validators/must_be_unique_validator.rb +0 -3
  13. data/lib/app/views/devise/confirmations/new.html.erb +5 -8
  14. data/lib/app/views/devise/passwords/edit.html.erb +12 -11
  15. data/lib/app/views/devise/passwords/new.html.erb +5 -8
  16. data/lib/app/views/devise/registrations/new.html.erb +5 -8
  17. data/lib/app/views/devise/sessions/new.html.erb +4 -8
  18. data/lib/app/views/devise/shared/_header_and_errors.html.erb +4 -0
  19. data/lib/app/views/devise/shared/_links.erb +21 -19
  20. data/lib/app/views/devise/unlocks/new.html.erb +5 -8
  21. data/lib/app/views/inline_forms/_close.html.erb +1 -1
  22. data/lib/app/views/inline_forms/_list.html.erb +8 -11
  23. data/lib/app/views/inline_forms/_new.html.erb +9 -3
  24. data/lib/app/views/inline_forms/_show.html.erb +2 -2
  25. data/lib/app/views/inline_forms/extract_translations.erb +4 -0
  26. data/lib/app/views/inline_forms/show_undo.js.erb +1 -1
  27. data/lib/app/views/layouts/devise.html.erb +1 -1
  28. data/lib/app/views/layouts/inline_forms.html.erb +1 -1
  29. data/lib/inline_forms.rb +2 -0
  30. data/lib/inline_forms/version.rb +1 -1
  31. data/lib/locales/inline_forms.en.yml +38 -0
  32. data/lib/locales/inline_forms.nl.yml +4 -0
  33. metadata +11 -6
  34. data/lib/app/views/inline_forms/_show_undo.html.erb +0 -1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- inline_forms (1.2.2)
4
+ inline_forms (1.3.6)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -84,6 +84,7 @@ gem 'inline_forms'
84
84
  gem 'mini_magick'
85
85
  gem 'jquery_datepicker'
86
86
  gem 'yaml_db'
87
+ gem 'rails-i18n'
87
88
 
88
89
  "
89
90
  gemfile_development_group ="
@@ -174,7 +175,7 @@ header_src = "
174
175
  </div>
175
176
  <% if cancan_enabled? -%>
176
177
  <div id='logout'>
177
- <%= link_to 'Afmelden: \#{current_user.name}', destroy_user_session_path %>
178
+ <%= link_to 'Afmelden: \#{current_user.name}', destroy_user_session_path, :method => :delete %>
178
179
  </div>
179
180
  <% end -%>
180
181
  <div style='clear: both;'></div>
@@ -188,18 +188,51 @@ ul.checklist li {
188
188
  margin: 0.4em 0 0.3em 0;
189
189
  }
190
190
 
191
+ /* HEADER */
192
+
191
193
  #title {
192
194
  float: left;
195
+ height: 1.5em;
193
196
  }
194
197
 
195
198
  #logout {
196
199
  float:right;
200
+ height: 1.5em;
201
+ }
202
+
203
+ #locales {
204
+ float: left;
205
+ height: 1.5em;
206
+ margin-left: 2em;
207
+ }
208
+
209
+ #locales ul {
210
+ list-style: none;
211
+ list-style-position: inside;
212
+ margin: 0;
213
+ padding: 0;
214
+ }
215
+
216
+ #locales li {
217
+ display: inline-block;
218
+ height: 1.5em;
219
+ }
220
+
221
+ #locales li a {
222
+ color: white;
223
+ }
224
+
225
+ #locales li .active_locale {
226
+ color: yellow;
197
227
  }
198
228
 
199
229
  #logout a {
200
230
  color: white;
201
231
  }
202
232
 
233
+ /* END HEADER */
234
+
235
+
203
236
  #tabs {
204
237
  background-color: #F9EBAE;
205
238
  -moz-border-radius: 5px;
@@ -359,3 +392,4 @@ ul.checklist li {
359
392
  text-align: right;
360
393
  font-family: monospace;
361
394
  }
395
+
@@ -0,0 +1,21 @@
1
+ class InlineFormsApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ layout 'devise' if :devise_controller?
4
+
5
+ # limit available locales by setting this. Override in applicaton_controller.
6
+ I18n.available_locales = [ :en, :nl, :pp ]
7
+
8
+ #set the locale based on the subdomain
9
+ def set_locale
10
+ I18n.locale = extract_locale_from_subdomain || I18n.default_locale
11
+
12
+ end
13
+
14
+ # Get locale code from request subdomain (like http://it.application.local:3000)
15
+ def extract_locale_from_subdomain
16
+ locale = request.subdomains.first
17
+ return nil if locale.nil?
18
+ I18n.available_locales.include?(locale.to_sym) ? locale.to_s : nil
19
+ end
20
+
21
+ end
@@ -1,223 +1,256 @@
1
- # == Generic controller for the inline_forms plugin.
2
- # === Usage
3
- # If you have an Example class, make an ExampleController
4
- # that is a subclass of InlineFormsController
5
- # class ExampleController < InlineFormsController
6
- # end
7
- # That's it! It'll work. But please read about the InlineForms::InlineFormsGenerator first!
8
- #
9
- # You can override the methods in your ExampleController
10
- # def index
11
- # @objects=@Klass.all
12
- # end
13
- #
14
- #
15
- # @objects holds the objects (in this case Examples)
16
- # and @Klass will be set to Example by the getKlass before filter.
17
- #
18
- # === How it works
19
- # The getKlass before_filter extracts the class and puts it in @Klass
20
- #
21
- # @Klass is used in the InlineFormsHelper
22
- #
23
- class InlineFormsController < ApplicationController
24
- before_filter :getKlass
25
-
26
- def self.cancan_enabled?
27
- begin
28
- ::Ability && true
29
- rescue NameError
30
- false
31
- end
32
- end
1
+ # == Generic controller for the inline_forms plugin.
2
+ # === Usage
3
+ # If you have an Example class, make an ExampleController
4
+ # that is a subclass of InlineFormsController
5
+ # class ExampleController < InlineFormsController
6
+ # end
7
+ # That's it! It'll work. But please read about the InlineForms::InlineFormsGenerator first!
8
+ #
9
+ # You can override the methods in your ExampleController
10
+ # def index
11
+ # @objects=@Klass.all
12
+ # end
13
+ #
14
+ #
15
+ # @objects holds the objects (in this case Examples)
16
+ # and @Klass will be set to Example by the getKlass before filter.
17
+ #
18
+ # === How it works
19
+ # The getKlass before_filter extracts the class and puts it in @Klass
20
+ #
21
+ # @Klass is used in the InlineFormsHelper
22
+ #
23
+ class InlineFormsController < ApplicationController
24
+ before_filter :getKlass
33
25
 
34
- def cancan_enabled?
35
- self.class.cancan_enabled?
26
+ def self.cancan_enabled?
27
+ begin
28
+ ::Ability && true
29
+ rescue NameError
30
+ false
36
31
  end
32
+ end
37
33
 
38
- def cancan_disabled?
39
- ! self.class.cancan_enabled?
40
- end
34
+ def cancan_enabled?
35
+ self.class.cancan_enabled?
36
+ end
37
+
38
+ def cancan_disabled?
39
+ ! self.class.cancan_enabled?
40
+ end
41
+
42
+ helper_method :cancan_disabled?, :cancan_enabled?
41
43
 
42
- helper_method :cancan_disabled?, :cancan_enabled?
44
+ load_and_authorize_resource if cancan_enabled?
43
45
 
44
- load_and_authorize_resource if cancan_enabled?
46
+ # :index shows a list of all objects from class @Klass, using will_paginate,
47
+ # including a link to 'new', that allows you to create a new record.
48
+ def index
49
+ @update_span = params[:update]
50
+ @parent_class = params[:parent_class]
51
+ @parent_id = params[:parent_id]
52
+ @ul_needed = params[:ul_needed]
53
+ @PER_PAGE = 5 unless @parent_class.nil?
54
+ # if the parent_class is not nill, we are in associated list and we don't search there.
55
+ # also, make sure the Model that you want to do a search on has a :name attribute. TODO
56
+ if @parent_class.nil?
57
+ conditions = [ @Klass.order_by_clause.to_s + " like ?", "%#{params[:search]}%" ]
58
+ else
59
+ conditions = [ "#{@parent_class.foreign_key} = ?", @parent_id ]
60
+ end
61
+ # if we are using cancan, then make sure to select only accessible records
62
+ if cancan_enabled?
63
+ @objects = @Klass.accessible_by(current_ability).order(@Klass.order_by_clause).paginate(
64
+ :page => params[:page],
65
+ :per_page => @PER_PAGE || 12,
66
+ :conditions => conditions )
67
+ else
68
+ @objects = @Klass.order(@Klass.order_by_clause).paginate(
69
+ :page => params[:page],
70
+ :per_page => @PER_PAGE || 12,
71
+ :conditions => conditions )
72
+ end
73
+ respond_to do |format|
74
+ format.html { render 'inline_forms/_list', :layout => 'inline_forms' } unless @Klass.not_accessible_through_html?
75
+ format.js { render :list }
76
+ end
77
+ end
45
78
 
46
- # :index shows a list of all objects from class @Klass, using will_paginate,
47
- # including a link to 'new', that allows you to create a new record.
48
- def index
49
- @update_span = params[:update]
50
- @parent_class = params[:parent_class]
79
+ # :new prepares a new object, updates the list of objects and replaces it with
80
+ # an empty form. After pressing OK or Cancel, the list of objects is retrieved
81
+ # in the same way as :index
82
+ def new
83
+ @object = @Klass.new
84
+ @update_span = params[:update]
85
+ @parent_class = params[:parent_class]
86
+ unless @parent_class.nil?
51
87
  @parent_id = params[:parent_id]
52
- @ul_needed = params[:ul_needed]
53
- @PER_PAGE = 5 unless @parent_class.nil?
54
- # if the parent_class is not nill, we are in associated list and we don't search there.
55
- # also, make sure the Model that you want to do a search on has a :name attribute. TODO
56
- if @parent_class.nil?
57
- conditions = [ @Klass.order_by_clause.to_s + " like ?", "%#{params[:search]}%" ]
58
- else
59
- conditions = [ "#{@parent_class.foreign_key} = ?", @parent_id ]
60
- end
61
- # if we are using cancan, then make sure to select only accessible records
88
+ @object[@parent_class.foreign_key] = @parent_id
89
+ end
90
+ @object.inline_forms_attribute_list = @inline_forms_attribute_list if @inline_forms_attribute_list
91
+ respond_to do |format|
92
+ format.js { }
93
+ end
94
+ end
95
+
96
+ # :edit presents a form to edit one specific attribute from an object
97
+ def edit
98
+ @object = @Klass.find(params[:id])
99
+ @attribute = params[:attribute]
100
+ @form_element = params[:form_element]
101
+ @sub_id = params[:sub_id]
102
+ @update_span = params[:update]
103
+ respond_to do |format|
104
+ #format.html { } unless @Klass.not_accessible_through_html?
105
+ format.js { }
106
+ end
107
+ end
108
+
109
+ # :create creates the object made with :new.
110
+ # It then presents the list of objects.
111
+ def create
112
+ object = @Klass.new
113
+ @update_span = params[:update]
114
+ attributes = @inline_forms_attribute_list || object.inline_forms_attribute_list
115
+ attributes.each do | attribute, name, form_element |
116
+ send("#{form_element.to_s}_update", object, attribute) unless form_element == :associated
117
+ end
118
+ @parent_class = params[:parent_class]
119
+ @parent_id = params[:parent_id]
120
+ @PER_PAGE = 5 unless @parent_class.nil?
121
+ # for the logic behind the :conditions see the #index method.
122
+ @parent_class.nil? ? conditions = [ @Klass.order_by_clause.to_s + " like ?", "%#{params[:search]}%" ] : conditions = [ "#{@parent_class.foreign_key} = ?", @parent_id ]
123
+ object[@parent_class.foreign_key] = @parent_id unless @parent_class.nil?
124
+ puts "BEFORE IF #{object.id} #{object.name}"
125
+ if object.save
126
+ puts "AFTER SAVE IF #{object.id} #{object.name}"
127
+ flash.now[:success] = t('success', :message => object.class.model_name.human)
62
128
  if cancan_enabled?
63
- @objects = @Klass.accessible_by(current_ability).order(@Klass.order_by_clause).paginate(
64
- :page => params[:page],
65
- :per_page => @PER_PAGE || 12,
66
- :conditions => conditions )
129
+ @objects = @Klass.accessible_by(current_ability).order(@Klass.order_by_clause).paginate :page => params[:page], :per_page => @PER_PAGE || 12, :conditions => conditions
67
130
  else
68
- @objects = @Klass.order(@Klass.order_by_clause).paginate(
69
- :page => params[:page],
70
- :per_page => @PER_PAGE || 12,
71
- :conditions => conditions )
131
+ @objects = @Klass.order(@Klass.order_by_clause).paginate :page => params[:page], :per_page => @PER_PAGE || 12, :conditions => conditions
72
132
  end
73
133
  respond_to do |format|
74
- format.html { render 'inline_forms/_list', :layout => 'inline_forms' } unless @Klass.not_accessible_through_html?
75
- format.js { render :list }
76
- end
77
- end
78
-
79
- # :new prepares a new object, updates the list of objects and replaces it with
80
- # an empty form. After pressing OK or Cancel, the list of objects is retrieved
81
- # in the same way as :index
82
- def new
83
- @object = @Klass.new
84
- @update_span = params[:update]
85
- @parent_class = params[:parent_class]
86
- unless @parent_class.nil?
87
- @parent_id = params[:parent_id]
88
- @object[@parent_class.foreign_key] = @parent_id
134
+ format.js { render :list}
89
135
  end
90
- @object.inline_forms_attribute_list = @inline_forms_attribute_list if @inline_forms_attribute_list
136
+ puts "*)*)*)#{object.id} #{object.name}"
137
+ else
138
+ flash.now[:header] = ["Kan #{object.class.to_s.underscore} niet aanmaken."]
139
+ flash.now[:error] = object.errors.to_a
91
140
  respond_to do |format|
92
- format.js { }
141
+ @object = object
142
+ @object.inline_forms_attribute_list = attributes
143
+ format.js { render :new}
93
144
  end
94
145
  end
146
+ end
95
147
 
96
- # :edit presents a form to edit one specific attribute from an object
97
- def edit
98
- @object = @Klass.find(params[:id])
99
- @attribute = params[:attribute]
100
- @form_element = params[:form_element]
101
- @sub_id = params[:sub_id]
102
- @update_span = params[:update]
103
- respond_to do |format|
104
- #format.html { } unless @Klass.not_accessible_through_html?
105
- format.js { }
106
- end
148
+ # :update updates a specific attribute from an object.
149
+ def update
150
+ @object = @Klass.find(params[:id])
151
+ @attribute = params[:attribute]
152
+ @form_element = params[:form_element]
153
+ @sub_id = params[:sub_id]
154
+ @update_span = params[:update]
155
+ send("#{@form_element.to_s}_update", @object, @attribute)
156
+ @object.save
157
+ #puts "Requested #{request.format}"
158
+ respond_to do |format|
159
+ format.js { }
107
160
  end
161
+ end
108
162
 
109
- # :create creates the object made with :new.
110
- # It then presents the list of objects.
111
- def create
112
- object = @Klass.new
113
- @update_span = params[:update]
114
- attributes = @inline_forms_attribute_list || object.inline_forms_attribute_list
115
- attributes.each do | attribute, name, form_element |
116
- send("#{form_element.to_s}_update", object, attribute) unless form_element == :associated
163
+ # :show shows one attribute (attribute) from a record (object).
164
+ # It includes the link to 'edit'
165
+ def show
166
+ @object = @Klass.find(params[:id])
167
+ @attribute = params[:attribute]
168
+ @form_element = params[:form_element]
169
+ close = params[:close] || false
170
+ if @form_element == "associated"
171
+ @sub_id = params[:sub_id]
172
+ if @sub_id.to_i > 0
173
+ @associated_record_id = @object.send(@attribute.to_s.singularize + "_ids").index(@sub_id.to_i)
174
+ @associated_record = @object.send(@attribute)[@associated_record_id]
117
175
  end
118
- @parent_class = params[:parent_class]
119
- @parent_id = params[:parent_id]
120
- @PER_PAGE = 5 unless @parent_class.nil?
121
- # for the logic behind the :conditions see the #index method.
122
- @parent_class.nil? ? conditions = [ @Klass.order_by_clause.to_s + " like ?", "%#{params[:search]}%" ] : conditions = [ "#{@parent_class.foreign_key} = ?", @parent_id ]
123
- object[@parent_class.foreign_key] = @parent_id unless @parent_class.nil?
124
- if object.save
125
- flash.now[:success] = "Successfully created #{object.class.to_s.underscore}."
126
- if cancan_enabled?
127
- @objects = @Klass.accessible_by(current_ability).order(@Klass.order_by_clause).paginate :page => params[:page], :per_page => @PER_PAGE || 12, :conditions => conditions
176
+ end
177
+ @update_span = params[:update]
178
+ if @attribute.nil?
179
+ respond_to do |format|
180
+ @attributes = @object.inline_forms_attribute_list
181
+ if close
182
+ format.js { render :close }
128
183
  else
129
- @objects = @Klass.order(@Klass.order_by_clause).paginate :page => params[:page], :per_page => @PER_PAGE || 12, :conditions => conditions
130
- end
131
- respond_to do |format|
132
- format.js { render :list }
133
- end
134
- else
135
- flash.now[:error] = "Kan #{object.class.to_s.underscore} niet aanmaken.".html_safe
136
- object.errors.each do |e|
137
- flash.now[:error] << '<br />'.html_safe + e[0].to_s + ": " + e[1]
138
- end
139
- respond_to do |format|
140
- @object = object
141
- @object.inline_forms_attribute_list = attributes
142
- format.js { render :new}
184
+ format.js { }
143
185
  end
144
186
  end
145
- end
146
-
147
- # :update updates a specific attribute from an object.
148
- def update
149
- @object = @Klass.find(params[:id])
150
- @attribute = params[:attribute]
151
- @form_element = params[:form_element]
152
- @sub_id = params[:sub_id]
153
- @update_span = params[:update]
154
- send("#{@form_element.to_s}_update", @object, @attribute)
155
- @object.save
156
- #puts "Requested #{request.format}"
187
+ else
157
188
  respond_to do |format|
158
- format.js { }
189
+ format.js { render :show_element }
159
190
  end
160
191
  end
192
+ end
161
193
 
162
- # :show shows one attribute (attribute) from a record (object).
163
- # It includes the link to 'edit'
164
- def show
165
- @object = @Klass.find(params[:id])
166
- @attribute = params[:attribute]
167
- @form_element = params[:form_element]
168
- close = params[:close] || false
169
- if @form_element == "associated"
170
- @sub_id = params[:sub_id]
171
- if @sub_id.to_i > 0
172
- @associated_record_id = @object.send(@attribute.to_s.singularize + "_ids").index(@sub_id.to_i)
173
- @associated_record = @object.send(@attribute)[@associated_record_id]
174
- end
175
- end
176
- @update_span = params[:update]
177
- if @attribute.nil?
178
- respond_to do |format|
179
- @attributes = @object.inline_forms_attribute_list
180
- if close
181
- format.js { render :close }
182
- else
183
- format.js { }
184
- end
185
- end
186
- else
187
- respond_to do |format|
188
- format.js { render :show_element }
189
- end
190
- end
194
+ # :destroy destroys the record, but also shows an undo link (with paper_trail)
195
+ def destroy
196
+ @update_span = params[:update]
197
+ @object = @Klass.find(params[:id])
198
+ @object.destroy
199
+ respond_to do |format|
200
+ format.js { render :show_undo }
191
201
  end
202
+ end
192
203
 
193
- # :destroy destroys the record, but also shows an undo link (with paper_trail)
194
- def destroy
195
- @update_span = params[:update]
196
- @object = @Klass.find(params[:id])
197
- @object.destroy
198
- respond_to do |format|
199
- format.js { render :show_undo }
200
- end
204
+ # :revert works like undo.
205
+ # Thanks Ryan Bates: http://railscasts.com/episodes/255-undo-with-paper-trail
206
+ def revert
207
+ @update_span = params[:update]
208
+ @version = Version.find(params[:id])
209
+ @version.reify.save!
210
+ @object = @Klass.find(@version.item_id)
211
+ respond_to do |format|
212
+ format.js { render :close }
201
213
  end
214
+ end
202
215
 
203
- # :revert works like undo.
204
- # Thanks Ryan Bates: http://railscasts.com/episodes/255-undo-with-paper-trail
205
- def revert
206
- @update_span = params[:update]
207
- @version = Version.find(params[:id])
208
- @version.reify.save!
209
- @object = @Klass.find(@version.item_id)
210
- respond_to do |format|
211
- format.js { render :close }
212
- end
216
+ def extract_translations
217
+ keys_array = []
218
+ I18n::Backend::ActiveRecord::Translation.order(:locale, :thekey).each do |t|
219
+ keys_array << deep_hashify([ t.locale, t.thekey.split('.'), t.value ].flatten)
213
220
  end
214
-
215
- private
216
- # Get the class from the controller name.
217
- # CountryController < InlineFormsController, so what class are we?
218
- # TODO think about this a bit more.
219
- def getKlass #:doc:
220
- @Klass = self.controller_name.classify.constantize
221
+ keys_hash = {}
222
+ keys_array.each do |h|
223
+ keys_hash = deep_merge(keys_hash, h)
221
224
  end
225
+ @display_array = unravel(keys_hash)
226
+ end
222
227
 
228
+ private
229
+ # Get the class from the controller name.
230
+ # CountryController < InlineFormsController, so what class are we?
231
+ # TODO think about this a bit more.
232
+ def getKlass #:doc:
233
+ @Klass = self.controller_name.classify.constantize
223
234
  end
235
+
236
+ def deep_hashify(ary)
237
+ return ary.to_s if ary.length == 1
238
+ { ary.shift => deep_hashify(ary) }
239
+ end
240
+
241
+ def deep_merge(h1, h2)
242
+ return h1.merge(h2) unless h2.first[1].is_a? Hash
243
+ h1.merge(h2){|key, first, second| deep_merge(first, second)}
244
+ end
245
+
246
+ def unravel(deep_hash, level=-1)
247
+ level += 1
248
+ return "#{' '*level}\"#{deep_hash.first[0]}\": \"#{deep_hash.first[1]}\"\n" unless deep_hash.first[1].is_a? Hash
249
+ a = "#{' '*level}\"#{deep_hash.first[0]}\":\n"
250
+ deep_hash.first[1].each do |k,v|
251
+ a << unravel( { k => v}, level)
252
+ end
253
+ a
254
+ end
255
+
256
+ end