sublime_video_layout 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +21 -0
- data/Rakefile +29 -0
- data/app/assets/fonts/SublimeIcons.eot +0 -0
- data/app/assets/fonts/SublimeIcons.svg +34 -0
- data/app/assets/fonts/SublimeIcons.ttf +0 -0
- data/app/assets/fonts/SublimeIcons.woff +0 -0
- data/app/assets/images/back_texture_my.png +0 -0
- data/app/assets/images/close_popup.png +0 -0
- data/app/assets/images/custom_checkbox.png +0 -0
- data/app/assets/images/custom_radio.png +0 -0
- data/app/assets/images/custom_select.png +0 -0
- data/app/assets/images/dm_banner.png +0 -0
- data/app/assets/images/dm_banner_bg.png +0 -0
- data/app/assets/images/fields/card_icon.png +0 -0
- data/app/assets/images/fields/domain_icon.png +0 -0
- data/app/assets/images/fields/email_icon.png +0 -0
- data/app/assets/images/fields/password_icon.png +0 -0
- data/app/assets/images/fields/path_icon.png +0 -0
- data/app/assets/images/fields/ticket_icon.png +0 -0
- data/app/assets/images/fields/user_icon.png +0 -0
- data/app/assets/images/fields/valid_icon.png +0 -0
- data/app/assets/images/footer_break.png +0 -0
- data/app/assets/images/footer_texture.png +0 -0
- data/app/assets/images/header_back_light.png +0 -0
- data/app/assets/images/header_inner_shadow.png +0 -0
- data/app/assets/images/header_repeat.jpg +0 -0
- data/app/assets/images/header_repeat.png +0 -0
- data/app/assets/images/header_repeat_max.jpg +0 -0
- data/app/assets/images/header_repeat_old.png +0 -0
- data/app/assets/images/header_signup_btn.png +0 -0
- data/app/assets/images/header_stars.png +0 -0
- data/app/assets/images/info_icon.png +0 -0
- data/app/assets/images/jilion.png +0 -0
- data/app/assets/images/jobs_highlight_note.png +0 -0
- data/app/assets/images/logout.png +0 -0
- data/app/assets/images/menu_bullet.png +0 -0
- data/app/assets/images/menu_bullet_active.png +0 -0
- data/app/assets/images/newsletter_btn_arrow.png +0 -0
- data/app/assets/images/plans/plays_icon.png +0 -0
- data/app/assets/images/plans/ssl_icon.png +0 -0
- data/app/assets/images/plans/stats_icon.png +0 -0
- data/app/assets/images/plans/support_icon.png +0 -0
- data/app/assets/images/popup_break.png +0 -0
- data/app/assets/images/popup_sign_up_btn.png +0 -0
- data/app/assets/images/sublimevideo_logo.png +0 -0
- data/app/assets/images/sublimevideo_logo@2x.png +0 -0
- data/app/assets/images/sublimevideo_maintenance.png +0 -0
- data/app/assets/images/twitter.png +0 -0
- data/app/assets/images/user_header_icon.png +0 -0
- data/app/assets/images/user_header_icon_active.png +0 -0
- data/app/assets/javascripts/form/password_checker.js.coffee +18 -0
- data/app/assets/javascripts/form/pseudo_placeholder.js.coffee +91 -0
- data/app/assets/javascripts/form/show_password.js.coffee +91 -0
- data/app/assets/javascripts/form/submit_manager.js.coffee +53 -0
- data/app/assets/javascripts/media/preloader.js.coffee +30 -0
- data/app/assets/javascripts/misc/browser_bugs_fixer.js.coffee +12 -0
- data/app/assets/javascripts/misc/cookie.js.coffee +42 -0
- data/app/assets/javascripts/misc/utils.js.coffee +17 -0
- data/app/assets/javascripts/sublimevideo.js.coffee +66 -0
- data/app/assets/javascripts/ui/link.js.coffee +24 -0
- data/app/assets/javascripts/ui/menu.js.coffee +36 -0
- data/app/assets/javascripts/ui/popup.js.coffee +121 -0
- data/app/assets/javascripts/ui/table.js.coffee +8 -0
- data/app/assets/javascripts/ui/utils.js.coffee +41 -0
- data/app/assets/stylesheets/_css3.scss +41 -0
- data/app/assets/stylesheets/ie.css.scss +2 -0
- data/app/assets/stylesheets/sublime_icons.css.scss.erb +46 -0
- data/app/assets/stylesheets/sublimevideo.css.scss.erb +947 -0
- data/app/controllers/maintenance_controller.rb +12 -0
- data/app/helpers/sublime_video_layout/engine_helper.rb +111 -0
- data/app/views/layouts/_facebook.html.haml +1 -0
- data/app/views/layouts/_footer.html.haml +54 -0
- data/app/views/layouts/_googleplus.html.haml +7 -0
- data/app/views/layouts/_gosquared.html.haml +11 -0
- data/app/views/layouts/_header_menu.html.haml +44 -0
- data/app/views/layouts/_ie.html.haml +14 -0
- data/app/views/layouts/_twitter.html.haml +2 -0
- data/app/views/layouts/maintenance.html.erb +79 -0
- data/app/views/layouts/sublimevideo.html.haml +61 -0
- data/app/views/users/new.html.haml +24 -0
- data/app/views/users/sessions/new.html.haml +25 -0
- data/config/locales/en.yml +14 -0
- data/config/routes.rb +5 -0
- data/lib/heroku-pages/error.html +82 -0
- data/lib/heroku-pages/maintenance.html +77 -0
- data/lib/heroku-pages/sublimevideo_maintenance.png +0 -0
- data/lib/rack/maintenance.rb +32 -0
- data/lib/site_token.rb +22 -0
- data/lib/sublime_video_layout.rb +18 -0
- data/lib/sublime_video_layout/version.rb +3 -0
- data/lib/tasks/sublime_video_layout_tasks.rake +4 -0
- data/public/404.html +28 -0
- data/public/404.png +0 -0
- data/public/422.html +29 -0
- data/public/500.html +28 -0
- data/public/500.png +0 -0
- data/public/apple-touch-icon-precomposed.png +0 -0
- data/public/error.png +0 -0
- data/public/errors.css +60 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +5 -0
- data/public/sublimevideo.png +0 -0
- data/vendor/assets/javascripts/modernizr.js +1265 -0
- metadata +203 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: ac83f35320ad7b0b33475563e8c1961661c2d223
|
|
4
|
+
data.tar.gz: d7913d23129423bee488bb271b50f239a347f7e7
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 025dbd6766741d5a9b8ca495d2c23993526fa857b0fa12582d82bcb5f5e1407e3e71a90fca9fb9bcb1f6844562a26270832001db1d6c651b00dfdcee6ec3025b
|
|
7
|
+
data.tar.gz: d2503ed03bc1758ad2b9ed013c96635732f2133909fa7d62a4f0de4262710a963ffba8d97b4f59c400510d476537b5c57315758775dbf8b92006471bed4393e6
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2012 YOURNAME
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SublimeVideoLayout
|
|
2
|
+
|
|
3
|
+
This engine provides a common layout (HTML, CSS) and utility JavaScript classes for all SublimeVideo apps.
|
|
4
|
+
|
|
5
|
+
### Deployement to http://gemfury.com/
|
|
6
|
+
|
|
7
|
+
Update `VERSION` in `lib/sublime_video_layout/version.rb` to `X.Y.Z` and then run the following commands:
|
|
8
|
+
|
|
9
|
+
``` bash
|
|
10
|
+
> bundle install
|
|
11
|
+
> rake build
|
|
12
|
+
sublime_video_layout X.Y.Z built to pkg/sublime_video_layout-X.Y.Z.gem
|
|
13
|
+
> bundle exec fury push pkg/sublime_video_layout-X.Y.Z.gem
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### JS documentation
|
|
17
|
+
|
|
18
|
+
To generate the JS docs, run `gem install codo && codo ./app/assets/javascripts`
|
|
19
|
+
|
|
20
|
+
------------
|
|
21
|
+
Copyright (c) 2010 - 2012 Jilion(r) - SublimeVideo and Jilion are registered trademarks
|
data/Rakefile
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
begin
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
rescue LoadError
|
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
|
+
end
|
|
7
|
+
begin
|
|
8
|
+
require 'rdoc/task'
|
|
9
|
+
rescue LoadError
|
|
10
|
+
require 'rdoc/rdoc'
|
|
11
|
+
require 'rake/rdoctask'
|
|
12
|
+
RDoc::Task = Rake::RDocTask
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
17
|
+
rdoc.title = 'SublimeVideoLayout'
|
|
18
|
+
rdoc.options << '--line-numbers'
|
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Bundler::GemHelper.install_tasks
|
|
24
|
+
|
|
25
|
+
require 'rspec/core/rake_task'
|
|
26
|
+
|
|
27
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
28
|
+
|
|
29
|
+
task :default => :spec
|
|
Binary file
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
4
|
+
<metadata>
|
|
5
|
+
This is a custom SVG font generated by IcoMoon.
|
|
6
|
+
<iconset grid="16"></iconset>
|
|
7
|
+
</metadata>
|
|
8
|
+
<defs>
|
|
9
|
+
<font id="SublimeIcons" horiz-adv-x="512" >
|
|
10
|
+
<font-face units-per-em="512" ascent="480" descent="-32" />
|
|
11
|
+
<missing-glyph horiz-adv-x="512" />
|
|
12
|
+
<glyph unicode="[" d="M 260.352-40.667C 116.59-40.667,0.00,75.886,0.00,219.648C0.00,363.447, 116.59,480.00, 260.352,480.00
|
|
13
|
+
s 260.352-116.553, 260.352-260.352C 520.704,75.886, 404.151-40.667, 260.352-40.667z M 185.088,326.51l0.00-219.758 L 364.251,216.649L 185.088,326.51z" />
|
|
14
|
+
<glyph unicode="!" d="M 384.00-32.00 L 0.00,480.00 L 768.00,480.00 L 384.00-32.00 Z" horiz-adv-x="768" />
|
|
15
|
+
<glyph unicode=""" d="M 256.00,480.00C 114.618,480.00,0.00,365.382,0.00,224.00s 114.618-256.00, 256.00-256.00s 256.00,114.618, 256.00,256.00S 397.382,480.00, 256.00,480.00z
|
|
16
|
+
M 114.292,332.451L 397.731,332.451 c 1.885,0.00, 3.677-0.349, 5.399-0.861l-105.449-90.275l-14.033-11.404L 256.00,207.407l-27.601,22.458l-14.01,11.38L 108.87,331.59
|
|
17
|
+
C 110.615,332.125, 112.407,332.451, 114.292,332.451z M 95.023,134.40L 95.023,313.181 c0.00,2.048, 0.419,4.003, 1.001,5.841l 105.10-89.949L 96.116,128.256
|
|
18
|
+
C 95.465,130.211, 95.023,132.259, 95.023,134.40z M 397.731,115.13L 114.292,115.13 c-1.792,0.00-3.514,0.326-5.19,0.791l 106.007,101.725L 256.00,184.39l 40.96,33.327
|
|
19
|
+
l 105.984-101.772C 401.245,115.456, 399.546,115.13, 397.731,115.13z M 417.001,134.40c0.00-2.164-0.442-4.212-1.094-6.167l-104.96,100.864l 105.053,89.903
|
|
20
|
+
c 0.582-1.839, 1.001-3.793, 1.001-5.841L 417.001,134.40 z" />
|
|
21
|
+
<glyph unicode="#" d="M 432.00,432.00L 192.00,192.00L 80.00,304.00L0.00,224.00L 192.00,32.00L 512.00,352.00 z" />
|
|
22
|
+
<glyph unicode="$" d="M 507.331,68.67c-0.002,0.002-0.004,0.004-0.006,0.005L 352.003,224.00l 155.322,155.325c 0.002,0.002, 0.004,0.003, 0.006,0.005
|
|
23
|
+
c 1.672,1.673, 2.881,3.627, 3.656,5.708c 2.123,5.688, 0.912,12.341-3.662,16.915L 433.952,475.326c-4.574,4.573-11.225,5.783-16.914,3.66
|
|
24
|
+
c-2.08-0.775-4.035-1.984-5.709-3.655c0.00-0.002-0.002-0.003-0.004-0.005L 256.001,320.00L 100.677,475.325
|
|
25
|
+
c-0.002,0.002-0.003,0.003-0.005,0.005c-1.673,1.671-3.627,2.88-5.707,3.655c-5.69,2.124-12.341,0.913-16.915-3.66L 4.676,401.951
|
|
26
|
+
c-4.574-4.574-5.784-11.226-3.661-16.914c 0.776-2.08, 1.985-4.036, 3.656-5.708c 0.002-0.001, 0.003-0.003, 0.005-0.005L 160.001,224.00
|
|
27
|
+
L 4.676,68.674c-0.001-0.002-0.003-0.003-0.004-0.005c-1.671-1.673-2.88-3.627-3.657-5.707c-2.124-5.688-0.913-12.341, 3.661-16.915
|
|
28
|
+
l 73.374-73.373c 4.575-4.574, 11.226-5.784, 16.915-3.661c 2.08,0.776, 4.035,1.985, 5.708,3.656c 0.001,0.002, 0.003,0.003, 0.005,0.005
|
|
29
|
+
l 155.324,155.325l 155.324-155.325c 0.002-0.001, 0.004-0.003, 0.006-0.004c 1.674-1.672, 3.627-2.881, 5.707-3.657
|
|
30
|
+
c 5.689-2.123, 12.342-0.913, 16.914,3.661l 73.373,73.374c 4.574,4.574, 5.785,11.227, 3.662,16.915
|
|
31
|
+
C 510.212,65.043, 509.003,66.997, 507.331,68.67z" />
|
|
32
|
+
<glyph unicode=" " horiz-adv-x="256" />
|
|
33
|
+
<glyph class="hidden" unicode="" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
|
|
34
|
+
</font></defs></svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# This class provides a "current password checker" popup.
|
|
2
|
+
#
|
|
3
|
+
class SublimeVideo.Form.PasswordChecker
|
|
4
|
+
# Creates a new "current password checker" popup using {SublimeVideo.UI.Utils.openPopup}.
|
|
5
|
+
#
|
|
6
|
+
constructor: (@originForm) ->
|
|
7
|
+
passwordState = if @originForm.data('password-state') then " #{@originForm.data('password-state')}" else ''
|
|
8
|
+
passwordCheckerForm = $('<form>', id: 'password_checker_form', action: '/password/validate', method: 'post', 'data-remote': 'true')
|
|
9
|
+
passwordCheckerForm.html("<p class='desc'>Your#{passwordState} password is needed to perform this action:</p>" +
|
|
10
|
+
"<div class='entry password'>" +
|
|
11
|
+
"<label for='password_check' class='icon'>#{passwordState} Password</label>" +
|
|
12
|
+
"<input type='password' id='password_check' name='password' placeholder='Your#{passwordState} password' class='text' />" +
|
|
13
|
+
"<div class='actions'><input type='submit' class='blue_button' value='Done' /></div>" +
|
|
14
|
+
"<div class='spacer'></div>" +
|
|
15
|
+
"</div>")
|
|
16
|
+
|
|
17
|
+
SublimeVideo.UI.Utils.openPopup(id: 'password_checker', class: 'popup', form: @originForm, content: passwordCheckerForm)
|
|
18
|
+
$('#password_check').focus()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Manages pseudo-placeholders essentially for:
|
|
2
|
+
#
|
|
3
|
+
# - IE < 10
|
|
4
|
+
# - Firefox < 4
|
|
5
|
+
# - Safari < 4
|
|
6
|
+
# - iOS/Safari < 4
|
|
7
|
+
# - Opera Mini
|
|
8
|
+
# - Android
|
|
9
|
+
#
|
|
10
|
+
# More info on compatibility here: http://caniuse.com/#search=placeholder
|
|
11
|
+
#
|
|
12
|
+
# What it does is setting the value of the field from its placeholder attribute
|
|
13
|
+
# and adding a class to reproduce the placeholder style.
|
|
14
|
+
#
|
|
15
|
+
class SublimeVideo.Form.PseudoPlaceholder
|
|
16
|
+
|
|
17
|
+
# Construct a pseudo placeholder.
|
|
18
|
+
#
|
|
19
|
+
# @todo Clarify how this shit works
|
|
20
|
+
# @param [jQuery Element] field an input or a textarea DOM element
|
|
21
|
+
#
|
|
22
|
+
constructor: (@field) ->
|
|
23
|
+
this.fieldDidChange(@field)
|
|
24
|
+
|
|
25
|
+
# This is a public API method that updates `@field`, resets its value if needed
|
|
26
|
+
# before setuping the pseudo placeholder.
|
|
27
|
+
#
|
|
28
|
+
# @param [jQuery Element] field the new input field to which is applied the pseudo placeholder
|
|
29
|
+
#
|
|
30
|
+
fieldDidChange: (field) ->
|
|
31
|
+
@field = field
|
|
32
|
+
# Firefox set the value with the placeholder when reloading the page, so clear this shit!
|
|
33
|
+
if @field.val() is @field.attr('placeholder')
|
|
34
|
+
@field.val('')
|
|
35
|
+
this.setupPseudoPlaceholder()
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# @private
|
|
39
|
+
#
|
|
40
|
+
# @param [String] value the new value for the 'value' attribute
|
|
41
|
+
#
|
|
42
|
+
setValueAndToggleClass: (value) ->
|
|
43
|
+
@field.val(value)
|
|
44
|
+
if value is ''
|
|
45
|
+
@field.removeClass('placeholder')
|
|
46
|
+
else
|
|
47
|
+
@field.addClass('placeholder')
|
|
48
|
+
|
|
49
|
+
# Copy 'placeholder' attribute to 'value' attribute if it's empty.
|
|
50
|
+
#
|
|
51
|
+
# @note If it's a password field this will also take care to initially
|
|
52
|
+
# replace it with a regular text field (until it receives focus).
|
|
53
|
+
#
|
|
54
|
+
# @private
|
|
55
|
+
#
|
|
56
|
+
setupPseudoPlaceholder: =>
|
|
57
|
+
this.storeSelfReferenceAndObservers()
|
|
58
|
+
|
|
59
|
+
if @field.val() is ''
|
|
60
|
+
if @field.data('showPasswordObject') and @field.attr('type') is 'password'
|
|
61
|
+
@field.data('showPasswordObject').toggleField(type: 'text')
|
|
62
|
+
else
|
|
63
|
+
this.setValueAndToggleClass(@field.attr('placeholder'))
|
|
64
|
+
|
|
65
|
+
# This stores a reference to this object into `@field` and register observers on focus & blur.
|
|
66
|
+
#
|
|
67
|
+
# @private
|
|
68
|
+
#
|
|
69
|
+
storeSelfReferenceAndObservers: ->
|
|
70
|
+
@field.data('pseudoPlaceholderObject', this)
|
|
71
|
+
@field.on('focus', this.clearPseudoPlaceholder)
|
|
72
|
+
@field.on('blur', this.setupPseudoPlaceholder)
|
|
73
|
+
|
|
74
|
+
# This method clear the value and class of the field if its value is equal to the placeholder.
|
|
75
|
+
#
|
|
76
|
+
# @note It automatically replaces the field with a password field if needed.
|
|
77
|
+
#
|
|
78
|
+
# @private
|
|
79
|
+
#
|
|
80
|
+
clearPseudoPlaceholder: =>
|
|
81
|
+
if @field.val() is @field.attr('placeholder')
|
|
82
|
+
this.setValueAndToggleClass('')
|
|
83
|
+
|
|
84
|
+
if @field.data('showPasswordObject')
|
|
85
|
+
showPasswordObject = @field.data('showPasswordObject')
|
|
86
|
+
@field.removeData() # ensure the #fieldDidChange callback won't be called
|
|
87
|
+
@field = showPasswordObject.toggleField()
|
|
88
|
+
this.storeSelfReferenceAndObservers() # since we have a new field
|
|
89
|
+
|
|
90
|
+
# refocus (the newly create field)
|
|
91
|
+
setTimeout((=> @field.focus()), 0) # msie hack
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Manages the showing/hiding in clear text of the entered password
|
|
2
|
+
#
|
|
3
|
+
class SublimeVideo.Form.ShowPassword
|
|
4
|
+
constructor: (@field, @index) ->
|
|
5
|
+
@showPasswordCheckbox = $('<input />', type: 'checkbox', id: "show_password_#{@index}")
|
|
6
|
+
|
|
7
|
+
this.storeThisInData()
|
|
8
|
+
this.insertShowPasswordCheckbox()
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# @private
|
|
12
|
+
#
|
|
13
|
+
storeThisInData: ->
|
|
14
|
+
@field.data('showPasswordObject', this) # so that the placeholderManager can eventually pick this up
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# @private
|
|
18
|
+
#
|
|
19
|
+
insertShowPasswordCheckbox: ->
|
|
20
|
+
showPasswordWrap = $('<div>', class: 'checkbox_wrap')
|
|
21
|
+
showPasswordLabel = $('<label />', for: "show_password_#{@index}").text('Show password')
|
|
22
|
+
showPasswordWrap.append(@showPasswordCheckbox).append(showPasswordLabel)
|
|
23
|
+
|
|
24
|
+
this.injectShowPasswordCheckboxInDom(showPasswordWrap)
|
|
25
|
+
this.attachEventHandlerToCheckbox()
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# @private
|
|
29
|
+
#
|
|
30
|
+
attachEventHandlerToCheckbox: ->
|
|
31
|
+
@showPasswordCheckbox.on('click', this.togglePasswordVisibility)
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# @private
|
|
35
|
+
#
|
|
36
|
+
injectShowPasswordCheckboxInDom: (showPasswordWrap) ->
|
|
37
|
+
errorMessage = @field.parent('form').find('.inline_errors').first()
|
|
38
|
+
if errorMessage.length
|
|
39
|
+
errorMessage.after(showPasswordWrap)
|
|
40
|
+
else
|
|
41
|
+
@field.after(showPasswordWrap)
|
|
42
|
+
@showPasswordCheckbox.checked = false # Firefox reload ;-)
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# @private
|
|
46
|
+
#
|
|
47
|
+
showPassword: ->
|
|
48
|
+
@showPasswordCheckbox and @showPasswordCheckbox.prop('checked')
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# @private
|
|
52
|
+
#
|
|
53
|
+
togglePasswordVisibility: (event) =>
|
|
54
|
+
this.toggleField()
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# @private
|
|
58
|
+
#
|
|
59
|
+
# @param [Object] options allow customizing the generated field
|
|
60
|
+
# @option options [Boolean] type force the type of the generated field
|
|
61
|
+
#
|
|
62
|
+
toggleField: (options = {}) ->
|
|
63
|
+
fieldType = if options['type']?
|
|
64
|
+
options['type']
|
|
65
|
+
else if this.showPassword() then 'text' else 'password'
|
|
66
|
+
|
|
67
|
+
# We can't simply modify the type attribute of the field (from 'password' to 'text'), because IE doesn't support this
|
|
68
|
+
# cf: http://www.alistapart.com/articles/the-problem-with-passwords
|
|
69
|
+
newField = $('<input />',
|
|
70
|
+
id: @field.attr 'id'
|
|
71
|
+
name: @field.attr 'name'
|
|
72
|
+
value: @field.val()
|
|
73
|
+
size: @field.size()
|
|
74
|
+
placeholder: @field.attr 'placeholder'
|
|
75
|
+
required: @field.attr 'required'
|
|
76
|
+
class: @field.attr 'class'
|
|
77
|
+
type: fieldType)
|
|
78
|
+
|
|
79
|
+
if @field.data 'pseudoPlaceholderObject'
|
|
80
|
+
pseudoPlaceholderObject = @field.data('pseudoPlaceholderObject')
|
|
81
|
+
|
|
82
|
+
@field.removeData() # Removes eventual observers and storage keys
|
|
83
|
+
@field.replaceWith newField
|
|
84
|
+
@field = newField
|
|
85
|
+
this.storeThisInData() # store this in the new field
|
|
86
|
+
pseudoPlaceholderObject.fieldDidChange(newField) if pseudoPlaceholderObject
|
|
87
|
+
|
|
88
|
+
if @field.attr('id') is 'user_password' and $('current_password_wrap').exists()
|
|
89
|
+
SublimeVideo.currentPasswordHandler.setupField(@field)
|
|
90
|
+
|
|
91
|
+
@field
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# SubmitManager manages several automation on form submit:
|
|
2
|
+
#
|
|
3
|
+
# - disabling of submit button
|
|
4
|
+
# - asking for current password
|
|
5
|
+
# - cleaning of pseudo-placeholders
|
|
6
|
+
# - cleaning HTML5 errors that are not present anymore but there still are errors (on other fields)
|
|
7
|
+
#
|
|
8
|
+
class SublimeVideo.Form.SubmitManager
|
|
9
|
+
constructor: (@form) ->
|
|
10
|
+
this.setupOnSubmitObservers()
|
|
11
|
+
this.setupOnClickObservers()
|
|
12
|
+
|
|
13
|
+
setupOnSubmitObservers: ->
|
|
14
|
+
submitEvent = if Modernizr.hasEvent('submit') then 'submit' else 'emulated:submit'
|
|
15
|
+
@form.on submitEvent, (event) =>
|
|
16
|
+
if @form.data('remote') is 'true' or @form.hasClass('disableable')
|
|
17
|
+
this.disableSubmitButton()
|
|
18
|
+
this.resetPseudoPlaceholders()
|
|
19
|
+
|
|
20
|
+
if @form.data('password-protected') is 'true'
|
|
21
|
+
this.instanciatePasswordChecker(event)
|
|
22
|
+
|
|
23
|
+
setupOnClickObservers: ->
|
|
24
|
+
@form.find('input[type=submit]').each (index, input) =>
|
|
25
|
+
# when HTML5 form validation doesn't pass, the submit event is not fired
|
|
26
|
+
$(input).on 'click', (event) =>
|
|
27
|
+
@form.find('input,textarea').each (index, input) ->
|
|
28
|
+
$input = $(input)
|
|
29
|
+
if $input[0].validity
|
|
30
|
+
if $input[0].validity.valid
|
|
31
|
+
$input.removeClass('errors')
|
|
32
|
+
$input.siblings('.inline_errors').remove()
|
|
33
|
+
else
|
|
34
|
+
event.preventDefault()
|
|
35
|
+
$input.addClass('errors')
|
|
36
|
+
|
|
37
|
+
# Disable submit button for ajax forms to prevent double submissions (quickly click muliple times the form submit button)
|
|
38
|
+
#
|
|
39
|
+
# (PAY ATTENTION: this considers that the ajax call will re-render the entire form hence re-enabling the submit button.
|
|
40
|
+
# If we'll have some ajax forms that won't reload themselves, the code below must be updated)
|
|
41
|
+
disableSubmitButton: ->
|
|
42
|
+
@form.find('input[type=submit], button[type=submit]').each ->
|
|
43
|
+
$(this).prop('disabled', true)
|
|
44
|
+
|
|
45
|
+
instanciatePasswordChecker: (event) ->
|
|
46
|
+
event.preventDefault()
|
|
47
|
+
SublimeVideo.Form.passwordChecker = new SublimeVideo.Form.PasswordChecker $(event.target)
|
|
48
|
+
|
|
49
|
+
# Reset pseudo-placeholders values (for browsers who don't support HTML5 placeholders)
|
|
50
|
+
#
|
|
51
|
+
resetPseudoPlaceholders: ->
|
|
52
|
+
@form.find('input.placeholder').each ->
|
|
53
|
+
$(this).val('')
|