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,954 @@
1
+ //= require jquery-ui/widgets/button
2
+ //= require jquery-ui/widgets/draggable
3
+ //= require jquery-ui/widgets/mouse
4
+ //= require jquery-ui/widgets/resizable
5
+ //= require jquery-ui/focusable
6
+ //= require jquery-ui/keycode
7
+ //= require jquery-ui/position
8
+ //= require jquery-ui/safe-active-element
9
+ //= require jquery-ui/safe-blur
10
+ //= require jquery-ui/tabbable
11
+ //= require jquery-ui/unique-id
12
+ //= require jquery-ui/version
13
+ //= require jquery-ui/widget
14
+
15
+ /*!
16
+ * jQuery UI Dialog 1.12.1
17
+ * http://jqueryui.com
18
+ *
19
+ * Copyright jQuery Foundation and other contributors
20
+ * Released under the MIT license.
21
+ * http://jquery.org/license
22
+ */
23
+
24
+ //>>label: Dialog
25
+ //>>group: Widgets
26
+ //>>description: Displays customizable dialog windows.
27
+ //>>docs: http://api.jqueryui.com/dialog/
28
+ //>>demos: http://jqueryui.com/dialog/
29
+ //>>css.structure: ../../themes/base/core.css
30
+ //>>css.structure: ../../themes/base/dialog.css
31
+ //>>css.theme: ../../themes/base/theme.css
32
+
33
+ ( function( factory ) {
34
+ if ( typeof define === "function" && define.amd ) {
35
+
36
+ // AMD. Register as an anonymous module.
37
+ define( [
38
+ "jquery",
39
+ "./button",
40
+ "./draggable",
41
+ "./mouse",
42
+ "./resizable",
43
+ "../focusable",
44
+ "../keycode",
45
+ "../position",
46
+ "../safe-active-element",
47
+ "../safe-blur",
48
+ "../tabbable",
49
+ "../unique-id",
50
+ "../version",
51
+ "../widget"
52
+ ], factory );
53
+ } else {
54
+
55
+ // Browser globals
56
+ factory( jQuery );
57
+ }
58
+ }( function( $ ) {
59
+
60
+ $.widget( "ui.dialog", {
61
+ version: "1.12.1",
62
+ options: {
63
+ appendTo: "body",
64
+ autoOpen: true,
65
+ buttons: [],
66
+ classes: {
67
+ "ui-dialog": "ui-corner-all",
68
+ "ui-dialog-titlebar": "ui-corner-all"
69
+ },
70
+ closeOnEscape: true,
71
+ closeText: "Close",
72
+ draggable: true,
73
+ hide: null,
74
+ height: "auto",
75
+ maxHeight: null,
76
+ maxWidth: null,
77
+ minHeight: 150,
78
+ minWidth: 150,
79
+ modal: false,
80
+ position: {
81
+ my: "center",
82
+ at: "center",
83
+ of: window,
84
+ collision: "fit",
85
+
86
+ // Ensure the titlebar is always visible
87
+ using: function( pos ) {
88
+ var topOffset = $( this ).css( pos ).offset().top;
89
+ if ( topOffset < 0 ) {
90
+ $( this ).css( "top", pos.top - topOffset );
91
+ }
92
+ }
93
+ },
94
+ resizable: true,
95
+ show: null,
96
+ title: null,
97
+ width: 300,
98
+
99
+ // Callbacks
100
+ beforeClose: null,
101
+ close: null,
102
+ drag: null,
103
+ dragStart: null,
104
+ dragStop: null,
105
+ focus: null,
106
+ open: null,
107
+ resize: null,
108
+ resizeStart: null,
109
+ resizeStop: null
110
+ },
111
+
112
+ sizeRelatedOptions: {
113
+ buttons: true,
114
+ height: true,
115
+ maxHeight: true,
116
+ maxWidth: true,
117
+ minHeight: true,
118
+ minWidth: true,
119
+ width: true
120
+ },
121
+
122
+ resizableRelatedOptions: {
123
+ maxHeight: true,
124
+ maxWidth: true,
125
+ minHeight: true,
126
+ minWidth: true
127
+ },
128
+
129
+ _create: function() {
130
+ this.originalCss = {
131
+ display: this.element[ 0 ].style.display,
132
+ width: this.element[ 0 ].style.width,
133
+ minHeight: this.element[ 0 ].style.minHeight,
134
+ maxHeight: this.element[ 0 ].style.maxHeight,
135
+ height: this.element[ 0 ].style.height
136
+ };
137
+ this.originalPosition = {
138
+ parent: this.element.parent(),
139
+ index: this.element.parent().children().index( this.element )
140
+ };
141
+ this.originalTitle = this.element.attr( "title" );
142
+ if ( this.options.title == null && this.originalTitle != null ) {
143
+ this.options.title = this.originalTitle;
144
+ }
145
+
146
+ // Dialogs can't be disabled
147
+ if ( this.options.disabled ) {
148
+ this.options.disabled = false;
149
+ }
150
+
151
+ this._createWrapper();
152
+
153
+ this.element
154
+ .show()
155
+ .removeAttr( "title" )
156
+ .appendTo( this.uiDialog );
157
+
158
+ this._addClass( "ui-dialog-content", "ui-widget-content" );
159
+
160
+ this._createTitlebar();
161
+ this._createButtonPane();
162
+
163
+ if ( this.options.draggable && $.fn.draggable ) {
164
+ this._makeDraggable();
165
+ }
166
+ if ( this.options.resizable && $.fn.resizable ) {
167
+ this._makeResizable();
168
+ }
169
+
170
+ this._isOpen = false;
171
+
172
+ this._trackFocus();
173
+ },
174
+
175
+ _init: function() {
176
+ if ( this.options.autoOpen ) {
177
+ this.open();
178
+ }
179
+ },
180
+
181
+ _appendTo: function() {
182
+ var element = this.options.appendTo;
183
+ if ( element && ( element.jquery || element.nodeType ) ) {
184
+ return $( element );
185
+ }
186
+ return this.document.find( element || "body" ).eq( 0 );
187
+ },
188
+
189
+ _destroy: function() {
190
+ var next,
191
+ originalPosition = this.originalPosition;
192
+
193
+ this._untrackInstance();
194
+ this._destroyOverlay();
195
+
196
+ this.element
197
+ .removeUniqueId()
198
+ .css( this.originalCss )
199
+
200
+ // Without detaching first, the following becomes really slow
201
+ .detach();
202
+
203
+ this.uiDialog.remove();
204
+
205
+ if ( this.originalTitle ) {
206
+ this.element.attr( "title", this.originalTitle );
207
+ }
208
+
209
+ next = originalPosition.parent.children().eq( originalPosition.index );
210
+
211
+ // Don't try to place the dialog next to itself (#8613)
212
+ if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
213
+ next.before( this.element );
214
+ } else {
215
+ originalPosition.parent.append( this.element );
216
+ }
217
+ },
218
+
219
+ widget: function() {
220
+ return this.uiDialog;
221
+ },
222
+
223
+ disable: $.noop,
224
+ enable: $.noop,
225
+
226
+ close: function( event ) {
227
+ var that = this;
228
+
229
+ if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
230
+ return;
231
+ }
232
+
233
+ this._isOpen = false;
234
+ this._focusedElement = null;
235
+ this._destroyOverlay();
236
+ this._untrackInstance();
237
+
238
+ if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
239
+
240
+ // Hiding a focused element doesn't trigger blur in WebKit
241
+ // so in case we have nothing to focus on, explicitly blur the active element
242
+ // https://bugs.webkit.org/show_bug.cgi?id=47182
243
+ $.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
244
+ }
245
+
246
+ this._hide( this.uiDialog, this.options.hide, function() {
247
+ that._trigger( "close", event );
248
+ } );
249
+ },
250
+
251
+ isOpen: function() {
252
+ return this._isOpen;
253
+ },
254
+
255
+ moveToTop: function() {
256
+ this._moveToTop();
257
+ },
258
+
259
+ _moveToTop: function( event, silent ) {
260
+ var moved = false,
261
+ zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
262
+ return +$( this ).css( "z-index" );
263
+ } ).get(),
264
+ zIndexMax = Math.max.apply( null, zIndices );
265
+
266
+ if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
267
+ this.uiDialog.css( "z-index", zIndexMax + 1 );
268
+ moved = true;
269
+ }
270
+
271
+ if ( moved && !silent ) {
272
+ this._trigger( "focus", event );
273
+ }
274
+ return moved;
275
+ },
276
+
277
+ open: function() {
278
+ var that = this;
279
+ if ( this._isOpen ) {
280
+ if ( this._moveToTop() ) {
281
+ this._focusTabbable();
282
+ }
283
+ return;
284
+ }
285
+
286
+ this._isOpen = true;
287
+ this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
288
+
289
+ this._size();
290
+ this._position();
291
+ this._createOverlay();
292
+ this._moveToTop( null, true );
293
+
294
+ // Ensure the overlay is moved to the top with the dialog, but only when
295
+ // opening. The overlay shouldn't move after the dialog is open so that
296
+ // modeless dialogs opened after the modal dialog stack properly.
297
+ if ( this.overlay ) {
298
+ this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
299
+ }
300
+
301
+ this._show( this.uiDialog, this.options.show, function() {
302
+ that._focusTabbable();
303
+ that._trigger( "focus" );
304
+ } );
305
+
306
+ // Track the dialog immediately upon openening in case a focus event
307
+ // somehow occurs outside of the dialog before an element inside the
308
+ // dialog is focused (#10152)
309
+ this._makeFocusTarget();
310
+
311
+ this._trigger( "open" );
312
+ },
313
+
314
+ _focusTabbable: function() {
315
+
316
+ // Set focus to the first match:
317
+ // 1. An element that was focused previously
318
+ // 2. First element inside the dialog matching [autofocus]
319
+ // 3. Tabbable element inside the content element
320
+ // 4. Tabbable element inside the buttonpane
321
+ // 5. The close button
322
+ // 6. The dialog itself
323
+ var hasFocus = this._focusedElement;
324
+ if ( !hasFocus ) {
325
+ hasFocus = this.element.find( "[autofocus]" );
326
+ }
327
+ if ( !hasFocus.length ) {
328
+ hasFocus = this.element.find( ":tabbable" );
329
+ }
330
+ if ( !hasFocus.length ) {
331
+ hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
332
+ }
333
+ if ( !hasFocus.length ) {
334
+ hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
335
+ }
336
+ if ( !hasFocus.length ) {
337
+ hasFocus = this.uiDialog;
338
+ }
339
+ hasFocus.eq( 0 ).trigger( "focus" );
340
+ },
341
+
342
+ _keepFocus: function( event ) {
343
+ function checkFocus() {
344
+ var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
345
+ isActive = this.uiDialog[ 0 ] === activeElement ||
346
+ $.contains( this.uiDialog[ 0 ], activeElement );
347
+ if ( !isActive ) {
348
+ this._focusTabbable();
349
+ }
350
+ }
351
+ event.preventDefault();
352
+ checkFocus.call( this );
353
+
354
+ // support: IE
355
+ // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
356
+ // so we check again later
357
+ this._delay( checkFocus );
358
+ },
359
+
360
+ _createWrapper: function() {
361
+ this.uiDialog = $( "<div>" )
362
+ .hide()
363
+ .attr( {
364
+
365
+ // Setting tabIndex makes the div focusable
366
+ tabIndex: -1,
367
+ role: "dialog"
368
+ } )
369
+ .appendTo( this._appendTo() );
370
+
371
+ this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
372
+ this._on( this.uiDialog, {
373
+ keydown: function( event ) {
374
+ if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
375
+ event.keyCode === $.ui.keyCode.ESCAPE ) {
376
+ event.preventDefault();
377
+ this.close( event );
378
+ return;
379
+ }
380
+
381
+ // Prevent tabbing out of dialogs
382
+ if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
383
+ return;
384
+ }
385
+ var tabbables = this.uiDialog.find( ":tabbable" ),
386
+ first = tabbables.filter( ":first" ),
387
+ last = tabbables.filter( ":last" );
388
+
389
+ if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
390
+ !event.shiftKey ) {
391
+ this._delay( function() {
392
+ first.trigger( "focus" );
393
+ } );
394
+ event.preventDefault();
395
+ } else if ( ( event.target === first[ 0 ] ||
396
+ event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
397
+ this._delay( function() {
398
+ last.trigger( "focus" );
399
+ } );
400
+ event.preventDefault();
401
+ }
402
+ },
403
+ mousedown: function( event ) {
404
+ if ( this._moveToTop( event ) ) {
405
+ this._focusTabbable();
406
+ }
407
+ }
408
+ } );
409
+
410
+ // We assume that any existing aria-describedby attribute means
411
+ // that the dialog content is marked up properly
412
+ // otherwise we brute force the content as the description
413
+ if ( !this.element.find( "[aria-describedby]" ).length ) {
414
+ this.uiDialog.attr( {
415
+ "aria-describedby": this.element.uniqueId().attr( "id" )
416
+ } );
417
+ }
418
+ },
419
+
420
+ _createTitlebar: function() {
421
+ var uiDialogTitle;
422
+
423
+ this.uiDialogTitlebar = $( "<div>" );
424
+ this._addClass( this.uiDialogTitlebar,
425
+ "ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
426
+ this._on( this.uiDialogTitlebar, {
427
+ mousedown: function( event ) {
428
+
429
+ // Don't prevent click on close button (#8838)
430
+ // Focusing a dialog that is partially scrolled out of view
431
+ // causes the browser to scroll it into view, preventing the click event
432
+ if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
433
+
434
+ // Dialog isn't getting focus when dragging (#8063)
435
+ this.uiDialog.trigger( "focus" );
436
+ }
437
+ }
438
+ } );
439
+
440
+ // Support: IE
441
+ // Use type="button" to prevent enter keypresses in textboxes from closing the
442
+ // dialog in IE (#9312)
443
+ this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
444
+ .button( {
445
+ label: $( "<a>" ).text( this.options.closeText ).html(),
446
+ icon: "ui-icon-closethick",
447
+ showLabel: false
448
+ } )
449
+ .appendTo( this.uiDialogTitlebar );
450
+
451
+ this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
452
+ this._on( this.uiDialogTitlebarClose, {
453
+ click: function( event ) {
454
+ event.preventDefault();
455
+ this.close( event );
456
+ }
457
+ } );
458
+
459
+ uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
460
+ this._addClass( uiDialogTitle, "ui-dialog-title" );
461
+ this._title( uiDialogTitle );
462
+
463
+ this.uiDialogTitlebar.prependTo( this.uiDialog );
464
+
465
+ this.uiDialog.attr( {
466
+ "aria-labelledby": uiDialogTitle.attr( "id" )
467
+ } );
468
+ },
469
+
470
+ _title: function( title ) {
471
+ if ( this.options.title ) {
472
+ title.text( this.options.title );
473
+ } else {
474
+ title.html( "&#160;" );
475
+ }
476
+ },
477
+
478
+ _createButtonPane: function() {
479
+ this.uiDialogButtonPane = $( "<div>" );
480
+ this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
481
+ "ui-widget-content ui-helper-clearfix" );
482
+
483
+ this.uiButtonSet = $( "<div>" )
484
+ .appendTo( this.uiDialogButtonPane );
485
+ this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
486
+
487
+ this._createButtons();
488
+ },
489
+
490
+ _createButtons: function() {
491
+ var that = this,
492
+ buttons = this.options.buttons;
493
+
494
+ // If we already have a button pane, remove it
495
+ this.uiDialogButtonPane.remove();
496
+ this.uiButtonSet.empty();
497
+
498
+ if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
499
+ this._removeClass( this.uiDialog, "ui-dialog-buttons" );
500
+ return;
501
+ }
502
+
503
+ $.each( buttons, function( name, props ) {
504
+ var click, buttonOptions;
505
+ props = $.isFunction( props ) ?
506
+ { click: props, text: name } :
507
+ props;
508
+
509
+ // Default to a non-submitting button
510
+ props = $.extend( { type: "button" }, props );
511
+
512
+ // Change the context for the click callback to be the main element
513
+ click = props.click;
514
+ buttonOptions = {
515
+ icon: props.icon,
516
+ iconPosition: props.iconPosition,
517
+ showLabel: props.showLabel,
518
+
519
+ // Deprecated options
520
+ icons: props.icons,
521
+ text: props.text
522
+ };
523
+
524
+ delete props.click;
525
+ delete props.icon;
526
+ delete props.iconPosition;
527
+ delete props.showLabel;
528
+
529
+ // Deprecated options
530
+ delete props.icons;
531
+ if ( typeof props.text === "boolean" ) {
532
+ delete props.text;
533
+ }
534
+
535
+ $( "<button></button>", props )
536
+ .button( buttonOptions )
537
+ .appendTo( that.uiButtonSet )
538
+ .on( "click", function() {
539
+ click.apply( that.element[ 0 ], arguments );
540
+ } );
541
+ } );
542
+ this._addClass( this.uiDialog, "ui-dialog-buttons" );
543
+ this.uiDialogButtonPane.appendTo( this.uiDialog );
544
+ },
545
+
546
+ _makeDraggable: function() {
547
+ var that = this,
548
+ options = this.options;
549
+
550
+ function filteredUi( ui ) {
551
+ return {
552
+ position: ui.position,
553
+ offset: ui.offset
554
+ };
555
+ }
556
+
557
+ this.uiDialog.draggable( {
558
+ cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
559
+ handle: ".ui-dialog-titlebar",
560
+ containment: "document",
561
+ start: function( event, ui ) {
562
+ that._addClass( $( this ), "ui-dialog-dragging" );
563
+ that._blockFrames();
564
+ that._trigger( "dragStart", event, filteredUi( ui ) );
565
+ },
566
+ drag: function( event, ui ) {
567
+ that._trigger( "drag", event, filteredUi( ui ) );
568
+ },
569
+ stop: function( event, ui ) {
570
+ var left = ui.offset.left - that.document.scrollLeft(),
571
+ top = ui.offset.top - that.document.scrollTop();
572
+
573
+ options.position = {
574
+ my: "left top",
575
+ at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
576
+ "top" + ( top >= 0 ? "+" : "" ) + top,
577
+ of: that.window
578
+ };
579
+ that._removeClass( $( this ), "ui-dialog-dragging" );
580
+ that._unblockFrames();
581
+ that._trigger( "dragStop", event, filteredUi( ui ) );
582
+ }
583
+ } );
584
+ },
585
+
586
+ _makeResizable: function() {
587
+ var that = this,
588
+ options = this.options,
589
+ handles = options.resizable,
590
+
591
+ // .ui-resizable has position: relative defined in the stylesheet
592
+ // but dialogs have to use absolute or fixed positioning
593
+ position = this.uiDialog.css( "position" ),
594
+ resizeHandles = typeof handles === "string" ?
595
+ handles :
596
+ "n,e,s,w,se,sw,ne,nw";
597
+
598
+ function filteredUi( ui ) {
599
+ return {
600
+ originalPosition: ui.originalPosition,
601
+ originalSize: ui.originalSize,
602
+ position: ui.position,
603
+ size: ui.size
604
+ };
605
+ }
606
+
607
+ this.uiDialog.resizable( {
608
+ cancel: ".ui-dialog-content",
609
+ containment: "document",
610
+ alsoResize: this.element,
611
+ maxWidth: options.maxWidth,
612
+ maxHeight: options.maxHeight,
613
+ minWidth: options.minWidth,
614
+ minHeight: this._minHeight(),
615
+ handles: resizeHandles,
616
+ start: function( event, ui ) {
617
+ that._addClass( $( this ), "ui-dialog-resizing" );
618
+ that._blockFrames();
619
+ that._trigger( "resizeStart", event, filteredUi( ui ) );
620
+ },
621
+ resize: function( event, ui ) {
622
+ that._trigger( "resize", event, filteredUi( ui ) );
623
+ },
624
+ stop: function( event, ui ) {
625
+ var offset = that.uiDialog.offset(),
626
+ left = offset.left - that.document.scrollLeft(),
627
+ top = offset.top - that.document.scrollTop();
628
+
629
+ options.height = that.uiDialog.height();
630
+ options.width = that.uiDialog.width();
631
+ options.position = {
632
+ my: "left top",
633
+ at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
634
+ "top" + ( top >= 0 ? "+" : "" ) + top,
635
+ of: that.window
636
+ };
637
+ that._removeClass( $( this ), "ui-dialog-resizing" );
638
+ that._unblockFrames();
639
+ that._trigger( "resizeStop", event, filteredUi( ui ) );
640
+ }
641
+ } )
642
+ .css( "position", position );
643
+ },
644
+
645
+ _trackFocus: function() {
646
+ this._on( this.widget(), {
647
+ focusin: function( event ) {
648
+ this._makeFocusTarget();
649
+ this._focusedElement = $( event.target );
650
+ }
651
+ } );
652
+ },
653
+
654
+ _makeFocusTarget: function() {
655
+ this._untrackInstance();
656
+ this._trackingInstances().unshift( this );
657
+ },
658
+
659
+ _untrackInstance: function() {
660
+ var instances = this._trackingInstances(),
661
+ exists = $.inArray( this, instances );
662
+ if ( exists !== -1 ) {
663
+ instances.splice( exists, 1 );
664
+ }
665
+ },
666
+
667
+ _trackingInstances: function() {
668
+ var instances = this.document.data( "ui-dialog-instances" );
669
+ if ( !instances ) {
670
+ instances = [];
671
+ this.document.data( "ui-dialog-instances", instances );
672
+ }
673
+ return instances;
674
+ },
675
+
676
+ _minHeight: function() {
677
+ var options = this.options;
678
+
679
+ return options.height === "auto" ?
680
+ options.minHeight :
681
+ Math.min( options.minHeight, options.height );
682
+ },
683
+
684
+ _position: function() {
685
+
686
+ // Need to show the dialog to get the actual offset in the position plugin
687
+ var isVisible = this.uiDialog.is( ":visible" );
688
+ if ( !isVisible ) {
689
+ this.uiDialog.show();
690
+ }
691
+ this.uiDialog.position( this.options.position );
692
+ if ( !isVisible ) {
693
+ this.uiDialog.hide();
694
+ }
695
+ },
696
+
697
+ _setOptions: function( options ) {
698
+ var that = this,
699
+ resize = false,
700
+ resizableOptions = {};
701
+
702
+ $.each( options, function( key, value ) {
703
+ that._setOption( key, value );
704
+
705
+ if ( key in that.sizeRelatedOptions ) {
706
+ resize = true;
707
+ }
708
+ if ( key in that.resizableRelatedOptions ) {
709
+ resizableOptions[ key ] = value;
710
+ }
711
+ } );
712
+
713
+ if ( resize ) {
714
+ this._size();
715
+ this._position();
716
+ }
717
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
718
+ this.uiDialog.resizable( "option", resizableOptions );
719
+ }
720
+ },
721
+
722
+ _setOption: function( key, value ) {
723
+ var isDraggable, isResizable,
724
+ uiDialog = this.uiDialog;
725
+
726
+ if ( key === "disabled" ) {
727
+ return;
728
+ }
729
+
730
+ this._super( key, value );
731
+
732
+ if ( key === "appendTo" ) {
733
+ this.uiDialog.appendTo( this._appendTo() );
734
+ }
735
+
736
+ if ( key === "buttons" ) {
737
+ this._createButtons();
738
+ }
739
+
740
+ if ( key === "closeText" ) {
741
+ this.uiDialogTitlebarClose.button( {
742
+
743
+ // Ensure that we always pass a string
744
+ label: $( "<a>" ).text( "" + this.options.closeText ).html()
745
+ } );
746
+ }
747
+
748
+ if ( key === "draggable" ) {
749
+ isDraggable = uiDialog.is( ":data(ui-draggable)" );
750
+ if ( isDraggable && !value ) {
751
+ uiDialog.draggable( "destroy" );
752
+ }
753
+
754
+ if ( !isDraggable && value ) {
755
+ this._makeDraggable();
756
+ }
757
+ }
758
+
759
+ if ( key === "position" ) {
760
+ this._position();
761
+ }
762
+
763
+ if ( key === "resizable" ) {
764
+
765
+ // currently resizable, becoming non-resizable
766
+ isResizable = uiDialog.is( ":data(ui-resizable)" );
767
+ if ( isResizable && !value ) {
768
+ uiDialog.resizable( "destroy" );
769
+ }
770
+
771
+ // Currently resizable, changing handles
772
+ if ( isResizable && typeof value === "string" ) {
773
+ uiDialog.resizable( "option", "handles", value );
774
+ }
775
+
776
+ // Currently non-resizable, becoming resizable
777
+ if ( !isResizable && value !== false ) {
778
+ this._makeResizable();
779
+ }
780
+ }
781
+
782
+ if ( key === "title" ) {
783
+ this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
784
+ }
785
+ },
786
+
787
+ _size: function() {
788
+
789
+ // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
790
+ // divs will both have width and height set, so we need to reset them
791
+ var nonContentHeight, minContentHeight, maxContentHeight,
792
+ options = this.options;
793
+
794
+ // Reset content sizing
795
+ this.element.show().css( {
796
+ width: "auto",
797
+ minHeight: 0,
798
+ maxHeight: "none",
799
+ height: 0
800
+ } );
801
+
802
+ if ( options.minWidth > options.width ) {
803
+ options.width = options.minWidth;
804
+ }
805
+
806
+ // Reset wrapper sizing
807
+ // determine the height of all the non-content elements
808
+ nonContentHeight = this.uiDialog.css( {
809
+ height: "auto",
810
+ width: options.width
811
+ } )
812
+ .outerHeight();
813
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
814
+ maxContentHeight = typeof options.maxHeight === "number" ?
815
+ Math.max( 0, options.maxHeight - nonContentHeight ) :
816
+ "none";
817
+
818
+ if ( options.height === "auto" ) {
819
+ this.element.css( {
820
+ minHeight: minContentHeight,
821
+ maxHeight: maxContentHeight,
822
+ height: "auto"
823
+ } );
824
+ } else {
825
+ this.element.height( Math.max( 0, options.height - nonContentHeight ) );
826
+ }
827
+
828
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
829
+ this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
830
+ }
831
+ },
832
+
833
+ _blockFrames: function() {
834
+ this.iframeBlocks = this.document.find( "iframe" ).map( function() {
835
+ var iframe = $( this );
836
+
837
+ return $( "<div>" )
838
+ .css( {
839
+ position: "absolute",
840
+ width: iframe.outerWidth(),
841
+ height: iframe.outerHeight()
842
+ } )
843
+ .appendTo( iframe.parent() )
844
+ .offset( iframe.offset() )[ 0 ];
845
+ } );
846
+ },
847
+
848
+ _unblockFrames: function() {
849
+ if ( this.iframeBlocks ) {
850
+ this.iframeBlocks.remove();
851
+ delete this.iframeBlocks;
852
+ }
853
+ },
854
+
855
+ _allowInteraction: function( event ) {
856
+ if ( $( event.target ).closest( ".ui-dialog" ).length ) {
857
+ return true;
858
+ }
859
+
860
+ // TODO: Remove hack when datepicker implements
861
+ // the .ui-front logic (#8989)
862
+ return !!$( event.target ).closest( ".ui-datepicker" ).length;
863
+ },
864
+
865
+ _createOverlay: function() {
866
+ if ( !this.options.modal ) {
867
+ return;
868
+ }
869
+
870
+ // We use a delay in case the overlay is created from an
871
+ // event that we're going to be cancelling (#2804)
872
+ var isOpening = true;
873
+ this._delay( function() {
874
+ isOpening = false;
875
+ } );
876
+
877
+ if ( !this.document.data( "ui-dialog-overlays" ) ) {
878
+
879
+ // Prevent use of anchors and inputs
880
+ // Using _on() for an event handler shared across many instances is
881
+ // safe because the dialogs stack and must be closed in reverse order
882
+ this._on( this.document, {
883
+ focusin: function( event ) {
884
+ if ( isOpening ) {
885
+ return;
886
+ }
887
+
888
+ if ( !this._allowInteraction( event ) ) {
889
+ event.preventDefault();
890
+ this._trackingInstances()[ 0 ]._focusTabbable();
891
+ }
892
+ }
893
+ } );
894
+ }
895
+
896
+ this.overlay = $( "<div>" )
897
+ .appendTo( this._appendTo() );
898
+
899
+ this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
900
+ this._on( this.overlay, {
901
+ mousedown: "_keepFocus"
902
+ } );
903
+ this.document.data( "ui-dialog-overlays",
904
+ ( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
905
+ },
906
+
907
+ _destroyOverlay: function() {
908
+ if ( !this.options.modal ) {
909
+ return;
910
+ }
911
+
912
+ if ( this.overlay ) {
913
+ var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
914
+
915
+ if ( !overlays ) {
916
+ this._off( this.document, "focusin" );
917
+ this.document.removeData( "ui-dialog-overlays" );
918
+ } else {
919
+ this.document.data( "ui-dialog-overlays", overlays );
920
+ }
921
+
922
+ this.overlay.remove();
923
+ this.overlay = null;
924
+ }
925
+ }
926
+ } );
927
+
928
+ // DEPRECATED
929
+ // TODO: switch return back to widget declaration at top of file when this is removed
930
+ if ( $.uiBackCompat !== false ) {
931
+
932
+ // Backcompat for dialogClass option
933
+ $.widget( "ui.dialog", $.ui.dialog, {
934
+ options: {
935
+ dialogClass: ""
936
+ },
937
+ _createWrapper: function() {
938
+ this._super();
939
+ this.uiDialog.addClass( this.options.dialogClass );
940
+ },
941
+ _setOption: function( key, value ) {
942
+ if ( key === "dialogClass" ) {
943
+ this.uiDialog
944
+ .removeClass( this.options.dialogClass )
945
+ .addClass( value );
946
+ }
947
+ this._superApply( arguments );
948
+ }
949
+ } );
950
+ }
951
+
952
+ return $.ui.dialog;
953
+
954
+ } ) );