upjs-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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