activeadmin 1.0.0 → 1.1.0

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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +20 -0
  3. data/.mdlrc +1 -0
  4. data/.rubocop.yml +52 -3
  5. data/.simplecov +13 -0
  6. data/.travis.yml +9 -24
  7. data/.yardopts +0 -1
  8. data/CHANGELOG.md +85 -4
  9. data/CONTRIBUTING.md +33 -57
  10. data/Gemfile +26 -17
  11. data/Rakefile +1 -12
  12. data/activeadmin.gemspec +9 -11
  13. data/app/assets/javascripts/active_admin/base.js.coffee +6 -2
  14. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +5 -1
  15. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +5 -1
  16. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +5 -1
  17. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +5 -1
  18. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +6 -3
  19. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +9 -7
  20. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +5 -2
  21. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +6 -2
  22. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +3 -5
  23. data/app/assets/stylesheets/active_admin/_base.scss +2 -2
  24. data/app/assets/stylesheets/active_admin/_forms.scss +6 -12
  25. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +0 -5
  26. data/app/assets/stylesheets/active_admin/components/_pagination.scss +11 -0
  27. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +1 -0
  28. data/app/assets/stylesheets/active_admin/components/_tables.scss +4 -1
  29. data/app/assets/stylesheets/active_admin/mixins/_all.scss +0 -2
  30. data/app/assets/stylesheets/active_admin/print.scss +2 -3
  31. data/app/views/active_admin/devise/sessions/new.html.erb +1 -1
  32. data/app/views/active_admin/devise/shared/_links.erb +12 -6
  33. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  34. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  35. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  36. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  37. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  38. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  39. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  40. data/codecov.yml +14 -12
  41. data/config/i18n-tasks.yml +26 -0
  42. data/config/locales/ar.yml +1 -3
  43. data/config/locales/bg.yml +0 -2
  44. data/config/locales/bs.yml +0 -2
  45. data/config/locales/ca.yml +0 -2
  46. data/config/locales/cs.yml +0 -2
  47. data/config/locales/da.yml +1 -3
  48. data/config/locales/de-CH.yml +1 -3
  49. data/config/locales/de.yml +1 -3
  50. data/config/locales/el.yml +1 -3
  51. data/config/locales/en-CA.yml +138 -0
  52. data/config/locales/en-GB.yml +43 -3
  53. data/config/locales/en.yml +8 -4
  54. data/config/locales/es-MX.yml +3 -2
  55. data/config/locales/es.yml +10 -4
  56. data/config/locales/fa.yml +0 -2
  57. data/config/locales/fi.yml +0 -2
  58. data/config/locales/fr.yml +9 -2
  59. data/config/locales/he.yml +53 -7
  60. data/config/locales/hr.yml +0 -2
  61. data/config/locales/hu.yml +0 -2
  62. data/config/locales/id.yml +1 -3
  63. data/config/locales/it.yml +2 -4
  64. data/config/locales/ja.yml +1 -3
  65. data/config/locales/ko.yml +0 -2
  66. data/config/locales/lt.yml +24 -4
  67. data/config/locales/lv.yml +0 -2
  68. data/config/locales/nb.yml +0 -2
  69. data/config/locales/nl.yml +1 -3
  70. data/config/locales/pl.yml +3 -2
  71. data/config/locales/pt-BR.yml +1 -3
  72. data/config/locales/pt-PT.yml +0 -2
  73. data/config/locales/ro.yml +0 -2
  74. data/config/locales/ru.yml +1 -3
  75. data/config/locales/sk.yml +0 -2
  76. data/config/locales/sv-SE.yml +1 -3
  77. data/config/locales/tr.yml +0 -2
  78. data/config/locales/uk.yml +1 -3
  79. data/config/locales/vi.yml +0 -2
  80. data/config/locales/zh-CN.yml +0 -2
  81. data/config/locales/zh-TW.yml +1 -3
  82. data/config/mdl_style.rb +9 -0
  83. data/cucumber.yml +3 -3
  84. data/docs/0-installation.md +15 -12
  85. data/docs/1-general-configuration.md +10 -3
  86. data/docs/10-custom-pages.md +10 -5
  87. data/docs/11-decorators.md +1 -0
  88. data/docs/12-arbre-components.md +7 -9
  89. data/docs/13-authorization-adapter.md +39 -24
  90. data/docs/14-gotchas.md +41 -22
  91. data/docs/2-resource-customization.md +41 -18
  92. data/docs/3-index-pages.md +30 -12
  93. data/docs/3-index-pages/custom-index.md +1 -0
  94. data/docs/3-index-pages/index-as-block.md +0 -5
  95. data/docs/3-index-pages/index-as-blog.md +0 -5
  96. data/docs/3-index-pages/index-as-grid.md +0 -5
  97. data/docs/3-index-pages/index-as-table.md +1 -9
  98. data/docs/4-csv-format.md +2 -1
  99. data/docs/5-forms.md +45 -21
  100. data/docs/6-show-pages.md +2 -1
  101. data/docs/7-sidebars.md +2 -1
  102. data/docs/8-custom-actions.md +4 -1
  103. data/docs/9-batch-actions.md +4 -2
  104. data/docs/documentation.md +19 -21
  105. data/features/comments/commenting.feature +20 -0
  106. data/features/index/filters.feature +41 -1
  107. data/features/index/format_as_csv.feature +17 -0
  108. data/features/index/index_scopes.feature +15 -0
  109. data/features/registering_assets.feature +8 -4
  110. data/features/show/attributes_table_title.feature +54 -0
  111. data/features/show/tabs.feature +10 -4
  112. data/features/step_definitions/action_link_steps.rb +0 -1
  113. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  114. data/features/step_definitions/batch_action_steps.rb +2 -2
  115. data/features/step_definitions/comment_steps.rb +21 -1
  116. data/features/step_definitions/configuration_steps.rb +1 -1
  117. data/features/step_definitions/filter_steps.rb +9 -0
  118. data/features/step_definitions/format_steps.rb +1 -1
  119. data/features/step_definitions/index_scope_steps.rb +4 -0
  120. data/features/support/env.rb +5 -4
  121. data/features/support/regular_env.rb +7 -0
  122. data/features/support/reload_env.rb +7 -0
  123. data/gemfiles/rails_42.gemfile +2 -37
  124. data/gemfiles/rails_50.gemfile +5 -40
  125. data/gemfiles/rails_51.gemfile +5 -40
  126. data/lib/active_admin.rb +0 -3
  127. data/lib/active_admin/application.rb +6 -4
  128. data/lib/active_admin/asset_registration.rb +8 -0
  129. data/lib/active_admin/authorization_adapter.rb +0 -3
  130. data/lib/active_admin/base_controller.rb +1 -2
  131. data/lib/active_admin/base_controller/authorization.rb +0 -1
  132. data/lib/active_admin/base_controller/menu.rb +9 -9
  133. data/lib/active_admin/batch_actions/controller.rb +1 -1
  134. data/lib/active_admin/batch_actions/views/selection_cells.rb +6 -5
  135. data/lib/active_admin/csv_builder.rb +3 -3
  136. data/lib/active_admin/dependency.rb +1 -1
  137. data/lib/active_admin/devise.rb +2 -2
  138. data/lib/active_admin/dsl.rb +2 -2
  139. data/lib/active_admin/filters.rb +2 -0
  140. data/lib/active_admin/filters/active.rb +13 -14
  141. data/lib/active_admin/filters/active_filter.rb +87 -0
  142. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  143. data/lib/active_admin/filters/forms.rb +1 -2
  144. data/lib/active_admin/filters/resource_extension.rb +2 -30
  145. data/lib/active_admin/helpers/settings.rb +0 -1
  146. data/lib/active_admin/inputs/datepicker_input.rb +5 -5
  147. data/lib/active_admin/inputs/filters/date_range_input.rb +12 -4
  148. data/lib/active_admin/inputs/filters/text_input.rb +0 -1
  149. data/lib/active_admin/menu.rb +4 -4
  150. data/lib/active_admin/menu_collection.rb +0 -2
  151. data/lib/active_admin/namespace.rb +1 -1
  152. data/lib/active_admin/orm/active_record/comments/comment.rb +1 -5
  153. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +4 -2
  154. data/lib/active_admin/page_controller.rb +1 -1
  155. data/lib/active_admin/resource/action_items.rb +4 -0
  156. data/lib/active_admin/resource/attributes.rb +1 -1
  157. data/lib/active_admin/resource/page_presenters.rb +1 -1
  158. data/lib/active_admin/resource/routes.rb +0 -1
  159. data/lib/active_admin/resource/scopes.rb +2 -1
  160. data/lib/active_admin/resource_controller.rb +1 -1
  161. data/lib/active_admin/resource_controller/data_access.rb +8 -9
  162. data/lib/active_admin/resource_dsl.rb +10 -10
  163. data/lib/active_admin/router.rb +1 -1
  164. data/lib/active_admin/scope.rb +3 -3
  165. data/lib/active_admin/version.rb +1 -1
  166. data/lib/active_admin/view_helpers.rb +1 -0
  167. data/lib/active_admin/view_helpers/display_helper.rb +1 -1
  168. data/lib/active_admin/view_helpers/form_helper.rb +1 -1
  169. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  170. data/lib/active_admin/views/action_items.rb +1 -1
  171. data/lib/active_admin/views/components/active_admin_form.rb +1 -1
  172. data/lib/active_admin/views/components/dropdown_menu.rb +2 -2
  173. data/lib/active_admin/views/components/index_list.rb +0 -2
  174. data/lib/active_admin/views/components/paginated_collection.rb +1 -1
  175. data/lib/active_admin/views/components/scopes.rb +2 -10
  176. data/lib/active_admin/views/components/status_tag.rb +19 -11
  177. data/lib/active_admin/views/components/tabs.rb +2 -2
  178. data/lib/active_admin/views/header.rb +0 -1
  179. data/lib/active_admin/views/index_as_blog.rb +1 -2
  180. data/lib/active_admin/views/index_as_grid.rb +2 -2
  181. data/lib/active_admin/views/index_as_table.rb +19 -1
  182. data/lib/active_admin/views/pages/base.rb +4 -4
  183. data/lib/active_admin/views/pages/show.rb +6 -1
  184. data/lib/active_admin/views/title_bar.rb +4 -4
  185. data/lib/bug_report_templates/{rails_5_master.rb → active_admin_master.rb} +35 -40
  186. data/lib/generators/active_admin/devise/devise_generator.rb +1 -1
  187. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +1 -1
  188. data/spec/bug_report_templates_spec.rb +2 -3
  189. data/spec/rails_helper.rb +0 -3
  190. data/spec/spec_helper.rb +1 -12
  191. data/spec/support/active_admin_integration_spec_helper.rb +1 -1
  192. data/spec/support/rails_template.rb +5 -37
  193. data/spec/support/rails_template_with_data.rb +262 -3
  194. data/spec/support/templates/policies/active_admin/comment_policy.rb +1 -1
  195. data/spec/support/templates/policies/active_admin/page_policy.rb +1 -1
  196. data/spec/support/templates/policies/application_policy.rb +1 -2
  197. data/spec/support/templates/post_decorator.rb +0 -1
  198. data/spec/unit/abstract_view_factory_spec.rb +0 -1
  199. data/spec/unit/application_spec.rb +4 -0
  200. data/spec/unit/asset_registration_spec.rb +29 -0
  201. data/spec/unit/belongs_to_spec.rb +1 -2
  202. data/spec/unit/config_shared_examples.rb +1 -1
  203. data/spec/unit/csv_builder_spec.rb +2 -4
  204. data/spec/unit/dependency_spec.rb +7 -7
  205. data/spec/unit/dsl_spec.rb +0 -2
  206. data/spec/unit/filters/active_filter_spec.rb +135 -0
  207. data/spec/unit/filters/active_spec.rb +11 -1
  208. data/spec/unit/filters/filter_form_builder_spec.rb +9 -7
  209. data/spec/unit/form_builder_spec.rb +14 -14
  210. data/spec/unit/helpers/scope_chain_spec.rb +0 -1
  211. data/spec/unit/i18n_spec.rb +17 -0
  212. data/spec/unit/menu_item_spec.rb +1 -3
  213. data/spec/unit/namespace/register_page_spec.rb +1 -1
  214. data/spec/unit/namespace_spec.rb +0 -1
  215. data/spec/unit/page_spec.rb +0 -3
  216. data/spec/unit/resource/action_items_spec.rb +5 -1
  217. data/spec/unit/resource/attributes_spec.rb +1 -2
  218. data/spec/unit/resource/ordering_spec.rb +0 -3
  219. data/spec/unit/resource/scopes_spec.rb +1 -1
  220. data/spec/unit/resource_controller/data_access_spec.rb +2 -2
  221. data/spec/unit/resource_controller_spec.rb +1 -2
  222. data/spec/unit/resource_spec.rb +9 -2
  223. data/spec/unit/routing_spec.rb +0 -2
  224. data/spec/unit/scope_spec.rb +3 -3
  225. data/spec/unit/settings_spec.rb +0 -1
  226. data/spec/unit/view_factory_spec.rb +1 -1
  227. data/spec/unit/view_helpers/flash_helper_spec.rb +0 -1
  228. data/spec/unit/view_helpers/form_helper_spec.rb +3 -4
  229. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +0 -1
  230. data/spec/unit/views/components/attributes_table_spec.rb +0 -1
  231. data/spec/unit/views/components/columns_spec.rb +0 -2
  232. data/spec/unit/views/components/site_title_spec.rb +0 -2
  233. data/spec/unit/views/components/status_tag_spec.rb +23 -7
  234. data/spec/unit/views/components/tabs_spec.rb +29 -1
  235. data/spec/unit/views/pages/index_spec.rb +1 -1
  236. data/tasks/docs.rake +37 -10
  237. data/tasks/lint.rake +14 -1
  238. data/tasks/local.rake +2 -2
  239. data/tasks/test.rake +8 -25
  240. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  241. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  242. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  243. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  244. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  245. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  246. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  247. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  248. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  249. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  250. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  251. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  252. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  253. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  254. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  255. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  256. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +300 -0
  257. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  258. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  259. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  260. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  261. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  262. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  263. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  264. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  265. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  266. metadata +62 -51
  267. data/.hound.yml +0 -14
  268. data/Appraisals +0 -41
  269. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  270. data/app/assets/javascripts/active_admin/jquery_ui.js.erb +0 -18
  271. data/app/assets/stylesheets/active_admin/mixins/_reset.scss +0 -165
  272. data/lib/active_admin/filters/humanized.rb +0 -68
  273. data/spec/requests/javascript_spec.rb +0 -22
  274. data/spec/support/jslint.yml +0 -80
  275. data/spec/unit/filters/humanized_spec.rb +0 -64
  276. data/tasks/yard.rake +0 -9
@@ -0,0 +1,391 @@
1
+ //= require jquery-ui/widgets/controlgroup
2
+ //= require jquery-ui/widgets/checkboxradio
3
+ //= require jquery-ui/keycode
4
+ //= require jquery-ui/widget
5
+
6
+ /*!
7
+ * jQuery UI Button 1.12.1
8
+ * http://jqueryui.com
9
+ *
10
+ * Copyright jQuery Foundation and other contributors
11
+ * Released under the MIT license.
12
+ * http://jquery.org/license
13
+ */
14
+
15
+ //>>label: Button
16
+ //>>group: Widgets
17
+ //>>description: Enhances a form with themeable buttons.
18
+ //>>docs: http://api.jqueryui.com/button/
19
+ //>>demos: http://jqueryui.com/button/
20
+ //>>css.structure: ../../themes/base/core.css
21
+ //>>css.structure: ../../themes/base/button.css
22
+ //>>css.theme: ../../themes/base/theme.css
23
+
24
+ ( function( factory ) {
25
+ if ( typeof define === "function" && define.amd ) {
26
+
27
+ // AMD. Register as an anonymous module.
28
+ define( [
29
+ "jquery",
30
+
31
+ // These are only for backcompat
32
+ // TODO: Remove after 1.12
33
+ "./controlgroup",
34
+ "./checkboxradio",
35
+
36
+ "../keycode",
37
+ "../widget"
38
+ ], factory );
39
+ } else {
40
+
41
+ // Browser globals
42
+ factory( jQuery );
43
+ }
44
+ }( function( $ ) {
45
+
46
+ $.widget( "ui.button", {
47
+ version: "1.12.1",
48
+ defaultElement: "<button>",
49
+ options: {
50
+ classes: {
51
+ "ui-button": "ui-corner-all"
52
+ },
53
+ disabled: null,
54
+ icon: null,
55
+ iconPosition: "beginning",
56
+ label: null,
57
+ showLabel: true
58
+ },
59
+
60
+ _getCreateOptions: function() {
61
+ var disabled,
62
+
63
+ // This is to support cases like in jQuery Mobile where the base widget does have
64
+ // an implementation of _getCreateOptions
65
+ options = this._super() || {};
66
+
67
+ this.isInput = this.element.is( "input" );
68
+
69
+ disabled = this.element[ 0 ].disabled;
70
+ if ( disabled != null ) {
71
+ options.disabled = disabled;
72
+ }
73
+
74
+ this.originalLabel = this.isInput ? this.element.val() : this.element.html();
75
+ if ( this.originalLabel ) {
76
+ options.label = this.originalLabel;
77
+ }
78
+
79
+ return options;
80
+ },
81
+
82
+ _create: function() {
83
+ if ( !this.option.showLabel & !this.options.icon ) {
84
+ this.options.showLabel = true;
85
+ }
86
+
87
+ // We have to check the option again here even though we did in _getCreateOptions,
88
+ // because null may have been passed on init which would override what was set in
89
+ // _getCreateOptions
90
+ if ( this.options.disabled == null ) {
91
+ this.options.disabled = this.element[ 0 ].disabled || false;
92
+ }
93
+
94
+ this.hasTitle = !!this.element.attr( "title" );
95
+
96
+ // Check to see if the label needs to be set or if its already correct
97
+ if ( this.options.label && this.options.label !== this.originalLabel ) {
98
+ if ( this.isInput ) {
99
+ this.element.val( this.options.label );
100
+ } else {
101
+ this.element.html( this.options.label );
102
+ }
103
+ }
104
+ this._addClass( "ui-button", "ui-widget" );
105
+ this._setOption( "disabled", this.options.disabled );
106
+ this._enhance();
107
+
108
+ if ( this.element.is( "a" ) ) {
109
+ this._on( {
110
+ "keyup": function( event ) {
111
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
112
+ event.preventDefault();
113
+
114
+ // Support: PhantomJS <= 1.9, IE 8 Only
115
+ // If a native click is available use it so we actually cause navigation
116
+ // otherwise just trigger a click event
117
+ if ( this.element[ 0 ].click ) {
118
+ this.element[ 0 ].click();
119
+ } else {
120
+ this.element.trigger( "click" );
121
+ }
122
+ }
123
+ }
124
+ } );
125
+ }
126
+ },
127
+
128
+ _enhance: function() {
129
+ if ( !this.element.is( "button" ) ) {
130
+ this.element.attr( "role", "button" );
131
+ }
132
+
133
+ if ( this.options.icon ) {
134
+ this._updateIcon( "icon", this.options.icon );
135
+ this._updateTooltip();
136
+ }
137
+ },
138
+
139
+ _updateTooltip: function() {
140
+ this.title = this.element.attr( "title" );
141
+
142
+ if ( !this.options.showLabel && !this.title ) {
143
+ this.element.attr( "title", this.options.label );
144
+ }
145
+ },
146
+
147
+ _updateIcon: function( option, value ) {
148
+ var icon = option !== "iconPosition",
149
+ position = icon ? this.options.iconPosition : value,
150
+ displayBlock = position === "top" || position === "bottom";
151
+
152
+ // Create icon
153
+ if ( !this.icon ) {
154
+ this.icon = $( "<span>" );
155
+
156
+ this._addClass( this.icon, "ui-button-icon", "ui-icon" );
157
+
158
+ if ( !this.options.showLabel ) {
159
+ this._addClass( "ui-button-icon-only" );
160
+ }
161
+ } else if ( icon ) {
162
+
163
+ // If we are updating the icon remove the old icon class
164
+ this._removeClass( this.icon, null, this.options.icon );
165
+ }
166
+
167
+ // If we are updating the icon add the new icon class
168
+ if ( icon ) {
169
+ this._addClass( this.icon, null, value );
170
+ }
171
+
172
+ this._attachIcon( position );
173
+
174
+ // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
175
+ // the iconSpace if there is one.
176
+ if ( displayBlock ) {
177
+ this._addClass( this.icon, null, "ui-widget-icon-block" );
178
+ if ( this.iconSpace ) {
179
+ this.iconSpace.remove();
180
+ }
181
+ } else {
182
+
183
+ // Position is beginning or end so remove the ui-widget-icon-block class and add the
184
+ // space if it does not exist
185
+ if ( !this.iconSpace ) {
186
+ this.iconSpace = $( "<span> </span>" );
187
+ this._addClass( this.iconSpace, "ui-button-icon-space" );
188
+ }
189
+ this._removeClass( this.icon, null, "ui-wiget-icon-block" );
190
+ this._attachIconSpace( position );
191
+ }
192
+ },
193
+
194
+ _destroy: function() {
195
+ this.element.removeAttr( "role" );
196
+
197
+ if ( this.icon ) {
198
+ this.icon.remove();
199
+ }
200
+ if ( this.iconSpace ) {
201
+ this.iconSpace.remove();
202
+ }
203
+ if ( !this.hasTitle ) {
204
+ this.element.removeAttr( "title" );
205
+ }
206
+ },
207
+
208
+ _attachIconSpace: function( iconPosition ) {
209
+ this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
210
+ },
211
+
212
+ _attachIcon: function( iconPosition ) {
213
+ this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
214
+ },
215
+
216
+ _setOptions: function( options ) {
217
+ var newShowLabel = options.showLabel === undefined ?
218
+ this.options.showLabel :
219
+ options.showLabel,
220
+ newIcon = options.icon === undefined ? this.options.icon : options.icon;
221
+
222
+ if ( !newShowLabel && !newIcon ) {
223
+ options.showLabel = true;
224
+ }
225
+ this._super( options );
226
+ },
227
+
228
+ _setOption: function( key, value ) {
229
+ if ( key === "icon" ) {
230
+ if ( value ) {
231
+ this._updateIcon( key, value );
232
+ } else if ( this.icon ) {
233
+ this.icon.remove();
234
+ if ( this.iconSpace ) {
235
+ this.iconSpace.remove();
236
+ }
237
+ }
238
+ }
239
+
240
+ if ( key === "iconPosition" ) {
241
+ this._updateIcon( key, value );
242
+ }
243
+
244
+ // Make sure we can't end up with a button that has neither text nor icon
245
+ if ( key === "showLabel" ) {
246
+ this._toggleClass( "ui-button-icon-only", null, !value );
247
+ this._updateTooltip();
248
+ }
249
+
250
+ if ( key === "label" ) {
251
+ if ( this.isInput ) {
252
+ this.element.val( value );
253
+ } else {
254
+
255
+ // If there is an icon, append it, else nothing then append the value
256
+ // this avoids removal of the icon when setting label text
257
+ this.element.html( value );
258
+ if ( this.icon ) {
259
+ this._attachIcon( this.options.iconPosition );
260
+ this._attachIconSpace( this.options.iconPosition );
261
+ }
262
+ }
263
+ }
264
+
265
+ this._super( key, value );
266
+
267
+ if ( key === "disabled" ) {
268
+ this._toggleClass( null, "ui-state-disabled", value );
269
+ this.element[ 0 ].disabled = value;
270
+ if ( value ) {
271
+ this.element.blur();
272
+ }
273
+ }
274
+ },
275
+
276
+ refresh: function() {
277
+
278
+ // Make sure to only check disabled if its an element that supports this otherwise
279
+ // check for the disabled class to determine state
280
+ var isDisabled = this.element.is( "input, button" ) ?
281
+ this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
282
+
283
+ if ( isDisabled !== this.options.disabled ) {
284
+ this._setOptions( { disabled: isDisabled } );
285
+ }
286
+
287
+ this._updateTooltip();
288
+ }
289
+ } );
290
+
291
+ // DEPRECATED
292
+ if ( $.uiBackCompat !== false ) {
293
+
294
+ // Text and Icons options
295
+ $.widget( "ui.button", $.ui.button, {
296
+ options: {
297
+ text: true,
298
+ icons: {
299
+ primary: null,
300
+ secondary: null
301
+ }
302
+ },
303
+
304
+ _create: function() {
305
+ if ( this.options.showLabel && !this.options.text ) {
306
+ this.options.showLabel = this.options.text;
307
+ }
308
+ if ( !this.options.showLabel && this.options.text ) {
309
+ this.options.text = this.options.showLabel;
310
+ }
311
+ if ( !this.options.icon && ( this.options.icons.primary ||
312
+ this.options.icons.secondary ) ) {
313
+ if ( this.options.icons.primary ) {
314
+ this.options.icon = this.options.icons.primary;
315
+ } else {
316
+ this.options.icon = this.options.icons.secondary;
317
+ this.options.iconPosition = "end";
318
+ }
319
+ } else if ( this.options.icon ) {
320
+ this.options.icons.primary = this.options.icon;
321
+ }
322
+ this._super();
323
+ },
324
+
325
+ _setOption: function( key, value ) {
326
+ if ( key === "text" ) {
327
+ this._super( "showLabel", value );
328
+ return;
329
+ }
330
+ if ( key === "showLabel" ) {
331
+ this.options.text = value;
332
+ }
333
+ if ( key === "icon" ) {
334
+ this.options.icons.primary = value;
335
+ }
336
+ if ( key === "icons" ) {
337
+ if ( value.primary ) {
338
+ this._super( "icon", value.primary );
339
+ this._super( "iconPosition", "beginning" );
340
+ } else if ( value.secondary ) {
341
+ this._super( "icon", value.secondary );
342
+ this._super( "iconPosition", "end" );
343
+ }
344
+ }
345
+ this._superApply( arguments );
346
+ }
347
+ } );
348
+
349
+ $.fn.button = ( function( orig ) {
350
+ return function() {
351
+ if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
352
+ ( this.length && this[ 0 ].tagName === "INPUT" && (
353
+ this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
354
+ ) ) ) {
355
+ return orig.apply( this, arguments );
356
+ }
357
+ if ( !$.ui.checkboxradio ) {
358
+ $.error( "Checkboxradio widget missing" );
359
+ }
360
+ if ( arguments.length === 0 ) {
361
+ return this.checkboxradio( {
362
+ "icon": false
363
+ } );
364
+ }
365
+ return this.checkboxradio.apply( this, arguments );
366
+ };
367
+ } )( $.fn.button );
368
+
369
+ $.fn.buttonset = function() {
370
+ if ( !$.ui.controlgroup ) {
371
+ $.error( "Controlgroup widget missing" );
372
+ }
373
+ if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
374
+ return this.controlgroup.apply( this,
375
+ [ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
376
+ }
377
+ if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
378
+ return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
379
+ }
380
+ if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
381
+ arguments[ 0 ].items = {
382
+ button: arguments[ 0 ].items
383
+ };
384
+ }
385
+ return this.controlgroup.apply( this, arguments );
386
+ };
387
+ }
388
+
389
+ return $.ui.button;
390
+
391
+ } ) );
@@ -0,0 +1,300 @@
1
+ //= require jquery-ui/widget
2
+
3
+ /*!
4
+ * jQuery UI Controlgroup 1.12.1
5
+ * http://jqueryui.com
6
+ *
7
+ * Copyright jQuery Foundation and other contributors
8
+ * Released under the MIT license.
9
+ * http://jquery.org/license
10
+ */
11
+
12
+ //>>label: Controlgroup
13
+ //>>group: Widgets
14
+ //>>description: Visually groups form control widgets
15
+ //>>docs: http://api.jqueryui.com/controlgroup/
16
+ //>>demos: http://jqueryui.com/controlgroup/
17
+ //>>css.structure: ../../themes/base/core.css
18
+ //>>css.structure: ../../themes/base/controlgroup.css
19
+ //>>css.theme: ../../themes/base/theme.css
20
+
21
+ ( 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
+ }
34
+ }( 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
+ } );
300
+ } ) );