ask 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +2 -0
- data/app/assets/javascripts/ask.js.coffee +54 -0
- data/app/assets/stylesheets/{ask/forms.css.sass → ask.css.sass} +0 -0
- data/app/views/answerer/_form.html.haml +1 -3
- data/lib/ask/version.rb +1 -1
- data/lib/assets/javascripts/jquery.handle-nesting.js.coffee +73 -0
- metadata +17 -20
- data/app/assets/javascripts/ask.js +0 -2
- data/app/assets/javascripts/ask/forms.js +0 -100
- data/app/assets/stylesheets/ask.css +0 -4
- data/app/assets/stylesheets/ask/submissions.css.sass +0 -60
- data/lib/assets/javascripts/jquery.handle-nesting.js +0 -113
data/README.markdown
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
#= require jquery.handle-nesting
|
2
|
+
|
3
|
+
$(document).ready ->
|
4
|
+
handleChoiceNesting = (container) ->
|
5
|
+
$(container).find("ul.choices").handleNesting
|
6
|
+
nameMatch: /(.*\[)[0-9]+(\].*)/
|
7
|
+
nameReplace: "$1{NEW_ID}$2"
|
8
|
+
afterAdd: (added) ->
|
9
|
+
insertDeleteButtons added.parent(), ".choice"
|
10
|
+
|
11
|
+
updateChoiceVisibility = (select) ->
|
12
|
+
if select.val() == "ChooseOneQuestion" or select.val() == "ChecklistQuestion"
|
13
|
+
select.parents("dl").find("dd.choices:hidden").slideDown "fast"
|
14
|
+
else
|
15
|
+
select.parents("dl").find("dd.choices:visible").slideUp "fast"
|
16
|
+
|
17
|
+
bindTypeChange = (select) ->
|
18
|
+
select.change ->
|
19
|
+
updateChoiceVisibility $(this)
|
20
|
+
|
21
|
+
insertDeleteButtons = (container, selector) ->
|
22
|
+
container.find(selector).each ->
|
23
|
+
if $(this).children("button.remove").length == 0
|
24
|
+
$("<button type=\"button\" class=\"remove\">Remove</button>").click(->
|
25
|
+
$(this).parents(selector).fadeOut "fast", ->
|
26
|
+
$(this).remove()
|
27
|
+
container.find("button.remove:last").remove() if container.find(selector).length == 1
|
28
|
+
|
29
|
+
false
|
30
|
+
).appendTo $(this)
|
31
|
+
|
32
|
+
makeSortable = ->
|
33
|
+
questions = $("form ul.ask.questions")
|
34
|
+
questions.sortable stop: (event, ui) ->
|
35
|
+
order = 1
|
36
|
+
questions.find(".position-wrapper").each ->
|
37
|
+
$(this).find("input").val order
|
38
|
+
order++
|
39
|
+
|
40
|
+
selects = $("dd.type > select")
|
41
|
+
bindTypeChange selects
|
42
|
+
selects.each ->
|
43
|
+
updateChoiceVisibility $(this)
|
44
|
+
|
45
|
+
makeSortable()
|
46
|
+
if jQuery.fn.handleNesting
|
47
|
+
$("form ul.ask.questions").handleNesting afterAdd: (added) ->
|
48
|
+
handleChoiceNesting added
|
49
|
+
insertDeleteButtons added.parent(), ".question"
|
50
|
+
bindTypeChange added.find("dd.type > select")
|
51
|
+
makeSortable()
|
52
|
+
|
53
|
+
$("form ul.ask.questions").children("li").each (i, li) ->
|
54
|
+
handleChoiceNesting li
|
File without changes
|
@@ -9,11 +9,9 @@
|
|
9
9
|
-else
|
10
10
|
=a.hidden_field(:question_id, :value=>question.id)
|
11
11
|
-if question.name != last_question.name
|
12
|
-
%dt
|
12
|
+
%dt{:class => question.required?? 'required' : nil}
|
13
13
|
=question_label(question, a)
|
14
14
|
=question_instructions(question)
|
15
|
-
-if question.required
|
16
|
-
%strong{:style=>"color:red;"} *
|
17
15
|
-case(question.type.to_sym)
|
18
16
|
|
19
17
|
-when :TextQuestion
|
data/lib/ask/version.rb
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
(($) ->
|
2
|
+
$.HandleNesting = (el, options) ->
|
3
|
+
base = this
|
4
|
+
base.$el = $(el)
|
5
|
+
base.el = el
|
6
|
+
base.items = []
|
7
|
+
base.blank = null
|
8
|
+
base.$el.data "HandleNesting", base
|
9
|
+
base.init = ->
|
10
|
+
base.options = $.extend({}, $.HandleNesting.defaultOptions, options)
|
11
|
+
base.items = base.$el.children("li")
|
12
|
+
base.blank = $(base.items[base.items.length - 1]).clone() if base.items.length
|
13
|
+
base.addButtons()
|
14
|
+
|
15
|
+
base.addButtons = ->
|
16
|
+
base.addAddButton()
|
17
|
+
base.items.each (i, item) ->
|
18
|
+
base.addRemoveButton item
|
19
|
+
|
20
|
+
base.addAddButton = ->
|
21
|
+
addButton = $("<button type=\"button\"/>").addClass("add").text("Add")
|
22
|
+
addButton.click ->
|
23
|
+
base.add()
|
24
|
+
|
25
|
+
base.$el.after addButton
|
26
|
+
|
27
|
+
base.addRemoveButton = (item) ->
|
28
|
+
destroys = $(item).find("input[name*=_destroy]")
|
29
|
+
destroys.each (i, destroy) ->
|
30
|
+
if $(item).find("button.remove").length == 0
|
31
|
+
removeButton = $("<button type=\"button\"/>").addClass("remove").text("Remove")
|
32
|
+
removeButton.click ->
|
33
|
+
base.remove this
|
34
|
+
|
35
|
+
$(item).append removeButton
|
36
|
+
$(destroy).hide()
|
37
|
+
$(item).find("label[for=" + $(destroy).attr("id") + "]").hide()
|
38
|
+
|
39
|
+
base.add = ->
|
40
|
+
newId = new Date().getTime()
|
41
|
+
match = base.options.nameMatch
|
42
|
+
replace = base.options.nameReplace.replace(/{NEW_ID}/g, newId)
|
43
|
+
base.options.beforeAdd() if base.options.beforeAdd?
|
44
|
+
added = base.blank.clone().hide()
|
45
|
+
added.find("*").each (i, el) ->
|
46
|
+
$(el).attr "id", null
|
47
|
+
|
48
|
+
added.find("input, select, textarea").each (i, el) ->
|
49
|
+
$(el).val ""
|
50
|
+
el.name = el.name.replace(match, replace)
|
51
|
+
|
52
|
+
base.$el.append added
|
53
|
+
base.options.afterAdd added if base.options.afterAdd?
|
54
|
+
added.fadeIn "fast"
|
55
|
+
|
56
|
+
base.remove = (item) ->
|
57
|
+
li = $(item).closest("li")
|
58
|
+
li.find("input[name*=_destroy]").val 1
|
59
|
+
li.find("input:checkbox[name*=_destroy]").attr "checked", "checked"
|
60
|
+
li.fadeOut "fast"
|
61
|
+
|
62
|
+
base.init()
|
63
|
+
|
64
|
+
$.HandleNesting.defaultOptions =
|
65
|
+
nameMatch: /\[[0-9]+\]/
|
66
|
+
nameReplace: "[{NEW_ID}]"
|
67
|
+
beforeAdd: null
|
68
|
+
afterAdd: null
|
69
|
+
|
70
|
+
$.fn.handleNesting = (options) ->
|
71
|
+
@each ->
|
72
|
+
new $.HandleNesting(this, options)
|
73
|
+
) jQuery
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ask
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &83997780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *83997780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: haml
|
27
|
-
requirement: &
|
27
|
+
requirement: &83996340 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.0.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *83996340
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: acts_as_list
|
38
|
-
requirement: &
|
38
|
+
requirement: &83994780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.1.2
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *83994780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rails_autolink
|
49
|
-
requirement: &
|
49
|
+
requirement: &84345040 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.0.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *84345040
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jquery-rails
|
60
|
-
requirement: &
|
60
|
+
requirement: &84344500 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *84344500
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
|
-
requirement: &
|
71
|
+
requirement: &84342650 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *84342650
|
80
80
|
description: Allow your site's maintainers to easily create forms.
|
81
81
|
email:
|
82
82
|
- adam@obledesign.com
|
@@ -84,13 +84,10 @@ executables: []
|
|
84
84
|
extensions: []
|
85
85
|
extra_rdoc_files: []
|
86
86
|
files:
|
87
|
-
- app/assets/javascripts/ask
|
88
|
-
- app/assets/javascripts/ask.js
|
87
|
+
- app/assets/javascripts/ask.js.coffee
|
89
88
|
- app/assets/images/add.png
|
90
89
|
- app/assets/images/delete.png
|
91
|
-
- app/assets/stylesheets/ask
|
92
|
-
- app/assets/stylesheets/ask/forms.css.sass
|
93
|
-
- app/assets/stylesheets/ask.css
|
90
|
+
- app/assets/stylesheets/ask.css.sass
|
94
91
|
- app/models/choose_one_question.rb
|
95
92
|
- app/models/question.rb
|
96
93
|
- app/models/choice.rb
|
@@ -111,7 +108,7 @@ files:
|
|
111
108
|
- lib/ask/version.rb
|
112
109
|
- lib/ask/engine.rb
|
113
110
|
- lib/ask/acts_as_asker.rb
|
114
|
-
- lib/assets/javascripts/jquery.handle-nesting.js
|
111
|
+
- lib/assets/javascripts/jquery.handle-nesting.js.coffee
|
115
112
|
- lib/ask.rb
|
116
113
|
- MIT-LICENSE
|
117
114
|
- Rakefile
|
@@ -1,100 +0,0 @@
|
|
1
|
-
$(document).ready(function()
|
2
|
-
{
|
3
|
-
var handleChoiceNesting = function(container)
|
4
|
-
{
|
5
|
-
$(container).find('ul.choices').handleNesting({
|
6
|
-
nameMatch: /(.*\[)[0-9]+(\].*)/,
|
7
|
-
nameReplace: '$1{NEW_ID}$2',
|
8
|
-
afterAdd: function(added)
|
9
|
-
{
|
10
|
-
insertDeleteButtons(added.parent(), ".choice");
|
11
|
-
}
|
12
|
-
});
|
13
|
-
}
|
14
|
-
|
15
|
-
var updateChoiceVisibility = function(select)
|
16
|
-
{
|
17
|
-
if (select.val() == "ChooseOneQuestion" || select.val() == "ChecklistQuestion")
|
18
|
-
select.parents("dl").find("dd.choices:hidden").slideDown("fast");
|
19
|
-
else
|
20
|
-
select.parents("dl").find("dd.choices:visible").slideUp("fast");
|
21
|
-
}
|
22
|
-
|
23
|
-
var bindTypeChange = function(select)
|
24
|
-
{
|
25
|
-
select.change(function()
|
26
|
-
{
|
27
|
-
updateChoiceVisibility($(this));
|
28
|
-
});
|
29
|
-
}
|
30
|
-
|
31
|
-
var insertDeleteButtons = function(container, selector)
|
32
|
-
{
|
33
|
-
container.find(selector).each(function()
|
34
|
-
{
|
35
|
-
// Add a delete button if there isn't one already
|
36
|
-
if ($(this).children("button.remove").length == 0)
|
37
|
-
{
|
38
|
-
$("<button type=\"button\" class=\"remove\">Remove</button>").click(function()
|
39
|
-
{
|
40
|
-
$(this).parents(selector).fadeOut("fast", function()
|
41
|
-
{
|
42
|
-
$(this).remove();
|
43
|
-
// If there's only one option left, remove the delete button
|
44
|
-
if (container.find(selector).length == 1)
|
45
|
-
container.find("button.remove:last").remove();
|
46
|
-
});
|
47
|
-
|
48
|
-
return false;
|
49
|
-
}).appendTo($(this));
|
50
|
-
}
|
51
|
-
});
|
52
|
-
}
|
53
|
-
|
54
|
-
var makeSortable = function()
|
55
|
-
{
|
56
|
-
var questions = $("form ul.ask.questions");
|
57
|
-
questions.sortable(
|
58
|
-
{
|
59
|
-
stop: function(event, ui)
|
60
|
-
{
|
61
|
-
var order = 1;
|
62
|
-
questions.find(".position-wrapper").each(function()
|
63
|
-
{
|
64
|
-
$(this).find("input").val(order);
|
65
|
-
order ++;
|
66
|
-
});
|
67
|
-
}
|
68
|
-
});
|
69
|
-
}
|
70
|
-
|
71
|
-
var selects = $("dd.type > select");
|
72
|
-
|
73
|
-
bindTypeChange(selects);
|
74
|
-
|
75
|
-
selects.each(function()
|
76
|
-
{
|
77
|
-
updateChoiceVisibility($(this));
|
78
|
-
});
|
79
|
-
|
80
|
-
makeSortable();
|
81
|
-
|
82
|
-
if(jQuery.fn.handleNesting)
|
83
|
-
{
|
84
|
-
$('form ul.ask.questions').handleNesting({
|
85
|
-
afterAdd: function(added)
|
86
|
-
{
|
87
|
-
handleChoiceNesting(added);
|
88
|
-
insertDeleteButtons(added.parent(), ".question");
|
89
|
-
bindTypeChange(added.find("dd.type > select"));
|
90
|
-
makeSortable();
|
91
|
-
}
|
92
|
-
});
|
93
|
-
}
|
94
|
-
|
95
|
-
$('form ul.ask.questions').children('li').each(function(i,li)
|
96
|
-
{
|
97
|
-
handleChoiceNesting(li);
|
98
|
-
});
|
99
|
-
|
100
|
-
});
|
@@ -1,60 +0,0 @@
|
|
1
|
-
#page
|
2
|
-
|
3
|
-
&.submissions.show
|
4
|
-
dd
|
5
|
-
padding-left: 10px
|
6
|
-
|
7
|
-
&.application_forms, &.reference_forms, &.interview_forms
|
8
|
-
&.show
|
9
|
-
#wrapperContent
|
10
|
-
#content
|
11
|
-
background-image: url(../images/preview.png)
|
12
|
-
background-position: top right
|
13
|
-
background-repeat: no-repeat
|
14
|
-
|
15
|
-
#content
|
16
|
-
|
17
|
-
h3.section
|
18
|
-
margin-top: 40px
|
19
|
-
border-bottom: solid 1px #ccc
|
20
|
-
|
21
|
-
.instructions
|
22
|
-
display: block
|
23
|
-
font-style: italic
|
24
|
-
font-weight: normal
|
25
|
-
|
26
|
-
dt
|
27
|
-
|
28
|
-
.instructions
|
29
|
-
margin: 5px 0
|
30
|
-
color: #333
|
31
|
-
font-size: 10pt
|
32
|
-
|
33
|
-
|
34
|
-
input[type=text], textarea
|
35
|
-
width: 400px
|
36
|
-
|
37
|
-
textarea
|
38
|
-
height: 100px
|
39
|
-
|
40
|
-
h2
|
41
|
-
border-bottom: solid 1px #ccc
|
42
|
-
|
43
|
-
dt, dd
|
44
|
-
font-size: 11pt
|
45
|
-
|
46
|
-
dt
|
47
|
-
padding-top: 10px
|
48
|
-
letter-spacing: -.05em
|
49
|
-
|
50
|
-
#contentAside
|
51
|
-
a
|
52
|
-
&.csv, &.table
|
53
|
-
padding-left: 24px
|
54
|
-
font-size: 10pt
|
55
|
-
font-weight: bold
|
56
|
-
text-decoration: none
|
57
|
-
&.csv
|
58
|
-
background: url(../images/csv.png) 5px center no-repeat
|
59
|
-
&.table
|
60
|
-
background: url(../images/table.png) 5px center no-repeat
|
@@ -1,113 +0,0 @@
|
|
1
|
-
(function($){
|
2
|
-
$.HandleNesting = function(el, options){
|
3
|
-
// To avoid scope issues, use 'base' instead of 'this'
|
4
|
-
// to reference this class from internal events and functions.
|
5
|
-
var base = this;
|
6
|
-
|
7
|
-
// Access to jQuery and DOM versions of element
|
8
|
-
base.$el = $(el);
|
9
|
-
base.el = el;
|
10
|
-
base.items = [];
|
11
|
-
base.blank = null;
|
12
|
-
|
13
|
-
// Add a reverse reference to the DOM object
|
14
|
-
base.$el.data("HandleNesting", base);
|
15
|
-
|
16
|
-
base.init = function(){
|
17
|
-
|
18
|
-
base.options = $.extend({},$.HandleNesting.defaultOptions, options);
|
19
|
-
|
20
|
-
base.items = base.$el.children('li');
|
21
|
-
if(base.items.length) {
|
22
|
-
base.blank = $(base.items[base.items.length-1]).clone();
|
23
|
-
}
|
24
|
-
|
25
|
-
base.addButtons();
|
26
|
-
|
27
|
-
};
|
28
|
-
|
29
|
-
base.addButtons = function() {
|
30
|
-
base.addAddButton();
|
31
|
-
base.items.each(function(i,item) { base.addRemoveButton(item); })
|
32
|
-
};
|
33
|
-
|
34
|
-
base.addAddButton = function() {
|
35
|
-
var addButton = $('<button type="button"/>').addClass('add').text('Add');
|
36
|
-
addButton.click(function() { base.add(); });
|
37
|
-
base.$el.after(addButton);
|
38
|
-
}
|
39
|
-
|
40
|
-
base.addRemoveButton = function(item) {
|
41
|
-
|
42
|
-
var destroys = $(item).find('input[name*=_destroy]')
|
43
|
-
|
44
|
-
destroys.each(function(i,destroy) {
|
45
|
-
|
46
|
-
if($(item).find('button.remove').length == 0) {
|
47
|
-
var removeButton = $('<button type="button"/>').addClass('remove').text('Remove');
|
48
|
-
removeButton.click(function() { base.remove(this); });
|
49
|
-
$(item).append(removeButton);
|
50
|
-
}
|
51
|
-
|
52
|
-
$(destroy).hide();
|
53
|
-
$(item).find('label[for='+$(destroy).attr('id')+']').hide();
|
54
|
-
|
55
|
-
});
|
56
|
-
}
|
57
|
-
|
58
|
-
base.add = function() {
|
59
|
-
|
60
|
-
var newId = new Date().getTime();
|
61
|
-
var match = base.options.nameMatch;
|
62
|
-
var replace = base.options.nameReplace.replace(/{NEW_ID}/g, newId);
|
63
|
-
|
64
|
-
if(base.options.beforeAdd != null) {
|
65
|
-
base.options.beforeAdd();
|
66
|
-
}
|
67
|
-
|
68
|
-
var added = base.blank.clone().hide();
|
69
|
-
|
70
|
-
added.find('*').each(function(i, el) {
|
71
|
-
$(el).attr('id', null);
|
72
|
-
});
|
73
|
-
|
74
|
-
added.find('input, select, textarea').each(function(i, el) {
|
75
|
-
$(el).val('');
|
76
|
-
el.name = el.name.replace(match, replace);
|
77
|
-
});
|
78
|
-
|
79
|
-
base.$el.append(added);
|
80
|
-
|
81
|
-
if(base.options.afterAdd != null) {
|
82
|
-
base.options.afterAdd(added);
|
83
|
-
}
|
84
|
-
|
85
|
-
added.fadeIn("fast");
|
86
|
-
|
87
|
-
}
|
88
|
-
|
89
|
-
base.remove = function(item) {
|
90
|
-
var li = $(item).closest('li');
|
91
|
-
li.find('input[name*=_destroy]').val(1);
|
92
|
-
li.find('input:checkbox[name*=_destroy]').attr('checked', 'checked');
|
93
|
-
li.fadeOut("fast");//, function() { $(this).remove() });
|
94
|
-
}
|
95
|
-
|
96
|
-
// Run initializer
|
97
|
-
base.init();
|
98
|
-
};
|
99
|
-
|
100
|
-
$.HandleNesting.defaultOptions = {
|
101
|
-
nameMatch: /\[[0-9]+\]/,
|
102
|
-
nameReplace: '[{NEW_ID}]',
|
103
|
-
beforeAdd: null,
|
104
|
-
afterAdd: null
|
105
|
-
};
|
106
|
-
|
107
|
-
$.fn.handleNesting = function(options){
|
108
|
-
return this.each(function(){
|
109
|
-
(new $.HandleNesting(this, options));
|
110
|
-
});
|
111
|
-
};
|
112
|
-
|
113
|
-
})(jQuery);
|