stepy-rails 1.1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +17 -0
- data/.stepy-rails.gemspec.un~ +0 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/stepy-rails +1 -0
- data/lib/stepy/rails.rb +8 -0
- data/lib/stepy/rails/engine.rb +6 -0
- data/lib/stepy/rails/version.rb +5 -0
- data/stepy-rails.gemspec +22 -0
- data/stepy-test/.gitignore +15 -0
- data/stepy-test/Gemfile +38 -0
- data/stepy-test/README.rdoc +261 -0
- data/stepy-test/Rakefile +7 -0
- data/stepy-test/app/assets/images/rails.png +0 -0
- data/stepy-test/app/assets/javascripts/application.js +15 -0
- data/stepy-test/app/assets/stylesheets/application.css +13 -0
- data/stepy-test/app/controllers/application_controller.rb +3 -0
- data/stepy-test/app/helpers/application_helper.rb +2 -0
- data/stepy-test/app/mailers/.gitkeep +0 -0
- data/stepy-test/app/models/.gitkeep +0 -0
- data/stepy-test/app/views/layouts/application.html.erb +14 -0
- data/stepy-test/config.ru +4 -0
- data/stepy-test/config/application.rb +62 -0
- data/stepy-test/config/boot.rb +6 -0
- data/stepy-test/config/database.yml +25 -0
- data/stepy-test/config/environment.rb +5 -0
- data/stepy-test/config/environments/development.rb +37 -0
- data/stepy-test/config/environments/production.rb +67 -0
- data/stepy-test/config/environments/test.rb +37 -0
- data/stepy-test/config/initializers/backtrace_silencers.rb +7 -0
- data/stepy-test/config/initializers/inflections.rb +15 -0
- data/stepy-test/config/initializers/mime_types.rb +5 -0
- data/stepy-test/config/initializers/secret_token.rb +7 -0
- data/stepy-test/config/initializers/session_store.rb +8 -0
- data/stepy-test/config/initializers/wrap_parameters.rb +14 -0
- data/stepy-test/config/locales/en.yml +5 -0
- data/stepy-test/config/routes.rb +58 -0
- data/stepy-test/db/seeds.rb +7 -0
- data/stepy-test/lib/assets/.gitkeep +0 -0
- data/stepy-test/lib/tasks/.gitkeep +0 -0
- data/stepy-test/log/.gitkeep +0 -0
- data/stepy-test/public/404.html +26 -0
- data/stepy-test/public/422.html +26 -0
- data/stepy-test/public/500.html +25 -0
- data/stepy-test/public/favicon.ico +0 -0
- data/stepy-test/public/index.html +241 -0
- data/stepy-test/public/robots.txt +5 -0
- data/stepy-test/script/rails +6 -0
- data/stepy-test/test/fixtures/.gitkeep +0 -0
- data/stepy-test/test/functional/.gitkeep +0 -0
- data/stepy-test/test/integration/.gitkeep +0 -0
- data/stepy-test/test/performance/browsing_test.rb +12 -0
- data/stepy-test/test/test_helper.rb +13 -0
- data/stepy-test/test/unit/.gitkeep +0 -0
- data/stepy-test/vendor/assets/javascripts/.gitkeep +0 -0
- data/stepy-test/vendor/assets/stylesheets/.gitkeep +0 -0
- data/stepy-test/vendor/plugins/.gitkeep +0 -0
- data/vendor/assets/javascripts/jquery.stepy.js +408 -0
- data/vendor/assets/stylesheets/jquery.stepy.css +39 -0
- metadata +153 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
# This file should contain all the record creation needed to seed the database with its default values.
|
2
|
+
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
|
3
|
+
#
|
4
|
+
# Examples:
|
5
|
+
#
|
6
|
+
# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
|
7
|
+
# Mayor.create(name: 'Emanuel', city: cities.first)
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/404.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/422.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/500.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
</html>
|
File without changes
|
@@ -0,0 +1,241 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Ruby on Rails: Welcome aboard</title>
|
5
|
+
<style type="text/css" media="screen">
|
6
|
+
body {
|
7
|
+
margin: 0;
|
8
|
+
margin-bottom: 25px;
|
9
|
+
padding: 0;
|
10
|
+
background-color: #f0f0f0;
|
11
|
+
font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
|
12
|
+
font-size: 13px;
|
13
|
+
color: #333;
|
14
|
+
}
|
15
|
+
|
16
|
+
h1 {
|
17
|
+
font-size: 28px;
|
18
|
+
color: #000;
|
19
|
+
}
|
20
|
+
|
21
|
+
a {color: #03c}
|
22
|
+
a:hover {
|
23
|
+
background-color: #03c;
|
24
|
+
color: white;
|
25
|
+
text-decoration: none;
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
#page {
|
30
|
+
background-color: #f0f0f0;
|
31
|
+
width: 750px;
|
32
|
+
margin: 0;
|
33
|
+
margin-left: auto;
|
34
|
+
margin-right: auto;
|
35
|
+
}
|
36
|
+
|
37
|
+
#content {
|
38
|
+
float: left;
|
39
|
+
background-color: white;
|
40
|
+
border: 3px solid #aaa;
|
41
|
+
border-top: none;
|
42
|
+
padding: 25px;
|
43
|
+
width: 500px;
|
44
|
+
}
|
45
|
+
|
46
|
+
#sidebar {
|
47
|
+
float: right;
|
48
|
+
width: 175px;
|
49
|
+
}
|
50
|
+
|
51
|
+
#footer {
|
52
|
+
clear: both;
|
53
|
+
}
|
54
|
+
|
55
|
+
#header, #about, #getting-started {
|
56
|
+
padding-left: 75px;
|
57
|
+
padding-right: 30px;
|
58
|
+
}
|
59
|
+
|
60
|
+
|
61
|
+
#header {
|
62
|
+
background-image: url("assets/rails.png");
|
63
|
+
background-repeat: no-repeat;
|
64
|
+
background-position: top left;
|
65
|
+
height: 64px;
|
66
|
+
}
|
67
|
+
#header h1, #header h2 {margin: 0}
|
68
|
+
#header h2 {
|
69
|
+
color: #888;
|
70
|
+
font-weight: normal;
|
71
|
+
font-size: 16px;
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
#about h3 {
|
76
|
+
margin: 0;
|
77
|
+
margin-bottom: 10px;
|
78
|
+
font-size: 14px;
|
79
|
+
}
|
80
|
+
|
81
|
+
#about-content {
|
82
|
+
background-color: #ffd;
|
83
|
+
border: 1px solid #fc0;
|
84
|
+
margin-left: -55px;
|
85
|
+
margin-right: -10px;
|
86
|
+
}
|
87
|
+
#about-content table {
|
88
|
+
margin-top: 10px;
|
89
|
+
margin-bottom: 10px;
|
90
|
+
font-size: 11px;
|
91
|
+
border-collapse: collapse;
|
92
|
+
}
|
93
|
+
#about-content td {
|
94
|
+
padding: 10px;
|
95
|
+
padding-top: 3px;
|
96
|
+
padding-bottom: 3px;
|
97
|
+
}
|
98
|
+
#about-content td.name {color: #555}
|
99
|
+
#about-content td.value {color: #000}
|
100
|
+
|
101
|
+
#about-content ul {
|
102
|
+
padding: 0;
|
103
|
+
list-style-type: none;
|
104
|
+
}
|
105
|
+
|
106
|
+
#about-content.failure {
|
107
|
+
background-color: #fcc;
|
108
|
+
border: 1px solid #f00;
|
109
|
+
}
|
110
|
+
#about-content.failure p {
|
111
|
+
margin: 0;
|
112
|
+
padding: 10px;
|
113
|
+
}
|
114
|
+
|
115
|
+
|
116
|
+
#getting-started {
|
117
|
+
border-top: 1px solid #ccc;
|
118
|
+
margin-top: 25px;
|
119
|
+
padding-top: 15px;
|
120
|
+
}
|
121
|
+
#getting-started h1 {
|
122
|
+
margin: 0;
|
123
|
+
font-size: 20px;
|
124
|
+
}
|
125
|
+
#getting-started h2 {
|
126
|
+
margin: 0;
|
127
|
+
font-size: 14px;
|
128
|
+
font-weight: normal;
|
129
|
+
color: #333;
|
130
|
+
margin-bottom: 25px;
|
131
|
+
}
|
132
|
+
#getting-started ol {
|
133
|
+
margin-left: 0;
|
134
|
+
padding-left: 0;
|
135
|
+
}
|
136
|
+
#getting-started li {
|
137
|
+
font-size: 18px;
|
138
|
+
color: #888;
|
139
|
+
margin-bottom: 25px;
|
140
|
+
}
|
141
|
+
#getting-started li h2 {
|
142
|
+
margin: 0;
|
143
|
+
font-weight: normal;
|
144
|
+
font-size: 18px;
|
145
|
+
color: #333;
|
146
|
+
}
|
147
|
+
#getting-started li p {
|
148
|
+
color: #555;
|
149
|
+
font-size: 13px;
|
150
|
+
}
|
151
|
+
|
152
|
+
|
153
|
+
#sidebar ul {
|
154
|
+
margin-left: 0;
|
155
|
+
padding-left: 0;
|
156
|
+
}
|
157
|
+
#sidebar ul h3 {
|
158
|
+
margin-top: 25px;
|
159
|
+
font-size: 16px;
|
160
|
+
padding-bottom: 10px;
|
161
|
+
border-bottom: 1px solid #ccc;
|
162
|
+
}
|
163
|
+
#sidebar li {
|
164
|
+
list-style-type: none;
|
165
|
+
}
|
166
|
+
#sidebar ul.links li {
|
167
|
+
margin-bottom: 5px;
|
168
|
+
}
|
169
|
+
|
170
|
+
.filename {
|
171
|
+
font-style: italic;
|
172
|
+
}
|
173
|
+
</style>
|
174
|
+
<script type="text/javascript">
|
175
|
+
function about() {
|
176
|
+
info = document.getElementById('about-content');
|
177
|
+
if (window.XMLHttpRequest)
|
178
|
+
{ xhr = new XMLHttpRequest(); }
|
179
|
+
else
|
180
|
+
{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
|
181
|
+
xhr.open("GET","rails/info/properties",false);
|
182
|
+
xhr.send("");
|
183
|
+
info.innerHTML = xhr.responseText;
|
184
|
+
info.style.display = 'block'
|
185
|
+
}
|
186
|
+
</script>
|
187
|
+
</head>
|
188
|
+
<body>
|
189
|
+
<div id="page">
|
190
|
+
<div id="sidebar">
|
191
|
+
<ul id="sidebar-items">
|
192
|
+
<li>
|
193
|
+
<h3>Browse the documentation</h3>
|
194
|
+
<ul class="links">
|
195
|
+
<li><a href="http://guides.rubyonrails.org/">Rails Guides</a></li>
|
196
|
+
<li><a href="http://api.rubyonrails.org/">Rails API</a></li>
|
197
|
+
<li><a href="http://www.ruby-doc.org/core/">Ruby core</a></li>
|
198
|
+
<li><a href="http://www.ruby-doc.org/stdlib/">Ruby standard library</a></li>
|
199
|
+
</ul>
|
200
|
+
</li>
|
201
|
+
</ul>
|
202
|
+
</div>
|
203
|
+
|
204
|
+
<div id="content">
|
205
|
+
<div id="header">
|
206
|
+
<h1>Welcome aboard</h1>
|
207
|
+
<h2>You’re riding Ruby on Rails!</h2>
|
208
|
+
</div>
|
209
|
+
|
210
|
+
<div id="about">
|
211
|
+
<h3><a href="rails/info/properties" onclick="about(); return false">About your application’s environment</a></h3>
|
212
|
+
<div id="about-content" style="display: none"></div>
|
213
|
+
</div>
|
214
|
+
|
215
|
+
<div id="getting-started">
|
216
|
+
<h1>Getting started</h1>
|
217
|
+
<h2>Here’s how to get rolling:</h2>
|
218
|
+
|
219
|
+
<ol>
|
220
|
+
<li>
|
221
|
+
<h2>Use <code>rails generate</code> to create your models and controllers</h2>
|
222
|
+
<p>To see all available options, run it without parameters.</p>
|
223
|
+
</li>
|
224
|
+
|
225
|
+
<li>
|
226
|
+
<h2>Set up a default route and remove <span class="filename">public/index.html</span></h2>
|
227
|
+
<p>Routes are set up in <span class="filename">config/routes.rb</span>.</p>
|
228
|
+
</li>
|
229
|
+
|
230
|
+
<li>
|
231
|
+
<h2>Create your database</h2>
|
232
|
+
<p>Run <code>rake db:create</code> to create your database. If you're not using SQLite (the default), edit <span class="filename">config/database.yml</span> with your username and password.</p>
|
233
|
+
</li>
|
234
|
+
</ol>
|
235
|
+
</div>
|
236
|
+
</div>
|
237
|
+
|
238
|
+
<div id="footer"> </div>
|
239
|
+
</div>
|
240
|
+
</body>
|
241
|
+
</html>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rails/performance_test_help'
|
3
|
+
|
4
|
+
class BrowsingTest < ActionDispatch::PerformanceTest
|
5
|
+
# Refer to the documentation for all available options
|
6
|
+
# self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
|
7
|
+
# :output => 'tmp/performance', :formats => [:flat] }
|
8
|
+
|
9
|
+
def test_homepage
|
10
|
+
get '/'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require File.expand_path('../../config/environment', __FILE__)
|
3
|
+
require 'rails/test_help'
|
4
|
+
|
5
|
+
class ActiveSupport::TestCase
|
6
|
+
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
7
|
+
#
|
8
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
9
|
+
# -- they do not yet inherit this setting
|
10
|
+
fixtures :all
|
11
|
+
|
12
|
+
# Add more helper methods to be used by all tests here...
|
13
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,408 @@
|
|
1
|
+
/*!
|
2
|
+
* jQuery Stepy - A Wizard Plugin
|
3
|
+
* --------------------------------------------------------------
|
4
|
+
*
|
5
|
+
* jQuery Stepy is a plugin that generates a customizable wizard.
|
6
|
+
*
|
7
|
+
* Licensed under The MIT License
|
8
|
+
*
|
9
|
+
* @version 1.1.0
|
10
|
+
* @since 2010-07-03
|
11
|
+
* @author Washington Botelho
|
12
|
+
* @documentation wbotelhos.com/stepy
|
13
|
+
*
|
14
|
+
* --------------------------------------------------------------
|
15
|
+
*
|
16
|
+
* <form>
|
17
|
+
* <fieldset title="Step 1">
|
18
|
+
* <legend>description one</legend>
|
19
|
+
* <!-- inputs -->
|
20
|
+
* </fieldset>
|
21
|
+
*
|
22
|
+
* <fieldset title="Step 2">
|
23
|
+
* <legend>description two</legend>
|
24
|
+
* <!-- inputs -->
|
25
|
+
* </fieldset>
|
26
|
+
*
|
27
|
+
* <input type="submit" />
|
28
|
+
* </form>
|
29
|
+
*
|
30
|
+
* $('form').stepy();
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
;(function($) {
|
35
|
+
|
36
|
+
var methods = {
|
37
|
+
init: function(settings) {
|
38
|
+
return this.each(function() {
|
39
|
+
methods.destroy.call(this);
|
40
|
+
|
41
|
+
this.opt = $.extend({}, $.fn.stepy.defaults, settings);
|
42
|
+
|
43
|
+
var self = this,
|
44
|
+
that = $(this),
|
45
|
+
id = that.attr('id');
|
46
|
+
|
47
|
+
if (id === undefined || id === '') {
|
48
|
+
var id = methods._hash.call(self);
|
49
|
+
|
50
|
+
that.attr('id', id);
|
51
|
+
}
|
52
|
+
|
53
|
+
if (self.opt.validate) {
|
54
|
+
jQuery.validator.setDefaults({ ignore: self.opt.ignore });
|
55
|
+
|
56
|
+
that.append('<div class="stepy-errors" />');
|
57
|
+
}
|
58
|
+
|
59
|
+
self.header = methods._header.call(self);
|
60
|
+
self.steps = that.children('fieldset');
|
61
|
+
|
62
|
+
self.steps.each(function(index) {
|
63
|
+
methods._createHead.call(self, this, index);
|
64
|
+
methods._createButtons.call(self, this, index);
|
65
|
+
});
|
66
|
+
|
67
|
+
self.heads = self.header.children('li');
|
68
|
+
|
69
|
+
self.heads.first().addClass('stepy-active');
|
70
|
+
|
71
|
+
if (self.opt.finishButton) {
|
72
|
+
methods._bindFinish.call(self);
|
73
|
+
}
|
74
|
+
|
75
|
+
if (self.opt.titleClick) {
|
76
|
+
self.heads.click(function() {
|
77
|
+
var array = self.heads.filter('.stepy-active').attr('id').split('-'), // TODO: try keep the number in an attribute.
|
78
|
+
current = parseInt(array[array.length - 1], 10),
|
79
|
+
clicked = $(this).index();
|
80
|
+
|
81
|
+
if (clicked > current) {
|
82
|
+
if (self.opt.next && !methods._execute.call(that, self.opt.next, clicked)) {
|
83
|
+
return false;
|
84
|
+
}
|
85
|
+
} else if (clicked < current) {
|
86
|
+
if (self.opt.back && !methods._execute.call(that, self.opt.back, clicked)) {
|
87
|
+
return false;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
if (clicked != current) {
|
92
|
+
methods.step.call(self, (clicked) + 1);
|
93
|
+
}
|
94
|
+
});
|
95
|
+
} else {
|
96
|
+
self.heads.css('cursor', 'default');
|
97
|
+
}
|
98
|
+
|
99
|
+
if (self.opt.enter) {
|
100
|
+
methods._bindEnter.call(self);
|
101
|
+
}
|
102
|
+
|
103
|
+
self.steps.first().find(':input:visible:enabled').first().select().focus();
|
104
|
+
|
105
|
+
that.data({ 'settings': this.opt, 'stepy': true });
|
106
|
+
});
|
107
|
+
}, _bindEnter: function() {
|
108
|
+
var self = this;
|
109
|
+
|
110
|
+
self.steps.delegate('input[type="text"], input[type="password"]', 'keypress', function(evt) {
|
111
|
+
var key = (evt.keyCode ? evt.keyCode : evt.which);
|
112
|
+
|
113
|
+
if (key == 13) {
|
114
|
+
evt.preventDefault();
|
115
|
+
|
116
|
+
var buttons = $(this).closest('fieldset').find('.stepy-navigator');
|
117
|
+
|
118
|
+
if (buttons.length) {
|
119
|
+
var next = buttons.children('.button-next');
|
120
|
+
|
121
|
+
if (next.length) {
|
122
|
+
next.click();
|
123
|
+
} else if (self.finish) {
|
124
|
+
self.finish.click();
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
});
|
129
|
+
}, _bindFinish: function() {
|
130
|
+
var self = this,
|
131
|
+
that = $(this),
|
132
|
+
finish = that.children('input[type="submit"]');
|
133
|
+
|
134
|
+
self.finish = (finish.length === 1) ? finish : that.children('.stepy-finish');
|
135
|
+
|
136
|
+
if (self.finish.length) {
|
137
|
+
var isForm = that.is('form'),
|
138
|
+
onSubmit = undefined;
|
139
|
+
|
140
|
+
if (isForm && self.opt.finish) {
|
141
|
+
onSubmit = that.attr('onsubmit');
|
142
|
+
|
143
|
+
that.attr('onsubmit', 'return false;');
|
144
|
+
}
|
145
|
+
|
146
|
+
self.finish.on('click.stepy', function(evt) {
|
147
|
+
if (self.opt.finish && !methods._execute.call(that, self.opt.finish, self.steps.length - 1)) {
|
148
|
+
evt.preventDefault();
|
149
|
+
} else if (isForm) {
|
150
|
+
if (onSubmit) {
|
151
|
+
that.attr('onsubmit', onSubmit);
|
152
|
+
} else {
|
153
|
+
that.removeAttr('onsubmit');
|
154
|
+
}
|
155
|
+
|
156
|
+
var isSubmit = self.finish.attr('type') === 'submit';
|
157
|
+
|
158
|
+
if (!isSubmit && (!self.opt.validate || methods.validate.call(that, self.steps.length - 1))) {
|
159
|
+
that.submit();
|
160
|
+
}
|
161
|
+
}
|
162
|
+
});
|
163
|
+
|
164
|
+
self.steps.last().children('.stepy-navigator').append(self.finish);
|
165
|
+
} else {
|
166
|
+
$.error('Submit button or element with class "stepy-finish" missing!');
|
167
|
+
}
|
168
|
+
}, _createBackButton: function(nav, index) {
|
169
|
+
var self = this,
|
170
|
+
that = $(this),
|
171
|
+
attributes = { href: 'javascript:void(0);', 'class': 'button-back', html: self.opt.backLabel };
|
172
|
+
|
173
|
+
$('<a />', attributes).on('click.stepy', function() {
|
174
|
+
if (!self.opt.back || methods._execute.call(self, self.opt.back, index - 1)) {
|
175
|
+
methods.step.call(self, (index - 1) + 1);
|
176
|
+
}
|
177
|
+
}).appendTo(nav);
|
178
|
+
}, _createButtons: function(step, index) {
|
179
|
+
var nav = methods._navigator.call(this).appendTo(step);
|
180
|
+
|
181
|
+
if (index === 0) {
|
182
|
+
if (this.steps.length > 1) {
|
183
|
+
methods._createNextButton.call(this, nav, index);
|
184
|
+
}
|
185
|
+
} else {
|
186
|
+
$(step).hide();
|
187
|
+
|
188
|
+
methods._createBackButton.call(this, nav, index);
|
189
|
+
|
190
|
+
if (index < this.steps.length - 1) {
|
191
|
+
methods._createNextButton.call(this, nav, index);
|
192
|
+
}
|
193
|
+
}
|
194
|
+
}, _createHead: function(step, index) {
|
195
|
+
var step = $(step).attr('id', $(this).attr('id') + '-step-' + index).addClass('stepy-step'),
|
196
|
+
head = methods._head.call(this, index);
|
197
|
+
|
198
|
+
head.append(methods._title.call(this, step));
|
199
|
+
|
200
|
+
if (this.opt.description) {
|
201
|
+
head.append(methods._description.call(this, step));
|
202
|
+
}
|
203
|
+
|
204
|
+
this.header.append(head);
|
205
|
+
}, _createNextButton: function(nav, index) {
|
206
|
+
var self = this,
|
207
|
+
that = $(this),
|
208
|
+
attributes = { href: 'javascript:void(0);', 'class': 'button-next', html: self.opt.nextLabel };
|
209
|
+
|
210
|
+
$('<a/>', attributes).on('click.stepy', function() {
|
211
|
+
if (!self.opt.next || methods._execute.call(that, self.opt.next, index + 1)) {
|
212
|
+
methods.step.call(self, (index + 1) + 1);
|
213
|
+
}
|
214
|
+
}).appendTo(nav);
|
215
|
+
}, _description: function(step) {
|
216
|
+
var legend = step.children('legend');
|
217
|
+
|
218
|
+
if (!this.opt.legend) {
|
219
|
+
legend.hide();
|
220
|
+
}
|
221
|
+
|
222
|
+
if (legend.length) {
|
223
|
+
return $('<span />', { html: legend.html() });
|
224
|
+
}
|
225
|
+
|
226
|
+
methods._error.call(this, '<legend /> element missing!');
|
227
|
+
}, _error: function(message) {
|
228
|
+
$(this).html(message);
|
229
|
+
|
230
|
+
$.error(message);
|
231
|
+
}, _execute: function(callback, index) {
|
232
|
+
var isValid = callback.call(this, index + 1);
|
233
|
+
|
234
|
+
return isValid || isValid === undefined;
|
235
|
+
}, _hash: function() {
|
236
|
+
this.hash = 'stepy-' + Math.random().toString().substring(2)
|
237
|
+
|
238
|
+
return this.hash;
|
239
|
+
}, _head: function(index) {
|
240
|
+
return $('<li />', { id: $(this).attr('id') + '-head-' + index });
|
241
|
+
}, _header: function() {
|
242
|
+
var header = $('<ul />', { id: $(this).attr('id') + '-header', 'class': 'stepy-header' });
|
243
|
+
|
244
|
+
if (this.opt.titleTarget) {
|
245
|
+
header.appendTo(this.opt.titleTarget);
|
246
|
+
} else {
|
247
|
+
header.insertBefore(this);
|
248
|
+
}
|
249
|
+
|
250
|
+
return header;
|
251
|
+
}, _navigator: function(index) {
|
252
|
+
return $('<p class="stepy-navigator" />');
|
253
|
+
}, _title: function(step) {
|
254
|
+
return $('<div />', { html: step.attr('title') || '--' });
|
255
|
+
}, destroy: function() {
|
256
|
+
return $(this).each(function() {
|
257
|
+
var that = $(this);
|
258
|
+
|
259
|
+
if (that.data('stepy')) {
|
260
|
+
var steps = that.data('stepy', false).children('fieldset').css('display', '');
|
261
|
+
|
262
|
+
that.children('.stepy-errors').remove();
|
263
|
+
this.finish.appendTo(steps.last());
|
264
|
+
steps.find('p.stepy-navigator').remove();
|
265
|
+
}
|
266
|
+
});
|
267
|
+
}, step: function(index) {
|
268
|
+
var self = this
|
269
|
+
that = $(this),
|
270
|
+
opt = that[0].opt;
|
271
|
+
|
272
|
+
index--;
|
273
|
+
|
274
|
+
var steps = that.children('fieldset');
|
275
|
+
|
276
|
+
if (index > steps.length - 1) {
|
277
|
+
index = steps.length - 1;
|
278
|
+
}
|
279
|
+
|
280
|
+
var max = index;
|
281
|
+
|
282
|
+
if (opt.validate) {
|
283
|
+
var isValid = true;
|
284
|
+
|
285
|
+
for (var i = 0; i < index; i++) {
|
286
|
+
isValid &= methods.validate.call(this, i);
|
287
|
+
|
288
|
+
if (opt.block && !isValid) {
|
289
|
+
max = i;
|
290
|
+
break;
|
291
|
+
}
|
292
|
+
}
|
293
|
+
}
|
294
|
+
|
295
|
+
if (opt.transition == 'fade') {
|
296
|
+
var stepsCount = steps.length;
|
297
|
+
|
298
|
+
steps.fadeOut(opt.duration, function(){
|
299
|
+
if (--stepsCount > 0) {
|
300
|
+
return;
|
301
|
+
}
|
302
|
+
|
303
|
+
steps.eq(max).fadeIn(opt.duration);
|
304
|
+
});
|
305
|
+
} else if (opt.transition == 'slide') {
|
306
|
+
var stepsCount = steps.length;
|
307
|
+
|
308
|
+
steps.slideUp(opt.duration, function(){
|
309
|
+
if (--stepsCount > 0) {
|
310
|
+
return;
|
311
|
+
}
|
312
|
+
|
313
|
+
steps.eq(max).slideDown(opt.duration);
|
314
|
+
});
|
315
|
+
} else {
|
316
|
+
steps.hide(opt.duration).eq(max).show(opt.duration);
|
317
|
+
}
|
318
|
+
|
319
|
+
that[0].heads.removeClass('stepy-active').eq(max).addClass('stepy-active');
|
320
|
+
|
321
|
+
if (that.is('form')) {
|
322
|
+
var $fields = undefined;
|
323
|
+
|
324
|
+
if (max == index) {
|
325
|
+
$fields = steps.eq(max).find(':input:enabled:visible');
|
326
|
+
} else {
|
327
|
+
$fields = steps.eq(max).find('.error').select().focus();
|
328
|
+
}
|
329
|
+
|
330
|
+
$fields.first().select().focus();
|
331
|
+
}
|
332
|
+
|
333
|
+
if (opt.select) {
|
334
|
+
opt.select.call(this, max + 1);
|
335
|
+
}
|
336
|
+
|
337
|
+
return that;
|
338
|
+
}, validate: function(index) {
|
339
|
+
var that = $(this);
|
340
|
+
|
341
|
+
if (!that.is('form')) {
|
342
|
+
return true;
|
343
|
+
}
|
344
|
+
|
345
|
+
var self = this,
|
346
|
+
step = that.children('fieldset').eq(index),
|
347
|
+
isValid = true,
|
348
|
+
$title = $('#' + that.attr('id') + '-header').children().eq(index),
|
349
|
+
$validate = that.validate();
|
350
|
+
|
351
|
+
$(step.find(':input:enabled').get().reverse()).each(function() {
|
352
|
+
var fieldIsValid = $validate.element($(this));
|
353
|
+
|
354
|
+
if (fieldIsValid === undefined) {
|
355
|
+
fieldIsValid = true;
|
356
|
+
}
|
357
|
+
|
358
|
+
isValid &= fieldIsValid;
|
359
|
+
|
360
|
+
if (isValid) {
|
361
|
+
if (self.opt.errorImage) {
|
362
|
+
$title.removeClass('stepy-error');
|
363
|
+
}
|
364
|
+
} else {
|
365
|
+
if (self.opt.errorImage) {
|
366
|
+
$title.addClass('stepy-error');
|
367
|
+
}
|
368
|
+
|
369
|
+
$validate.focusInvalid();
|
370
|
+
}
|
371
|
+
});
|
372
|
+
|
373
|
+
return isValid;
|
374
|
+
}
|
375
|
+
};
|
376
|
+
|
377
|
+
$.fn.stepy = function(method) {
|
378
|
+
if (methods[method]) {
|
379
|
+
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
380
|
+
} else if (typeof method === 'object' || !method) {
|
381
|
+
return methods.init.apply(this, arguments);
|
382
|
+
} else {
|
383
|
+
$.error('Method ' + method + ' does not exist!');
|
384
|
+
}
|
385
|
+
};
|
386
|
+
|
387
|
+
$.fn.stepy.defaults = {
|
388
|
+
back : undefined,
|
389
|
+
backLabel : '< Back',
|
390
|
+
block : false,
|
391
|
+
description : true,
|
392
|
+
duration : 0,
|
393
|
+
enter : true,
|
394
|
+
errorImage : false,
|
395
|
+
finish : undefined,
|
396
|
+
finishButton : true,
|
397
|
+
ignore : '',
|
398
|
+
legend : true,
|
399
|
+
next : undefined,
|
400
|
+
nextLabel : 'Next >',
|
401
|
+
select : undefined,
|
402
|
+
titleClick : false,
|
403
|
+
titleTarget : undefined,
|
404
|
+
transition : 'hide',
|
405
|
+
validate : false
|
406
|
+
};
|
407
|
+
|
408
|
+
})(jQuery);
|