upjs-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.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.ruby-version +2 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +47 -0
  6. data/Rakefile +1 -0
  7. data/bin/doc-server +3 -0
  8. data/bin/install-ydoc +4 -0
  9. data/design/animation-ghosting.txt +72 -0
  10. data/design/design.txt +34 -0
  11. data/design/draft.html.erb +48 -0
  12. data/design/draft.rb +9 -0
  13. data/lib/assets/javascripts/up/browser.js.coffee +20 -0
  14. data/lib/assets/javascripts/up/bus.js.coffee +54 -0
  15. data/lib/assets/javascripts/up/flow.js.coffee +160 -0
  16. data/lib/assets/javascripts/up/form.js.coffee +162 -0
  17. data/lib/assets/javascripts/up/history.js.coffee +33 -0
  18. data/lib/assets/javascripts/up/index.js +13 -0
  19. data/lib/assets/javascripts/up/link.js.coffee +95 -0
  20. data/lib/assets/javascripts/up/magic.js.coffee +79 -0
  21. data/lib/assets/javascripts/up/modal.js.coffee +51 -0
  22. data/lib/assets/javascripts/up/module.js.coffee +4 -0
  23. data/lib/assets/javascripts/up/motion.js.coffee +276 -0
  24. data/lib/assets/javascripts/up/navigation.js.coffee +63 -0
  25. data/lib/assets/javascripts/up/popup.js.coffee +143 -0
  26. data/lib/assets/javascripts/up/util.js.coffee +287 -0
  27. data/lib/assets/stylesheets/up/follow.css.sass +2 -0
  28. data/lib/assets/stylesheets/up/index.css +3 -0
  29. data/lib/assets/stylesheets/up/modal.css.sass +54 -0
  30. data/lib/assets/stylesheets/up/popup.css.sass +9 -0
  31. data/lib/upjs/rails/engine.rb +6 -0
  32. data/lib/upjs/rails/redirection.rb +26 -0
  33. data/lib/upjs/rails/request.rb +13 -0
  34. data/lib/upjs/rails/version.rb +5 -0
  35. data/lib/upjs-rails.rb +7 -0
  36. data/spec_app/.firefox-version +1 -0
  37. data/spec_app/.gitignore +17 -0
  38. data/spec_app/Gemfile +24 -0
  39. data/spec_app/Gemfile.lock +239 -0
  40. data/spec_app/README.rdoc +28 -0
  41. data/spec_app/Rakefile +6 -0
  42. data/spec_app/app/assets/images/.keep +0 -0
  43. data/spec_app/app/assets/javascripts/application.js +16 -0
  44. data/spec_app/app/assets/stylesheets/application.css +15 -0
  45. data/spec_app/app/assets/stylesheets/blocks/card.css.sass +11 -0
  46. data/spec_app/app/assets/stylesheets/blocks/controls.css.sass +7 -0
  47. data/spec_app/app/assets/stylesheets/blocks/field_with_errors.css.sass +5 -0
  48. data/spec_app/app/assets/stylesheets/blocks/menu.css.sass +13 -0
  49. data/spec_app/app/assets/stylesheets/blocks/panel.css.sass +8 -0
  50. data/spec_app/app/controllers/application_controller.rb +14 -0
  51. data/spec_app/app/controllers/cards_controller.rb +51 -0
  52. data/spec_app/app/controllers/concerns/.keep +0 -0
  53. data/spec_app/app/controllers/pages_controller.rb +6 -0
  54. data/spec_app/app/helpers/application_helper.rb +2 -0
  55. data/spec_app/app/mailers/.keep +0 -0
  56. data/spec_app/app/models/card.rb +6 -0
  57. data/spec_app/app/models/concerns/.keep +0 -0
  58. data/spec_app/app/models/tests.rb +27 -0
  59. data/spec_app/app/views/cards/_side.html.haml +4 -0
  60. data/spec_app/app/views/cards/index.html.haml +10 -0
  61. data/spec_app/app/views/cards/new.html.haml +15 -0
  62. data/spec_app/app/views/cards/show.html.haml +11 -0
  63. data/spec_app/app/views/layouts/application.html.erb +12 -0
  64. data/spec_app/app/views/pages/home.html.haml +5 -0
  65. data/spec_app/bin/bundle +3 -0
  66. data/spec_app/bin/rails +8 -0
  67. data/spec_app/bin/rake +8 -0
  68. data/spec_app/bin/setup +29 -0
  69. data/spec_app/bin/spring +18 -0
  70. data/spec_app/config/application.rb +26 -0
  71. data/spec_app/config/boot.rb +3 -0
  72. data/spec_app/config/cucumber.yml +8 -0
  73. data/spec_app/config/database.yml +25 -0
  74. data/spec_app/config/environment.rb +5 -0
  75. data/spec_app/config/environments/development.rb +41 -0
  76. data/spec_app/config/environments/production.rb +79 -0
  77. data/spec_app/config/environments/test.rb +42 -0
  78. data/spec_app/config/initializers/assets.rb +11 -0
  79. data/spec_app/config/initializers/backtrace_silencers.rb +7 -0
  80. data/spec_app/config/initializers/cookies_serializer.rb +3 -0
  81. data/spec_app/config/initializers/filter_parameter_logging.rb +4 -0
  82. data/spec_app/config/initializers/inflections.rb +16 -0
  83. data/spec_app/config/initializers/mime_types.rb +4 -0
  84. data/spec_app/config/initializers/session_store.rb +3 -0
  85. data/spec_app/config/initializers/wrap_parameters.rb +14 -0
  86. data/spec_app/config/locales/en.yml +23 -0
  87. data/spec_app/config/routes.rb +6 -0
  88. data/spec_app/config/secrets.yml +22 -0
  89. data/spec_app/config.ru +4 -0
  90. data/spec_app/db/migrate/20141225125143_create_card.rb +9 -0
  91. data/spec_app/db/schema.rb +23 -0
  92. data/spec_app/db/seeds.rb +7 -0
  93. data/spec_app/features/history.feature +30 -0
  94. data/spec_app/features/navigation.feature +9 -0
  95. data/spec_app/features/step_definitions/factory_steps.rb +5 -0
  96. data/spec_app/features/step_definitions/navigation_steps.rb +29 -0
  97. data/spec_app/features/step_definitions/utility_steps.rb +15 -0
  98. data/spec_app/features/support/env.rb +73 -0
  99. data/spec_app/features/support/find_by_anything.rb +19 -0
  100. data/spec_app/features/support/paths.rb +51 -0
  101. data/spec_app/lib/assets/.keep +0 -0
  102. data/spec_app/lib/tasks/.keep +0 -0
  103. data/spec_app/lib/tasks/cucumber.rake +65 -0
  104. data/spec_app/log/.keep +0 -0
  105. data/spec_app/public/404.html +67 -0
  106. data/spec_app/public/422.html +67 -0
  107. data/spec_app/public/500.html +66 -0
  108. data/spec_app/public/favicon.ico +0 -0
  109. data/spec_app/public/robots.txt +5 -0
  110. data/spec_app/script/cucumber +10 -0
  111. data/spec_app/test/controllers/.keep +0 -0
  112. data/spec_app/test/fixtures/.keep +0 -0
  113. data/spec_app/test/helpers/.keep +0 -0
  114. data/spec_app/test/integration/.keep +0 -0
  115. data/spec_app/test/mailers/.keep +0 -0
  116. data/spec_app/test/models/.keep +0 -0
  117. data/spec_app/test/test_helper.rb +10 -0
  118. data/spec_app/vendor/assets/javascripts/.keep +0 -0
  119. data/spec_app/vendor/assets/stylesheets/.keep +0 -0
  120. data/upjs-rails.gemspec +24 -0
  121. metadata +207 -0
@@ -0,0 +1,143 @@
1
+ ###*
2
+ Pop-up overlays.
3
+
4
+ For modal dialogs see {{#crossLink "up.modal"}}{{/crossLink}}.
5
+
6
+ @class up.popup
7
+ ###
8
+ up.popup = (->
9
+
10
+ position = ($link, $popup, origin) ->
11
+ linkBox = up.util.measure($link, full: true)
12
+ css = switch origin
13
+ when "bottom-right"
14
+ right: linkBox.right
15
+ top: linkBox.top + linkBox.height
16
+ when "bottom-left"
17
+ left: linkBox.left
18
+ top: linkBox.bottom + linkBox.height
19
+ when "top-right"
20
+ right: linkBox.right
21
+ bottom: linkBox.top
22
+ when "top-left"
23
+ left: linkBox.left
24
+ bottom: linkBox.top
25
+ else
26
+ up.util.error("Unknown origin", origin)
27
+ # for key, value of css
28
+ # css[key] = Math.max(value, 0)
29
+ $popup.css(css)
30
+
31
+ createHiddenPopup = ($link, selector, sticky) ->
32
+ $popup = up.util.$createElementFromSelector('.up-popup')
33
+ $popup.attr('up-sticky', '') if sticky
34
+ $content = up.util.$createElementFromSelector(selector)
35
+ $content.appendTo($popup)
36
+ $popup.appendTo(document.body)
37
+ $popup.hide()
38
+ $popup
39
+
40
+ updated = ($link, $popup, origin, animation) ->
41
+ $popup.show()
42
+ position($link, $popup, origin)
43
+ up.animate($popup, animation)
44
+
45
+ ###*
46
+ Opens a popup overlay.
47
+
48
+ @method up.popup.open
49
+ @param {Element|jQuery|String} elementOrSelector
50
+ @param {String} [options.origin='bottom-right']
51
+ @param {String} [options.animation]
52
+ @param {Boolean} [options.sticky=false]
53
+ If set to `true`, the popup remains
54
+ open even if the page changes in the background.
55
+ @param {Object} [options.history=false]
56
+ @example
57
+ <a href="/decks" up-popup=".deck_list">Switch deck</a>
58
+ @example
59
+ <a href="/settings" up-popup=".options" up-popup-sticky>Settings</a>
60
+ ###
61
+ open = (linkOrSelector, options = {}) ->
62
+ $link = $(linkOrSelector)
63
+
64
+ url = up.util.presentAttr($link, 'href')
65
+ selector = options.target || $link.attr('up-popup') || 'body'
66
+ origin = options.origin || $link.attr('up-origin') || 'bottom-right'
67
+ animation = options.animation || $link.attr('up-animation') || 'roll-down'
68
+ sticky = options.sticky || $link.is('[up-sticky]')
69
+ history = options.history || false
70
+
71
+ close()
72
+ $popup = createHiddenPopup($link, selector, sticky)
73
+
74
+ # console.log("before replace", $link, $popup)
75
+
76
+ up.replace(selector, url,
77
+ history: history
78
+ source: true
79
+ insert: -> updated($link, $popup, origin, animation)
80
+ )
81
+
82
+ ###*
83
+ Returns the source URL for the fragment displayed
84
+ in the current popup overlay, or `undefined` if no
85
+ popup is open.
86
+
87
+ @method up.popup.source
88
+ @return {String}
89
+ the source URL
90
+ ###
91
+ source = ->
92
+ $popup = $('.up-popup')
93
+ unless $popup.is('.up-destroying')
94
+ $popup.find('[up-source]').attr('up-source')
95
+
96
+ ###*
97
+ Closes a currently opened popup overlay.
98
+ Does nothing if no popup is currently open.
99
+
100
+ @method up.popup.close
101
+ @param options.animation {String}
102
+ ###
103
+ close = (options) ->
104
+ options = up.util.options(options, animation: 'fade-out')
105
+ $popup = $('.up-popup')
106
+ if $popup.length
107
+ up.destroy($popup, animation: options.animation)
108
+
109
+ autoclose = ->
110
+ unless $('.up-popup').is('[up-sticky]')
111
+ close()
112
+
113
+
114
+ up.on('click', '[up-popup]', (event, $link) ->
115
+ event.preventDefault()
116
+ if $link.is('.up-current')
117
+ close()
118
+ else
119
+ open($link)
120
+ )
121
+
122
+ up.on('click', 'body', (event, $body) ->
123
+ $target = $(event.target)
124
+ unless $target.closest('.up-popup').length || $target.closest('[up-popup]').length
125
+ close()
126
+ )
127
+
128
+ up.bus.on('fragment:ready', ($fragment) ->
129
+ unless $fragment.closest('.up-popup').length
130
+ autoclose()
131
+ )
132
+
133
+ # Close the pop-up overlay when the user presses ESC.
134
+ $(document).on('keydown', (event) ->
135
+ if event.keyCode == 27
136
+ close()
137
+ )
138
+
139
+ open: open
140
+ close: close
141
+ source: source
142
+
143
+ )()
@@ -0,0 +1,287 @@
1
+ up.util = (->
2
+
3
+ get = (url, options) ->
4
+ options = options or {}
5
+ options.url = url
6
+ ajax options
7
+
8
+ ajax = (options) ->
9
+ if options.selector
10
+ options.headers = {
11
+ "X-Up-Selector": options.selector
12
+ }
13
+ $.ajax options
14
+
15
+ isStandardPort = (protocol, port) ->
16
+ (port == 80 && protocol == 'http') || (port == 443 && protocol == 'https')
17
+
18
+ normalizeUrl = (urlOrAnchor, options) ->
19
+ anchor = if isString(urlOrAnchor)
20
+ $('<a>').attr(href: urlOrAnchor).get(0)
21
+ else
22
+ unwrap(urlOrAnchor)
23
+ normalized = anchor.protocol + "//" + anchor.hostname
24
+ normalized += ":#{anchor.port}" unless isStandardPort(anchor.protocol, anchor.port)
25
+ normalized += anchor.pathname
26
+ normalized += anchor.search unless options?.search == false
27
+ normalized
28
+
29
+ $createElementFromSelector = (selector) ->
30
+ path = selector.split(/[ >]/)
31
+ $root = null
32
+ for depthSelector, iteration in path
33
+ conjunction = depthSelector.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g)
34
+ tag = "div"
35
+ classes = []
36
+ id = null
37
+ for expression in conjunction
38
+ switch expression[0]
39
+ when "."
40
+ classes.push expression.substr(1)
41
+ when "#"
42
+ id = expression.substr(1)
43
+ else
44
+ tag = expression
45
+ html = "<" + tag
46
+ html += " class=\"" + classes.join(" ") + "\"" if classes.length
47
+ html += " id=\"" + id + "\"" if id
48
+ html += ">"
49
+ $element = $(html)
50
+ $element.appendTo($parent) if $parent
51
+ $root = $element if iteration == 0
52
+ $parent = $element
53
+ $root
54
+
55
+ createElement = (tagName, html) ->
56
+ element = document.createElement(tagName)
57
+ element.innerHTML = html
58
+ element
59
+
60
+ error = (args...) ->
61
+ message = if args.length == 1 && up.util.isString(args[0]) then args[0] else JSON.stringify(args)
62
+ console.log("[UP] Error: #{message}", args...)
63
+ alert message
64
+ throw message
65
+
66
+ createSelectorFromElement = ($element) ->
67
+ console.log("Creating selector from element", $element)
68
+ classes = if classString = $element.attr("class") then classString.split(" ") else []
69
+ id = $element.attr("id")
70
+ selector = $element.prop("tagName").toLowerCase()
71
+ selector += "#" + id if id
72
+ for klass in classes
73
+ selector += "." + klass
74
+ selector
75
+
76
+ # jQuery's implementation of $(...) cannot create elements that have
77
+ # an <html> or <body> tag. So we're using native elements.
78
+ createElementFromHtml = (html) ->
79
+ htmlElementPattern = /<html>((?:.|\n)*)<\/html>/i
80
+ innerHtml = undefined
81
+ if match = html.match(htmlElementPattern)
82
+ innerHtml = match[1]
83
+ else
84
+ innerHtml = "<html><body>#{html}</body></html>"
85
+ createElement('html', innerHtml)
86
+
87
+ extend = $.extend
88
+
89
+ each = (collection, block) ->
90
+ block(item, index) for item, index in collection
91
+
92
+ isNull = (object) ->
93
+ object == null
94
+
95
+ isUndefined = (object) ->
96
+ object == `void(0)`
97
+
98
+ isDefined = (object) ->
99
+ !isUndefined(object)
100
+
101
+ isMissing = (object) ->
102
+ isUndefined(object) || isNull(object)
103
+
104
+ isGiven = (object) ->
105
+ !isMissing(object)
106
+
107
+ isBlank = (object) ->
108
+ isMissing(object) || # null or undefined
109
+ # (isString(object) && object == "") || # String
110
+ (object.length == 0) # String, Array, jQuery
111
+
112
+ presence = (object, checker = isPresent) ->
113
+ if checker(object) then object else null
114
+
115
+ isPresent = (object) ->
116
+ !isBlank(object)
117
+
118
+ isFunction = (object) ->
119
+ typeof(object) == 'function'
120
+
121
+ isString = (object) ->
122
+ typeof(object) == 'string'
123
+
124
+ isObject = (object) ->
125
+ type = typeof object
126
+ type == 'function' || (type == 'object' && !!object)
127
+
128
+ isJQuery = (object) ->
129
+ object instanceof jQuery
130
+
131
+ isPromise = (object) ->
132
+ isFunction(object.then)
133
+
134
+ ifGiven = (object) ->
135
+ object if isGiven(object)
136
+
137
+ copy = (object) ->
138
+ extend({}, object)
139
+
140
+ unwrap = (object) ->
141
+ if isJQuery(object)
142
+ object.get(0)
143
+ else
144
+ object
145
+
146
+ # Non-destructive extend
147
+ merge = (object, otherObject) ->
148
+ extend(copy(object), otherObject)
149
+
150
+ options = (object, defaults) ->
151
+ merged = if object then copy(object) else {}
152
+ if defaults
153
+ for key, defaultValue of defaults
154
+ value = merged[key]
155
+ if !isGiven(value)
156
+ merged[key] = defaultValue
157
+ else if isObject(defaultValue) && isObject(value)
158
+ merged[key] = options(value, defaultValue)
159
+ merged
160
+
161
+ detect = (array, tester) ->
162
+ match = null
163
+ array.every (element) ->
164
+ if tester(element)
165
+ match = element
166
+ false
167
+ else
168
+ true
169
+ match
170
+
171
+ select = (array, tester) ->
172
+ matches = []
173
+ each array, (element) ->
174
+ if tester(element)
175
+ matches.push(element)
176
+ matches
177
+
178
+ presentAttr = ($element, attrNames...) ->
179
+ values = ($element.attr(attrName) for attrName in attrNames)
180
+ detect(values, isPresent)
181
+
182
+ nextFrame = (block) ->
183
+ setTimeout(block, 0)
184
+
185
+ last = (array) ->
186
+ array[array.length - 1]
187
+
188
+ clientSize = ->
189
+ element = document.documentElement
190
+ width: element.clientWidth
191
+ height: element.clientHeight
192
+
193
+ temporaryCss = ($element, css, block) ->
194
+
195
+ oldCss = $element.css(Object.keys(css))
196
+ # oldCss = {}
197
+ # for property of css
198
+ # oldCss[property] = $element.css(property)
199
+ $element.css(css)
200
+ memo = -> $element.css(oldCss)
201
+ if block
202
+ block()
203
+ memo()
204
+ else
205
+ memo
206
+
207
+ cssAnimate = ($element, lastFrame, opts) ->
208
+ opts = options(opts, duration: 300, easing: 'ease')
209
+ deferred = $.Deferred()
210
+ # This should really be "one" instead of "on".
211
+ # We only want this event to be called once, then clean up after ourselves.
212
+ # $element.one(up.browser.transitionEndEvent(), -> deferred.resolve())
213
+ transition =
214
+ 'transition-property': Object.keys(lastFrame).join(', ')
215
+ 'transition-duration': "#{opts.duration}ms"
216
+ 'transition-timing-function': opts.easing
217
+ console.log("CSS transition with", transition)
218
+ withoutTransition = temporaryCss($element, transition)
219
+ $element.css(lastFrame)
220
+ deferred.then(withoutTransition)
221
+ setTimeout((-> deferred.resolve()), opts.duration)
222
+ deferred.promise()
223
+
224
+ measure = ($element, options) ->
225
+ offset = $element.offset()
226
+ box =
227
+ left: offset.left
228
+ top: offset.top
229
+ width: $element.outerWidth()
230
+ height: $element.outerHeight()
231
+ if options?.full
232
+ viewport = clientSize()
233
+ box.right = viewport.width - (box.left + box.width)
234
+ box.bottom = viewport.height - (box.top + box.height)
235
+ box
236
+
237
+ prependGhost = ($element) ->
238
+ dimensions = measure($element)
239
+ $ghost = $element.clone()
240
+ $ghost.css
241
+ right: ''
242
+ bottom: ''
243
+ margin: 0
244
+ position: 'fixed'
245
+ $ghost.css(dimensions)
246
+ $ghost.addClass('up-ghost')
247
+ $ghost.prependTo(document.body)
248
+
249
+ presentAttr: presentAttr
250
+ createElement: createElement
251
+ normalizeUrl: normalizeUrl
252
+ createElementFromHtml: createElementFromHtml
253
+ $createElementFromSelector: $createElementFromSelector
254
+ createSelectorFromElement: createSelectorFromElement
255
+ get: get
256
+ ajax: ajax
257
+ extend: extend
258
+ copy: copy
259
+ merge: merge
260
+ options: options
261
+ error: error
262
+ each: each
263
+ detect: detect
264
+ select: select
265
+ last: last
266
+ isNull: isNull
267
+ isDefined: isDefined
268
+ isUndefined: isUndefined
269
+ isGiven: isGiven
270
+ isMissing: isMissing
271
+ isPresent: isPresent
272
+ isBlank: isBlank
273
+ presence: presence
274
+ isObject: isObject
275
+ isFunction: isFunction
276
+ isString: isString
277
+ isJQuery: isJQuery
278
+ isPromise: isPromise
279
+ ifGiven: ifGiven
280
+ unwrap: unwrap
281
+ nextFrame: nextFrame
282
+ measure: measure
283
+ temporaryCss: temporaryCss
284
+ cssAnimate: cssAnimate
285
+ prependGhost: prependGhost
286
+
287
+ )()
@@ -0,0 +1,2 @@
1
+ [up-follow]
2
+ cursor: pointer
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require_tree .
3
+ */
@@ -0,0 +1,54 @@
1
+ $stratum: 10000
2
+ $width: 700px
3
+ $height: 450px
4
+
5
+ .up-modal-overlay
6
+ position: fixed
7
+ top: 0
8
+ left: 0
9
+ bottom: 0
10
+ right: 0
11
+ background-color: rgba(90, 90, 90, 0.7)
12
+ z-index: $stratum
13
+
14
+ .up-modal-dialog
15
+ position: fixed
16
+ z-index: $stratum + 1
17
+ margin: auto
18
+ top: 0
19
+ left: 0
20
+ bottom: 0
21
+ right: 0
22
+ width: $width
23
+ height: $height
24
+ max-width: 100%
25
+ max-height: 100%
26
+ background-color: #fff
27
+ box-shadow: 0 0 10px 5px #000
28
+
29
+ .up-modal-close
30
+ position: absolute
31
+ top: 20px
32
+ right: 20px
33
+ background-color: #666
34
+ color: #fff
35
+ font-weight: bold
36
+ text-transform: uppercase
37
+ padding: 5px 15px
38
+ z-index: $stratum + 2
39
+ cursor: pointer
40
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2)
41
+
42
+ .up-modal-close-label
43
+
44
+ .up-modal-close-key
45
+ margin-left: 3px
46
+ opacity: 0.5
47
+
48
+ .up-modal-content
49
+ overflow-x: hidden
50
+ overflow-y: auto
51
+ width: 100%
52
+ height: 100%
53
+ padding: 20px
54
+ box-sizing: border-box
@@ -0,0 +1,9 @@
1
+ $stratum: 10000
2
+
3
+ .up-popup
4
+ z-index: $stratum
5
+ position: fixed
6
+ background-color: #fff
7
+ padding: 15px
8
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.3)
9
+
@@ -0,0 +1,6 @@
1
+ module Upjs
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,26 @@
1
+ module Upjs
2
+ module Rails
3
+ module Redirection
4
+
5
+ def redirect_to(*args)
6
+ super
7
+ flash[:redirected_to] = self.location if request.up?
8
+ end
9
+
10
+ def self.included(base)
11
+ base.before_filter :extract_redirect_location
12
+ end
13
+
14
+ private
15
+
16
+ def extract_redirect_location
17
+ if location = flash[:redirected_to]
18
+ headers['X-Up-Previous-Redirect-Location'] = location
19
+ end
20
+ end
21
+
22
+ ActionController::Base.include(self)
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ module Upjs
2
+ module Rails
3
+ module Request
4
+
5
+ def up?
6
+ headers['X-Up-Selector'].present?
7
+ end
8
+
9
+ ActionDispatch::Request.include(self)
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module Upjs
2
+ module Rails
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
data/lib/upjs-rails.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "upjs/rails/version"
2
+ require "upjs/rails/engine"
3
+ require "upjs/rails/redirection"
4
+ require "upjs/rails/request"
5
+
6
+
7
+
@@ -0,0 +1 @@
1
+ 24.0
@@ -0,0 +1,17 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+ /db/*.sqlite3-journal
13
+
14
+ # Ignore all logfiles and tempfiles.
15
+ /log/*
16
+ !/log/.keep
17
+ /tmp
data/spec_app/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '4.2.0'
4
+ gem 'sqlite3'
5
+ gem 'sass-rails', '~> 5.0'
6
+ gem 'haml-rails'
7
+ gem 'uglifier', '>= 1.3.0'
8
+ gem 'coffee-rails', '~> 4.1.0'
9
+ gem 'therubyracer', platforms: :ruby
10
+ gem 'jquery-rails'
11
+ gem 'upjs-rails', path: '..'
12
+
13
+ group :development, :test do
14
+ gem 'byebug'
15
+ gem 'web-console', '~> 2.0'
16
+ end
17
+
18
+ group :test do
19
+ gem 'rspec-rails'
20
+ gem 'cucumber-rails', require: false
21
+ gem 'database_cleaner'
22
+ gem 'selenium-webdriver'
23
+ gem 'spreewald'
24
+ end