thin_man 0.17.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c06e9191250030954e43aa80ec1039a04387c6da
4
- data.tar.gz: 5f79ff39a656093021667941d8aea2accffd4749
3
+ metadata.gz: 889c8c7807a4ed374dd0bb78ab34768f9f641f66
4
+ data.tar.gz: cb5199ac9ddd6a2471ca0f91e039d0123270d4e3
5
5
  SHA512:
6
- metadata.gz: 2a84356d1c56ca333fcc91aa5a27b1cbb84438228daec8c86e2076c925daa416f210120aaaab845acc93e383563bb7dde58dd49f858573ab9e2848536eb8a1eb
7
- data.tar.gz: 2edf5c8474575ecf040aa91f958cc74b6c2f0cc7c6f86b52b324089a837d83159b8900f5e3a0a34d3e73ee746a4396467e9b6625406ab0a37ccc59640c684183
6
+ metadata.gz: 2b8c563c47e60e8f4b6167d34c2cc6863671343cfd7cbaca583bed57f7fa56a2283d7c4951904fd9ca9373a6e889fc8f7317710fc2d526ee83ae77e615e6e45b
7
+ data.tar.gz: ac17499c839a3096abf2d69d4fcea1889b4b290ffc245c1e9298b0e18d11e744427f354b818d083b66d21dab5c497002e963682c86838ab00fc7f42847cd4c9f
@@ -8,6 +8,51 @@ var initThinMan = function(){
8
8
  }
9
9
  return this_class;
10
10
  },
11
+ getLinkGroup: function(name){
12
+ if(thin_man.hasOwnProperty('link_groups') && thin_man.link_groups.hasOwnProperty(name)){
13
+ return thin_man.link_groups[name]
14
+ } else {
15
+ return thin_man.addLinkGroup(name)
16
+ }
17
+ },
18
+ addLinkGroup: function(name){
19
+ if(!thin_man.hasOwnProperty('link_groups')){
20
+ thin_man.link_groups = {}
21
+ }
22
+ if(!thin_man.link_groups.hasOwnProperty(name)){
23
+ var this_group = new thin_man.LinkGroup(name)
24
+ thin_man.link_groups[name] = this_group
25
+ return this_group
26
+ }
27
+ },
28
+ addLinkToGroup: function(link, sequence_number, group_name){
29
+ var group = thin_man.getLinkGroup(group_name)
30
+ group.addLink(link,sequence_number)
31
+ },
32
+ LinkGroup: Class.extend({
33
+ init: function(name){
34
+ this.name = name
35
+ this.links = {}
36
+ this.current_number = 0
37
+ },
38
+ addLink: function(link_submission, sequence_number){
39
+ this.links[sequence_number] = link_submission
40
+ link_submission.addWatcher(this)
41
+ if(sequence_number == this.current_number){
42
+ this.fire()
43
+ }
44
+ },
45
+ fire: function(){
46
+ if(this.links.hasOwnProperty(this.current_number)){
47
+ this.links[this.current_number].fire()
48
+ delete this.links[this.current_number]
49
+ }
50
+ },
51
+ linkCompleted: function(link_submission){
52
+ this.current_number += 1
53
+ this.fire()
54
+ }
55
+ }),
11
56
  AjaxSubmission: Class.extend({
12
57
  init: function(jq_obj,params){
13
58
  this.jq_obj = jq_obj;
@@ -24,6 +69,7 @@ var initThinMan = function(){
24
69
  this.progress_target = $(jq_obj.data('progress-target'));
25
70
  this.custom_progress = typeof(jq_obj.data('custom-progress')) != 'undefined';
26
71
  this.scroll_to = jq_obj.data('scroll-to')
72
+ this.watchers = []
27
73
  if(this.progress_target.length == 0 && this.trigger.length > 0){
28
74
  this.progress_target = this.trigger
29
75
  this.trigger_is_progress_target = true
@@ -48,8 +94,30 @@ var initThinMan = function(){
48
94
  this.ajax_options.xhr = this.customXHR
49
95
  this.ajax_options.thin_man_obj = this;
50
96
  }
97
+ this.handleGroup()
98
+ if(this.readyToFire()){
99
+ this.fire()
100
+ }
101
+ },
102
+ fire: function(){
51
103
  $.ajax(this.ajax_options);
52
104
  },
105
+ readyToFire: function(){
106
+ if(!this.sequence_group){ return true }
107
+ },
108
+ handleGroup: function(){
109
+ this.sequence_group = this.jq_obj.data('sequence-group');
110
+ this.sequence_number = this.jq_obj.data('sequence-number');
111
+ if(typeof(this.sequence_number) == 'number' && !this.sequence_group){
112
+ console.log('Warning! Thin Man Link has sequence number but no sequence group.')
113
+ }
114
+ if(this.sequence_group && typeof(this.sequence_number) != 'number'){
115
+ console.log('Warning! Thin Man Link has sequence group ' + this.sequence_group + ' but no sequence number.')
116
+ }
117
+ if(this.sequence_group){
118
+ thin_man.addLinkToGroup(this, this.sequence_number, this.sequence_group)
119
+ }
120
+ },
53
121
  getTarget: function(){
54
122
  var target_selector = this.jq_obj.data('ajax-target');
55
123
  if(target_selector){
@@ -173,8 +241,20 @@ var initThinMan = function(){
173
241
  this.jq_obj.find('.help-inline').remove()
174
242
  }
175
243
  },
244
+ addWatcher: function(watcher){
245
+ if(!this.hasOwnProperty('watchers')){
246
+ this.watchers = []
247
+ }
248
+ this.watchers.push(watcher)
249
+ },
250
+ notifyWatchers: function(){
251
+ $.each(this.watchers, function(){
252
+ this.linkCompleted(this)
253
+ })
254
+ },
176
255
  ajaxComplete: function(jqXHR) {
177
256
  this.showTrigger();
257
+ this.notifyWatchers();
178
258
  if(this.progress_indicator){
179
259
  this.progress_indicator.stop();
180
260
  } else if(!this.trigger_is_progress_target){
@@ -21,7 +21,10 @@ module ThinMan
21
21
  html_options.merge(ajax_options))
22
22
  end
23
23
 
24
- def ajax_link_now(name, options, html_options, target, sub_class: nil, insert_method: nil, empty_on_success: nil, http_method: nil, no_mouse_click: nil, progress_target: nil, progress_color: nil)
24
+ def ajax_link_now(name, options, html_options, target,
25
+ sub_class: nil, insert_method: nil, empty_on_success: nil,
26
+ http_method: nil, no_mouse_click: nil, progress_target: nil,
27
+ progress_color: nil, sequence_group: nil, sequence_number: nil)
25
28
  ajax_options = {
26
29
  'data-ajax-link-now' => true,
27
30
  'data-ajax-target' => target
@@ -33,6 +36,8 @@ module ThinMan
33
36
  ajax_options.merge!('data-no-mouse-click' => no_mouse_click) if no_mouse_click.present?
34
37
  ajax_options.merge!('data-progress-target' => progress_target) if progress_target.present?
35
38
  ajax_options.merge!('data-progress-color' => progress_color) if progress_color.present?
39
+ ajax_options.merge!('data-sequence-group' => sequence_group) if sequence_group.present?
40
+ ajax_options.merge!('data-sequence-number' => sequence_number) if sequence_number.present?
36
41
  link_to(name,
37
42
  options,
38
43
  html_options.merge(ajax_options))
@@ -1,3 +1,3 @@
1
1
  module ThinMan
2
- VERSION = "0.17.0"
2
+ VERSION = "0.18.0"
3
3
  end
@@ -113,10 +113,26 @@ describe("thin_man", function(){
113
113
  expect(getAjaxArg("url")).toMatch("/url");
114
114
  expect(getAjaxArg("type")).toMatch("PATCH");
115
115
  expect(getAjaxArg("datatype")).toMatch("json");
116
+ expect(thin_man.hasOwnProperty('link_groups')).toEqual(false)
116
117
  });
117
-
118
+ it("fires grouped links in sequence", function(){
119
+ var $link_zero = affix('a[data-ajax-link-now="true"][data-ajax-target="#test_dom_id"][href="/url"][data-ajax-method="PATCH"][data-sequence-group="test_group"][data-sequence-number="0"]');
120
+ var $link_one = affix('a[data-ajax-link-now="true"][data-ajax-target="#test_dom_id"][href="/url"][data-ajax-method="PATCH"][data-sequence-group="test_group"][data-sequence-number="1"]');
121
+ var $link_two = affix('a[data-ajax-link-now="true"][data-ajax-target="#test_dom_id"][href="/url"][data-ajax-method="PATCH"][data-sequence-group="test_group"][data-sequence-number="2"]');
122
+ zero = new thin_man.AjaxLinkSubmission($link_zero)
123
+ one = new thin_man.AjaxLinkSubmission($link_one)
124
+ two = new thin_man.AjaxLinkSubmission($link_two)
125
+ expect(thin_man.hasOwnProperty('link_groups')).toEqual(true)
126
+ spyOn(one,'fire')
127
+ spyOn(two,'fire')
128
+ zero.ajaxComplete()
129
+ expect(one.fire).toHaveBeenCalled();
130
+ expect(two.fire).not.toHaveBeenCalled();
131
+ one.ajaxComplete()
132
+ expect(one.fire.calls.count()).toEqual(1);
133
+ expect(two.fire).toHaveBeenCalled();
134
+ })
118
135
  });
119
-
120
136
  describe("DeleteLink", function(){
121
137
  it("submits an ajax delete call with options", function(){
122
138
  var $link = affix('a[data-ajax-delete="true"][data-ajax-target="#test_dom_id"][href="/url"]');
@@ -14,6 +14,8 @@ class ThinManTest < ActionView::TestCase
14
14
  @progress_target = '#progress_element'
15
15
  @progress_color = 'blue'
16
16
  @scroll_to = true
17
+ @sequence_group = 'test_group'
18
+ @sequence_number = 0
17
19
 
18
20
  @replace_response = true
19
21
  @no_confirm = true
@@ -39,7 +41,11 @@ class ThinManTest < ActionView::TestCase
39
41
  end
40
42
 
41
43
  it "generates an instant link" do
42
- test_link = ajax_link_now('test link', "http://test.com", @html_options, @target, insert_method: @insert_method, empty_on_success: @empty_on_success, http_method: @http_method, progress_target: @progress_target, progress_color: @progress_color)
44
+ test_link = ajax_link_now('test link', "http://test.com", @html_options, @target,
45
+ insert_method: @insert_method, empty_on_success: @empty_on_success,
46
+ http_method: @http_method, progress_target: @progress_target,
47
+ progress_color: @progress_color, sequence_number: @sequence_number,
48
+ sequence_group: @sequence_group)
43
49
  test_link.must_match "data-ajax-link-now="
44
50
  test_link.must_match(/class=.test_class./)
45
51
  test_link.must_match "data-ajax-target=\"#{@target}\""
@@ -48,6 +54,8 @@ class ThinManTest < ActionView::TestCase
48
54
  test_link.must_match "data-ajax-method=\"#{@http_method}\""
49
55
  test_link.must_match "data-progress-target=\"#{@progress_target}\""
50
56
  test_link.must_match "data-progress-color=\"#{@progress_color}\""
57
+ test_link.must_match "data-sequence-group=\"#{@sequence_group}\""
58
+ test_link.must_match "data-sequence-number=\"#{@sequence_number}\""
51
59
  end
52
60
 
53
61
  it "generates a delete link" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thin_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Draut, Adam Bialek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-02 00:00:00.000000000 Z
11
+ date: 2017-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails