pwnstyles_rails 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,14 +1,12 @@
1
- source 'http://rubygems.org'
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- gem 'rails', '>= 3.1.1'
5
- gem 'sass-rails', '>= 3.1.4'
1
+ source :rubygems
2
+
3
+ gem 'rails', '>= 3.2.0'
4
+ gem 'sass-rails', '>= 3.2.4'
6
5
 
7
- # Add dependencies to develop your gem here.
8
- # Include everything needed to run rake, tests, features, etc.
9
6
  group :development do
10
7
  gem 'shoulda', '>= 0'
11
8
  gem 'bundler', '~> 1.0.0'
12
- gem 'jeweler', '~> 1.6.0'
13
- gem 'rcov', '>= 0'
9
+ gem 'jeweler', '>= 1.8.0'
10
+ gem 'rcov', '>= 0', :platform => :mri_18
11
+ gem 'simplecov', '>= 0', :platform => :mri_19
14
12
  end
data/Gemfile.lock CHANGED
@@ -1,89 +1,90 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- actionmailer (3.1.1)
5
- actionpack (= 3.1.1)
6
- mail (~> 2.3.0)
7
- actionpack (3.1.1)
8
- activemodel (= 3.1.1)
9
- activesupport (= 3.1.1)
4
+ actionmailer (3.2.1)
5
+ actionpack (= 3.2.1)
6
+ mail (~> 2.4.0)
7
+ actionpack (3.2.1)
8
+ activemodel (= 3.2.1)
9
+ activesupport (= 3.2.1)
10
10
  builder (~> 3.0.0)
11
11
  erubis (~> 2.7.0)
12
- i18n (~> 0.6)
13
- rack (~> 1.3.2)
12
+ journey (~> 1.0.1)
13
+ rack (~> 1.4.0)
14
14
  rack-cache (~> 1.1)
15
- rack-mount (~> 0.8.2)
16
15
  rack-test (~> 0.6.1)
17
- sprockets (~> 2.0.2)
18
- activemodel (3.1.1)
19
- activesupport (= 3.1.1)
16
+ sprockets (~> 2.1.2)
17
+ activemodel (3.2.1)
18
+ activesupport (= 3.2.1)
20
19
  builder (~> 3.0.0)
21
- i18n (~> 0.6)
22
- activerecord (3.1.1)
23
- activemodel (= 3.1.1)
24
- activesupport (= 3.1.1)
25
- arel (~> 2.2.1)
20
+ activerecord (3.2.1)
21
+ activemodel (= 3.2.1)
22
+ activesupport (= 3.2.1)
23
+ arel (~> 3.0.0)
26
24
  tzinfo (~> 0.3.29)
27
- activeresource (3.1.1)
28
- activemodel (= 3.1.1)
29
- activesupport (= 3.1.1)
30
- activesupport (3.1.1)
25
+ activeresource (3.2.1)
26
+ activemodel (= 3.2.1)
27
+ activesupport (= 3.2.1)
28
+ activesupport (3.2.1)
29
+ i18n (~> 0.6)
31
30
  multi_json (~> 1.0)
32
- arel (2.2.1)
31
+ arel (3.0.0)
33
32
  builder (3.0.0)
34
33
  erubis (2.7.0)
35
34
  git (1.2.5)
36
35
  hike (1.2.1)
37
36
  i18n (0.6.0)
38
- jeweler (1.6.4)
37
+ jeweler (1.8.3)
39
38
  bundler (~> 1.0)
40
39
  git (>= 1.2.5)
41
40
  rake
42
- json (1.6.1)
43
- mail (2.3.0)
41
+ rdoc
42
+ journey (1.0.1)
43
+ json (1.6.5)
44
+ mail (2.4.1)
44
45
  i18n (>= 0.4.0)
45
46
  mime-types (~> 1.16)
46
47
  treetop (~> 1.4.8)
47
48
  mime-types (1.17.2)
48
- multi_json (1.0.3)
49
+ multi_json (1.0.4)
49
50
  polyglot (0.3.3)
50
- rack (1.3.5)
51
+ rack (1.4.1)
51
52
  rack-cache (1.1)
52
53
  rack (>= 0.4)
53
- rack-mount (0.8.3)
54
- rack (>= 1.0.0)
55
54
  rack-ssl (1.3.2)
56
55
  rack
57
56
  rack-test (0.6.1)
58
57
  rack (>= 1.0)
59
- rails (3.1.1)
60
- actionmailer (= 3.1.1)
61
- actionpack (= 3.1.1)
62
- activerecord (= 3.1.1)
63
- activeresource (= 3.1.1)
64
- activesupport (= 3.1.1)
58
+ rails (3.2.1)
59
+ actionmailer (= 3.2.1)
60
+ actionpack (= 3.2.1)
61
+ activerecord (= 3.2.1)
62
+ activeresource (= 3.2.1)
63
+ activesupport (= 3.2.1)
65
64
  bundler (~> 1.0)
66
- railties (= 3.1.1)
67
- railties (3.1.1)
68
- actionpack (= 3.1.1)
69
- activesupport (= 3.1.1)
65
+ railties (= 3.2.1)
66
+ railties (3.2.1)
67
+ actionpack (= 3.2.1)
68
+ activesupport (= 3.2.1)
70
69
  rack-ssl (~> 1.3.2)
71
70
  rake (>= 0.8.7)
72
71
  rdoc (~> 3.4)
73
72
  thor (~> 0.14.6)
74
73
  rake (0.9.2.2)
75
- rcov (0.9.11)
76
- rdoc (3.11)
74
+ rcov (1.0.0)
75
+ rdoc (3.12)
77
76
  json (~> 1.4)
78
- sass (3.1.10)
79
- sass-rails (3.1.4)
80
- actionpack (~> 3.1.0)
81
- railties (~> 3.1.0)
82
- sass (>= 3.1.4)
83
- sprockets (~> 2.0.0)
84
- tilt (~> 1.3.2)
77
+ sass (3.1.13)
78
+ sass-rails (3.2.4)
79
+ railties (~> 3.2.0)
80
+ sass (>= 3.1.10)
81
+ tilt (~> 1.3)
85
82
  shoulda (2.11.3)
86
- sprockets (2.0.3)
83
+ simplecov (0.5.4)
84
+ multi_json (~> 1.0.3)
85
+ simplecov-html (~> 0.5.3)
86
+ simplecov-html (0.5.3)
87
+ sprockets (2.1.2)
87
88
  hike (~> 1.2)
88
89
  rack (~> 1.0)
89
90
  tilt (~> 1.1, != 1.3.0)
@@ -92,15 +93,16 @@ GEM
92
93
  treetop (1.4.10)
93
94
  polyglot
94
95
  polyglot (>= 0.3.1)
95
- tzinfo (0.3.30)
96
+ tzinfo (0.3.31)
96
97
 
97
98
  PLATFORMS
98
99
  ruby
99
100
 
100
101
  DEPENDENCIES
101
102
  bundler (~> 1.0.0)
102
- jeweler (~> 1.6.0)
103
- rails (>= 3.1.1)
103
+ jeweler (>= 1.8.0)
104
+ rails (>= 3.2.0)
104
105
  rcov
105
- sass-rails (>= 3.1.4)
106
+ sass-rails (>= 3.2.4)
106
107
  shoulda
108
+ simplecov
data/Rakefile CHANGED
@@ -30,13 +30,6 @@ Rake::TestTask.new(:test) do |test|
30
30
  test.verbose = true
31
31
  end
32
32
 
33
- require 'rcov/rcovtask'
34
- Rcov::RcovTask.new do |test|
35
- test.libs << 'test'
36
- test.pattern = 'test/**/test_*.rb'
37
- test.verbose = true
38
- end
39
-
40
33
  task :default => :test
41
34
 
42
35
  require 'rdoc/task'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -0,0 +1,178 @@
1
+ # PwnFx: AJAX sprinkles via unobtrusive JavaScript.
2
+ # @author Victor Costan
3
+
4
+ # The author sorely misses Rails' AJAX helpers such as observe_field. This
5
+ # library provides a replacement that adheres to the new philosophy of
6
+ # unobtrusive JavaScript triggered by HTML5 data- attributes.
7
+
8
+ # Fires off an AJAX request (almost) every time when an element changes.
9
+ #
10
+ # The text / HTML returned by the request is placed in another element.
11
+ #
12
+ # Element attributes:
13
+ # data-pwnfx-refresh-url: URL to perform an AJAX request to
14
+ # data-pwnfx-refresh-method: the HTTP method of AJAX request (default: POST)
15
+ # data-pwnfx-refresh-ms: interval between a change on the source element and
16
+ # AJAX refresh requests (default: 200ms)
17
+ # data-pwnfx-target: the element populated with the AJAX response
18
+ class PwnFxRefresh
19
+ constructor: (element, xhrUrl) ->
20
+ targetSelector = '#' + element.getAttribute('data-pwnfx-refresh-target')
21
+ refreshInterval = parseInt(
22
+ element.getAttribute('data-pwnfx-refresh-ms') || '200');
23
+ xhrMethod = element.getAttribute('data-pwnfx-refresh-method') || 'POST'
24
+ xhrForm = @parentForm element
25
+
26
+ onXhrSuccess = ->
27
+ data = @responseText
28
+ for targetElement in document.querySelectorAll(targetSelector)
29
+ targetElement.innerHTML = data
30
+ for scriptElement in targetElement.querySelectorAll('script')
31
+ parent = scriptElement.parentElement
32
+ nextSibling = scriptElement.nextSibling
33
+ parent.removeChild scriptElement
34
+ parent.insertBefore scriptElement.cloneNode(true), nextSibling
35
+
36
+
37
+ refreshPending = false
38
+ refreshOldValue = null
39
+ ajaxRefresh = ->
40
+ refreshPending = false
41
+ xhr = new XMLHttpRequest
42
+ xhr.onload = onXhrSuccess
43
+ xhr.open xhrMethod, xhrUrl
44
+ xhr.send new FormData(xhrForm)
45
+
46
+ onChange = ->
47
+ value = element.value
48
+ return true if value == refreshOldValue
49
+ refreshOldValue = value
50
+
51
+ return true if refreshPending
52
+ refreshPending = true
53
+ window.setTimeout ajaxRefresh, refreshInterval
54
+ true
55
+
56
+ element.addEventListener 'change', onChange
57
+ element.addEventListener 'keydown', onChange
58
+ element.addEventListener 'keyup', onChange
59
+
60
+
61
+ # The closest form element wrapping a node.
62
+ parentForm: (element) ->
63
+ while element
64
+ return element if element.nodeName == 'FORM'
65
+ element = element.parentNode
66
+ null
67
+
68
+ # Shows elements conditionally, depending on whether some inputs' values match.
69
+ #
70
+ # Element attributes:
71
+ # data-pwnfx-confirm: all elements with the same value for this attribute
72
+ # belong to the same confirmation group; their values have to match to
73
+ # trigger the "win" condition
74
+ # data-pwnfx-confirm-win: CSS selector identifying the elements to be shown
75
+ # when the "win" condition is triggered, and hidden otherwise
76
+ # data-pwnfx-confirm-fail: CSS selector identifying the elements to be hidden
77
+ # when the "win" condition is triggered, and shown otherwise
78
+ class PwnFxConfirm
79
+ constructor: (element, identifier) ->
80
+ sourceSelector = "[data-pwnfx-confirm-done=\"#{identifier}\"]"
81
+ winSelector = "[data-pwnfx-confirm-win=\"#{identifier}\"]"
82
+ failSelector = "[data-pwnfx-confirm-fail=\"#{identifier}\"]"
83
+
84
+ onChange = ->
85
+ value = null
86
+ matching = true
87
+ for element, index in document.querySelectorAll(sourceSelector)
88
+ if index == 0
89
+ value = element.value
90
+ else if element.value != value
91
+ matching = false
92
+ break
93
+
94
+ hideSelector = if matching then failSelector else winSelector
95
+ showSelector = if matching then winSelector else failSelector
96
+ for targetElement in document.querySelectorAll(showSelector)
97
+ targetElement.classList.remove 'hidden'
98
+ for targetElement in document.querySelectorAll(hideSelector)
99
+ targetElement.classList.add 'hidden'
100
+ true
101
+ onChange()
102
+
103
+ element.addEventListener 'change', onChange
104
+ element.addEventListener 'keydown', onChange
105
+ element.addEventListener 'keyup', onChange
106
+
107
+ # Moves an element using data-pwnfx-move.
108
+ class PwnFxMove
109
+ constructor: (element, identifier) ->
110
+ targetSelector =
111
+ target = document.querySelector "[data-pwnfx-move-target=\"#{identifier}\"]"
112
+ target.appendChild element
113
+
114
+ # Shows / hides elements when an element is clicked or checked / unchecked.
115
+ #
116
+ # Attributes:
117
+ # data-pwnfx-reveal: a name for the events caused by this element's triggering
118
+ # data-pwnfx-trigger: 'click' means events are triggered when the element is
119
+ # clicked, 'check' means events are triggered when the element is checked;
120
+ # (default: click)
121
+ # data-pwnfx-positive: set to the same value as data-pwnfx-reveal on elements
122
+ # that will be shown when a positive event (click / check) is triggered,
123
+ # and hidden when a negative event (uncheck) is triggered
124
+ # data-pwnfx-negative: set to the same value as data-pwnfx-reveal on elements
125
+ # that will be hidden when a positive event (click / check) is triggered,
126
+ # and shown when a negative event (uncheck) is triggered
127
+ class PwnFxReveal
128
+ constructor: (element, identifier) ->
129
+ trigger = element.getAttribute('data-pwnfx-reveal-trigger') || 'click'
130
+ positiveSelector = "[data-pwnfx-reveal-positive=\"#{identifier}\"]"
131
+ negativeSelector = "[data-pwnfx-reveal-negative=\"#{identifier}\"]"
132
+ onChange = (event) ->
133
+ positive = (trigger == 'click') || element.checked
134
+
135
+ showSelector = if positive then positiveSelector else negativeSelector
136
+ hideSelector = if positive then negativeSelector else positiveSelector
137
+ for targetElement in document.querySelectorAll(showSelector)
138
+ targetElement.classList.remove 'hidden'
139
+ for targetElement in document.querySelectorAll(hideSelector)
140
+ targetElement.classList.add 'hidden'
141
+ if trigger == 'click'
142
+ event.preventDefault()
143
+ false
144
+ else
145
+ true
146
+
147
+ if trigger == 'click'
148
+ element.addEventListener 'click', onChange
149
+ else if trigger == 'check'
150
+ element.addEventListener 'change', onChange
151
+ onChange()
152
+
153
+
154
+ # List of effects.
155
+ pwnEffects = [
156
+ ['data-pwnfx-move', PwnFxMove],
157
+ ['data-pwnfx-refresh-url', PwnFxRefresh],
158
+ ['data-pwnfx-confirm', PwnFxConfirm],
159
+ ['data-pwnfx-reveal', PwnFxReveal]
160
+ ]
161
+
162
+ # Wires JS to elements with data-pwnfx attributes.
163
+ window.PwnFx = ->
164
+ for effect in pwnEffects
165
+ attrName = effect[0]
166
+ effectClass = effect[1]
167
+ doneAttrName = "#{attrName}-done"
168
+ attrSelector = "[#{attrName}]"
169
+ for element in document.querySelectorAll(attrSelector)
170
+ attrValue = element.getAttribute attrName
171
+ continue unless attrValue
172
+ element.removeAttribute attrName
173
+ element.setAttribute doneAttrName, attrValue
174
+ new effectClass element, attrValue
175
+ null
176
+
177
+ # Honor data-pwnfx attributes after the DOM is loaded.
178
+ window.addEventListener 'load', -> window.PwnFx()
@@ -12,7 +12,7 @@ input[type=submit], input[type=button], button, a.button {
12
12
  background-color: $button-color;
13
13
  border: 1px solid $button-border-color;
14
14
  color: $button-font-color;
15
- font-size: 1.1em;
15
+ font-size: 1.21em;
16
16
  text-decoration: none;
17
17
  display: inline-block;
18
18
 
@@ -47,6 +47,8 @@ input[type=text], input[type=email], input[type=tel], input[type=password],
47
47
  box-shadow: inset 0px 2px 2px $input-shadow-color;
48
48
  background-color: $input-background-color;
49
49
 
50
+ text-decoration: none;
51
+
50
52
  &:hover {
51
53
  border: 1px solid $button-hover-border-color;
52
54
  }
@@ -1,18 +1,16 @@
1
1
  <% if flash[:error] %>
2
- <p class="status-bar error" data-pwnfx-reveal-target="status-bar">
2
+ <p class="status-bar error" data-pwnfx-reveal-negative="status-bar">
3
3
  <%= flash[:error] %>
4
4
 
5
5
  <span class="actions">
6
- <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar',
7
- 'data-pwnfx-reveal-trigger' => 'click-hide' %>
6
+ <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar' %>
8
7
  </span>
9
8
  </p>
10
9
  <% elsif flash[:errors] && flash[:errors].any? %>
11
- <div class="status-bar error" data-pwnfx-reveal-target="status-bar">
10
+ <div class="status-bar error" data-pwnfx-reveal-negative="status-bar">
12
11
  <%= pluralize(flash[:errors].count, "error") %> occurred:
13
12
  <span class="actions">
14
- <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar',
15
- 'data-pwnfx-reveal-trigger' => 'click-hide' %>
13
+ <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar' %>
16
14
  </span>
17
15
 
18
16
  <ul>
@@ -22,12 +20,11 @@
22
20
  </ul>
23
21
  </div>
24
22
  <% elsif flash[:notice] %>
25
- <p class="status-bar notice" data-pwnfx-reveal-target="status-bar">
23
+ <p class="status-bar notice" data-pwnfx-reveal-negative="status-bar">
26
24
  <%= flash[:notice] %>
27
25
 
28
26
  <span class="actions">
29
- <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar',
30
- 'data-pwnfx-reveal-trigger' => 'click-hide' %>
27
+ <%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar' %>
31
28
  </span>
32
29
  </p>
33
30
  <% end %>
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "pwnstyles_rails"
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Victor Costan"]
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
  "README.rdoc",
26
26
  "Rakefile",
27
27
  "VERSION",
28
- "app/assets/javascripts/pwn-fx.js",
28
+ "app/assets/javascripts/pwn-fx.js.coffee",
29
29
  "app/assets/stylesheets/_pwnstyles.css.scss",
30
30
  "app/assets/stylesheets/generic/_controls.css.scss",
31
31
  "app/assets/stylesheets/generic/_forms.css.scss",
@@ -69,27 +69,30 @@ Gem::Specification.new do |s|
69
69
  s.specification_version = 3
70
70
 
71
71
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
72
- s.add_runtime_dependency(%q<rails>, [">= 3.1.1"])
73
- s.add_runtime_dependency(%q<sass-rails>, [">= 3.1.4"])
72
+ s.add_runtime_dependency(%q<rails>, [">= 3.2.0"])
73
+ s.add_runtime_dependency(%q<sass-rails>, [">= 3.2.4"])
74
74
  s.add_development_dependency(%q<shoulda>, [">= 0"])
75
75
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
76
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
76
+ s.add_development_dependency(%q<jeweler>, [">= 1.8.0"])
77
77
  s.add_development_dependency(%q<rcov>, [">= 0"])
78
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
78
79
  else
79
- s.add_dependency(%q<rails>, [">= 3.1.1"])
80
- s.add_dependency(%q<sass-rails>, [">= 3.1.4"])
80
+ s.add_dependency(%q<rails>, [">= 3.2.0"])
81
+ s.add_dependency(%q<sass-rails>, [">= 3.2.4"])
81
82
  s.add_dependency(%q<shoulda>, [">= 0"])
82
83
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
83
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
84
+ s.add_dependency(%q<jeweler>, [">= 1.8.0"])
84
85
  s.add_dependency(%q<rcov>, [">= 0"])
86
+ s.add_dependency(%q<simplecov>, [">= 0"])
85
87
  end
86
88
  else
87
- s.add_dependency(%q<rails>, [">= 3.1.1"])
88
- s.add_dependency(%q<sass-rails>, [">= 3.1.4"])
89
+ s.add_dependency(%q<rails>, [">= 3.2.0"])
90
+ s.add_dependency(%q<sass-rails>, [">= 3.2.4"])
89
91
  s.add_dependency(%q<shoulda>, [">= 0"])
90
92
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
91
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
93
+ s.add_dependency(%q<jeweler>, [">= 1.8.0"])
92
94
  s.add_dependency(%q<rcov>, [">= 0"])
95
+ s.add_dependency(%q<simplecov>, [">= 0"])
93
96
  end
94
97
  end
95
98
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwnstyles_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-04 00:00:00.000000000Z
12
+ date: 2012-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &14639820 !ruby/object:Gem::Requirement
16
+ requirement: &7895040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 3.1.1
21
+ version: 3.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *14639820
24
+ version_requirements: *7895040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sass-rails
27
- requirement: &14639180 !ruby/object:Gem::Requirement
27
+ requirement: &7893040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 3.1.4
32
+ version: 3.2.4
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *14639180
35
+ version_requirements: *7893040
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &14638580 !ruby/object:Gem::Requirement
38
+ requirement: &7891480 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *14638580
46
+ version_requirements: *7891480
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &14637940 !ruby/object:Gem::Requirement
49
+ requirement: &7890520 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,21 +54,32 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *14637940
57
+ version_requirements: *7890520
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &14637340 !ruby/object:Gem::Requirement
60
+ requirement: &7889360 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
- - - ~>
63
+ - - ! '>='
64
64
  - !ruby/object:Gem::Version
65
- version: 1.6.0
65
+ version: 1.8.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *14637340
68
+ version_requirements: *7889360
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &14636700 !ruby/object:Gem::Requirement
71
+ requirement: &7888140 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *7888140
80
+ - !ruby/object:Gem::Dependency
81
+ name: simplecov
82
+ requirement: &7887200 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,7 +87,7 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *14636700
90
+ version_requirements: *7887200
80
91
  description: Included CSS was designed for reuse across pwnb.us apps.
81
92
  email: victor@costan.us
82
93
  executables: []
@@ -93,7 +104,7 @@ files:
93
104
  - README.rdoc
94
105
  - Rakefile
95
106
  - VERSION
96
- - app/assets/javascripts/pwn-fx.js
107
+ - app/assets/javascripts/pwn-fx.js.coffee
97
108
  - app/assets/stylesheets/_pwnstyles.css.scss
98
109
  - app/assets/stylesheets/generic/_controls.css.scss
99
110
  - app/assets/stylesheets/generic/_forms.css.scss
@@ -141,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
152
  version: '0'
142
153
  segments:
143
154
  - 0
144
- hash: -2823634831094979445
155
+ hash: -808311045673830044
145
156
  required_rubygems_version: !ruby/object:Gem::Requirement
146
157
  none: false
147
158
  requirements:
@@ -1,160 +0,0 @@
1
- /**
2
- * PwnFx: AJAX sprinkles via unobtrusive JavaScript.
3
- * @author Victor Costan
4
- *
5
- * The author sorely misses Rails' AJAX helpers such as observe_field. This
6
- * library provides a replacement that adheres to the new philosophy of
7
- * unobtrusive JavaScript triggered by HTML5 data- attributes.
8
- */
9
-
10
-
11
- /** Namespace. */
12
- var PwnFx = {};
13
-
14
- /** Wires JS to elements with data-pwnfx attributes. */
15
- PwnFx.wireAll = function () {
16
- $('[data-pwnfx-move]').each(function (_, element) {
17
- PwnFx.wireMove(element);
18
- });
19
-
20
- $('[data-pwnfx-refresh-url]').each(function (_, element) {
21
- PwnFx.wireRefresh(element);
22
- });
23
- $('[data-pwnfx-confirm]').each(function (_, element) {
24
- PwnFx.wireConfirm(element);
25
- });
26
- $('[data-pwnfx-reveal]').each(function (_, element) {
27
- PwnFx.wireReveal(element);
28
- });
29
- };
30
-
31
- /** Wires JS to an AJAX refresh element that uses data-pwnfx-refresh-url. */
32
- PwnFx.wireRefresh = function (element) {
33
- var jElement = $(element);
34
- var xhrUrl = jElement.attr('data-pwnfx-refresh-url');
35
- jElement.attr('data-pwnfx-refresh-url-done', xhrUrl);
36
- jElement.removeAttr('data-pwnfx-refresh-url');
37
-
38
- var targetSelector = '#' + jElement.attr('data-pwnfx-refresh-target');
39
- var refreshInterval =
40
- parseInt(jElement.attr('data-pwnfx-refresh-ms') || '200');
41
- var xhrMethod = jElement.attr('data-pwnfx-refresh-method') || 'POST';
42
- var form = $(jElement.parents('form')[0]);
43
- var onXhrSuccessFn = function (data) {
44
- $(targetSelector).html(data);
45
- };
46
- var refreshPending = false;
47
- var refreshOldValue = null;
48
- var ajaxRefreshFn = function () {
49
- refreshPending = false;
50
- $.ajax({
51
- data: form.serialize(), success: onXhrSuccessFn,
52
- dataType: 'html', type: xhrMethod, url: xhrUrl
53
- });
54
- };
55
- var onChangeFn = function () {
56
- var value = jElement.val();
57
- if (value == refreshOldValue) {
58
- return;
59
- } else {
60
- refreshOldValue = value;
61
- }
62
- if (refreshPending) {
63
- return;
64
- } else {
65
- refreshPending = true;
66
- setTimeout(ajaxRefreshFn, refreshInterval);
67
- }
68
- };
69
-
70
- jElement.bind('change', onChangeFn);
71
- jElement.bind('keydown', onChangeFn);
72
- jElement.bind('keyup', onChangeFn);
73
- onChangeFn();
74
- };
75
-
76
- /**
77
- * Wires JS to an AJAX confirmation check element using data-pwnfx-confirm.
78
- */
79
- PwnFx.wireConfirm = function (element) {
80
- var jElement = $(element);
81
- var identifier = jElement.attr('data-pwnfx-confirm');
82
- var sourceSelector = '[data-pwnfx-confirm="' + identifier + '"]'
83
- var winSelector = '[data-pwnfx-confirm-win="' + identifier + '"]';
84
- var failSelector = '[data-pwnfx-confirm-fail="' + identifier + '"]';
85
-
86
- var onChangeFn = function () {
87
- var value = null;
88
- var matching = true;
89
- $(sourceSelector).each(function (index, element) {
90
- var val = $(element).val();
91
- value = value || val;
92
- if (value != val) {
93
- matching = false;
94
- }
95
- if (matching) {
96
- $(winSelector).removeClass('hidden');
97
- $(failSelector).addClass('hidden');
98
- } else {
99
- $(winSelector).addClass('hidden');
100
- $(failSelector).removeClass('hidden');
101
- }
102
- });
103
- };
104
- jElement.bind('change', onChangeFn);
105
- jElement.bind('keydown', onChangeFn);
106
- jElement.bind('keyup', onChangeFn);
107
- onChangeFn();
108
- };
109
-
110
- /** Moves an element using data-pwnfx-move. */
111
- PwnFx.wireMove = function (element) {
112
- var jElement = $(element);
113
- var identifier = jElement.attr('data-pwnfx-move');
114
- jElement.attr('data-pwnfx-move-done', identifier);
115
- jElement.removeAttr('data-pwnfx-move');
116
-
117
- var targetSelector = '[data-pwnfx-move-target="' + identifier + '"]';
118
- var jTarget = $(targetSelector).first();
119
- jElement.detach();
120
- jTarget.append(jElement);
121
- };
122
-
123
- /** Wires JS to an AJAX show/hide trigger using data-pwnfx-reveal. */
124
- PwnFx.wireReveal = function (element) {
125
- var jElement = $(element);
126
- var identifier = jElement.attr('data-pwnfx-reveal');
127
- jElement.attr('data-pwnfx-reveal-done', identifier);
128
- jElement.removeAttr('data-pwnfx-reveal');
129
-
130
- var trigger = jElement.attr('data-pwnfx-reveal-trigger') || 'click';
131
- var showOnCheck = true;
132
- if (trigger == 'uncheck') {
133
- trigger = 'check';
134
- showOnCheck = false;
135
- } else if (trigger == 'click-hide') {
136
- trigger = 'click';
137
- showOnCheck = false;
138
- }
139
- var targetSelector = '[data-pwnfx-reveal-target="' + identifier + '"]';
140
-
141
- var onChangeFn = function () {
142
- var checked = (trigger == 'click') || jElement.is(':checked');
143
- var willShow = (checked == showOnCheck);
144
- if (willShow) {
145
- $(targetSelector).removeClass('hidden');
146
- } else {
147
- $(targetSelector).addClass('hidden');
148
- }
149
- };
150
-
151
- if (trigger == 'click') {
152
- jElement.bind('click', onChangeFn);
153
- } else if (trigger = 'check') {
154
- jElement.bind('change', onChangeFn);
155
- onChangeFn();
156
- }
157
- };
158
-
159
- // Wire JS to elements when the document is loaded.
160
- $(PwnFx.wireAll);