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,8 +1,8 @@
1
1
  /* ========================================================================
2
- * Bootstrap: modal.js v3.1.0
3
- * http://getbootstrap.com/javascript/#modals
2
+ * Bootstrap: modal.js v3.4.1
3
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
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,10 +14,16 @@
14
14
  // ======================
15
15
 
16
16
  var Modal = function (element, options) {
17
- this.options = options
18
- this.$element = $(element)
19
- this.$backdrop =
20
- this.isShown = null
17
+ this.options = options
18
+ this.$body = $(document.body)
19
+ this.$element = $(element)
20
+ this.$dialog = this.$element.find('.modal-dialog')
21
+ this.$backdrop = null
22
+ this.isShown = null
23
+ this.originalBodyPad = null
24
+ this.scrollbarWidth = 0
25
+ this.ignoreBackdropClick = false
26
+ this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
21
27
 
22
28
  if (this.options.remote) {
23
29
  this.$element
@@ -28,6 +34,11 @@
28
34
  }
29
35
  }
30
36
 
37
+ Modal.VERSION = '3.4.1'
38
+
39
+ Modal.TRANSITION_DURATION = 300
40
+ Modal.BACKDROP_TRANSITION_DURATION = 150
41
+
31
42
  Modal.DEFAULTS = {
32
43
  backdrop: true,
33
44
  keyboard: true,
@@ -35,12 +46,12 @@
35
46
  }
36
47
 
37
48
  Modal.prototype.toggle = function (_relatedTarget) {
38
- return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
49
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
39
50
  }
40
51
 
41
52
  Modal.prototype.show = function (_relatedTarget) {
42
53
  var that = this
43
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
54
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
44
55
 
45
56
  this.$element.trigger(e)
46
57
 
@@ -48,40 +59,51 @@
48
59
 
49
60
  this.isShown = true
50
61
 
62
+ this.checkScrollbar()
63
+ this.setScrollbar()
64
+ this.$body.addClass('modal-open')
65
+
51
66
  this.escape()
67
+ this.resize()
52
68
 
53
69
  this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
54
70
 
71
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
72
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
73
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
74
+ })
75
+ })
76
+
55
77
  this.backdrop(function () {
56
78
  var transition = $.support.transition && that.$element.hasClass('fade')
57
79
 
58
80
  if (!that.$element.parent().length) {
59
- that.$element.appendTo(document.body) // don't move modals dom position
81
+ that.$element.appendTo(that.$body) // don't move modals dom position
60
82
  }
61
83
 
62
84
  that.$element
63
85
  .show()
64
86
  .scrollTop(0)
65
87
 
88
+ that.adjustDialog()
89
+
66
90
  if (transition) {
67
91
  that.$element[0].offsetWidth // force reflow
68
92
  }
69
93
 
70
- that.$element
71
- .addClass('in')
72
- .attr('aria-hidden', false)
94
+ that.$element.addClass('in')
73
95
 
74
96
  that.enforceFocus()
75
97
 
76
98
  var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
77
99
 
78
100
  transition ?
79
- that.$element.find('.modal-dialog') // wait for modal to slide in
80
- .one($.support.transition.end, function () {
81
- that.$element.focus().trigger(e)
101
+ that.$dialog // wait for modal to slide in
102
+ .one('bsTransitionEnd', function () {
103
+ that.$element.trigger('focus').trigger(e)
82
104
  })
83
- .emulateTransitionEnd(300) :
84
- that.$element.focus().trigger(e)
105
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
106
+ that.$element.trigger('focus').trigger(e)
85
107
  })
86
108
  }
87
109
 
@@ -97,18 +119,21 @@
97
119
  this.isShown = false
98
120
 
99
121
  this.escape()
122
+ this.resize()
100
123
 
101
124
  $(document).off('focusin.bs.modal')
102
125
 
103
126
  this.$element
104
127
  .removeClass('in')
105
- .attr('aria-hidden', true)
106
128
  .off('click.dismiss.bs.modal')
129
+ .off('mouseup.dismiss.bs.modal')
130
+
131
+ this.$dialog.off('mousedown.dismiss.bs.modal')
107
132
 
108
133
  $.support.transition && this.$element.hasClass('fade') ?
109
134
  this.$element
110
- .one($.support.transition.end, $.proxy(this.hideModal, this))
111
- .emulateTransitionEnd(300) :
135
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
136
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
112
137
  this.hideModal()
113
138
  }
114
139
 
@@ -116,19 +141,29 @@
116
141
  $(document)
117
142
  .off('focusin.bs.modal') // guard against infinite focus loop
118
143
  .on('focusin.bs.modal', $.proxy(function (e) {
119
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
120
- this.$element.focus()
144
+ if (document !== e.target &&
145
+ this.$element[0] !== e.target &&
146
+ !this.$element.has(e.target).length) {
147
+ this.$element.trigger('focus')
121
148
  }
122
149
  }, this))
123
150
  }
124
151
 
125
152
  Modal.prototype.escape = function () {
126
153
  if (this.isShown && this.options.keyboard) {
127
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
154
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
128
155
  e.which == 27 && this.hide()
129
156
  }, this))
130
157
  } else if (!this.isShown) {
131
- this.$element.off('keyup.dismiss.bs.modal')
158
+ this.$element.off('keydown.dismiss.bs.modal')
159
+ }
160
+ }
161
+
162
+ Modal.prototype.resize = function () {
163
+ if (this.isShown) {
164
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
165
+ } else {
166
+ $(window).off('resize.bs.modal')
132
167
  }
133
168
  }
134
169
 
@@ -136,7 +171,9 @@
136
171
  var that = this
137
172
  this.$element.hide()
138
173
  this.backdrop(function () {
139
- that.removeBackdrop()
174
+ that.$body.removeClass('modal-open')
175
+ that.resetAdjustments()
176
+ that.resetScrollbar()
140
177
  that.$element.trigger('hidden.bs.modal')
141
178
  })
142
179
  }
@@ -147,19 +184,25 @@
147
184
  }
148
185
 
149
186
  Modal.prototype.backdrop = function (callback) {
187
+ var that = this
150
188
  var animate = this.$element.hasClass('fade') ? 'fade' : ''
151
189
 
152
190
  if (this.isShown && this.options.backdrop) {
153
191
  var doAnimate = $.support.transition && animate
154
192
 
155
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
156
- .appendTo(document.body)
193
+ this.$backdrop = $(document.createElement('div'))
194
+ .addClass('modal-backdrop ' + animate)
195
+ .appendTo(this.$body)
157
196
 
158
197
  this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
198
+ if (this.ignoreBackdropClick) {
199
+ this.ignoreBackdropClick = false
200
+ return
201
+ }
159
202
  if (e.target !== e.currentTarget) return
160
203
  this.options.backdrop == 'static'
161
- ? this.$element[0].focus.call(this.$element[0])
162
- : this.hide.call(this)
204
+ ? this.$element[0].focus()
205
+ : this.hide()
163
206
  }, this))
164
207
 
165
208
  if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
@@ -170,34 +213,102 @@
170
213
 
171
214
  doAnimate ?
172
215
  this.$backdrop
173
- .one($.support.transition.end, callback)
174
- .emulateTransitionEnd(150) :
216
+ .one('bsTransitionEnd', callback)
217
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
175
218
  callback()
176
219
 
177
220
  } else if (!this.isShown && this.$backdrop) {
178
221
  this.$backdrop.removeClass('in')
179
222
 
223
+ var callbackRemove = function () {
224
+ that.removeBackdrop()
225
+ callback && callback()
226
+ }
180
227
  $.support.transition && this.$element.hasClass('fade') ?
181
228
  this.$backdrop
182
- .one($.support.transition.end, callback)
183
- .emulateTransitionEnd(150) :
184
- callback()
229
+ .one('bsTransitionEnd', callbackRemove)
230
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
231
+ callbackRemove()
185
232
 
186
233
  } else if (callback) {
187
234
  callback()
188
235
  }
189
236
  }
190
237
 
238
+ // these following methods are used to handle overflowing modals
239
+
240
+ Modal.prototype.handleUpdate = function () {
241
+ this.adjustDialog()
242
+ }
243
+
244
+ Modal.prototype.adjustDialog = function () {
245
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
246
+
247
+ this.$element.css({
248
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
249
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
250
+ })
251
+ }
252
+
253
+ Modal.prototype.resetAdjustments = function () {
254
+ this.$element.css({
255
+ paddingLeft: '',
256
+ paddingRight: ''
257
+ })
258
+ }
259
+
260
+ Modal.prototype.checkScrollbar = function () {
261
+ var fullWindowWidth = window.innerWidth
262
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
263
+ var documentElementRect = document.documentElement.getBoundingClientRect()
264
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
265
+ }
266
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
267
+ this.scrollbarWidth = this.measureScrollbar()
268
+ }
269
+
270
+ Modal.prototype.setScrollbar = function () {
271
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
272
+ this.originalBodyPad = document.body.style.paddingRight || ''
273
+ var scrollbarWidth = this.scrollbarWidth
274
+ if (this.bodyIsOverflowing) {
275
+ this.$body.css('padding-right', bodyPad + scrollbarWidth)
276
+ $(this.fixedContent).each(function (index, element) {
277
+ var actualPadding = element.style.paddingRight
278
+ var calculatedPadding = $(element).css('padding-right')
279
+ $(element)
280
+ .data('padding-right', actualPadding)
281
+ .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
282
+ })
283
+ }
284
+ }
285
+
286
+ Modal.prototype.resetScrollbar = function () {
287
+ this.$body.css('padding-right', this.originalBodyPad)
288
+ $(this.fixedContent).each(function (index, element) {
289
+ var padding = $(element).data('padding-right')
290
+ $(element).removeData('padding-right')
291
+ element.style.paddingRight = padding ? padding : ''
292
+ })
293
+ }
294
+
295
+ Modal.prototype.measureScrollbar = function () { // thx walsh
296
+ var scrollDiv = document.createElement('div')
297
+ scrollDiv.className = 'modal-scrollbar-measure'
298
+ this.$body.append(scrollDiv)
299
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
300
+ this.$body[0].removeChild(scrollDiv)
301
+ return scrollbarWidth
302
+ }
303
+
191
304
 
192
305
  // MODAL PLUGIN DEFINITION
193
306
  // =======================
194
307
 
195
- var old = $.fn.modal
196
-
197
- $.fn.modal = function (option, _relatedTarget) {
308
+ function Plugin(option, _relatedTarget) {
198
309
  return this.each(function () {
199
- var $this = $(this)
200
- var data = $this.data('bs.modal')
310
+ var $this = $(this)
311
+ var data = $this.data('bs.modal')
201
312
  var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
202
313
 
203
314
  if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
@@ -206,6 +317,9 @@
206
317
  })
207
318
  }
208
319
 
320
+ var old = $.fn.modal
321
+
322
+ $.fn.modal = Plugin
209
323
  $.fn.modal.Constructor = Modal
210
324
 
211
325
 
@@ -222,22 +336,23 @@
222
336
  // ==============
223
337
 
224
338
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
225
- var $this = $(this)
226
- var href = $this.attr('href')
227
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
228
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
339
+ var $this = $(this)
340
+ var href = $this.attr('href')
341
+ var target = $this.attr('data-target') ||
342
+ (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
343
+
344
+ var $target = $(document).find(target)
345
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
229
346
 
230
347
  if ($this.is('a')) e.preventDefault()
231
348
 
232
- $target
233
- .modal(option, this)
234
- .one('hide', function () {
235
- $this.is(':visible') && $this.focus()
349
+ $target.one('show.bs.modal', function (showEvent) {
350
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
351
+ $target.one('hidden.bs.modal', function () {
352
+ $this.is(':visible') && $this.trigger('focus')
236
353
  })
354
+ })
355
+ Plugin.call($target, option, this)
237
356
  })
238
357
 
239
- $(document)
240
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
241
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
242
-
243
358
  }(jQuery);
@@ -1,8 +1,8 @@
1
1
  /* ========================================================================
2
- * Bootstrap: popover.js v3.1.0
3
- * http://getbootstrap.com/javascript/#popovers
2
+ * Bootstrap: popover.js v3.4.1
3
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
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
 
@@ -19,11 +19,13 @@
19
19
 
20
20
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
21
21
 
22
+ Popover.VERSION = '3.4.1'
23
+
22
24
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
23
25
  placement: 'right',
24
26
  trigger: 'click',
25
27
  content: '',
26
- template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
28
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
27
29
  })
28
30
 
29
31
 
@@ -43,10 +45,25 @@
43
45
  var title = this.getTitle()
44
46
  var content = this.getContent()
45
47
 
46
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
47
- $tip.find('.popover-content')[ // we use append for html objects to maintain js events
48
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
49
- ](content)
48
+ if (this.options.html) {
49
+ var typeContent = typeof content
50
+
51
+ if (this.options.sanitize) {
52
+ title = this.sanitizeHtml(title)
53
+
54
+ if (typeContent === 'string') {
55
+ content = this.sanitizeHtml(content)
56
+ }
57
+ }
58
+
59
+ $tip.find('.popover-title').html(title)
60
+ $tip.find('.popover-content').children().detach().end()[
61
+ typeContent === 'string' ? 'html' : 'append'
62
+ ](content)
63
+ } else {
64
+ $tip.find('.popover-title').text(title)
65
+ $tip.find('.popover-content').children().detach().end().text(content)
66
+ }
50
67
 
51
68
  $tip.removeClass('fade top bottom left right in')
52
69
 
@@ -65,37 +82,33 @@
65
82
 
66
83
  return $e.attr('data-content')
67
84
  || (typeof o.content == 'function' ?
68
- o.content.call($e[0]) :
69
- o.content)
85
+ o.content.call($e[0]) :
86
+ o.content)
70
87
  }
71
88
 
72
89
  Popover.prototype.arrow = function () {
73
- return this.$arrow = this.$arrow || this.tip().find('.arrow')
74
- }
75
-
76
- Popover.prototype.tip = function () {
77
- if (!this.$tip) this.$tip = $(this.options.template)
78
- return this.$tip
90
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
79
91
  }
80
92
 
81
93
 
82
94
  // POPOVER PLUGIN DEFINITION
83
95
  // =========================
84
96
 
85
- var old = $.fn.popover
86
-
87
- $.fn.popover = function (option) {
97
+ function Plugin(option) {
88
98
  return this.each(function () {
89
99
  var $this = $(this)
90
100
  var data = $this.data('bs.popover')
91
101
  var options = typeof option == 'object' && option
92
102
 
93
- if (!data && option == 'destroy') return
103
+ if (!data && /destroy|hide/.test(option)) return
94
104
  if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
95
105
  if (typeof option == 'string') data[option]()
96
106
  })
97
107
  }
98
108
 
109
+ var old = $.fn.popover
110
+
111
+ $.fn.popover = Plugin
99
112
  $.fn.popover.Constructor = Popover
100
113
 
101
114
 
@@ -1,8 +1,8 @@
1
1
  /* ========================================================================
2
- * Bootstrap: scrollspy.js v3.1.0
3
- * http://getbootstrap.com/javascript/#scrollspy
2
+ * Bootstrap: scrollspy.js v3.4.1
3
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
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,36 +14,45 @@
14
14
  // ==========================
15
15
 
16
16
  function ScrollSpy(element, options) {
17
- var href
18
- var process = $.proxy(this.process, this)
19
-
20
- this.$element = $(element).is('body') ? $(window) : $(element)
21
- this.$body = $('body')
22
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
17
+ this.$body = $(document.body)
18
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
23
19
  this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
24
- this.selector = (this.options.target
25
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
26
- || '') + ' .nav li > a'
27
- this.offsets = $([])
28
- this.targets = $([])
20
+ this.selector = (this.options.target || '') + ' .nav li > a'
21
+ this.offsets = []
22
+ this.targets = []
29
23
  this.activeTarget = null
24
+ this.scrollHeight = 0
30
25
 
26
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
31
27
  this.refresh()
32
28
  this.process()
33
29
  }
34
30
 
31
+ ScrollSpy.VERSION = '3.4.1'
32
+
35
33
  ScrollSpy.DEFAULTS = {
36
34
  offset: 10
37
35
  }
38
36
 
37
+ ScrollSpy.prototype.getScrollHeight = function () {
38
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
39
+ }
40
+
39
41
  ScrollSpy.prototype.refresh = function () {
40
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
42
+ var that = this
43
+ var offsetMethod = 'offset'
44
+ var offsetBase = 0
45
+
46
+ this.offsets = []
47
+ this.targets = []
48
+ this.scrollHeight = this.getScrollHeight()
41
49
 
42
- this.offsets = $([])
43
- this.targets = $([])
50
+ if (!$.isWindow(this.$scrollElement[0])) {
51
+ offsetMethod = 'position'
52
+ offsetBase = this.$scrollElement.scrollTop()
53
+ }
44
54
 
45
- var self = this
46
- var $targets = this.$body
55
+ this.$body
47
56
  .find(this.selector)
48
57
  .map(function () {
49
58
  var $el = $(this)
@@ -53,50 +62,53 @@
53
62
  return ($href
54
63
  && $href.length
55
64
  && $href.is(':visible')
56
- && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
65
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
57
66
  })
58
67
  .sort(function (a, b) { return a[0] - b[0] })
59
68
  .each(function () {
60
- self.offsets.push(this[0])
61
- self.targets.push(this[1])
69
+ that.offsets.push(this[0])
70
+ that.targets.push(this[1])
62
71
  })
63
72
  }
64
73
 
65
74
  ScrollSpy.prototype.process = function () {
66
75
  var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
67
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
68
- var maxScroll = scrollHeight - this.$scrollElement.height()
76
+ var scrollHeight = this.getScrollHeight()
77
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
69
78
  var offsets = this.offsets
70
79
  var targets = this.targets
71
80
  var activeTarget = this.activeTarget
72
81
  var i
73
82
 
83
+ if (this.scrollHeight != scrollHeight) {
84
+ this.refresh()
85
+ }
86
+
74
87
  if (scrollTop >= maxScroll) {
75
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
88
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
76
89
  }
77
90
 
78
- if (activeTarget && scrollTop <= offsets[0]) {
79
- return activeTarget != (i = targets[0]) && this.activate(i)
91
+ if (activeTarget && scrollTop < offsets[0]) {
92
+ this.activeTarget = null
93
+ return this.clear()
80
94
  }
81
95
 
82
96
  for (i = offsets.length; i--;) {
83
97
  activeTarget != targets[i]
84
98
  && scrollTop >= offsets[i]
85
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
86
- && this.activate( targets[i] )
99
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
100
+ && this.activate(targets[i])
87
101
  }
88
102
  }
89
103
 
90
104
  ScrollSpy.prototype.activate = function (target) {
91
105
  this.activeTarget = target
92
106
 
93
- $(this.selector)
94
- .parentsUntil(this.options.target, '.active')
95
- .removeClass('active')
107
+ this.clear()
96
108
 
97
109
  var selector = this.selector +
98
- '[data-target="' + target + '"],' +
99
- this.selector + '[href="' + target + '"]'
110
+ '[data-target="' + target + '"],' +
111
+ this.selector + '[href="' + target + '"]'
100
112
 
101
113
  var active = $(selector)
102
114
  .parents('li')
@@ -111,13 +123,17 @@
111
123
  active.trigger('activate.bs.scrollspy')
112
124
  }
113
125
 
126
+ ScrollSpy.prototype.clear = function () {
127
+ $(this.selector)
128
+ .parentsUntil(this.options.target, '.active')
129
+ .removeClass('active')
130
+ }
131
+
114
132
 
115
133
  // SCROLLSPY PLUGIN DEFINITION
116
134
  // ===========================
117
135
 
118
- var old = $.fn.scrollspy
119
-
120
- $.fn.scrollspy = function (option) {
136
+ function Plugin(option) {
121
137
  return this.each(function () {
122
138
  var $this = $(this)
123
139
  var data = $this.data('bs.scrollspy')
@@ -128,6 +144,9 @@
128
144
  })
129
145
  }
130
146
 
147
+ var old = $.fn.scrollspy
148
+
149
+ $.fn.scrollspy = Plugin
131
150
  $.fn.scrollspy.Constructor = ScrollSpy
132
151
 
133
152
 
@@ -143,10 +162,10 @@
143
162
  // SCROLLSPY DATA-API
144
163
  // ==================
145
164
 
146
- $(window).on('load', function () {
165
+ $(window).on('load.bs.scrollspy.data-api', function () {
147
166
  $('[data-spy="scroll"]').each(function () {
148
167
  var $spy = $(this)
149
- $spy.scrollspy($spy.data())
168
+ Plugin.call($spy, $spy.data())
150
169
  })
151
170
  })
152
171