upjs-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-version +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +47 -0
- data/Rakefile +1 -0
- data/bin/doc-server +3 -0
- data/bin/install-ydoc +4 -0
- data/design/animation-ghosting.txt +72 -0
- data/design/design.txt +34 -0
- data/design/draft.html.erb +48 -0
- data/design/draft.rb +9 -0
- data/lib/assets/javascripts/up/browser.js.coffee +20 -0
- data/lib/assets/javascripts/up/bus.js.coffee +54 -0
- data/lib/assets/javascripts/up/flow.js.coffee +160 -0
- data/lib/assets/javascripts/up/form.js.coffee +162 -0
- data/lib/assets/javascripts/up/history.js.coffee +33 -0
- data/lib/assets/javascripts/up/index.js +13 -0
- data/lib/assets/javascripts/up/link.js.coffee +95 -0
- data/lib/assets/javascripts/up/magic.js.coffee +79 -0
- data/lib/assets/javascripts/up/modal.js.coffee +51 -0
- data/lib/assets/javascripts/up/module.js.coffee +4 -0
- data/lib/assets/javascripts/up/motion.js.coffee +276 -0
- data/lib/assets/javascripts/up/navigation.js.coffee +63 -0
- data/lib/assets/javascripts/up/popup.js.coffee +143 -0
- data/lib/assets/javascripts/up/util.js.coffee +287 -0
- data/lib/assets/stylesheets/up/follow.css.sass +2 -0
- data/lib/assets/stylesheets/up/index.css +3 -0
- data/lib/assets/stylesheets/up/modal.css.sass +54 -0
- data/lib/assets/stylesheets/up/popup.css.sass +9 -0
- data/lib/upjs/rails/engine.rb +6 -0
- data/lib/upjs/rails/redirection.rb +26 -0
- data/lib/upjs/rails/request.rb +13 -0
- data/lib/upjs/rails/version.rb +5 -0
- data/lib/upjs-rails.rb +7 -0
- data/spec_app/.firefox-version +1 -0
- data/spec_app/.gitignore +17 -0
- data/spec_app/Gemfile +24 -0
- data/spec_app/Gemfile.lock +239 -0
- data/spec_app/README.rdoc +28 -0
- data/spec_app/Rakefile +6 -0
- data/spec_app/app/assets/images/.keep +0 -0
- data/spec_app/app/assets/javascripts/application.js +16 -0
- data/spec_app/app/assets/stylesheets/application.css +15 -0
- data/spec_app/app/assets/stylesheets/blocks/card.css.sass +11 -0
- data/spec_app/app/assets/stylesheets/blocks/controls.css.sass +7 -0
- data/spec_app/app/assets/stylesheets/blocks/field_with_errors.css.sass +5 -0
- data/spec_app/app/assets/stylesheets/blocks/menu.css.sass +13 -0
- data/spec_app/app/assets/stylesheets/blocks/panel.css.sass +8 -0
- data/spec_app/app/controllers/application_controller.rb +14 -0
- data/spec_app/app/controllers/cards_controller.rb +51 -0
- data/spec_app/app/controllers/concerns/.keep +0 -0
- data/spec_app/app/controllers/pages_controller.rb +6 -0
- data/spec_app/app/helpers/application_helper.rb +2 -0
- data/spec_app/app/mailers/.keep +0 -0
- data/spec_app/app/models/card.rb +6 -0
- data/spec_app/app/models/concerns/.keep +0 -0
- data/spec_app/app/models/tests.rb +27 -0
- data/spec_app/app/views/cards/_side.html.haml +4 -0
- data/spec_app/app/views/cards/index.html.haml +10 -0
- data/spec_app/app/views/cards/new.html.haml +15 -0
- data/spec_app/app/views/cards/show.html.haml +11 -0
- data/spec_app/app/views/layouts/application.html.erb +12 -0
- data/spec_app/app/views/pages/home.html.haml +5 -0
- data/spec_app/bin/bundle +3 -0
- data/spec_app/bin/rails +8 -0
- data/spec_app/bin/rake +8 -0
- data/spec_app/bin/setup +29 -0
- data/spec_app/bin/spring +18 -0
- data/spec_app/config/application.rb +26 -0
- data/spec_app/config/boot.rb +3 -0
- data/spec_app/config/cucumber.yml +8 -0
- data/spec_app/config/database.yml +25 -0
- data/spec_app/config/environment.rb +5 -0
- data/spec_app/config/environments/development.rb +41 -0
- data/spec_app/config/environments/production.rb +79 -0
- data/spec_app/config/environments/test.rb +42 -0
- data/spec_app/config/initializers/assets.rb +11 -0
- data/spec_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec_app/config/initializers/cookies_serializer.rb +3 -0
- data/spec_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec_app/config/initializers/inflections.rb +16 -0
- data/spec_app/config/initializers/mime_types.rb +4 -0
- data/spec_app/config/initializers/session_store.rb +3 -0
- data/spec_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec_app/config/locales/en.yml +23 -0
- data/spec_app/config/routes.rb +6 -0
- data/spec_app/config/secrets.yml +22 -0
- data/spec_app/config.ru +4 -0
- data/spec_app/db/migrate/20141225125143_create_card.rb +9 -0
- data/spec_app/db/schema.rb +23 -0
- data/spec_app/db/seeds.rb +7 -0
- data/spec_app/features/history.feature +30 -0
- data/spec_app/features/navigation.feature +9 -0
- data/spec_app/features/step_definitions/factory_steps.rb +5 -0
- data/spec_app/features/step_definitions/navigation_steps.rb +29 -0
- data/spec_app/features/step_definitions/utility_steps.rb +15 -0
- data/spec_app/features/support/env.rb +73 -0
- data/spec_app/features/support/find_by_anything.rb +19 -0
- data/spec_app/features/support/paths.rb +51 -0
- data/spec_app/lib/assets/.keep +0 -0
- data/spec_app/lib/tasks/.keep +0 -0
- data/spec_app/lib/tasks/cucumber.rake +65 -0
- data/spec_app/log/.keep +0 -0
- data/spec_app/public/404.html +67 -0
- data/spec_app/public/422.html +67 -0
- data/spec_app/public/500.html +66 -0
- data/spec_app/public/favicon.ico +0 -0
- data/spec_app/public/robots.txt +5 -0
- data/spec_app/script/cucumber +10 -0
- data/spec_app/test/controllers/.keep +0 -0
- data/spec_app/test/fixtures/.keep +0 -0
- data/spec_app/test/helpers/.keep +0 -0
- data/spec_app/test/integration/.keep +0 -0
- data/spec_app/test/mailers/.keep +0 -0
- data/spec_app/test/models/.keep +0 -0
- data/spec_app/test/test_helper.rb +10 -0
- data/spec_app/vendor/assets/javascripts/.keep +0 -0
- data/spec_app/vendor/assets/stylesheets/.keep +0 -0
- data/upjs-rails.gemspec +24 -0
- 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,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,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
|
data/lib/upjs-rails.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
24.0
|
data/spec_app/.gitignore
ADDED
@@ -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
|