partystreusel 1.1.0pre2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  rvm:
2
2
  - "1.9.3-p448"
3
- script: 'bundle exec guard-jasmine --server-timeout=60'
3
+ script: 'bundle exec guard-jasmine --server-timeout=120'
data/CHANGELOG.md CHANGED
@@ -3,6 +3,7 @@
3
3
  ## v1.1.0pre2
4
4
  * Refactored Readmore
5
5
  * Add Offcanvas, Tab, Accordion, Slider JS
6
+ * Add events
6
7
 
7
8
  ## v1.0.8
8
9
  * IE8 fixes (readmore, ie_fixes did not work in IE8)
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard :jasmine, console: :always do
4
+ guard :jasmine, console: :always, errors: :always do
5
5
  watch(%r{spec/javascripts/spec\.(js\.coffee|js|coffee)$}) { 'spec/javascripts' }
6
6
  watch(%r{spec/javascripts/.+_spec\.(js\.coffee|js|coffee)$})
7
7
  watch(%r{spec/javascripts/fixtures/.+$})
data/README.md CHANGED
@@ -28,6 +28,35 @@ If you only want to initialize readmore for a part of the document:
28
28
 
29
29
  Streusel.Readmore.init($('body article.loadedwithajax'))
30
30
 
31
+ ## JS <-> DOM
32
+
33
+ If you have the JS object use
34
+
35
+ myJsObject.$el
36
+
37
+ to access the corresponding DOM element.
38
+
39
+ If you have the DOM element use
40
+
41
+ $('.myselector').data('object')
42
+
43
+ to access the correspoindg partystreusel JS object.
44
+
45
+ ## Events
46
+
47
+ Partystreusel components tirgger some events. All events are
48
+ prefixed with the moulename. Eg. Readmore triggers the event
49
+ 'readmore-open' and 'readmore-close'.
50
+
51
+ You can trigger an event directly on the JS object. Eg.
52
+ if you have a readmore object:
53
+
54
+ readmoreObject = $('.myreadmore).data('object')
55
+ readmoreObject.trigger('myevent')
56
+
57
+ Would triger a new event on $('.myreadmore') with name
58
+ 'readmore-event'.
59
+
31
60
  # Module Usage
32
61
 
33
62
  Available modules:
@@ -14,8 +14,13 @@ class Accordion extends Partystreusel.Base
14
14
  item = $(e.target).closest('.accordion__item')
15
15
  currentOpen = item.hasClass('accordion__item--open')
16
16
 
17
+ @items.filter('.accordion__item--open').each (_, i) =>
18
+ @trigger('close', $(i))
19
+
17
20
  @items.removeClass('accordion__item--open')
18
- item.toggleClass('accordion__item--open') unless currentOpen
21
+ unless currentOpen
22
+ item.toggleClass('accordion__item--open')
23
+ @trigger('open', item)
19
24
 
20
25
  e.preventDefault()
21
26
  Partystreusel.scrollTo(item, @offset)
@@ -4,3 +4,4 @@
4
4
  #= require partystreusel/topbar
5
5
  #= require partystreusel/accordion
6
6
  #= require partystreusel/tab
7
+ #= require partystreusel/slider
@@ -20,3 +20,7 @@ class Partystreusel.Base
20
20
  constructor: (el) ->
21
21
  @$el = $(el)
22
22
  @$el.data('object', @)
23
+
24
+ trigger: (name) ->
25
+ arguments[0] = "#{@constructor.className.toLowerCase()}-#{name}"
26
+ @$el.trigger.apply(@$el, arguments)
@@ -11,6 +11,10 @@ class Offcanvas extends Partystreusel.Base
11
11
 
12
12
  toggle: =>
13
13
  @$el.toggleClass('offcanvas--open')
14
+ if @$el.hasClass('offcanvas--open')
15
+ @trigger('open', @$el)
16
+ else
17
+ @trigger('close', @$el)
14
18
 
15
19
  toggleNavLink: (e) =>
16
20
  navLink = $(e.target).closest('.offcanvas-nav__link')
@@ -18,11 +18,15 @@ class Readmore extends Partystreusel.Base
18
18
  $(@button).bind 'click', @toggle
19
19
 
20
20
  toggle: (event) =>
21
- @button.text(@buttonText())
22
21
  @$el.slideToggle =>
23
22
  @$el.toggleClass('readmore--opened readmore--closed')
23
+ @button.text(@buttonText())
24
24
  @$el.css('display', "")
25
25
  @$el.removeAttr('style') if @$el.attr('style') == ''
26
+ if @$el.hasClass('readmore--opened')
27
+ @trigger('open', @$el)
28
+ else
29
+ @trigger('close', @$el)
26
30
  return false
27
31
 
28
32
  buttonState: ->
@@ -8,12 +8,13 @@ class Slider extends Partystreusel.Base
8
8
 
9
9
  constructor: (el) ->
10
10
  super
11
+ @slidelist = @$el.find('.slider__list')
11
12
  @initializeCycle()
12
13
 
13
14
  initializeCycle: ->
14
15
  # see for documenation and options:
15
16
  # https://github.com/malsup/cycle2
16
- @$el.cycle
17
+ @slidelist.cycle
17
18
  slides: '.slider__item'
18
19
  fx: 'scrollHorz'
19
20
  speed: 300
@@ -34,13 +34,21 @@ class Tab extends Partystreusel.Base
34
34
  console.log("Nav Item or panel with name #{panelName} not found")
35
35
  return
36
36
 
37
- @$panels.removeClass('tab__panel--active')
38
- @$navItems.removeClass('tab__nav-item--active')
37
+ itemAndPanelToClose = @findItemAndPanel(@currentPanelName())
38
+ if itemAndPanelToClose
39
+ closeName = @currentPanelName()
40
+ itemAndPanelToClose[0].removeClass('tab__nav-item--active')
41
+ itemAndPanelToClose[1].removeClass('tab__panel--active')
42
+ @trigger('close', closeName, itemAndPanelToClose[0], itemAndPanelToClose[1])
39
43
 
40
44
  itemAndPanel[0].addClass('tab__nav-item--active')
41
45
  itemAndPanel[1].addClass('tab__panel--active')
42
46
 
47
+ @trigger('open', @currentPanelName(), itemAndPanel[0], itemAndPanel[1])
48
+
43
49
  findItemAndPanel: (name) ->
50
+ return unless name?
51
+
44
52
  if name.indexOf('#') == 0
45
53
  name = name.slice(1)
46
54
 
@@ -1,3 +1,3 @@
1
1
  module Partystreusel
2
- VERSION = "1.1.0pre2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -6,12 +6,14 @@ describe 'Accordion', ->
6
6
  describe 'Readmore object', ->
7
7
 
8
8
  beforeEach ->
9
- @el = affix('[data-streusel-accordion]')
9
+ @el = affix('.accordion[data-streusel-accordion]')
10
10
  @item1 = @el.affix('.accordion__item .accordion__title Title')
11
11
  @item2 = @el.affix('.accordion__item .accordion__title Title')
12
12
  @item3 = @el.affix('.accordion__item .accordion__title Title')
13
13
 
14
14
  @subject = Partystreusel.Accordion.init()[0]
15
+ spyOnEvent('.accordion', 'accordion-open')
16
+ spyOnEvent('.accordion', 'accordion-close')
15
17
 
16
18
  it 'toggles correcty', ->
17
19
  expect($('.accordion__item--open').length).toEqual(0)
@@ -23,3 +25,11 @@ describe 'Accordion', ->
23
25
  expect($('.accordion__item--open').length).toEqual(1)
24
26
  @item3.find('.accordion__title').trigger('click')
25
27
  expect($('.accordion__item--open').length).toEqual(0)
28
+
29
+ it 'triggers events', ->
30
+ @item1.find('.accordion__title').trigger('click')
31
+ expect('accordion-open').toHaveBeenTriggeredOnAndWith('.accordion', @item1[0])
32
+ expect('accordion-close').not.toHaveBeenTriggeredOnAndWith('.accordion', @item1[0])
33
+ @item1.find('.accordion__title').trigger('click')
34
+ expect('accordion-open').toHaveBeenTriggeredOnAndWith('.accordion', @item1[0])
35
+ expect('accordion-close').toHaveBeenTriggeredOnAndWith('.accordion', @item1[0])
@@ -50,3 +50,11 @@ describe 'Base', ->
50
50
  objects = @subject.init()
51
51
  expect(objects.length).toEqual(0)
52
52
  expect(@initSpy).not.toHaveBeenCalled()
53
+
54
+ it 'triggers an event', ->
55
+ tag1 = affix('#c1[data-streusel-myclass]')
56
+ @subject = @subject.init()[0]
57
+ spyOn(@subject.$el, 'trigger')
58
+ @subject.trigger('myevent', 'arg1', 'arg2')
59
+ expect(@subject.$el.trigger).toHaveBeenCalledWith('myclass-myevent', 'arg1', 'arg2');
60
+
@@ -6,8 +6,10 @@ describe 'Offcanvas', ->
6
6
  describe 'Readmore object', ->
7
7
 
8
8
  beforeEach ->
9
- @el = affix('[data-streusel-offcanvas] .js-offcanvas__toggler+.offcanvas__overlay')
9
+ @el = affix('.offcanvas[data-streusel-offcanvas] .js-offcanvas__toggler+.offcanvas__overlay')
10
10
  @subject = Partystreusel.Offcanvas.init()[0]
11
+ spyOnEvent('.offcanvas', 'offcanvas-open')
12
+ spyOnEvent('.offcanvas', 'offcanvas-close')
11
13
 
12
14
  it 'toggles correcty with togger', ->
13
15
  expect(@el).not.toHaveClass('offcanvas--open')
@@ -22,3 +24,11 @@ describe 'Offcanvas', ->
22
24
  expect(@el).toHaveClass('offcanvas--open')
23
25
  $('.offcanvas__overlay').trigger('click')
24
26
  expect(@el).not.toHaveClass('offcanvas--open')
27
+
28
+ it 'triggers events', ->
29
+ $('.js-offcanvas__toggler').trigger('click')
30
+ expect('offcanvas-open').toHaveBeenTriggeredOnAndWith('.offcanvas', @el[0])
31
+ expect('offcanvas-close').not.toHaveBeenTriggeredOnAndWith('.offcanvas', @el[0])
32
+ $('.js-offcanvas__toggler').trigger('click')
33
+ expect('offcanvas-open').toHaveBeenTriggeredOnAndWith('.offcanvas', @el[0])
34
+ expect('offcanvas-close').toHaveBeenTriggeredOnAndWith('.offcanvas', @el[0])
@@ -14,8 +14,10 @@ describe 'Readmore', ->
14
14
  describe 'Readmore object', ->
15
15
 
16
16
  beforeEach ->
17
- affix('[data-streusel-readmore]').html('Some Test text')
17
+ @el = affix('.readmore[data-streusel-readmore]').html('Some Test text')
18
18
  @subject = Partystreusel.Readmore.init()[0]
19
+ spyOnEvent('.readmore', 'readmore-open')
20
+ spyOnEvent('.readmore', 'readmore-close')
19
21
 
20
22
  it 'renders an open button', ->
21
23
  @subject = @subject.renderButton()
@@ -29,6 +31,14 @@ describe 'Readmore', ->
29
31
  @subject.toggle()
30
32
  expect(@subject.buttonState()).toEqual('open')
31
33
 
34
+ it 'triggers events', ->
35
+ $('.readmore__button').trigger('click')
36
+ expect('readmore-open').toHaveBeenTriggeredOnAndWith('.readmore', @el[0])
37
+ expect('readmore-close').not.toHaveBeenTriggeredOnAndWith('.readmore', @el[0])
38
+ $('.readmore__button').trigger('click')
39
+ expect('readmore-open').toHaveBeenTriggeredOnAndWith('.readmore', @el[0])
40
+ expect('readmore-close').toHaveBeenTriggeredOnAndWith('.readmore', @el[0])
41
+
32
42
  describe 'Readmore tag', ->
33
43
 
34
44
  beforeEach ->
@@ -71,4 +81,3 @@ describe 'Readmore', ->
71
81
 
72
82
  it 'uses custom button', ->
73
83
  expect(@subject.next()).toHaveClass('myclass')
74
-
@@ -6,7 +6,7 @@ describe 'Tab', ->
6
6
  describe 'Readmore object', ->
7
7
 
8
8
  beforeEach ->
9
- @el = affix('[data-streusel-tab]')
9
+ @el = affix('.tab[data-streusel-tab]')
10
10
 
11
11
  @navItem1 = @el.affix('.tab__nav-item a[href="#panel1"]')
12
12
  @navItem2 = @el.affix('.tab__nav-item a[href="#panel2"]')
@@ -17,6 +17,8 @@ describe 'Tab', ->
17
17
  @panel3 = @el.affix('.tab__panel[id=panel3]')
18
18
 
19
19
  @subject = Partystreusel.Tab.init()[0]
20
+ spyOnEvent('.tab', 'tab-open')
21
+ spyOnEvent('.tab', 'tab-close')
20
22
 
21
23
  it 'has correct references', ->
22
24
  expect(@subject.$navItems.length).toEqual(3)
@@ -42,3 +44,7 @@ describe 'Tab', ->
42
44
  @navItem3.trigger('click')
43
45
  expect(@panel3).toHaveClass('tab__panel--active')
44
46
 
47
+ it 'triggers events', ->
48
+ @navItem2.trigger('click')
49
+ expect('tab-close').toHaveBeenTriggeredOnAndWith('.tab', 'panel1', @navItem1[0], @panel1[0])
50
+ expect('tab-open').toHaveBeenTriggeredOnAndWith('.tab', 'panel2', @navItem2[0], @panel2[0])
@@ -1,6 +1,8 @@
1
1
  #= require jquery
2
2
  #= require i18n
3
3
  #= require ../../app/assets/javascripts/partystreusel
4
+ #= require ../../vendor/assets/javascripts/jquery.cycle2
5
+ #= require ../../vendor/assets/javascripts/jquery.cycle2.swipe
4
6
  #= require_tree .
5
7
 
6
8
  jQuery.fx.off = true
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: partystreusel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0pre2
5
- prerelease: 5
4
+ version: 1.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Flavio Pellanda
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-02 00:00:00.000000000 Z
12
+ date: 2015-03-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -110,9 +110,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
110
  required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements:
113
- - - ! '>'
113
+ - - ! '>='
114
114
  - !ruby/object:Gem::Version
115
- version: 1.3.1
115
+ version: '0'
116
116
  requirements: []
117
117
  rubyforge_project: partystreusel
118
118
  rubygems_version: 1.8.23