ios-checkboxes 0.1.0 → 0.1.2
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.
- data/.gitignore +12 -6
- data/Gemfile +21 -0
- data/HISTORY.md +10 -0
- data/README.md +136 -0
- data/Rakefile +36 -21
- data/build/.gitignore +2 -0
- data/build/build.sh +7 -0
- data/build/output/assets/ios-checkboxes/ios-checkboxes-5d38e09413b47993266b4343b181d2f9.css +1 -0
- data/build/output/assets/ios-checkboxes/ios-checkboxes-767fc292f6a04316d3a54b18f4637b57.js +1 -0
- data/{vendor/assets/images/ios-style-checkboxes/off.png → build/output/assets/ios-checkboxes/off-32586c60c5c48b7002326fdff55cd42e.png} +0 -0
- data/{vendor/assets/images/ios-style-checkboxes/on.png → build/output/assets/ios-checkboxes/on-c1710e0553b5cb2ba6b41a59ace60662.png} +0 -0
- data/{vendor/assets/images/ios-style-checkboxes/slider.png → build/output/assets/ios-checkboxes/slider-a8cd833485793750ee72350ac5adb4d4.png} +0 -0
- data/{vendor/assets/images/ios-style-checkboxes/slider_center.png → build/output/assets/ios-checkboxes/slider_center-137b6fa2802dc0a9be192b66c5a76815.png} +0 -0
- data/{vendor/assets/images/ios-style-checkboxes/slider_left.png → build/output/assets/ios-checkboxes/slider_left-e6930b387dd9c0a424e7c1aedd0b0aea.png} +0 -0
- data/{vendor/assets/images/ios-style-checkboxes/slider_right.png → build/output/assets/ios-checkboxes/slider_right-e8654b2a69377361211e57422446c703.png} +0 -0
- data/ios-checkboxes.gemspec +18 -12
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/off.png +0 -0
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/on.png +0 -0
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/slider.png +0 -0
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/slider_center.png +0 -0
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/slider_left.png +0 -0
- data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/slider_right.png +0 -0
- data/lib/assets/javascripts/ios-checkboxes.js.coffee +2 -0
- data/lib/assets/javascripts/ios-checkboxes/ios-checkboxes.js.coffee +269 -0
- data/lib/assets/stylesheets/ios-checkboxes.css.sass +3 -0
- data/lib/assets/stylesheets/ios-checkboxes/_mixins.sass +104 -0
- data/lib/assets/stylesheets/ios-checkboxes/ios-checkboxes.css.sass +3 -0
- data/lib/ios-checkboxes.rb +5 -5
- data/lib/ios-checkboxes/engine.rb +4 -0
- data/lib/ios-checkboxes/railtie.rb +10 -0
- data/lib/ios-checkboxes/version.rb +2 -2
- data/lib/ios-style-checkboxes/off.png +0 -0
- data/lib/ios-style-checkboxes/on.png +0 -0
- data/lib/ios-style-checkboxes/slider.png +0 -0
- data/lib/ios-style-checkboxes/slider_center.png +0 -0
- data/lib/ios-style-checkboxes/slider_left.png +0 -0
- data/lib/ios-style-checkboxes/slider_right.png +0 -0
- data/lib/tasks/ios-checkboxes_tasks.rake +4 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +57 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/ios-checkboxes_spec.rb +13 -0
- data/spec/javascripts/ios-checkboxes_spec.js.coffee +36 -0
- data/spec/javascripts/spec.css +4 -0
- data/spec/javascripts/spec.js.coffee +2 -0
- data/spec/javascripts/support/custom-theme.css.sass +7 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/asset_matchers.rb +37 -0
- metadata +171 -28
- data/vendor/assets/javascripts/ios-checkboxes.js +0 -283
- data/vendor/assets/stylesheets/ios-checkboxes.css.erb +0 -147
data/.gitignore
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*.rbc
|
|
5
|
-
*.swp
|
|
6
|
-
.bundle
|
|
1
|
+
.bundle/
|
|
2
|
+
log/*.log
|
|
3
|
+
pkg/
|
|
7
4
|
Gemfile.lock
|
|
5
|
+
spec/dummy/db/*.sqlite3
|
|
6
|
+
spec/dummy/log/*.log
|
|
7
|
+
spec/dummy/tmp/
|
|
8
|
+
spec/dummy/public/assets
|
|
9
|
+
db/*.sqlite3
|
|
10
|
+
log/*.log
|
|
11
|
+
tmp/
|
|
12
|
+
.sass-cache/
|
|
13
|
+
*.swp
|
data/Gemfile
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
source "http://rubygems.org"
|
|
2
|
+
|
|
3
|
+
# Declare your gem's dependencies in ios-checkboxes.gemspec.
|
|
4
|
+
# Bundler will treat runtime dependencies like base dependencies, and
|
|
5
|
+
# development dependencies will be added by default to the :development group.
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
# jquery-rails is used by the dummy application
|
|
9
|
+
gem "jquery-rails"
|
|
10
|
+
gem 'jasminerice'
|
|
11
|
+
gem 'coffee-script'
|
|
12
|
+
gem 'pry'
|
|
13
|
+
gem 'uglifier'
|
|
14
|
+
|
|
15
|
+
# Declare any dependencies that are still in development here instead of in
|
|
16
|
+
# your gemspec. These might include edge Rails or gems from your path or
|
|
17
|
+
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
18
|
+
# your gem to rubygems.org.
|
|
19
|
+
|
|
20
|
+
# To use debugger
|
|
21
|
+
# gem 'ruby-debug19', :require => 'ruby-debug'
|
data/HISTORY.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
0.1.2 - Mon 21 Nov 2011
|
|
2
|
+
========================================
|
|
3
|
+
- Customise the images, sizes etc via SASS
|
|
4
|
+
- Provide precompiled assets for standalone use
|
|
5
|
+
|
|
6
|
+
0.1.1 - Fri 18 Nov 2011
|
|
7
|
+
========================================
|
|
8
|
+
- Provides jQuery iphoneStyle function in JavaScript and the JavaScript file itself.
|
|
9
|
+
- Provides default styling.
|
|
10
|
+
- Compatible with Rails Assets Pipeline (include images referenced from the CSS).
|
data/README.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
ios-checkboxes
|
|
2
|
+
========================================
|
|
3
|
+
|
|
4
|
+
This project allows you to easily use iPhone style checkboxes in a Rails 3.1 application.
|
|
5
|
+
|
|
6
|
+
Install
|
|
7
|
+
========================================
|
|
8
|
+
|
|
9
|
+
Add `gem 'ios-checkboxes'` to your Gemfile and run `bundle install`
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
Usage
|
|
13
|
+
========================================
|
|
14
|
+
|
|
15
|
+
Add `//=require ios-checkboxes` to your `app/assets/javascripts/application.js`.
|
|
16
|
+
This will require `jquery` automaticaly.
|
|
17
|
+
|
|
18
|
+
Also make sure you add the stylesheets to your `application.css`.
|
|
19
|
+
Just `require ios-checkboxes` to get the default styling.
|
|
20
|
+
|
|
21
|
+
You may choose not to use it and write the styling from scratch. In that case just don't add the iox-checkboxes to the stylesheet manifest.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
After you have all the ingridients in place you can convert your checkboxes into "On/Off" buttons
|
|
25
|
+
with this JavaScript snippet:
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
$(function(){
|
|
29
|
+
$("input:checkbox").iphoneStyle();
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Using as a standalone
|
|
34
|
+
========================================
|
|
35
|
+
|
|
36
|
+
Go to the `build/output` directory and download its content.
|
|
37
|
+
Put it content under your server root.
|
|
38
|
+
Make sure you reference the JavaScript and CSS files properly.
|
|
39
|
+
|
|
40
|
+
Don't reference it as 'assets/ios-checkboxes.js', instead use the full file name from the download
|
|
41
|
+
(it will change with time): `assets/ios-checkboxes-d0bbaf0b834d61ddccf7510739596dd2.js`
|
|
42
|
+
|
|
43
|
+
The same applies to CSS, but you don't need to do anything for images.
|
|
44
|
+
|
|
45
|
+
The use of the "digest" appended to the end of file ensures that your users will have the most recent version of the files (cashe buster).
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Customisation
|
|
49
|
+
========================================
|
|
50
|
+
|
|
51
|
+
If the defaut stylesheet doesn't fit your design, you can customize it.
|
|
52
|
+
|
|
53
|
+
First, add a `.css.sass` file to your application:
|
|
54
|
+
|
|
55
|
+
```sass
|
|
56
|
+
// app/assets/stylesheets/iphone.css.sass
|
|
57
|
+
@import "./ios-checkboxes/mixins"
|
|
58
|
+
|
|
59
|
+
// This will change the default for everything
|
|
60
|
+
$iphone-style-height: 33px // Default = 27px
|
|
61
|
+
$iphone-style-font-size: 30px // Default = 17px
|
|
62
|
+
$iphone-style-images-path: 'custom-path-to-images' // Default = ios-checkboxes
|
|
63
|
+
|
|
64
|
+
+iphone-style // This includes the actual styles with customised values
|
|
65
|
+
|
|
66
|
+
// You can also override the styles for sub-selectors
|
|
67
|
+
.huge
|
|
68
|
+
$iphone-style-height: 60px
|
|
69
|
+
$iphone-style-font-size: 40px
|
|
70
|
+
$iphone-style-images-path: 'hude-images'
|
|
71
|
+
+iphone-style
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
If you modify the `$iphone-style-images-path` then you have to provide a (Sprockets) directory with the following files:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
off.png
|
|
78
|
+
on.png
|
|
79
|
+
slider.png
|
|
80
|
+
slider_center.png
|
|
81
|
+
slider_left.png
|
|
82
|
+
slider_right.png
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
Development
|
|
88
|
+
========================================
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git clone git@github.com:dnagir/ios-checkboxes.git
|
|
92
|
+
cd ios-checkboxes
|
|
93
|
+
bundle install
|
|
94
|
+
bundle rspec spec
|
|
95
|
+
(cd spec/dummy/ && bundle exec rails s)
|
|
96
|
+
# Now go to http://localhost:3000/jasmine to run the specs
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
To build the standalone assets: `sh build/build.sh`.
|
|
100
|
+
|
|
101
|
+
Help
|
|
102
|
+
========================================
|
|
103
|
+
|
|
104
|
+
- Report issues on [Github](https://github.com/dnagir/ios-checkboxes/issues).
|
|
105
|
+
- Shout at me in Twitter - [@dnagir](http://twitter.com/dnagir)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
Credits
|
|
109
|
+
========================================
|
|
110
|
+
|
|
111
|
+
[Thomas Reynolds](https://github.com/tdreyno) for the original [implementation](https://github.com/tdreyno/iphone-style-checkboxes).
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
License (MIT)
|
|
115
|
+
========================================
|
|
116
|
+
|
|
117
|
+
Copyright 2011 Thomas Reynolds, Dmytrii Nagirniak
|
|
118
|
+
|
|
119
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
120
|
+
a copy of this software and associated documentation files (the
|
|
121
|
+
"Software"), to deal in the Software without restriction, including
|
|
122
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
123
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
124
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
125
|
+
the following conditions:
|
|
126
|
+
|
|
127
|
+
The above copyright notice and this permission notice shall be
|
|
128
|
+
included in all copies or substantial portions of the Software.
|
|
129
|
+
|
|
130
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
131
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
132
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
133
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
134
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
135
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
136
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
# Copy the js file and require jQuery
|
|
7
|
-
js_content = File.read "../jquery/iphone-style-checkboxes.js"
|
|
8
|
-
f = File.new("vendor/assets/javascripts/ios-checkboxes.js", "w")
|
|
9
|
-
f.write("//= require jquery\n\n#{js_content}")
|
|
10
|
-
f.close
|
|
11
|
-
|
|
12
|
-
# Copy the images
|
|
13
|
-
cp_r "../images/", "vendor/assets/"
|
|
14
|
-
|
|
15
|
-
# Copy CSS and make sure it references the images via assets pipeline
|
|
16
|
-
css_content = File.read "../style.css"
|
|
17
|
-
pattern = /url\('images\/([^']+)'\)/
|
|
18
|
-
css_processed = css_content.gsub(pattern) {|m| "url('<%= image_path \"#{$1.sub(/\?.*/, '')}\" %>')" }
|
|
19
|
-
f2 = File.new("vendor/assets/stylesheets/ios-checkboxes.css.erb", "w")
|
|
20
|
-
f2.write(css_processed)
|
|
21
|
-
f2.close
|
|
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'
|
|
22
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 = 'IosCheckboxes'
|
|
18
|
+
rdoc.options << '--line-numbers'
|
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Bundler::GemHelper.install_tasks
|
|
26
|
+
|
|
27
|
+
require 'rake/testtask'
|
|
28
|
+
|
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
|
30
|
+
t.libs << 'lib'
|
|
31
|
+
t.libs << 'test'
|
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
|
33
|
+
t.verbose = false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
task :default => :test
|
data/build/.gitignore
ADDED
data/build/build.sh
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.iPhoneCheckContainer{position:relative;height:27px;cursor:pointer;overflow:hidden}.iPhoneCheckContainer input{position:absolute;top:5px;left:30px;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0}.iPhoneCheckContainer label{white-space:nowrap;font-size:17x;line-height:17x;font-weight:bold;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;cursor:pointer;display:block;height:27px;position:absolute;width:auto;top:0;padding-top:5px;overflow:hidden}.iPhoneCheckContainer,.iPhoneCheckContainer label{user-select:none;-moz-user-select:none;-khtml-user-select:none}.iPhoneCheckDisabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}label.iPhoneCheckLabelOn{color:#fff;background:url(/assets/ios-checkboxes/on-c1710e0553b5cb2ba6b41a59ace60662.png) no-repeat;text-shadow:0px 0px 2px rgba(0,0,0,0.6);left:0;padding-top:5px}label.iPhoneCheckLabelOn span{padding-left:8px}label.iPhoneCheckLabelOff{color:#8b8b8b;background:url(/assets/ios-checkboxes/off-32586c60c5c48b7002326fdff55cd42e.png) no-repeat right 0;text-shadow:0px 0px 2px rgba(255,255,255,0.6);text-align:right;right:0}label.iPhoneCheckLabelOff span{padding-right:8px}.iPhoneCheckHandle{display:block;height:27px;cursor:pointer;position:absolute;top:0;left:0;width:0;background:url(/assets/ios-checkboxes/slider_left-e6930b387dd9c0a424e7c1aedd0b0aea.png) no-repeat;padding-left:3px}.iPhoneCheckHandleRight{height:100%;width:100%;padding-right:3px;background:url(/assets/ios-checkboxes/slider_right-e8654b2a69377361211e57422446c703.png) no-repeat right 0}.iPhoneCheckHandleCenter{height:100%;width:100%;background:url(/assets/ios-checkboxes/slider_center-137b6fa2802dc0a9be192b66c5a76815.png)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
((function(){var a,b=Array.prototype.slice;a=function(){function a(b,c){var d,e,f;this.elem=$(b),e=$.extend({},a.defaults,c);for(d in e)f=e[d],this[d]=f;this.elem.data(this.dataName,this),this.wrapCheckboxWithDivs(),this.attachEvents(),this.disableTextSelection(),this.resizeHandle&&this.optionallyResize("handle"),this.resizeContainer&&this.optionallyResize("container"),this.initialPosition()}return a.prototype.isDisabled=function(){return this.elem.is(":disabled")},a.prototype.wrapCheckboxWithDivs=function(){return this.elem.wrap("<div class='"+this.containerClass+"' />"),this.container=this.elem.parent(),this.offLabel=$("<label class='"+this.labelOffClass+"'>\n <span>"+this.uncheckedLabel+"</span>\n</label>").appendTo(this.container),this.offSpan=this.offLabel.children("span"),this.onLabel=$("<label class='"+this.labelOnClass+"'>\n <span>"+this.checkedLabel+"</span>\n</label>").appendTo(this.container),this.onSpan=this.onLabel.children("span"),this.handle=$("<div class='"+this.handleClass+"'>\n <div class='"+this.handleRightClass+"'>\n <div class='"+this.handleCenterClass+"' />\n </div>\n</div>").appendTo(this.container)},a.prototype.disableTextSelection=function(){if($.browser.msie)return $([this.handle,this.offLabel,this.onLabel,this.container]).attr("unselectable","on")},a.prototype._getDimension=function(a,b){return $.fn.actual!=null?a.actual(b):a[b]()},a.prototype.optionallyResize=function(a){var b,c,d;return d=this._getDimension(this.onLabel,"width"),c=this._getDimension(this.offLabel,"width"),a==="container"?(b=d>c?d:c,b+=this._getDimension(this.handle,"width")+this.handleMargin,this.container.css({width:b})):(b=d>c?d:c,this.handle.css({width:b}))},a.prototype.onMouseDown=function(b){var c;b.preventDefault();if(this.isDisabled())return;return c=b.pageX||b.originalEvent.changedTouches[0].pageX,a.currentlyClicking=this.handle,a.dragStartPosition=c,a.handleLeftOffset=parseInt(this.handle.css("left"),10)||0},a.prototype.onDragMove=function(b,c){var d,e;if(a.currentlyClicking!==this.handle)return;return e=(c+a.handleLeftOffset-a.dragStartPosition)/this.rightSide,e<0&&(e=0),e>1&&(e=1),d=e*this.rightSide,this.handle.css({left:d}),this.onLabel.css({width:d+this.handleRadius}),this.offSpan.css({marginRight:-d}),this.onSpan.css({marginLeft:-(1-e)*this.rightSide})},a.prototype.onDragEnd=function(b,c){var d;if(a.currentlyClicking!==this.handle)return;if(this.isDisabled())return;return a.dragging?(d=(c-a.dragStartPosition)/this.rightSide,this.elem.prop("checked",d>=.5)):this.elem.prop("checked",!this.elem.prop("checked")),a.currentlyClicking=null,a.dragging=null,this.didChange()},a.prototype.refresh=function(){return this.didChange()},a.prototype.didChange=function(){var a;return typeof this.onChange=="function"&&this.onChange(this.elem,this.elem.prop("checked")),this.isDisabled()?(this.container.addClass(this.disabledClass),!1):(this.container.removeClass(this.disabledClass),a=this.elem.prop("checked")?this.rightSide:0,this.handle.animate({left:a},this.duration),this.onLabel.animate({width:a+this.handleRadius},this.duration),this.offSpan.animate({marginRight:-a},this.duration),this.onSpan.animate({marginLeft:a-this.rightSide},this.duration))},a.prototype.attachEvents=function(){var a,b,c;return c=this,a=function(a){return c.onGlobalMove.apply(c,arguments)},b=function(d){return c.onGlobalUp.apply(c,arguments),$(document).unbind("mousemove touchmove",a),$(document).unbind("mouseup touchend",b)},this.elem.change(function(){return c.refresh()}),this.container.bind("mousedown touchstart",function(d){return c.onMouseDown.apply(c,arguments),$(document).bind("mousemove touchmove",a),$(document).bind("mouseup touchend",b)})},a.prototype.initialPosition=function(){var a,b;a=this._getDimension(this.container,"width"),this.offLabel.css({width:a-this.containerRadius}),b=this.containerRadius+1,$.browser.msie&&$.browser.version<7&&(b-=3),this.rightSide=a-this._getDimension(this.handle,"width")-b,this.elem.is(":checked")?(this.handle.css({left:this.rightSide}),this.onLabel.css({width:this.rightSide+this.handleRadius}),this.offSpan.css({marginRight:-this.rightSide})):(this.onLabel.css({width:0}),this.onSpan.css({marginLeft:-this.rightSide}));if(this.isDisabled())return this.container.addClass(this.disabledClass)},a.prototype.onGlobalMove=function(b){var c;if(!!this.isDisabled()||!a.currentlyClicking)return;return b.preventDefault(),c=b.pageX||b.originalEvent.changedTouches[0].pageX,!a.dragging&&Math.abs(a.dragStartPosition-c)>this.dragThreshold&&(a.dragging=!0),this.onDragMove(b,c)},a.prototype.onGlobalUp=function(b){var c;if(!a.currentlyClicking)return;return b.preventDefault(),c=b.pageX||b.originalEvent.changedTouches[0].pageX,this.onDragEnd(b,c),!1},a.defaults={duration:200,checkedLabel:"ON",uncheckedLabel:"OFF",resizeHandle:!0,resizeContainer:!0,disabledClass:"iPhoneCheckDisabled",containerClass:"iPhoneCheckContainer",labelOnClass:"iPhoneCheckLabelOn",labelOffClass:"iPhoneCheckLabelOff",handleClass:"iPhoneCheckHandle",handleCenterClass:"iPhoneCheckHandleCenter",handleRightClass:"iPhoneCheckHandleRight",dragThreshold:5,handleMargin:15,handleRadius:4,containerRadius:5,dataName:"iphoneStyle",onChange:function(){}},a}(),$.iphoneStyle=this.iOSCheckbox=a,$.fn.iphoneStyle=function(){var c,d,e,f,g,h,i,j,k,l,m,n;c=1<=arguments.length?b.call(arguments,0):[],e=(k=(l=c[0])!=null?l.dataName:void 0)!=null?k:a.defaults.dataName,m=this.filter(":checkbox");for(i=0,j=m.length;i<j;i++)d=m[i],f=$(d).data(e),f!=null?(g=c[0],h=2<=c.length?b.call(c,1):[],(n=f[g])!=null&&n.apply(f,h)):new a(d,c[0]);return this},$.fn.iOSCheckbox=function(a){var b;return a==null&&(a={}),b=$.extend({},a,{resizeHandle:!1,disabledClass:"iOSCheckDisabled",containerClass:"iOSCheckContainer",labelOnClass:"iOSCheckLabelOn",labelOffClass:"iOSCheckLabelOff",handleClass:"iOSCheckHandle",handleCenterClass:"iOSCheckHandleCenter",handleRightClass:"iOSCheckHandleRight",dataName:"iOSCheckbox"}),this.iphoneStyle(b)}})).call(this)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/ios-checkboxes.gemspec
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
require File.expand_path('../lib/ios-checkboxes/version', __FILE__)
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
2
|
|
|
3
|
+
# Maintain your gem's version:
|
|
4
|
+
require "ios-checkboxes/version"
|
|
5
|
+
|
|
6
|
+
# Describe your gem and declare its dependencies:
|
|
4
7
|
Gem::Specification.new do |s|
|
|
5
8
|
s.name = "ios-checkboxes"
|
|
6
|
-
s.version =
|
|
7
|
-
s.authors = ["Thomas Reynolds"]
|
|
8
|
-
s.email = ["
|
|
9
|
-
s.homepage = "https://github.com/
|
|
10
|
-
s.summary =
|
|
11
|
-
s.description =
|
|
9
|
+
s.version = IosCheckboxes::VERSION
|
|
10
|
+
s.authors = ["Dmytrii Nagirniak, Thomas Reynolds"]
|
|
11
|
+
s.email = ["dnagir@gmail.com"]
|
|
12
|
+
s.homepage = "https://github.com/dnagir/ios-checkboxes"
|
|
13
|
+
s.summary = "iOS checkboxes for Rails"
|
|
14
|
+
s.description = "Easily convert your checkboxes into iPhone style On/Off buttons. Use with Rails 3.1 Assets Pipeline."
|
|
12
15
|
|
|
13
|
-
s.
|
|
14
|
-
s.
|
|
16
|
+
s.files = `git ls-files`.split("\n")
|
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features,build}/*`.split("\n")
|
|
18
|
+
s.require_paths = ["lib"]
|
|
15
19
|
|
|
16
|
-
s.
|
|
20
|
+
s.add_dependency "rails", "~> 3.1.2"
|
|
21
|
+
s.add_dependency "sass-rails"
|
|
22
|
+
s.add_dependency "compass", ">= 0.12.alpha.1"
|
|
17
23
|
|
|
18
|
-
s.
|
|
24
|
+
s.add_development_dependency "rspec-rails"
|
|
19
25
|
end
|
data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/off.png
RENAMED
|
File without changes
|
data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/on.png
RENAMED
|
File without changes
|
data/{vendor/assets/images/iphone-style-checkboxes → lib/assets/images/ios-checkboxes}/slider.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# iPhone-style Checkboxes Coffee plugin
|
|
2
|
+
# Copyright Thomas Reynolds, licensed GPL & MIT
|
|
3
|
+
|
|
4
|
+
class iOSCheckbox
|
|
5
|
+
constructor: (elem, options) ->
|
|
6
|
+
@elem = $(elem)
|
|
7
|
+
|
|
8
|
+
opts = $.extend({}, iOSCheckbox.defaults, options)
|
|
9
|
+
|
|
10
|
+
# Import options into instance variables
|
|
11
|
+
for key, value of opts
|
|
12
|
+
@[key] = value
|
|
13
|
+
|
|
14
|
+
@elem.data(@dataName, this)
|
|
15
|
+
|
|
16
|
+
# Initialize the control
|
|
17
|
+
@wrapCheckboxWithDivs()
|
|
18
|
+
@attachEvents()
|
|
19
|
+
@disableTextSelection()
|
|
20
|
+
|
|
21
|
+
@optionallyResize('handle') if @resizeHandle
|
|
22
|
+
@optionallyResize('container') if @resizeContainer
|
|
23
|
+
|
|
24
|
+
@initialPosition()
|
|
25
|
+
|
|
26
|
+
isDisabled: -> @elem.is(':disabled')
|
|
27
|
+
|
|
28
|
+
# Wrap the existing input[type=checkbox] with divs for styling and grab
|
|
29
|
+
# DOM references to the created nodes
|
|
30
|
+
wrapCheckboxWithDivs: ->
|
|
31
|
+
@elem.wrap("<div class='#{@containerClass}' />")
|
|
32
|
+
|
|
33
|
+
@container = @elem.parent()
|
|
34
|
+
|
|
35
|
+
@offLabel = $("""<label class='#{@labelOffClass}'>
|
|
36
|
+
<span>#{@uncheckedLabel}</span>
|
|
37
|
+
</label>""").appendTo(@container)
|
|
38
|
+
|
|
39
|
+
@offSpan = @offLabel.children('span')
|
|
40
|
+
|
|
41
|
+
@onLabel = $("""<label class='#{@labelOnClass}'>
|
|
42
|
+
<span>#{@checkedLabel}</span>
|
|
43
|
+
</label>""").appendTo(@container)
|
|
44
|
+
|
|
45
|
+
@onSpan = @onLabel.children('span')
|
|
46
|
+
|
|
47
|
+
@handle = $("""<div class='#{@handleClass}'>
|
|
48
|
+
<div class='#{@handleRightClass}'>
|
|
49
|
+
<div class='#{@handleCenterClass}' />
|
|
50
|
+
</div>
|
|
51
|
+
</div>""").appendTo(this.container)
|
|
52
|
+
|
|
53
|
+
# Disable IE text selection, other browsers are handled in CSS
|
|
54
|
+
disableTextSelection: ->
|
|
55
|
+
# Elements containing text should be unselectable
|
|
56
|
+
if $.browser.msie
|
|
57
|
+
$([@handle, @offLabel, @onLabel, @container]).attr("unselectable", "on")
|
|
58
|
+
|
|
59
|
+
_getDimension: (elem, dimension) ->
|
|
60
|
+
if $.fn.actual?
|
|
61
|
+
elem.actual(dimension)
|
|
62
|
+
else
|
|
63
|
+
elem[dimension]()
|
|
64
|
+
|
|
65
|
+
# Automatically resize the handle or container
|
|
66
|
+
optionallyResize: (mode) ->
|
|
67
|
+
onLabelWidth = @_getDimension(@onLabel, "width")
|
|
68
|
+
offLabelWidth = @_getDimension(@offLabel, "width")
|
|
69
|
+
|
|
70
|
+
if mode == "container"
|
|
71
|
+
newWidth = if (onLabelWidth > offLabelWidth)
|
|
72
|
+
onLabelWidth
|
|
73
|
+
else
|
|
74
|
+
offLabelWidth
|
|
75
|
+
|
|
76
|
+
newWidth += @_getDimension(@handle, "width") + @handleMargin
|
|
77
|
+
@container.css(width: newWidth)
|
|
78
|
+
else
|
|
79
|
+
newWidth = if (onLabelWidth > offLabelWidth)
|
|
80
|
+
onLabelWidth
|
|
81
|
+
else
|
|
82
|
+
offLabelWidth
|
|
83
|
+
@handle.css(width: newWidth)
|
|
84
|
+
|
|
85
|
+
onMouseDown: (event) ->
|
|
86
|
+
event.preventDefault()
|
|
87
|
+
|
|
88
|
+
return if @isDisabled()
|
|
89
|
+
|
|
90
|
+
x = event.pageX || event.originalEvent.changedTouches[0].pageX
|
|
91
|
+
iOSCheckbox.currentlyClicking = @handle
|
|
92
|
+
iOSCheckbox.dragStartPosition = x
|
|
93
|
+
iOSCheckbox.handleLeftOffset = parseInt(@handle.css('left'), 10) || 0
|
|
94
|
+
|
|
95
|
+
onDragMove: (event, x) ->
|
|
96
|
+
return unless iOSCheckbox.currentlyClicking == @handle
|
|
97
|
+
|
|
98
|
+
p = (x + iOSCheckbox.handleLeftOffset - iOSCheckbox.dragStartPosition) / @rightSide
|
|
99
|
+
p = 0 if p < 0
|
|
100
|
+
p = 1 if p > 1
|
|
101
|
+
|
|
102
|
+
newWidth = p * @rightSide
|
|
103
|
+
@handle.css(left: newWidth)
|
|
104
|
+
@onLabel.css(width: newWidth + @handleRadius)
|
|
105
|
+
@offSpan.css(marginRight: -newWidth)
|
|
106
|
+
@onSpan.css(marginLeft: -(1 - p) * @rightSide)
|
|
107
|
+
|
|
108
|
+
onDragEnd: (event, x) ->
|
|
109
|
+
return unless iOSCheckbox.currentlyClicking == @handle
|
|
110
|
+
return if @isDisabled()
|
|
111
|
+
|
|
112
|
+
if iOSCheckbox.dragging
|
|
113
|
+
p = (x - iOSCheckbox.dragStartPosition) / @rightSide
|
|
114
|
+
@elem.prop('checked', (p >= 0.5))
|
|
115
|
+
else
|
|
116
|
+
@elem.prop('checked', !@elem.prop('checked'))
|
|
117
|
+
|
|
118
|
+
iOSCheckbox.currentlyClicking = null
|
|
119
|
+
iOSCheckbox.dragging = null
|
|
120
|
+
@didChange()
|
|
121
|
+
|
|
122
|
+
refresh: -> @didChange() #TODO: Verify - this might fire event unnecessarily
|
|
123
|
+
|
|
124
|
+
didChange: ->
|
|
125
|
+
@onChange?(@elem, @elem.prop('checked'))
|
|
126
|
+
|
|
127
|
+
if @isDisabled()
|
|
128
|
+
@container.addClass(@disabledClass)
|
|
129
|
+
return false
|
|
130
|
+
else
|
|
131
|
+
@container.removeClass(@disabledClass)
|
|
132
|
+
|
|
133
|
+
new_left = if @elem.prop('checked') then @rightSide else 0
|
|
134
|
+
|
|
135
|
+
@handle.animate(left: new_left, @duration)
|
|
136
|
+
@onLabel.animate(width: new_left + @handleRadius, @duration)
|
|
137
|
+
@offSpan.animate(marginRight: -new_left, @duration)
|
|
138
|
+
@onSpan.animate(marginLeft: new_left - @rightSide, @duration)
|
|
139
|
+
|
|
140
|
+
attachEvents: ->
|
|
141
|
+
self = this
|
|
142
|
+
|
|
143
|
+
localMouseMove = (event) ->
|
|
144
|
+
self.onGlobalMove.apply(self, arguments)
|
|
145
|
+
|
|
146
|
+
localMouseUp = (event) ->
|
|
147
|
+
self.onGlobalUp.apply(self, arguments)
|
|
148
|
+
$(document).unbind 'mousemove touchmove', localMouseMove
|
|
149
|
+
$(document).unbind 'mouseup touchend', localMouseUp
|
|
150
|
+
|
|
151
|
+
# The original checkbox value might be changed by clickig on the associated label or other means
|
|
152
|
+
# To make sure we are in sync:
|
|
153
|
+
@elem.change -> self.refresh()
|
|
154
|
+
|
|
155
|
+
# A mousedown anywhere in the control will start tracking for dragging
|
|
156
|
+
@container.bind 'mousedown touchstart', (event) ->
|
|
157
|
+
self.onMouseDown.apply(self, arguments)
|
|
158
|
+
|
|
159
|
+
# As the mouse moves on the page, animate if we are in a drag state
|
|
160
|
+
$(document).bind 'mousemove touchmove', localMouseMove
|
|
161
|
+
|
|
162
|
+
# When the mouse comes up, leave drag state
|
|
163
|
+
$(document).bind 'mouseup touchend', localMouseUp
|
|
164
|
+
|
|
165
|
+
# Setup the control's inital position
|
|
166
|
+
initialPosition: ->
|
|
167
|
+
containerWidth = @_getDimension(@container, "width")
|
|
168
|
+
@offLabel.css(width: containerWidth - @containerRadius)
|
|
169
|
+
|
|
170
|
+
offset = @containerRadius + 1
|
|
171
|
+
offset -= 3 if $.browser.msie and $.browser.version < 7
|
|
172
|
+
@rightSide = containerWidth - @_getDimension(@handle, "width") - offset
|
|
173
|
+
|
|
174
|
+
if @elem.is(':checked')
|
|
175
|
+
@handle.css(left: @rightSide)
|
|
176
|
+
@onLabel.css(width: @rightSide + @handleRadius)
|
|
177
|
+
@offSpan.css(marginRight: -@rightSide)
|
|
178
|
+
else
|
|
179
|
+
@onLabel.css(width: 0)
|
|
180
|
+
@onSpan.css(marginLeft: -@rightSide)
|
|
181
|
+
|
|
182
|
+
@container.addClass(@disabledClass) if @isDisabled()
|
|
183
|
+
|
|
184
|
+
onGlobalMove: (event) ->
|
|
185
|
+
return unless !@isDisabled() && iOSCheckbox.currentlyClicking
|
|
186
|
+
event.preventDefault()
|
|
187
|
+
|
|
188
|
+
x = event.pageX || event.originalEvent.changedTouches[0].pageX
|
|
189
|
+
|
|
190
|
+
if (!iOSCheckbox.dragging &&
|
|
191
|
+
(Math.abs(iOSCheckbox.dragStartPosition - x) > @dragThreshold))
|
|
192
|
+
iOSCheckbox.dragging = true
|
|
193
|
+
|
|
194
|
+
@onDragMove(event, x)
|
|
195
|
+
|
|
196
|
+
onGlobalUp: (event) ->
|
|
197
|
+
return unless iOSCheckbox.currentlyClicking
|
|
198
|
+
event.preventDefault()
|
|
199
|
+
|
|
200
|
+
x = event.pageX || event.originalEvent.changedTouches[0].pageX
|
|
201
|
+
|
|
202
|
+
@onDragEnd(event, x)
|
|
203
|
+
false
|
|
204
|
+
|
|
205
|
+
@defaults:
|
|
206
|
+
# Time spent during slide animation
|
|
207
|
+
duration: 200
|
|
208
|
+
|
|
209
|
+
# Text content of "on" state
|
|
210
|
+
checkedLabel: 'ON'
|
|
211
|
+
|
|
212
|
+
# Text content of "off" state
|
|
213
|
+
uncheckedLabel: 'OFF'
|
|
214
|
+
|
|
215
|
+
# Automatically resize the handle to cover either label
|
|
216
|
+
resizeHandle: true
|
|
217
|
+
|
|
218
|
+
# Automatically resize the widget to contain the labels
|
|
219
|
+
resizeContainer: true
|
|
220
|
+
|
|
221
|
+
disabledClass: 'iPhoneCheckDisabled'
|
|
222
|
+
containerClass: 'iPhoneCheckContainer'
|
|
223
|
+
labelOnClass: 'iPhoneCheckLabelOn'
|
|
224
|
+
labelOffClass: 'iPhoneCheckLabelOff'
|
|
225
|
+
handleClass: 'iPhoneCheckHandle'
|
|
226
|
+
handleCenterClass: 'iPhoneCheckHandleCenter'
|
|
227
|
+
handleRightClass: 'iPhoneCheckHandleRight'
|
|
228
|
+
|
|
229
|
+
# Pixels that must be dragged for a click to be ignored
|
|
230
|
+
dragThreshold: 5
|
|
231
|
+
|
|
232
|
+
handleMargin: 15
|
|
233
|
+
handleRadius: 4
|
|
234
|
+
containerRadius: 5
|
|
235
|
+
|
|
236
|
+
dataName: "iphoneStyle"
|
|
237
|
+
|
|
238
|
+
onChange: ->
|
|
239
|
+
|
|
240
|
+
$.iphoneStyle = @iOSCheckbox = iOSCheckbox
|
|
241
|
+
|
|
242
|
+
$.fn.iphoneStyle = (args...) ->
|
|
243
|
+
dataName = args[0]?.dataName ? iOSCheckbox.defaults.dataName
|
|
244
|
+
|
|
245
|
+
for checkbox in @filter(':checkbox')
|
|
246
|
+
existingControl = $(checkbox).data(dataName)
|
|
247
|
+
if existingControl?
|
|
248
|
+
[method, params...] = args
|
|
249
|
+
existingControl[method]?.apply(existingControl, params)
|
|
250
|
+
else
|
|
251
|
+
new iOSCheckbox(checkbox, args[0])
|
|
252
|
+
|
|
253
|
+
this
|
|
254
|
+
|
|
255
|
+
$.fn.iOSCheckbox = (options={}) ->
|
|
256
|
+
# iOS5 style only supports circular handle
|
|
257
|
+
opts = $.extend({}, options, {
|
|
258
|
+
resizeHandle: false
|
|
259
|
+
disabledClass: 'iOSCheckDisabled'
|
|
260
|
+
containerClass: 'iOSCheckContainer'
|
|
261
|
+
labelOnClass: 'iOSCheckLabelOn'
|
|
262
|
+
labelOffClass: 'iOSCheckLabelOff'
|
|
263
|
+
handleClass: 'iOSCheckHandle'
|
|
264
|
+
handleCenterClass: 'iOSCheckHandleCenter'
|
|
265
|
+
handleRightClass: 'iOSCheckHandleRight'
|
|
266
|
+
dataName: 'iOSCheckbox'
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
this.iphoneStyle(opts)
|