bootstrap-popover-rails 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 57503054feb7e5bbd0496155c129fcb609196cae
4
+ data.tar.gz: 3d61c5849f0b22fcf764180d2744726175ab833c
5
+ SHA512:
6
+ metadata.gz: de9a605922d53d65d7431355763dcf0e30dce4cf787604363d004b561fc2e3072037fb9b7964bf0314283972696a18ca7c22d1bd19055168957775dd9ad6c31e
7
+ data.tar.gz: 6cffc1e7da74a0494557b1d30faeebc10a652db27f357a5eb8dc81c7624d8b2b13125ed69aa99ebef0d4c43b89b3e3ef99415fb4ee906cff78506cadceb63457
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bootstrap-popover-rails.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Łukasz Wójcik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,78 @@
1
+ # Bootstrap Popover Rails
2
+
3
+ This gem provides easy way to use twitter bootstrap popover with your Rails application.
4
+ The Bootstrap's tooltip is a required dependency for popover it is also available to use.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your Rails application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'bootstrap-popover-rails'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install bootstrap-popover-rails
21
+
22
+ ## Conifguration
23
+
24
+ To load javascripts add following to Your application.js:
25
+
26
+ ```
27
+ //= require bootstrap/bootstrap-rails-tooltip
28
+ //= require bootstrap/bootstrap-rails-popover
29
+ ```
30
+
31
+ Tooltip is required to enable popover feature so it must be loaded before popover
32
+
33
+
34
+ To load stylesheets add following to Your application.css:
35
+
36
+
37
+ ```
38
+ *= require bootstrap/bootstrap-rails-tooltip
39
+ *= require bootstrap/bootstrap-rails-popover
40
+ ```
41
+
42
+ Requiring tooltip is not required here so might be ommited.
43
+
44
+
45
+ ## Usage
46
+
47
+ To get the default behaviour add following options to HTML element which should display popover
48
+
49
+ ```html
50
+ <div data-content="This will be displayed as popover content"
51
+ data-toggle="popover" title="Popover"> Popover </div>
52
+ ```
53
+ In your js file add following:
54
+
55
+ ```javascript
56
+ $(function () {
57
+ $('[data-toggle="popover"]').popover();
58
+ })
59
+ ```
60
+
61
+ For more detiled info refer to official bootstrap documentation: http://getbootstrap.com/javascript/#popovers
62
+
63
+ ## Development
64
+
65
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
66
+
67
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
68
+
69
+ ## Contributing
70
+
71
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/bootstrap-popover-rails. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
72
+
73
+
74
+ ## License
75
+
76
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
77
+ See [LICENSE](LICENSE)
78
+
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bootstrap/popover/rails/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "bootstrap-popover-rails"
8
+ gem.version = Bootstrap::Popover::Rails::VERSION
9
+ gem.authors = ["Łukasz Wójcik"]
10
+ gem.email = ["sonar0007@hotmail.com"]
11
+
12
+ gem.summary = %q{Bootstrap popover for Rails applications}
13
+ gem.description = %q{This gem provides easy way to use twitter bootstrap popover with your Rails application}
14
+ gem.license = "MIT"
15
+
16
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
+ # delete this section to allow pushing this gem to any host.
18
+ if gem.respond_to?(:metadata)
19
+ gem.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ end
23
+
24
+ gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ gem.bindir = "exe"
26
+ gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ gem.require_paths = ["lib"]
28
+
29
+
30
+ gem.add_development_dependency "bundler", "~> 1.10"
31
+ gem.add_development_dependency "rake", "~> 10.0"
32
+ end
@@ -0,0 +1,2 @@
1
+ require 'bootstrap/popover/rails/version'
2
+ require 'bootstrap/popover/rails/engine' if defined?(Rails)
@@ -0,0 +1,10 @@
1
+ require "bootstrap/popover/rails/version"
2
+
3
+ module Bootstrap
4
+ module Popover
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Bootstrap
2
+ module Popover
3
+ module Rails
4
+ VERSION = "0.1.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,108 @@
1
+ /* ========================================================================
2
+ * Bootstrap: popover.js v3.3.6
3
+ * http://getbootstrap.com/javascript/#popovers
4
+ * ========================================================================
5
+ * Copyright 2011-2015 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // POPOVER PUBLIC CLASS DEFINITION
14
+ // ===============================
15
+
16
+ var Popover = function (element, options) {
17
+ this.init('popover', element, options)
18
+ }
19
+
20
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
21
+
22
+ Popover.VERSION = '3.3.6'
23
+
24
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
25
+ placement: 'right',
26
+ trigger: 'click',
27
+ content: '',
28
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
29
+ })
30
+
31
+
32
+ // NOTE: POPOVER EXTENDS tooltip.js
33
+ // ================================
34
+
35
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
36
+
37
+ Popover.prototype.constructor = Popover
38
+
39
+ Popover.prototype.getDefaults = function () {
40
+ return Popover.DEFAULTS
41
+ }
42
+
43
+ Popover.prototype.setContent = function () {
44
+ var $tip = this.tip()
45
+ var title = this.getTitle()
46
+ var content = this.getContent()
47
+
48
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
49
+ $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
50
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
51
+ ](content)
52
+
53
+ $tip.removeClass('fade top bottom left right in')
54
+
55
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
56
+ // this manually by checking the contents.
57
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
58
+ }
59
+
60
+ Popover.prototype.hasContent = function () {
61
+ return this.getTitle() || this.getContent()
62
+ }
63
+
64
+ Popover.prototype.getContent = function () {
65
+ var $e = this.$element
66
+ var o = this.options
67
+
68
+ return $e.attr('data-content')
69
+ || (typeof o.content == 'function' ?
70
+ o.content.call($e[0]) :
71
+ o.content)
72
+ }
73
+
74
+ Popover.prototype.arrow = function () {
75
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
76
+ }
77
+
78
+
79
+ // POPOVER PLUGIN DEFINITION
80
+ // =========================
81
+
82
+ function Plugin(option) {
83
+ return this.each(function () {
84
+ var $this = $(this)
85
+ var data = $this.data('bs.popover')
86
+ var options = typeof option == 'object' && option
87
+
88
+ if (!data && /destroy|hide/.test(option)) return
89
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
90
+ if (typeof option == 'string') data[option]()
91
+ })
92
+ }
93
+
94
+ var old = $.fn.popover
95
+
96
+ $.fn.popover = Plugin
97
+ $.fn.popover.Constructor = Popover
98
+
99
+
100
+ // POPOVER NO CONFLICT
101
+ // ===================
102
+
103
+ $.fn.popover.noConflict = function () {
104
+ $.fn.popover = old
105
+ return this
106
+ }
107
+
108
+ }(jQuery);
@@ -0,0 +1,514 @@
1
+ /* ========================================================================
2
+ * Bootstrap: tooltip.js v3.3.6
3
+ * http://getbootstrap.com/javascript/#tooltip
4
+ * Inspired by the original jQuery.tipsy by Jason Frame
5
+ * ========================================================================
6
+ * Copyright 2011-2015 Twitter, Inc.
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
8
+ * ======================================================================== */
9
+
10
+
11
+ +function ($) {
12
+ 'use strict';
13
+
14
+ // TOOLTIP PUBLIC CLASS DEFINITION
15
+ // ===============================
16
+
17
+ var Tooltip = function (element, options) {
18
+ this.type = null
19
+ this.options = null
20
+ this.enabled = null
21
+ this.timeout = null
22
+ this.hoverState = null
23
+ this.$element = null
24
+ this.inState = null
25
+
26
+ this.init('tooltip', element, options)
27
+ }
28
+
29
+ Tooltip.VERSION = '3.3.6'
30
+
31
+ Tooltip.TRANSITION_DURATION = 150
32
+
33
+ Tooltip.DEFAULTS = {
34
+ animation: true,
35
+ placement: 'top',
36
+ selector: false,
37
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
38
+ trigger: 'hover focus',
39
+ title: '',
40
+ delay: 0,
41
+ html: false,
42
+ container: false,
43
+ viewport: {
44
+ selector: 'body',
45
+ padding: 0
46
+ }
47
+ }
48
+
49
+ Tooltip.prototype.init = function (type, element, options) {
50
+ this.enabled = true
51
+ this.type = type
52
+ this.$element = $(element)
53
+ this.options = this.getOptions(options)
54
+ this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
55
+ this.inState = { click: false, hover: false, focus: false }
56
+
57
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
58
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
59
+ }
60
+
61
+ var triggers = this.options.trigger.split(' ')
62
+
63
+ for (var i = triggers.length; i--;) {
64
+ var trigger = triggers[i]
65
+
66
+ if (trigger == 'click') {
67
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
68
+ } else if (trigger != 'manual') {
69
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
70
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
71
+
72
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
73
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
74
+ }
75
+ }
76
+
77
+ this.options.selector ?
78
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
79
+ this.fixTitle()
80
+ }
81
+
82
+ Tooltip.prototype.getDefaults = function () {
83
+ return Tooltip.DEFAULTS
84
+ }
85
+
86
+ Tooltip.prototype.getOptions = function (options) {
87
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
88
+
89
+ if (options.delay && typeof options.delay == 'number') {
90
+ options.delay = {
91
+ show: options.delay,
92
+ hide: options.delay
93
+ }
94
+ }
95
+
96
+ return options
97
+ }
98
+
99
+ Tooltip.prototype.getDelegateOptions = function () {
100
+ var options = {}
101
+ var defaults = this.getDefaults()
102
+
103
+ this._options && $.each(this._options, function (key, value) {
104
+ if (defaults[key] != value) options[key] = value
105
+ })
106
+
107
+ return options
108
+ }
109
+
110
+ Tooltip.prototype.enter = function (obj) {
111
+ var self = obj instanceof this.constructor ?
112
+ obj : $(obj.currentTarget).data('bs.' + this.type)
113
+
114
+ if (!self) {
115
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
116
+ $(obj.currentTarget).data('bs.' + this.type, self)
117
+ }
118
+
119
+ if (obj instanceof $.Event) {
120
+ self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
121
+ }
122
+
123
+ if (self.tip().hasClass('in') || self.hoverState == 'in') {
124
+ self.hoverState = 'in'
125
+ return
126
+ }
127
+
128
+ clearTimeout(self.timeout)
129
+
130
+ self.hoverState = 'in'
131
+
132
+ if (!self.options.delay || !self.options.delay.show) return self.show()
133
+
134
+ self.timeout = setTimeout(function () {
135
+ if (self.hoverState == 'in') self.show()
136
+ }, self.options.delay.show)
137
+ }
138
+
139
+ Tooltip.prototype.isInStateTrue = function () {
140
+ for (var key in this.inState) {
141
+ if (this.inState[key]) return true
142
+ }
143
+
144
+ return false
145
+ }
146
+
147
+ Tooltip.prototype.leave = function (obj) {
148
+ var self = obj instanceof this.constructor ?
149
+ obj : $(obj.currentTarget).data('bs.' + this.type)
150
+
151
+ if (!self) {
152
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
153
+ $(obj.currentTarget).data('bs.' + this.type, self)
154
+ }
155
+
156
+ if (obj instanceof $.Event) {
157
+ self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
158
+ }
159
+
160
+ if (self.isInStateTrue()) return
161
+
162
+ clearTimeout(self.timeout)
163
+
164
+ self.hoverState = 'out'
165
+
166
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
167
+
168
+ self.timeout = setTimeout(function () {
169
+ if (self.hoverState == 'out') self.hide()
170
+ }, self.options.delay.hide)
171
+ }
172
+
173
+ Tooltip.prototype.show = function () {
174
+ var e = $.Event('show.bs.' + this.type)
175
+
176
+ if (this.hasContent() && this.enabled) {
177
+ this.$element.trigger(e)
178
+
179
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
180
+ if (e.isDefaultPrevented() || !inDom) return
181
+ var that = this
182
+
183
+ var $tip = this.tip()
184
+
185
+ var tipId = this.getUID(this.type)
186
+
187
+ this.setContent()
188
+ $tip.attr('id', tipId)
189
+ this.$element.attr('aria-describedby', tipId)
190
+
191
+ if (this.options.animation) $tip.addClass('fade')
192
+
193
+ var placement = typeof this.options.placement == 'function' ?
194
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
195
+ this.options.placement
196
+
197
+ var autoToken = /\s?auto?\s?/i
198
+ var autoPlace = autoToken.test(placement)
199
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
200
+
201
+ $tip
202
+ .detach()
203
+ .css({ top: 0, left: 0, display: 'block' })
204
+ .addClass(placement)
205
+ .data('bs.' + this.type, this)
206
+
207
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
208
+ this.$element.trigger('inserted.bs.' + this.type)
209
+
210
+ var pos = this.getPosition()
211
+ var actualWidth = $tip[0].offsetWidth
212
+ var actualHeight = $tip[0].offsetHeight
213
+
214
+ if (autoPlace) {
215
+ var orgPlacement = placement
216
+ var viewportDim = this.getPosition(this.$viewport)
217
+
218
+ placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
219
+ placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
220
+ placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
221
+ placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
222
+ placement
223
+
224
+ $tip
225
+ .removeClass(orgPlacement)
226
+ .addClass(placement)
227
+ }
228
+
229
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
230
+
231
+ this.applyPlacement(calculatedOffset, placement)
232
+
233
+ var complete = function () {
234
+ var prevHoverState = that.hoverState
235
+ that.$element.trigger('shown.bs.' + that.type)
236
+ that.hoverState = null
237
+
238
+ if (prevHoverState == 'out') that.leave(that)
239
+ }
240
+
241
+ $.support.transition && this.$tip.hasClass('fade') ?
242
+ $tip
243
+ .one('bsTransitionEnd', complete)
244
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
245
+ complete()
246
+ }
247
+ }
248
+
249
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
250
+ var $tip = this.tip()
251
+ var width = $tip[0].offsetWidth
252
+ var height = $tip[0].offsetHeight
253
+
254
+ // manually read margins because getBoundingClientRect includes difference
255
+ var marginTop = parseInt($tip.css('margin-top'), 10)
256
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
257
+
258
+ // we must check for NaN for ie 8/9
259
+ if (isNaN(marginTop)) marginTop = 0
260
+ if (isNaN(marginLeft)) marginLeft = 0
261
+
262
+ offset.top += marginTop
263
+ offset.left += marginLeft
264
+
265
+ // $.fn.offset doesn't round pixel values
266
+ // so we use setOffset directly with our own function B-0
267
+ $.offset.setOffset($tip[0], $.extend({
268
+ using: function (props) {
269
+ $tip.css({
270
+ top: Math.round(props.top),
271
+ left: Math.round(props.left)
272
+ })
273
+ }
274
+ }, offset), 0)
275
+
276
+ $tip.addClass('in')
277
+
278
+ // check to see if placing tip in new offset caused the tip to resize itself
279
+ var actualWidth = $tip[0].offsetWidth
280
+ var actualHeight = $tip[0].offsetHeight
281
+
282
+ if (placement == 'top' && actualHeight != height) {
283
+ offset.top = offset.top + height - actualHeight
284
+ }
285
+
286
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
287
+
288
+ if (delta.left) offset.left += delta.left
289
+ else offset.top += delta.top
290
+
291
+ var isVertical = /top|bottom/.test(placement)
292
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
293
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
294
+
295
+ $tip.offset(offset)
296
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
297
+ }
298
+
299
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
300
+ this.arrow()
301
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
302
+ .css(isVertical ? 'top' : 'left', '')
303
+ }
304
+
305
+ Tooltip.prototype.setContent = function () {
306
+ var $tip = this.tip()
307
+ var title = this.getTitle()
308
+
309
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
310
+ $tip.removeClass('fade in top bottom left right')
311
+ }
312
+
313
+ Tooltip.prototype.hide = function (callback) {
314
+ var that = this
315
+ var $tip = $(this.$tip)
316
+ var e = $.Event('hide.bs.' + this.type)
317
+
318
+ function complete() {
319
+ if (that.hoverState != 'in') $tip.detach()
320
+ that.$element
321
+ .removeAttr('aria-describedby')
322
+ .trigger('hidden.bs.' + that.type)
323
+ callback && callback()
324
+ }
325
+
326
+ this.$element.trigger(e)
327
+
328
+ if (e.isDefaultPrevented()) return
329
+
330
+ $tip.removeClass('in')
331
+
332
+ $.support.transition && $tip.hasClass('fade') ?
333
+ $tip
334
+ .one('bsTransitionEnd', complete)
335
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
336
+ complete()
337
+
338
+ this.hoverState = null
339
+
340
+ return this
341
+ }
342
+
343
+ Tooltip.prototype.fixTitle = function () {
344
+ var $e = this.$element
345
+ if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
346
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
347
+ }
348
+ }
349
+
350
+ Tooltip.prototype.hasContent = function () {
351
+ return this.getTitle()
352
+ }
353
+
354
+ Tooltip.prototype.getPosition = function ($element) {
355
+ $element = $element || this.$element
356
+
357
+ var el = $element[0]
358
+ var isBody = el.tagName == 'BODY'
359
+
360
+ var elRect = el.getBoundingClientRect()
361
+ if (elRect.width == null) {
362
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
363
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
364
+ }
365
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
366
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
367
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
368
+
369
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
370
+ }
371
+
372
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
373
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
374
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
375
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
376
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
377
+
378
+ }
379
+
380
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
381
+ var delta = { top: 0, left: 0 }
382
+ if (!this.$viewport) return delta
383
+
384
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
385
+ var viewportDimensions = this.getPosition(this.$viewport)
386
+
387
+ if (/right|left/.test(placement)) {
388
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
389
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
390
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
391
+ delta.top = viewportDimensions.top - topEdgeOffset
392
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
393
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
394
+ }
395
+ } else {
396
+ var leftEdgeOffset = pos.left - viewportPadding
397
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
398
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
399
+ delta.left = viewportDimensions.left - leftEdgeOffset
400
+ } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
401
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
402
+ }
403
+ }
404
+
405
+ return delta
406
+ }
407
+
408
+ Tooltip.prototype.getTitle = function () {
409
+ var title
410
+ var $e = this.$element
411
+ var o = this.options
412
+
413
+ title = $e.attr('data-original-title')
414
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
415
+
416
+ return title
417
+ }
418
+
419
+ Tooltip.prototype.getUID = function (prefix) {
420
+ do prefix += ~~(Math.random() * 1000000)
421
+ while (document.getElementById(prefix))
422
+ return prefix
423
+ }
424
+
425
+ Tooltip.prototype.tip = function () {
426
+ if (!this.$tip) {
427
+ this.$tip = $(this.options.template)
428
+ if (this.$tip.length != 1) {
429
+ throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
430
+ }
431
+ }
432
+ return this.$tip
433
+ }
434
+
435
+ Tooltip.prototype.arrow = function () {
436
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
437
+ }
438
+
439
+ Tooltip.prototype.enable = function () {
440
+ this.enabled = true
441
+ }
442
+
443
+ Tooltip.prototype.disable = function () {
444
+ this.enabled = false
445
+ }
446
+
447
+ Tooltip.prototype.toggleEnabled = function () {
448
+ this.enabled = !this.enabled
449
+ }
450
+
451
+ Tooltip.prototype.toggle = function (e) {
452
+ var self = this
453
+ if (e) {
454
+ self = $(e.currentTarget).data('bs.' + this.type)
455
+ if (!self) {
456
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
457
+ $(e.currentTarget).data('bs.' + this.type, self)
458
+ }
459
+ }
460
+
461
+ if (e) {
462
+ self.inState.click = !self.inState.click
463
+ if (self.isInStateTrue()) self.enter(self)
464
+ else self.leave(self)
465
+ } else {
466
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
467
+ }
468
+ }
469
+
470
+ Tooltip.prototype.destroy = function () {
471
+ var that = this
472
+ clearTimeout(this.timeout)
473
+ this.hide(function () {
474
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
475
+ if (that.$tip) {
476
+ that.$tip.detach()
477
+ }
478
+ that.$tip = null
479
+ that.$arrow = null
480
+ that.$viewport = null
481
+ })
482
+ }
483
+
484
+
485
+ // TOOLTIP PLUGIN DEFINITION
486
+ // =========================
487
+
488
+ function Plugin(option) {
489
+ return this.each(function () {
490
+ var $this = $(this)
491
+ var data = $this.data('bs.tooltip')
492
+ var options = typeof option == 'object' && option
493
+
494
+ if (!data && /destroy|hide/.test(option)) return
495
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
496
+ if (typeof option == 'string') data[option]()
497
+ })
498
+ }
499
+
500
+ var old = $.fn.tooltip
501
+
502
+ $.fn.tooltip = Plugin
503
+ $.fn.tooltip.Constructor = Tooltip
504
+
505
+
506
+ // TOOLTIP NO CONFLICT
507
+ // ===================
508
+
509
+ $.fn.tooltip.noConflict = function () {
510
+ $.fn.tooltip = old
511
+ return this
512
+ }
513
+
514
+ }(jQuery);
@@ -0,0 +1,142 @@
1
+ .popover {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ z-index: 1060;
6
+ display: none;
7
+ max-width: 276px;
8
+ padding: 1px;
9
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
10
+ font-style: normal;
11
+ font-weight: normal;
12
+ letter-spacing: normal;
13
+ line-break: auto;
14
+ line-height: 1.428571429;
15
+ text-align: left;
16
+ text-align: start;
17
+ text-decoration: none;
18
+ text-shadow: none;
19
+ text-transform: none;
20
+ white-space: normal;
21
+ word-break: normal;
22
+ word-spacing: normal;
23
+ word-wrap: normal;
24
+ font-size: 14px;
25
+ background-color: #ffffff;
26
+ background-clip: padding-box;
27
+ border: 1px solid #cccccc;
28
+ border: 1px solid rgba(0, 0, 0, 0.2);
29
+ border-radius: 6px;
30
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
31
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
32
+ }
33
+ .popover.top {
34
+ margin-top: -10px;
35
+ }
36
+ .popover.right {
37
+ margin-left: 10px;
38
+ }
39
+ .popover.bottom {
40
+ margin-top: 10px;
41
+ }
42
+ .popover.left {
43
+ margin-left: -10px;
44
+ }
45
+ .popover-title {
46
+ margin: 0;
47
+ padding: 8px 14px;
48
+ font-size: 14px;
49
+ background-color: #f7f7f7;
50
+ border-bottom: 1px solid #ebebeb;
51
+ border-radius: 5px 5px 0 0;
52
+ }
53
+ .popover-content {
54
+ padding: 9px 14px;
55
+ }
56
+ .popover > .arrow,
57
+ .popover > .arrow:after {
58
+ position: absolute;
59
+ display: block;
60
+ width: 0;
61
+ height: 0;
62
+ border-color: transparent;
63
+ border-style: solid;
64
+ }
65
+ .popover > .arrow {
66
+ border-width: 11px;
67
+ }
68
+ .popover > .arrow:after {
69
+ border-width: 10px;
70
+ content: "";
71
+ }
72
+ .popover.top > .arrow {
73
+ left: 50%;
74
+ margin-left: -11px;
75
+ border-bottom-width: 0;
76
+ border-top-color: #999999;
77
+ border-top-color: rgba(0, 0, 0, 0.25);
78
+ bottom: -11px;
79
+ }
80
+ .popover.top > .arrow:after {
81
+ content: " ";
82
+ bottom: 1px;
83
+ margin-left: -10px;
84
+ border-bottom-width: 0;
85
+ border-top-color: #ffffff;
86
+ }
87
+ .popover.right > .arrow {
88
+ top: 50%;
89
+ left: -11px;
90
+ margin-top: -11px;
91
+ border-left-width: 0;
92
+ border-right-color: #999999;
93
+ border-right-color: rgba(0, 0, 0, 0.25);
94
+ }
95
+ .popover.right > .arrow:after {
96
+ content: " ";
97
+ left: 1px;
98
+ bottom: -10px;
99
+ border-left-width: 0;
100
+ border-right-color: #ffffff;
101
+ }
102
+ .popover.bottom > .arrow {
103
+ left: 50%;
104
+ margin-left: -11px;
105
+ border-top-width: 0;
106
+ border-bottom-color: #999999;
107
+ border-bottom-color: rgba(0, 0, 0, 0.25);
108
+ top: -11px;
109
+ }
110
+ .popover.bottom > .arrow:after {
111
+ content: " ";
112
+ top: 1px;
113
+ margin-left: -10px;
114
+ border-top-width: 0;
115
+ border-bottom-color: #ffffff;
116
+ }
117
+ .popover.left > .arrow {
118
+ top: 50%;
119
+ right: -11px;
120
+ margin-top: -11px;
121
+ border-right-width: 0;
122
+ border-left-color: #999999;
123
+ border-left-color: rgba(0, 0, 0, 0.25);
124
+ }
125
+ .popover.left > .arrow:after {
126
+ content: " ";
127
+ right: 1px;
128
+ border-right-width: 0;
129
+ border-left-color: #ffffff;
130
+ bottom: -10px;
131
+ }
132
+
133
+ .fade {
134
+ opacity: 0;
135
+ -webkit-transition: opacity .15s linear;
136
+ -o-transition: opacity .15s linear;
137
+ transition: opacity .15s linear;
138
+ }
139
+
140
+ .fade.in {
141
+ opacity: 1;
142
+ }
@@ -0,0 +1,125 @@
1
+ .tooltip {
2
+ position: absolute;
3
+ z-index: 1070;
4
+ display: block;
5
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
6
+ font-style: normal;
7
+ font-weight: normal;
8
+ letter-spacing: normal;
9
+ line-break: auto;
10
+ line-height: 1.428571429;
11
+ text-align: left;
12
+ text-align: start;
13
+ text-decoration: none;
14
+ text-shadow: none;
15
+ text-transform: none;
16
+ white-space: normal;
17
+ word-break: normal;
18
+ word-spacing: normal;
19
+ word-wrap: normal;
20
+ font-size: 12px;
21
+ opacity: 0;
22
+ filter: alpha(opacity=0);
23
+ }
24
+ .tooltip.in {
25
+ opacity: 0.9;
26
+ filter: alpha(opacity=90);
27
+ }
28
+ .tooltip.top {
29
+ margin-top: -3px;
30
+ padding: 5px 0;
31
+ }
32
+ .tooltip.right {
33
+ margin-left: 3px;
34
+ padding: 0 5px;
35
+ }
36
+ .tooltip.bottom {
37
+ margin-top: 3px;
38
+ padding: 5px 0;
39
+ }
40
+ .tooltip.left {
41
+ margin-left: -3px;
42
+ padding: 0 5px;
43
+ }
44
+ .tooltip-inner {
45
+ max-width: 200px;
46
+ padding: 3px 8px;
47
+ color: #fff;
48
+ text-align: center;
49
+ background-color: #000;
50
+ border-radius: 4px;
51
+ }
52
+ .tooltip-arrow {
53
+ position: absolute;
54
+ width: 0;
55
+ height: 0;
56
+ border-color: transparent;
57
+ border-style: solid;
58
+ }
59
+ .tooltip.top .tooltip-arrow {
60
+ bottom: 0;
61
+ left: 50%;
62
+ margin-left: -5px;
63
+ border-width: 5px 5px 0;
64
+ border-top-color: #000;
65
+ }
66
+ .tooltip.top-left .tooltip-arrow {
67
+ bottom: 0;
68
+ right: 5px;
69
+ margin-bottom: -5px;
70
+ border-width: 5px 5px 0;
71
+ border-top-color: #000;
72
+ }
73
+ .tooltip.top-right .tooltip-arrow {
74
+ bottom: 0;
75
+ left: 5px;
76
+ margin-bottom: -5px;
77
+ border-width: 5px 5px 0;
78
+ border-top-color: #000;
79
+ }
80
+ .tooltip.right .tooltip-arrow {
81
+ top: 50%;
82
+ left: 0;
83
+ margin-top: -5px;
84
+ border-width: 5px 5px 5px 0;
85
+ border-right-color: #000;
86
+ }
87
+ .tooltip.left .tooltip-arrow {
88
+ top: 50%;
89
+ right: 0;
90
+ margin-top: -5px;
91
+ border-width: 5px 0 5px 5px;
92
+ border-left-color: #000;
93
+ }
94
+ .tooltip.bottom .tooltip-arrow {
95
+ top: 0;
96
+ left: 50%;
97
+ margin-left: -5px;
98
+ border-width: 0 5px 5px;
99
+ border-bottom-color: #000;
100
+ }
101
+ .tooltip.bottom-left .tooltip-arrow {
102
+ top: 0;
103
+ right: 5px;
104
+ margin-top: -5px;
105
+ border-width: 0 5px 5px;
106
+ border-bottom-color: #000;
107
+ }
108
+ .tooltip.bottom-right .tooltip-arrow {
109
+ top: 0;
110
+ left: 5px;
111
+ margin-top: -5px;
112
+ border-width: 0 5px 5px;
113
+ border-bottom-color: #000;
114
+ }
115
+
116
+ .fade {
117
+ opacity: 0;
118
+ -webkit-transition: opacity .15s linear;
119
+ -o-transition: opacity .15s linear;
120
+ transition: opacity .15s linear;
121
+ }
122
+
123
+ .fade.in {
124
+ opacity: 1;
125
+ }
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bootstrap-popover-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - "Łukasz Wójcik"
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: This gem provides easy way to use twitter bootstrap popover with your
42
+ Rails application
43
+ email:
44
+ - sonar0007@hotmail.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".gitignore"
50
+ - Gemfile
51
+ - LICENSE
52
+ - README.md
53
+ - Rakefile
54
+ - bootstrap-popover-rails.gemspec
55
+ - lib/bootstrap-popover-rails.rb
56
+ - lib/bootstrap/popover/rails/engine.rb
57
+ - lib/bootstrap/popover/rails/version.rb
58
+ - vendor/assets/javascripts/bootstrap/bootstrap-rails-popover.js
59
+ - vendor/assets/javascripts/bootstrap/bootstrap-rails-tooltip.js
60
+ - vendor/assets/stylesheets/bootstrap/bootstrap-rails-popover.css
61
+ - vendor/assets/stylesheets/bootstrap/bootstrap-rails-tooltip.css
62
+ homepage:
63
+ licenses:
64
+ - MIT
65
+ metadata:
66
+ allowed_push_host: https://rubygems.org
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.4.8
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: Bootstrap popover for Rails applications
87
+ test_files: []