activeadmin 1.4.3 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -10
  3. data/CONTRIBUTING.md +12 -11
  4. data/README.md +34 -8
  5. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  6. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  7. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  8. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  9. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  10. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  11. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  12. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
  13. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  14. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  15. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  16. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  17. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  18. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  19. data/app/assets/stylesheets/active_admin/_forms.scss +2 -14
  20. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
  21. data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
  22. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
  23. data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
  24. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  25. data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
  26. data/app/views/active_admin/devise/registrations/new.html.erb +1 -2
  27. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  28. data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
  29. data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
  30. data/config/locales/bg.yml +0 -1
  31. data/config/locales/he.yml +0 -1
  32. data/config/locales/hu.yml +4 -0
  33. data/config/locales/lt.yml +2 -2
  34. data/config/locales/uk.yml +2 -0
  35. data/docs/0-installation.md +2 -2
  36. data/docs/13-authorization-adapter.md +4 -4
  37. data/docs/CNAME +1 -1
  38. data/docs/index.html +2 -2
  39. data/lib/active_admin.rb +9 -4
  40. data/lib/active_admin/application.rb +8 -14
  41. data/lib/active_admin/application_settings.rb +3 -0
  42. data/lib/active_admin/asset_registration.rb +0 -8
  43. data/lib/active_admin/base_controller.rb +6 -6
  44. data/lib/active_admin/base_controller/authorization.rb +2 -4
  45. data/lib/active_admin/batch_actions/controller.rb +1 -1
  46. data/lib/active_admin/batch_actions/resource_extension.rb +4 -4
  47. data/lib/active_admin/callbacks.rb +1 -1
  48. data/lib/active_admin/csv_builder.rb +1 -1
  49. data/lib/active_admin/dependency.rb +1 -77
  50. data/lib/active_admin/dsl.rb +1 -8
  51. data/lib/active_admin/error.rb +1 -1
  52. data/lib/active_admin/filters/active_filter.rb +3 -1
  53. data/lib/active_admin/filters/active_sidebar.rb +5 -1
  54. data/lib/active_admin/filters/forms.rb +2 -2
  55. data/lib/active_admin/filters/formtastic_addons.rb +1 -1
  56. data/lib/active_admin/filters/resource_extension.rb +3 -3
  57. data/lib/active_admin/form_builder.rb +3 -3
  58. data/lib/active_admin/generators/boilerplate.rb +1 -1
  59. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  60. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  61. data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
  62. data/lib/active_admin/menu_item.rb +1 -1
  63. data/lib/active_admin/namespace.rb +2 -2
  64. data/lib/active_admin/namespace_settings.rb +7 -4
  65. data/lib/active_admin/orm/active_record/comments.rb +4 -4
  66. data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
  67. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
  68. data/lib/active_admin/page_dsl.rb +1 -1
  69. data/lib/active_admin/pundit_adapter.rb +13 -4
  70. data/lib/active_admin/resource.rb +2 -2
  71. data/lib/active_admin/resource/action_items.rb +1 -1
  72. data/lib/active_admin/resource/attributes.rb +7 -4
  73. data/lib/active_admin/resource/menu.rb +3 -3
  74. data/lib/active_admin/resource/naming.rb +3 -3
  75. data/lib/active_admin/resource/routes.rb +9 -4
  76. data/lib/active_admin/resource/scopes.rb +3 -3
  77. data/lib/active_admin/resource/sidebars.rb +1 -1
  78. data/lib/active_admin/resource_collection.rb +2 -2
  79. data/lib/active_admin/resource_controller/action_builder.rb +10 -0
  80. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
  81. data/lib/active_admin/resource_dsl.rb +5 -3
  82. data/lib/active_admin/router.rb +1 -1
  83. data/lib/active_admin/scope.rb +4 -4
  84. data/lib/active_admin/settings_node.rb +1 -1
  85. data/lib/active_admin/version.rb +1 -1
  86. data/lib/active_admin/view_helpers.rb +1 -1
  87. data/lib/active_admin/view_helpers/display_helper.rb +10 -2
  88. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  89. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +2 -0
  90. data/lib/active_admin/views.rb +1 -1
  91. data/lib/active_admin/views/components/active_admin_form.rb +7 -1
  92. data/lib/active_admin/views/components/attributes_table.rb +3 -3
  93. data/lib/active_admin/views/components/paginated_collection.rb +1 -1
  94. data/lib/active_admin/views/components/sidebar_section.rb +0 -3
  95. data/lib/active_admin/views/components/status_tag.rb +1 -18
  96. data/lib/active_admin/views/components/table_for.rb +2 -2
  97. data/lib/active_admin/views/components/tabs.rb +11 -2
  98. data/lib/active_admin/views/footer.rb +1 -1
  99. data/lib/active_admin/views/index_as_table.rb +5 -4
  100. data/lib/active_admin/views/pages/base.rb +3 -0
  101. data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
  102. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  103. data/lib/generators/active_admin/install/install_generator.rb +6 -2
  104. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -1
  105. data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
  106. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
  107. data/lib/generators/active_admin/page/page_generator.rb +1 -1
  108. data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
  109. data/lib/ransack_ext.rb +3 -3
  110. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  111. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  112. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  113. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
  114. metadata +107 -96
  115. data/.circleci/config.yml +0 -572
  116. data/.github/ISSUE_TEMPLATE.md +0 -20
  117. data/.gitignore +0 -16
  118. data/.mdlrc +0 -1
  119. data/.rspec +0 -1
  120. data/.rspec_parallel +0 -2
  121. data/.rubocop.yml +0 -99
  122. data/.simplecov +0 -9
  123. data/.yardopts +0 -7
  124. data/Gemfile +0 -30
  125. data/Gemfile.common +0 -26
  126. data/Gemfile.lock +0 -433
  127. data/Rakefile +0 -24
  128. data/activeadmin.gemspec +0 -32
  129. data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
  130. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
  131. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
  132. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
  133. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
  134. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
  135. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
  136. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
  137. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
  138. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
  139. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
  140. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
  141. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
  142. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
  143. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
  144. data/bin/install_chromedriver.sh +0 -17
  145. data/config/i18n-tasks.yml +0 -26
  146. data/config/mdl_style.rb +0 -11
  147. data/cucumber.yml +0 -7
  148. data/gemfiles/rails_42.gemfile +0 -10
  149. data/gemfiles/rails_42.gemfile.lock +0 -339
  150. data/gemfiles/rails_50.gemfile +0 -10
  151. data/gemfiles/rails_50.gemfile.lock +0 -353
  152. data/gemfiles/rails_51.gemfile +0 -10
  153. data/gemfiles/rails_51.gemfile.lock +0 -353
  154. data/lib/active_admin/event.rb +0 -24
  155. data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
  156. data/lib/bug_report_templates/active_admin_master.rb +0 -111
  157. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
  158. data/tasks/application_generator.rb +0 -50
  159. data/tasks/docs.rake +0 -64
  160. data/tasks/gemfiles.rake +0 -8
  161. data/tasks/lint.rake +0 -110
  162. data/tasks/local.rake +0 -27
  163. data/tasks/release.rake +0 -6
  164. data/tasks/test.rake +0 -42
@@ -1,7 +1,10 @@
1
+ //= require jquery-ui/escape-selector
2
+ //= require jquery-ui/form-reset-mixin
3
+ //= require jquery-ui/labels
1
4
  //= require jquery-ui/widget
2
5
 
3
6
  /*!
4
- * jQuery UI Controlgroup 1.12.1
7
+ * jQuery UI Checkboxradio 1.12.1
5
8
  * http://jqueryui.com
6
9
  *
7
10
  * Copyright jQuery Foundation and other contributors
@@ -9,292 +12,280 @@
9
12
  * http://jquery.org/license
10
13
  */
11
14
 
12
- //>>label: Controlgroup
15
+ //>>label: Checkboxradio
13
16
  //>>group: Widgets
14
- //>>description: Visually groups form control widgets
15
- //>>docs: http://api.jqueryui.com/controlgroup/
16
- //>>demos: http://jqueryui.com/controlgroup/
17
+ //>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
18
+ //>>docs: http://api.jqueryui.com/checkboxradio/
19
+ //>>demos: http://jqueryui.com/checkboxradio/
17
20
  //>>css.structure: ../../themes/base/core.css
18
- //>>css.structure: ../../themes/base/controlgroup.css
21
+ //>>css.structure: ../../themes/base/button.css
22
+ //>>css.structure: ../../themes/base/checkboxradio.css
19
23
  //>>css.theme: ../../themes/base/theme.css
20
24
 
21
25
  ( function( factory ) {
22
- if ( typeof define === "function" && define.amd ) {
23
-
24
- // AMD. Register as an anonymous module.
25
- define( [
26
- "jquery",
27
- "../widget"
28
- ], factory );
29
- } else {
30
-
31
- // Browser globals
32
- factory( jQuery );
33
- }
26
+ if ( typeof define === "function" && define.amd ) {
27
+
28
+ // AMD. Register as an anonymous module.
29
+ define( [
30
+ "jquery",
31
+ "../escape-selector",
32
+ "../form-reset-mixin",
33
+ "../labels",
34
+ "../widget"
35
+ ], factory );
36
+ } else {
37
+
38
+ // Browser globals
39
+ factory( jQuery );
40
+ }
34
41
  }( function( $ ) {
35
- var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
36
-
37
- return $.widget( "ui.controlgroup", {
38
- version: "1.12.1",
39
- defaultElement: "<div>",
40
- options: {
41
- direction: "horizontal",
42
- disabled: null,
43
- onlyVisible: true,
44
- items: {
45
- "button": "input[type=button], input[type=submit], input[type=reset], button, a",
46
- "controlgroupLabel": ".ui-controlgroup-label",
47
- "checkboxradio": "input[type='checkbox'], input[type='radio']",
48
- "selectmenu": "select",
49
- "spinner": ".ui-spinner-input"
50
- }
51
- },
52
-
53
- _create: function() {
54
- this._enhance();
55
- },
56
-
57
- // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
58
- _enhance: function() {
59
- this.element.attr( "role", "toolbar" );
60
- this.refresh();
61
- },
62
-
63
- _destroy: function() {
64
- this._callChildMethod( "destroy" );
65
- this.childWidgets.removeData( "ui-controlgroup-data" );
66
- this.element.removeAttr( "role" );
67
- if ( this.options.items.controlgroupLabel ) {
68
- this.element
69
- .find( this.options.items.controlgroupLabel )
70
- .find( ".ui-controlgroup-label-contents" )
71
- .contents().unwrap();
72
- }
73
- },
74
-
75
- _initWidgets: function() {
76
- var that = this,
77
- childWidgets = [];
78
-
79
- // First we iterate over each of the items options
80
- $.each( this.options.items, function( widget, selector ) {
81
- var labels;
82
- var options = {};
83
-
84
- // Make sure the widget has a selector set
85
- if ( !selector ) {
86
- return;
87
- }
88
-
89
- if ( widget === "controlgroupLabel" ) {
90
- labels = that.element.find( selector );
91
- labels.each( function() {
92
- var element = $( this );
93
-
94
- if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
95
- return;
96
- }
97
- element.contents()
98
- .wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
99
- } );
100
- that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
101
- childWidgets = childWidgets.concat( labels.get() );
102
- return;
103
- }
104
-
105
- // Make sure the widget actually exists
106
- if ( !$.fn[ widget ] ) {
107
- return;
108
- }
109
-
110
- // We assume everything is in the middle to start because we can't determine
111
- // first / last elements until all enhancments are done.
112
- if ( that[ "_" + widget + "Options" ] ) {
113
- options = that[ "_" + widget + "Options" ]( "middle" );
114
- } else {
115
- options = { classes: {} };
116
- }
117
-
118
- // Find instances of this widget inside controlgroup and init them
119
- that.element
120
- .find( selector )
121
- .each( function() {
122
- var element = $( this );
123
- var instance = element[ widget ]( "instance" );
124
-
125
- // We need to clone the default options for this type of widget to avoid
126
- // polluting the variable options which has a wider scope than a single widget.
127
- var instanceOptions = $.widget.extend( {}, options );
128
-
129
- // If the button is the child of a spinner ignore it
130
- // TODO: Find a more generic solution
131
- if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
132
- return;
133
- }
134
-
135
- // Create the widget if it doesn't exist
136
- if ( !instance ) {
137
- instance = element[ widget ]()[ widget ]( "instance" );
138
- }
139
- if ( instance ) {
140
- instanceOptions.classes =
141
- that._resolveClassesValues( instanceOptions.classes, instance );
142
- }
143
- element[ widget ]( instanceOptions );
144
-
145
- // Store an instance of the controlgroup to be able to reference
146
- // from the outermost element for changing options and refresh
147
- var widgetElement = element[ widget ]( "widget" );
148
- $.data( widgetElement[ 0 ], "ui-controlgroup-data",
149
- instance ? instance : element[ widget ]( "instance" ) );
150
-
151
- childWidgets.push( widgetElement[ 0 ] );
152
- } );
153
- } );
154
-
155
- this.childWidgets = $( $.unique( childWidgets ) );
156
- this._addClass( this.childWidgets, "ui-controlgroup-item" );
157
- },
158
-
159
- _callChildMethod: function( method ) {
160
- this.childWidgets.each( function() {
161
- var element = $( this ),
162
- data = element.data( "ui-controlgroup-data" );
163
- if ( data && data[ method ] ) {
164
- data[ method ]();
165
- }
166
- } );
167
- },
168
-
169
- _updateCornerClass: function( element, position ) {
170
- var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
171
- var add = this._buildSimpleOptions( position, "label" ).classes.label;
172
-
173
- this._removeClass( element, null, remove );
174
- this._addClass( element, null, add );
175
- },
176
-
177
- _buildSimpleOptions: function( position, key ) {
178
- var direction = this.options.direction === "vertical";
179
- var result = {
180
- classes: {}
181
- };
182
- result.classes[ key ] = {
183
- "middle": "",
184
- "first": "ui-corner-" + ( direction ? "top" : "left" ),
185
- "last": "ui-corner-" + ( direction ? "bottom" : "right" ),
186
- "only": "ui-corner-all"
187
- }[ position ];
188
-
189
- return result;
190
- },
191
-
192
- _spinnerOptions: function( position ) {
193
- var options = this._buildSimpleOptions( position, "ui-spinner" );
194
-
195
- options.classes[ "ui-spinner-up" ] = "";
196
- options.classes[ "ui-spinner-down" ] = "";
197
-
198
- return options;
199
- },
200
-
201
- _buttonOptions: function( position ) {
202
- return this._buildSimpleOptions( position, "ui-button" );
203
- },
204
-
205
- _checkboxradioOptions: function( position ) {
206
- return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
207
- },
208
-
209
- _selectmenuOptions: function( position ) {
210
- var direction = this.options.direction === "vertical";
211
- return {
212
- width: direction ? "auto" : false,
213
- classes: {
214
- middle: {
215
- "ui-selectmenu-button-open": "",
216
- "ui-selectmenu-button-closed": ""
217
- },
218
- first: {
219
- "ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
220
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
221
- },
222
- last: {
223
- "ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
224
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
225
- },
226
- only: {
227
- "ui-selectmenu-button-open": "ui-corner-top",
228
- "ui-selectmenu-button-closed": "ui-corner-all"
229
- }
230
-
231
- }[ position ]
232
- };
233
- },
234
-
235
- _resolveClassesValues: function( classes, instance ) {
236
- var result = {};
237
- $.each( classes, function( key ) {
238
- var current = instance.options.classes[ key ] || "";
239
- current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
240
- result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
241
- } );
242
- return result;
243
- },
244
-
245
- _setOption: function( key, value ) {
246
- if ( key === "direction" ) {
247
- this._removeClass( "ui-controlgroup-" + this.options.direction );
248
- }
249
-
250
- this._super( key, value );
251
- if ( key === "disabled" ) {
252
- this._callChildMethod( value ? "disable" : "enable" );
253
- return;
254
- }
255
-
256
- this.refresh();
257
- },
258
-
259
- refresh: function() {
260
- var children,
261
- that = this;
262
-
263
- this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
264
-
265
- if ( this.options.direction === "horizontal" ) {
266
- this._addClass( null, "ui-helper-clearfix" );
267
- }
268
- this._initWidgets();
269
-
270
- children = this.childWidgets;
271
-
272
- // We filter here because we need to track all childWidgets not just the visible ones
273
- if ( this.options.onlyVisible ) {
274
- children = children.filter( ":visible" );
275
- }
276
-
277
- if ( children.length ) {
278
-
279
- // We do this last because we need to make sure all enhancment is done
280
- // before determining first and last
281
- $.each( [ "first", "last" ], function( index, value ) {
282
- var instance = children[ value ]().data( "ui-controlgroup-data" );
283
-
284
- if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
285
- var options = that[ "_" + instance.widgetName + "Options" ](
286
- children.length === 1 ? "only" : value
287
- );
288
- options.classes = that._resolveClassesValues( options.classes, instance );
289
- instance.element[ instance.widgetName ]( options );
290
- } else {
291
- that._updateCornerClass( children[ value ](), value );
292
- }
293
- } );
294
-
295
- // Finally call the refresh method on each of the child widgets.
296
- this._callChildMethod( "refresh" );
297
- }
298
- }
299
- } );
42
+
43
+ $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
44
+ version: "1.12.1",
45
+ options: {
46
+ disabled: null,
47
+ label: null,
48
+ icon: true,
49
+ classes: {
50
+ "ui-checkboxradio-label": "ui-corner-all",
51
+ "ui-checkboxradio-icon": "ui-corner-all"
52
+ }
53
+ },
54
+
55
+ _getCreateOptions: function() {
56
+ var disabled, labels;
57
+ var that = this;
58
+ var options = this._super() || {};
59
+
60
+ // We read the type here, because it makes more sense to throw a element type error first,
61
+ // rather then the error for lack of a label. Often if its the wrong type, it
62
+ // won't have a label (e.g. calling on a div, btn, etc)
63
+ this._readType();
64
+
65
+ labels = this.element.labels();
66
+
67
+ // If there are multiple labels, use the last one
68
+ this.label = $( labels[ labels.length - 1 ] );
69
+ if ( !this.label.length ) {
70
+ $.error( "No label found for checkboxradio widget" );
71
+ }
72
+
73
+ this.originalLabel = "";
74
+
75
+ // We need to get the label text but this may also need to make sure it does not contain the
76
+ // input itself.
77
+ this.label.contents().not( this.element[ 0 ] ).each( function() {
78
+
79
+ // The label contents could be text, html, or a mix. We concat each element to get a
80
+ // string representation of the label, without the input as part of it.
81
+ that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
82
+ } );
83
+
84
+ // Set the label option if we found label text
85
+ if ( this.originalLabel ) {
86
+ options.label = this.originalLabel;
87
+ }
88
+
89
+ disabled = this.element[ 0 ].disabled;
90
+ if ( disabled != null ) {
91
+ options.disabled = disabled;
92
+ }
93
+ return options;
94
+ },
95
+
96
+ _create: function() {
97
+ var checked = this.element[ 0 ].checked;
98
+
99
+ this._bindFormResetHandler();
100
+
101
+ if ( this.options.disabled == null ) {
102
+ this.options.disabled = this.element[ 0 ].disabled;
103
+ }
104
+
105
+ this._setOption( "disabled", this.options.disabled );
106
+ this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
107
+ this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
108
+
109
+ if ( this.type === "radio" ) {
110
+ this._addClass( this.label, "ui-checkboxradio-radio-label" );
111
+ }
112
+
113
+ if ( this.options.label && this.options.label !== this.originalLabel ) {
114
+ this._updateLabel();
115
+ } else if ( this.originalLabel ) {
116
+ this.options.label = this.originalLabel;
117
+ }
118
+
119
+ this._enhance();
120
+
121
+ if ( checked ) {
122
+ this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
123
+ if ( this.icon ) {
124
+ this._addClass( this.icon, null, "ui-state-hover" );
125
+ }
126
+ }
127
+
128
+ this._on( {
129
+ change: "_toggleClasses",
130
+ focus: function() {
131
+ this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
132
+ },
133
+ blur: function() {
134
+ this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
135
+ }
136
+ } );
137
+ },
138
+
139
+ _readType: function() {
140
+ var nodeName = this.element[ 0 ].nodeName.toLowerCase();
141
+ this.type = this.element[ 0 ].type;
142
+ if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
143
+ $.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
144
+ " and element.type=" + this.type );
145
+ }
146
+ },
147
+
148
+ // Support jQuery Mobile enhanced option
149
+ _enhance: function() {
150
+ this._updateIcon( this.element[ 0 ].checked );
151
+ },
152
+
153
+ widget: function() {
154
+ return this.label;
155
+ },
156
+
157
+ _getRadioGroup: function() {
158
+ var group;
159
+ var name = this.element[ 0 ].name;
160
+ var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
161
+
162
+ if ( !name ) {
163
+ return $( [] );
164
+ }
165
+
166
+ if ( this.form.length ) {
167
+ group = $( this.form[ 0 ].elements ).filter( nameSelector );
168
+ } else {
169
+
170
+ // Not inside a form, check all inputs that also are not inside a form
171
+ group = $( nameSelector ).filter( function() {
172
+ return $( this ).form().length === 0;
173
+ } );
174
+ }
175
+
176
+ return group.not( this.element );
177
+ },
178
+
179
+ _toggleClasses: function() {
180
+ var checked = this.element[ 0 ].checked;
181
+ this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
182
+
183
+ if ( this.options.icon && this.type === "checkbox" ) {
184
+ this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
185
+ ._toggleClass( this.icon, null, "ui-icon-blank", !checked );
186
+ }
187
+
188
+ if ( this.type === "radio" ) {
189
+ this._getRadioGroup()
190
+ .each( function() {
191
+ var instance = $( this ).checkboxradio( "instance" );
192
+
193
+ if ( instance ) {
194
+ instance._removeClass( instance.label,
195
+ "ui-checkboxradio-checked", "ui-state-active" );
196
+ }
197
+ } );
198
+ }
199
+ },
200
+
201
+ _destroy: function() {
202
+ this._unbindFormResetHandler();
203
+
204
+ if ( this.icon ) {
205
+ this.icon.remove();
206
+ this.iconSpace.remove();
207
+ }
208
+ },
209
+
210
+ _setOption: function( key, value ) {
211
+
212
+ // We don't allow the value to be set to nothing
213
+ if ( key === "label" && !value ) {
214
+ return;
215
+ }
216
+
217
+ this._super( key, value );
218
+
219
+ if ( key === "disabled" ) {
220
+ this._toggleClass( this.label, null, "ui-state-disabled", value );
221
+ this.element[ 0 ].disabled = value;
222
+
223
+ // Don't refresh when setting disabled
224
+ return;
225
+ }
226
+ this.refresh();
227
+ },
228
+
229
+ _updateIcon: function( checked ) {
230
+ var toAdd = "ui-icon ui-icon-background ";
231
+
232
+ if ( this.options.icon ) {
233
+ if ( !this.icon ) {
234
+ this.icon = $( "<span>" );
235
+ this.iconSpace = $( "<span> </span>" );
236
+ this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
237
+ }
238
+
239
+ if ( this.type === "checkbox" ) {
240
+ toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
241
+ this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
242
+ } else {
243
+ toAdd += "ui-icon-blank";
244
+ }
245
+ this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
246
+ if ( !checked ) {
247
+ this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
248
+ }
249
+ this.icon.prependTo( this.label ).after( this.iconSpace );
250
+ } else if ( this.icon !== undefined ) {
251
+ this.icon.remove();
252
+ this.iconSpace.remove();
253
+ delete this.icon;
254
+ }
255
+ },
256
+
257
+ _updateLabel: function() {
258
+
259
+ // Remove the contents of the label ( minus the icon, icon space, and input )
260
+ var contents = this.label.contents().not( this.element[ 0 ] );
261
+ if ( this.icon ) {
262
+ contents = contents.not( this.icon[ 0 ] );
263
+ }
264
+ if ( this.iconSpace ) {
265
+ contents = contents.not( this.iconSpace[ 0 ] );
266
+ }
267
+ contents.remove();
268
+
269
+ this.label.append( this.options.label );
270
+ },
271
+
272
+ refresh: function() {
273
+ var checked = this.element[ 0 ].checked,
274
+ isDisabled = this.element[ 0 ].disabled;
275
+
276
+ this._updateIcon( checked );
277
+ this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
278
+ if ( this.options.label !== null ) {
279
+ this._updateLabel();
280
+ }
281
+
282
+ if ( isDisabled !== this.options.disabled ) {
283
+ this._setOptions( { "disabled": isDisabled } );
284
+ }
285
+ }
286
+
287
+ } ] );
288
+
289
+ return $.ui.checkboxradio;
290
+
300
291
  } ) );