padrino-admin 0.16.2 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +3 -3
  3. data/Rakefile +0 -21
  4. data/lib/padrino-admin/access_control.rb +17 -4
  5. data/lib/padrino-admin/generators/actions.rb +1 -1
  6. data/lib/padrino-admin/generators/admin_app.rb +9 -11
  7. data/lib/padrino-admin/generators/admin_page.rb +12 -2
  8. data/lib/padrino-admin/generators/orm.rb +30 -47
  9. data/lib/padrino-admin/generators/templates/account/seeds.rb.tt +7 -2
  10. data/lib/padrino-admin/generators/templates/app/controllers/sessions.rb.tt +0 -4
  11. data/lib/padrino-admin/generators/templates/app.rb.tt +4 -1
  12. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/affix.js +63 -36
  13. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/alert.js +18 -11
  14. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/bootstrap.min.js +4 -4
  15. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/button.js +41 -23
  16. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/carousel.js +90 -49
  17. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/collapse.js +86 -44
  18. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/dropdown.js +66 -48
  19. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/modal.js +167 -52
  20. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/popover.js +33 -20
  21. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/scrollspy.js +58 -39
  22. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tab.js +55 -25
  23. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tooltip.js +370 -92
  24. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/transition.js +22 -11
  25. data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-3.7.1.min.js +2 -0
  26. data/lib/padrino-admin/generators/templates/assets/stylesheets/application.css +14 -0
  27. data/lib/padrino-admin/generators/templates/assets/stylesheets/bootstrap.css +6 -4
  28. data/lib/padrino-admin/generators/templates/erb/app/base/index.erb.tt +1 -1
  29. data/lib/padrino-admin/generators/templates/erb/app/layouts/application.erb.tt +1 -1
  30. data/lib/padrino-admin/generators/templates/erb/app/sessions/new.erb.tt +1 -1
  31. data/lib/padrino-admin/generators/templates/erb/page/index.erb.tt +2 -2
  32. data/lib/padrino-admin/generators/templates/haml/app/base/index.haml.tt +1 -1
  33. data/lib/padrino-admin/generators/templates/haml/app/layouts/application.haml.tt +1 -1
  34. data/lib/padrino-admin/generators/templates/haml/app/sessions/new.haml.tt +1 -1
  35. data/lib/padrino-admin/generators/templates/slim/app/base/index.slim.tt +1 -1
  36. data/lib/padrino-admin/generators/templates/slim/app/layouts/application.slim.tt +1 -1
  37. data/lib/padrino-admin/generators/templates/slim/app/sessions/new.slim.tt +1 -1
  38. data/lib/padrino-admin/generators/templates/slim/page/index.slim.tt +2 -2
  39. data/lib/padrino-admin/helpers/authentication_helpers.rb +1 -1
  40. data/lib/padrino-admin/helpers/view_helpers.rb +3 -3
  41. data/lib/padrino-admin/locale/orm/pl.yml +0 -11
  42. data/lib/padrino-admin.rb +1 -1
  43. data/padrino-admin.gemspec +0 -2
  44. data/test/generators/test_account_model_generator.rb +1 -60
  45. data/test/generators/test_admin_app_generator.rb +159 -25
  46. data/test/generators/test_admin_page_generator.rb +110 -9
  47. data/test/test_admin_application.rb +123 -0
  48. metadata +9 -124
  49. data/lib/padrino-admin/bootstrap-less/alerts.less +0 -67
  50. data/lib/padrino-admin/bootstrap-less/badges.less +0 -55
  51. data/lib/padrino-admin/bootstrap-less/bootstrap.less +0 -49
  52. data/lib/padrino-admin/bootstrap-less/breadcrumbs.less +0 -26
  53. data/lib/padrino-admin/bootstrap-less/button-groups.less +0 -226
  54. data/lib/padrino-admin/bootstrap-less/buttons.less +0 -155
  55. data/lib/padrino-admin/bootstrap-less/carousel.less +0 -232
  56. data/lib/padrino-admin/bootstrap-less/close.less +0 -33
  57. data/lib/padrino-admin/bootstrap-less/code.less +0 -63
  58. data/lib/padrino-admin/bootstrap-less/component-animations.less +0 -29
  59. data/lib/padrino-admin/bootstrap-less/dropdowns.less +0 -213
  60. data/lib/padrino-admin/bootstrap-less/font-awesome/bordered-pulled.less +0 -16
  61. data/lib/padrino-admin/bootstrap-less/font-awesome/core.less +0 -12
  62. data/lib/padrino-admin/bootstrap-less/font-awesome/fixed-width.less +0 -6
  63. data/lib/padrino-admin/bootstrap-less/font-awesome/font-awesome.less +0 -17
  64. data/lib/padrino-admin/bootstrap-less/font-awesome/icons.less +0 -412
  65. data/lib/padrino-admin/bootstrap-less/font-awesome/larger.less +0 -13
  66. data/lib/padrino-admin/bootstrap-less/font-awesome/list.less +0 -19
  67. data/lib/padrino-admin/bootstrap-less/font-awesome/mixins.less +0 -20
  68. data/lib/padrino-admin/bootstrap-less/font-awesome/path.less +0 -14
  69. data/lib/padrino-admin/bootstrap-less/font-awesome/rotated-flipped.less +0 -9
  70. data/lib/padrino-admin/bootstrap-less/font-awesome/spinning.less +0 -30
  71. data/lib/padrino-admin/bootstrap-less/font-awesome/stacked.less +0 -20
  72. data/lib/padrino-admin/bootstrap-less/font-awesome/variables.less +0 -381
  73. data/lib/padrino-admin/bootstrap-less/forms.less +0 -419
  74. data/lib/padrino-admin/bootstrap-less/glyphicons.less +0 -233
  75. data/lib/padrino-admin/bootstrap-less/grid.less +0 -100
  76. data/lib/padrino-admin/bootstrap-less/input-groups.less +0 -157
  77. data/lib/padrino-admin/bootstrap-less/jumbotron.less +0 -44
  78. data/lib/padrino-admin/bootstrap-less/labels.less +0 -64
  79. data/lib/padrino-admin/bootstrap-less/list-group.less +0 -110
  80. data/lib/padrino-admin/bootstrap-less/media.less +0 -56
  81. data/lib/padrino-admin/bootstrap-less/mixins.less +0 -926
  82. data/lib/padrino-admin/bootstrap-less/modals.less +0 -138
  83. data/lib/padrino-admin/bootstrap-less/navbar.less +0 -616
  84. data/lib/padrino-admin/bootstrap-less/navs.less +0 -242
  85. data/lib/padrino-admin/bootstrap-less/normalize.less +0 -423
  86. data/lib/padrino-admin/bootstrap-less/padrino-admin.less +0 -18
  87. data/lib/padrino-admin/bootstrap-less/pager.less +0 -55
  88. data/lib/padrino-admin/bootstrap-less/pagination.less +0 -88
  89. data/lib/padrino-admin/bootstrap-less/panels.less +0 -230
  90. data/lib/padrino-admin/bootstrap-less/popovers.less +0 -133
  91. data/lib/padrino-admin/bootstrap-less/print.less +0 -101
  92. data/lib/padrino-admin/bootstrap-less/progress-bars.less +0 -80
  93. data/lib/padrino-admin/bootstrap-less/responsive-utilities.less +0 -93
  94. data/lib/padrino-admin/bootstrap-less/scaffolding.less +0 -134
  95. data/lib/padrino-admin/bootstrap-less/tables.less +0 -233
  96. data/lib/padrino-admin/bootstrap-less/theme.less +0 -247
  97. data/lib/padrino-admin/bootstrap-less/thumbnails.less +0 -36
  98. data/lib/padrino-admin/bootstrap-less/tooltip.less +0 -95
  99. data/lib/padrino-admin/bootstrap-less/type.less +0 -296
  100. data/lib/padrino-admin/bootstrap-less/utilities.less +0 -56
  101. data/lib/padrino-admin/bootstrap-less/variables.less +0 -827
  102. data/lib/padrino-admin/bootstrap-less/wells.less +0 -29
  103. data/lib/padrino-admin/generators/templates/account/couchrest.rb.tt +0 -67
  104. data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +0 -61
  105. data/lib/padrino-admin/generators/templates/account/dynamoid.rb.tt +0 -55
  106. data/lib/padrino-admin/generators/templates/account/minirecord.rb.tt +0 -44
  107. data/lib/padrino-admin/generators/templates/account/mongomapper.rb.tt +0 -47
  108. data/lib/padrino-admin/generators/templates/account/ohm.rb.tt +0 -70
  109. data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-1.11.0.min.js +0 -4
  110. data/lib/padrino-admin/locale/orm/cs.yml +0 -12
  111. data/lib/padrino-admin/locale/orm/da.yml +0 -12
  112. data/lib/padrino-admin/locale/orm/de.yml +0 -12
  113. data/lib/padrino-admin/locale/orm/en.yml +0 -12
  114. data/lib/padrino-admin/locale/orm/es.yml +0 -12
  115. data/lib/padrino-admin/locale/orm/fr.yml +0 -12
  116. data/lib/padrino-admin/locale/orm/hu.yml +0 -12
  117. data/lib/padrino-admin/locale/orm/it.yml +0 -12
  118. data/lib/padrino-admin/locale/orm/ja.yml +0 -12
  119. data/lib/padrino-admin/locale/orm/lv.yml +0 -12
  120. data/lib/padrino-admin/locale/orm/nl.yml +0 -12
  121. data/lib/padrino-admin/locale/orm/no.yml +0 -12
  122. data/lib/padrino-admin/locale/orm/pt_br.yml +0 -12
  123. data/lib/padrino-admin/locale/orm/ro.yml +0 -12
  124. data/lib/padrino-admin/locale/orm/ru.yml +0 -12
  125. data/lib/padrino-admin/locale/orm/sv.yml +0 -12
  126. data/lib/padrino-admin/locale/orm/tr.yml +0 -12
  127. data/lib/padrino-admin/locale/orm/uk.yml +0 -12
  128. data/lib/padrino-admin/locale/orm/zh_cn.yml +0 -12
  129. data/lib/padrino-admin/locale/orm/zh_tw.yml +0 -12
@@ -1,11 +1,12 @@
1
1
  /* ========================================================================
2
- * Bootstrap: collapse.js v3.1.0
3
- * http://getbootstrap.com/javascript/#collapse
2
+ * Bootstrap: collapse.js v3.4.1
3
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
4
4
  * ========================================================================
5
- * Copyright 2011-2014 Twitter, Inc.
5
+ * Copyright 2011-2019 Twitter, Inc.
6
6
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
7
  * ======================================================================== */
8
8
 
9
+ /* jshint latedef: false */
9
10
 
10
11
  +function ($) {
11
12
  'use strict';
@@ -16,12 +17,23 @@
16
17
  var Collapse = function (element, options) {
17
18
  this.$element = $(element)
18
19
  this.options = $.extend({}, Collapse.DEFAULTS, options)
20
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
21
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
19
22
  this.transitioning = null
20
23
 
21
- if (this.options.parent) this.$parent = $(this.options.parent)
24
+ if (this.options.parent) {
25
+ this.$parent = this.getParent()
26
+ } else {
27
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
28
+ }
29
+
22
30
  if (this.options.toggle) this.toggle()
23
31
  }
24
32
 
33
+ Collapse.VERSION = '3.4.1'
34
+
35
+ Collapse.TRANSITION_DURATION = 350
36
+
25
37
  Collapse.DEFAULTS = {
26
38
  toggle: true
27
39
  }
@@ -34,35 +46,43 @@
34
46
  Collapse.prototype.show = function () {
35
47
  if (this.transitioning || this.$element.hasClass('in')) return
36
48
 
49
+ var activesData
50
+ var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
51
+
52
+ if (actives && actives.length) {
53
+ activesData = actives.data('bs.collapse')
54
+ if (activesData && activesData.transitioning) return
55
+ }
56
+
37
57
  var startEvent = $.Event('show.bs.collapse')
38
58
  this.$element.trigger(startEvent)
39
59
  if (startEvent.isDefaultPrevented()) return
40
60
 
41
- var actives = this.$parent && this.$parent.find('> .panel > .in')
42
-
43
61
  if (actives && actives.length) {
44
- var hasData = actives.data('bs.collapse')
45
- if (hasData && hasData.transitioning) return
46
- actives.collapse('hide')
47
- hasData || actives.data('bs.collapse', null)
62
+ Plugin.call(actives, 'hide')
63
+ activesData || actives.data('bs.collapse', null)
48
64
  }
49
65
 
50
66
  var dimension = this.dimension()
51
67
 
52
68
  this.$element
53
69
  .removeClass('collapse')
54
- .addClass('collapsing')
55
- [dimension](0)
70
+ .addClass('collapsing')[dimension](0)
71
+ .attr('aria-expanded', true)
72
+
73
+ this.$trigger
74
+ .removeClass('collapsed')
75
+ .attr('aria-expanded', true)
56
76
 
57
77
  this.transitioning = 1
58
78
 
59
79
  var complete = function () {
60
80
  this.$element
61
81
  .removeClass('collapsing')
62
- .addClass('collapse in')
63
- [dimension]('auto')
82
+ .addClass('collapse in')[dimension]('')
64
83
  this.transitioning = 0
65
- this.$element.trigger('shown.bs.collapse')
84
+ this.$element
85
+ .trigger('shown.bs.collapse')
66
86
  }
67
87
 
68
88
  if (!$.support.transition) return complete.call(this)
@@ -70,9 +90,8 @@
70
90
  var scrollSize = $.camelCase(['scroll', dimension].join('-'))
71
91
 
72
92
  this.$element
73
- .one($.support.transition.end, $.proxy(complete, this))
74
- .emulateTransitionEnd(350)
75
- [dimension](this.$element[0][scrollSize])
93
+ .one('bsTransitionEnd', $.proxy(complete, this))
94
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
76
95
  }
77
96
 
78
97
  Collapse.prototype.hide = function () {
@@ -84,55 +103,85 @@
84
103
 
85
104
  var dimension = this.dimension()
86
105
 
87
- this.$element
88
- [dimension](this.$element[dimension]())
89
- [0].offsetHeight
106
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
90
107
 
91
108
  this.$element
92
109
  .addClass('collapsing')
93
- .removeClass('collapse')
94
- .removeClass('in')
110
+ .removeClass('collapse in')
111
+ .attr('aria-expanded', false)
112
+
113
+ this.$trigger
114
+ .addClass('collapsed')
115
+ .attr('aria-expanded', false)
95
116
 
96
117
  this.transitioning = 1
97
118
 
98
119
  var complete = function () {
99
120
  this.transitioning = 0
100
121
  this.$element
101
- .trigger('hidden.bs.collapse')
102
122
  .removeClass('collapsing')
103
123
  .addClass('collapse')
124
+ .trigger('hidden.bs.collapse')
104
125
  }
105
126
 
106
127
  if (!$.support.transition) return complete.call(this)
107
128
 
108
129
  this.$element
109
130
  [dimension](0)
110
- .one($.support.transition.end, $.proxy(complete, this))
111
- .emulateTransitionEnd(350)
131
+ .one('bsTransitionEnd', $.proxy(complete, this))
132
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
112
133
  }
113
134
 
114
135
  Collapse.prototype.toggle = function () {
115
136
  this[this.$element.hasClass('in') ? 'hide' : 'show']()
116
137
  }
117
138
 
139
+ Collapse.prototype.getParent = function () {
140
+ return $(document).find(this.options.parent)
141
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
142
+ .each($.proxy(function (i, element) {
143
+ var $element = $(element)
144
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
145
+ }, this))
146
+ .end()
147
+ }
148
+
149
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
150
+ var isOpen = $element.hasClass('in')
151
+
152
+ $element.attr('aria-expanded', isOpen)
153
+ $trigger
154
+ .toggleClass('collapsed', !isOpen)
155
+ .attr('aria-expanded', isOpen)
156
+ }
157
+
158
+ function getTargetFromTrigger($trigger) {
159
+ var href
160
+ var target = $trigger.attr('data-target')
161
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
162
+
163
+ return $(document).find(target)
164
+ }
165
+
118
166
 
119
167
  // COLLAPSE PLUGIN DEFINITION
120
168
  // ==========================
121
169
 
122
- var old = $.fn.collapse
123
-
124
- $.fn.collapse = function (option) {
170
+ function Plugin(option) {
125
171
  return this.each(function () {
126
172
  var $this = $(this)
127
173
  var data = $this.data('bs.collapse')
128
174
  var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
129
175
 
130
- if (!data && options.toggle && option == 'show') option = !option
176
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
131
177
  if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
132
178
  if (typeof option == 'string') data[option]()
133
179
  })
134
180
  }
135
181
 
182
+ var old = $.fn.collapse
183
+
184
+ $.fn.collapse = Plugin
136
185
  $.fn.collapse.Constructor = Collapse
137
186
 
138
187
 
@@ -148,23 +197,16 @@
148
197
  // COLLAPSE DATA-API
149
198
  // =================
150
199
 
151
- $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
152
- var $this = $(this), href
153
- var target = $this.attr('data-target')
154
- || e.preventDefault()
155
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
156
- var $target = $(target)
200
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
201
+ var $this = $(this)
202
+
203
+ if (!$this.attr('data-target')) e.preventDefault()
204
+
205
+ var $target = getTargetFromTrigger($this)
157
206
  var data = $target.data('bs.collapse')
158
207
  var option = data ? 'toggle' : $this.data()
159
- var parent = $this.attr('data-parent')
160
- var $parent = parent && $(parent)
161
-
162
- if (!data || !data.transitioning) {
163
- if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
164
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
165
- }
166
208
 
167
- $target.collapse(option)
209
+ Plugin.call($target, option)
168
210
  })
169
211
 
170
212
  }(jQuery);
@@ -1,8 +1,8 @@
1
1
  /* ========================================================================
2
- * Bootstrap: dropdown.js v3.1.0
3
- * http://getbootstrap.com/javascript/#dropdowns
2
+ * Bootstrap: dropdown.js v3.4.1
3
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
4
4
  * ========================================================================
5
- * Copyright 2011-2014 Twitter, Inc.
5
+ * Copyright 2011-2019 Twitter, Inc.
6
6
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
7
  * ======================================================================== */
8
8
 
@@ -14,11 +14,47 @@
14
14
  // =========================
15
15
 
16
16
  var backdrop = '.dropdown-backdrop'
17
- var toggle = '[data-toggle=dropdown]'
17
+ var toggle = '[data-toggle="dropdown"]'
18
18
  var Dropdown = function (element) {
19
19
  $(element).on('click.bs.dropdown', this.toggle)
20
20
  }
21
21
 
22
+ Dropdown.VERSION = '3.4.1'
23
+
24
+ function getParent($this) {
25
+ var selector = $this.attr('data-target')
26
+
27
+ if (!selector) {
28
+ selector = $this.attr('href')
29
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
30
+ }
31
+
32
+ var $parent = selector !== '#' ? $(document).find(selector) : null
33
+
34
+ return $parent && $parent.length ? $parent : $this.parent()
35
+ }
36
+
37
+ function clearMenus(e) {
38
+ if (e && e.which === 3) return
39
+ $(backdrop).remove()
40
+ $(toggle).each(function () {
41
+ var $this = $(this)
42
+ var $parent = getParent($this)
43
+ var relatedTarget = { relatedTarget: this }
44
+
45
+ if (!$parent.hasClass('open')) return
46
+
47
+ if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
48
+
49
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
50
+
51
+ if (e.isDefaultPrevented()) return
52
+
53
+ $this.attr('aria-expanded', 'false')
54
+ $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
55
+ })
56
+ }
57
+
22
58
  Dropdown.prototype.toggle = function (e) {
23
59
  var $this = $(this)
24
60
 
@@ -32,7 +68,10 @@
32
68
  if (!isActive) {
33
69
  if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
34
70
  // if mobile we use a backdrop because click events don't delegate
35
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
71
+ $(document.createElement('div'))
72
+ .addClass('dropdown-backdrop')
73
+ .insertAfter($(this))
74
+ .on('click', clearMenus)
36
75
  }
37
76
 
38
77
  var relatedTarget = { relatedTarget: this }
@@ -40,18 +79,20 @@
40
79
 
41
80
  if (e.isDefaultPrevented()) return
42
81
 
82
+ $this
83
+ .trigger('focus')
84
+ .attr('aria-expanded', 'true')
85
+
43
86
  $parent
44
87
  .toggleClass('open')
45
- .trigger('shown.bs.dropdown', relatedTarget)
46
-
47
- $this.focus()
88
+ .trigger($.Event('shown.bs.dropdown', relatedTarget))
48
89
  }
49
90
 
50
91
  return false
51
92
  }
52
93
 
53
94
  Dropdown.prototype.keydown = function (e) {
54
- if (!/(38|40|27)/.test(e.keyCode)) return
95
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
55
96
 
56
97
  var $this = $(this)
57
98
 
@@ -63,57 +104,30 @@
63
104
  var $parent = getParent($this)
64
105
  var isActive = $parent.hasClass('open')
65
106
 
66
- if (!isActive || (isActive && e.keyCode == 27)) {
67
- if (e.which == 27) $parent.find(toggle).focus()
68
- return $this.click()
107
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
108
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
109
+ return $this.trigger('click')
69
110
  }
70
111
 
71
- var desc = ' li:not(.divider):visible a'
72
- var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
112
+ var desc = ' li:not(.disabled):visible a'
113
+ var $items = $parent.find('.dropdown-menu' + desc)
73
114
 
74
115
  if (!$items.length) return
75
116
 
76
- var index = $items.index($items.filter(':focus'))
117
+ var index = $items.index(e.target)
77
118
 
78
- if (e.keyCode == 38 && index > 0) index-- // up
79
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
80
- if (!~index) index = 0
81
-
82
- $items.eq(index).focus()
83
- }
119
+ if (e.which == 38 && index > 0) index-- // up
120
+ if (e.which == 40 && index < $items.length - 1) index++ // down
121
+ if (!~index) index = 0
84
122
 
85
- function clearMenus(e) {
86
- $(backdrop).remove()
87
- $(toggle).each(function () {
88
- var $parent = getParent($(this))
89
- var relatedTarget = { relatedTarget: this }
90
- if (!$parent.hasClass('open')) return
91
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
92
- if (e.isDefaultPrevented()) return
93
- $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
94
- })
95
- }
96
-
97
- function getParent($this) {
98
- var selector = $this.attr('data-target')
99
-
100
- if (!selector) {
101
- selector = $this.attr('href')
102
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
103
- }
104
-
105
- var $parent = selector && $(selector)
106
-
107
- return $parent && $parent.length ? $parent : $this.parent()
123
+ $items.eq(index).trigger('focus')
108
124
  }
109
125
 
110
126
 
111
127
  // DROPDOWN PLUGIN DEFINITION
112
128
  // ==========================
113
129
 
114
- var old = $.fn.dropdown
115
-
116
- $.fn.dropdown = function (option) {
130
+ function Plugin(option) {
117
131
  return this.each(function () {
118
132
  var $this = $(this)
119
133
  var data = $this.data('bs.dropdown')
@@ -123,6 +137,9 @@
123
137
  })
124
138
  }
125
139
 
140
+ var old = $.fn.dropdown
141
+
142
+ $.fn.dropdown = Plugin
126
143
  $.fn.dropdown.Constructor = Dropdown
127
144
 
128
145
 
@@ -142,6 +159,7 @@
142
159
  .on('click.bs.dropdown.data-api', clearMenus)
143
160
  .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
144
161
  .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
145
- .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
162
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
163
+ .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
146
164
 
147
165
  }(jQuery);