parlement 0.5 → 0.6
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/CHANGES +26 -0
- data/README +2 -1
- data/app/controllers/account_controller.rb +27 -18
- data/app/controllers/application.rb +1 -3
- data/app/controllers/elt_controller.rb +92 -42
- data/app/helpers/elt_helper.rb +7 -18
- data/app/models/elt.rb +76 -22
- data/app/models/mail.rb +13 -10
- data/app/models/mail_notify.rb +11 -27
- data/app/models/person.rb +1 -1
- data/app/views/account/_login.rhtml +14 -9
- data/app/views/account/_show.rhtml +23 -9
- data/app/views/elt/_choice.rhtml +32 -0
- data/app/views/elt/_elt.rhtml +90 -78
- data/app/views/elt/_list.rhtml +83 -50
- data/app/views/elt/_listByDate.rhtml +60 -0
- data/app/views/elt/_listByVote.rhtml +71 -0
- data/app/views/elt/choices.rhtml +29 -0
- data/app/views/elt/new.rhtml +11 -26
- data/app/views/elt/rss.rxml +14 -12
- data/app/views/elt/show.rhtml +23 -29
- data/app/views/elt/vote_rss.rxml +40 -0
- data/app/views/layouts/top.rhtml +5 -13
- data/config/environment.rb +3 -1
- data/config/routes.rb +4 -0
- data/db/development_structure.sql +5 -2
- data/db/migrate/002_nested_set.rb +22 -0
- data/db/migrate/003_elt_children_count.rb +12 -0
- data/public/images/ParlementLogo.png +0 -0
- data/public/images/indicator.gif +0 -0
- data/public/javascripts/behaviour.js +254 -0
- data/public/javascripts/mybehaviour.js +96 -0
- data/public/javascripts/slider.js +188 -163
- data/test/fixtures/elts.yml +19 -0
- data/test/fixtures/mail/mail_ruby +4 -0
- data/test/fixtures/mail/mail_rubyChild +1 -1
- data/test/fixtures/mail/mail_rubyChild2 +1 -1
- data/test/functional/account_controller_test.rb +24 -0
- data/test/functional/elt_controller_test.rb +64 -4
- data/test/unit/elt_test.rb +28 -4
- data/test/unit/mail_notify_test.rb +7 -5
- data/test/unit/mail_test.rb +1 -1
- data/vendor/plugins/google_analytics/README +19 -0
- data/vendor/plugins/google_analytics/Rakefile +22 -0
- data/vendor/plugins/google_analytics/init.rb +3 -0
- data/vendor/plugins/google_analytics/lib/rubaidh/google_analytics.rb +70 -0
- data/vendor/plugins/google_analytics/test/google_analytics_test.rb +8 -0
- data/vendor/plugins/output_compression/README +4 -0
- data/vendor/plugins/output_compression/Rakefile +22 -0
- data/vendor/plugins/output_compression/init.rb +2 -0
- data/vendor/plugins/output_compression/lib/output_compression.rb +66 -0
- data/vendor/plugins/output_compression/tasks/output_compression_tasks.rake +4 -0
- data/vendor/plugins/output_compression/test/output_compression_test.rb +8 -0
- metadata +32 -4
- data/public/images/smile.svg +0 -257
- data/public/javascripts/borders.js +0 -687
@@ -0,0 +1,96 @@
|
|
1
|
+
var myrules = {
|
2
|
+
/*
|
3
|
+
* Possibility to open and close elements
|
4
|
+
*
|
5
|
+
* Two things:
|
6
|
+
* - an opening or closing will open or close all sub elements
|
7
|
+
* - an opened element contained by a closed element will be closed if any
|
8
|
+
* sub element is also closed (due to technical limitations)
|
9
|
+
*/
|
10
|
+
'.eltSub' : function(elt) {
|
11
|
+
}
|
12
|
+
};
|
13
|
+
|
14
|
+
//Behaviour.register(myrules);
|
15
|
+
|
16
|
+
function setKnobs(elt) {
|
17
|
+
var knobOpened = document.createElement("a");
|
18
|
+
Element.addClassName(knobOpened, "knobOpened");
|
19
|
+
knobOpened.href = "#";
|
20
|
+
knobOpened.appendChild(document.createTextNode("V"));
|
21
|
+
|
22
|
+
var knobClosed = document.createElement("a");
|
23
|
+
Element.addClassName(knobClosed, "knobClosed");
|
24
|
+
knobClosed.href = "#";
|
25
|
+
knobClosed.appendChild(document.createTextNode(">"));
|
26
|
+
|
27
|
+
elt.insertBefore(knobOpened, elt.firstChild);
|
28
|
+
elt.insertBefore(knobClosed, elt.firstChild);
|
29
|
+
|
30
|
+
knobOpened.onclick = function() { return closeElt(elt); }
|
31
|
+
knobClosed.onclick = function() { return openElt(elt); }
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
function closeElt(elt) {
|
36
|
+
Element.addClassName(elt, "closed");
|
37
|
+
Element.removeClassName(elt, "opened");
|
38
|
+
|
39
|
+
$A(document.getElementsByClassName("opened", elt)).each( function(e) {
|
40
|
+
Element.removeClassName(e, "opened");
|
41
|
+
});
|
42
|
+
$A(document.getElementsByClassName("closed", elt)).each( function(e) {
|
43
|
+
Element.removeClassName(e, "closed");
|
44
|
+
});
|
45
|
+
|
46
|
+
var openedParent = false;
|
47
|
+
var current = elt;
|
48
|
+
while (!openedParent && document != (current = current.parentNode)) {
|
49
|
+
openedParent = Element.hasClassName(current, 'opened');
|
50
|
+
}
|
51
|
+
if (openedParent) {
|
52
|
+
Element.removeClassName(current, "opened");
|
53
|
+
Element.removeClassName(elt, "closed");
|
54
|
+
}
|
55
|
+
return false;
|
56
|
+
}
|
57
|
+
|
58
|
+
function openElt(elt) {
|
59
|
+
var closedParent = false;
|
60
|
+
var current = elt;
|
61
|
+
while (!closedParent && document != (current = current.parentNode)) {
|
62
|
+
closedParent = Element.hasClassName(current, 'closed');
|
63
|
+
}
|
64
|
+
if (closedParent) {
|
65
|
+
Element.addClassName(elt, "opened");
|
66
|
+
}
|
67
|
+
|
68
|
+
Element.removeClassName(elt, "closed");
|
69
|
+
$A(document.getElementsByClassName("opened", elt)).each( function(e) {
|
70
|
+
Element.removeClassName(e, "opened");
|
71
|
+
});
|
72
|
+
$A(document.getElementsByClassName("closed", elt)).each( function(e) {
|
73
|
+
Element.removeClassName(e, "closed");
|
74
|
+
});
|
75
|
+
return false;
|
76
|
+
}
|
77
|
+
|
78
|
+
function resetChoices() {
|
79
|
+
$A(document.getElementsByClassName('selected', document.body)).each( function(choice) {
|
80
|
+
Element.removeClassName(choice, 'selected');
|
81
|
+
});
|
82
|
+
}
|
83
|
+
|
84
|
+
function updateChoices(choices) {
|
85
|
+
$A(document.getElementsByClassName('con', document.body)).each( function(choice) {
|
86
|
+
if (choices[choice.parentNode.parentNode.parentNode.id] == "-1") {
|
87
|
+
Element.addClassName(choice, 'selected');
|
88
|
+
}
|
89
|
+
});
|
90
|
+
$A(document.getElementsByClassName('pro', document.body)).each( function(choice) {
|
91
|
+
if (choices[choice.parentNode.parentNode.parentNode.id] == "1") {
|
92
|
+
Element.addClassName(choice, 'selected');
|
93
|
+
}
|
94
|
+
});
|
95
|
+
}
|
96
|
+
|
@@ -1,184 +1,251 @@
|
|
1
|
-
// Copyright (c) 2005 Marty Haught
|
1
|
+
// Copyright (c) 2005 Marty Haught, Thomas Fuchs
|
2
|
+
//
|
3
|
+
// See http://script.aculo.us for more info
|
4
|
+
//
|
5
|
+
// Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
// a copy of this software and associated documentation files (the
|
7
|
+
// "Software"), to deal in the Software without restriction, including
|
8
|
+
// without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
// distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
// permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
// the following conditions:
|
2
12
|
//
|
3
|
-
//
|
13
|
+
// The above copyright notice and this permission notice shall be
|
14
|
+
// included in all copies or substantial portions of the Software.
|
15
|
+
//
|
16
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
4
23
|
|
5
24
|
if(!Control) var Control = {};
|
6
25
|
Control.Slider = Class.create();
|
7
26
|
|
8
27
|
// options:
|
9
28
|
// axis: 'vertical', or 'horizontal' (default)
|
10
|
-
// increment: (default: 1)
|
11
|
-
// step: (default: 1)
|
12
29
|
//
|
13
30
|
// callbacks:
|
14
31
|
// onChange(value)
|
15
32
|
// onSlide(value)
|
16
33
|
Control.Slider.prototype = {
|
17
34
|
initialize: function(handle, track, options) {
|
18
|
-
|
35
|
+
var slider = this;
|
36
|
+
|
37
|
+
if(handle instanceof Array) {
|
38
|
+
this.handles = handle.collect( function(e) { return $(e) });
|
39
|
+
} else {
|
40
|
+
this.handles = [$(handle)];
|
41
|
+
}
|
42
|
+
|
19
43
|
this.track = $(track);
|
20
|
-
|
21
44
|
this.options = options || {};
|
22
45
|
|
23
46
|
this.axis = this.options.axis || 'horizontal';
|
24
47
|
this.increment = this.options.increment || 1;
|
25
|
-
this.step = parseInt(this.options.step
|
26
|
-
this.
|
27
|
-
|
28
|
-
var defaultMaximum = Math.round(this.track.offsetWidth / this.increment);
|
29
|
-
if(this.isVertical()) defaultMaximum = Math.round(this.track.offsetHeight / this.increment);
|
48
|
+
this.step = parseInt(this.options.step || '1');
|
49
|
+
this.range = this.options.range || $R(0,1);
|
30
50
|
|
31
|
-
this.
|
32
|
-
this.
|
33
|
-
|
34
|
-
|
35
|
-
this.
|
36
|
-
this.alignY = parseInt (this.options.alignY) || 0;
|
37
|
-
|
38
|
-
// Zero out the slider position
|
39
|
-
this.setCurrentLeft(Position.cumulativeOffset(this.track)[0] - Position.cumulativeOffset(this.handle)[0] + this.alignX);
|
40
|
-
this.setCurrentTop(this.trackTop() - Position.cumulativeOffset(this.handle)[1] + this.alignY);
|
51
|
+
this.value = 0; // assure backwards compat
|
52
|
+
this.values = this.handles.map( function() { return 0 });
|
53
|
+
this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
|
54
|
+
this.options.startSpan = $(this.options.startSpan || null);
|
55
|
+
this.options.endSpan = $(this.options.endSpan || null);
|
41
56
|
|
42
|
-
this.
|
43
|
-
this.offsetY = 0;
|
57
|
+
this.restricted = this.options.restricted || false;
|
44
58
|
|
45
|
-
this.
|
46
|
-
this.
|
47
|
-
this.originalZ = parseInt(this.handle.style.zIndex || "0");
|
59
|
+
this.maximum = this.options.maximum || this.range.end;
|
60
|
+
this.minimum = this.options.minimum || this.range.start;
|
48
61
|
|
49
|
-
//
|
50
|
-
this.
|
62
|
+
// Will be used to align the handle onto the track, if necessary
|
63
|
+
this.alignX = parseInt(this.options.alignX || '0');
|
64
|
+
this.alignY = parseInt(this.options.alignY || '0');
|
65
|
+
|
66
|
+
this.trackLength = this.maximumOffset() - this.minimumOffset();
|
67
|
+
this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
|
51
68
|
|
52
69
|
this.active = false;
|
53
70
|
this.dragging = false;
|
54
71
|
this.disabled = false;
|
55
72
|
|
56
|
-
|
57
|
-
this.handleImage = $(this.options.handleImage) || false;
|
58
|
-
this.handleDisabled = this.options.handleDisabled || false;
|
59
|
-
this.handleEnabled = false;
|
60
|
-
if(this.handleImage)
|
61
|
-
this.handleEnabled = this.handleImage.src || false;
|
62
|
-
|
63
|
-
if(this.options.disabled)
|
64
|
-
this.setDisabled();
|
65
|
-
|
66
|
-
// Value Array
|
67
|
-
this.values = this.options.values || false; // Add method to validate and sort??
|
73
|
+
if(this.options.disabled) this.setDisabled();
|
68
74
|
|
69
|
-
|
75
|
+
// Allowed values array
|
76
|
+
this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
|
77
|
+
if(this.allowedValues) {
|
78
|
+
this.minimum = this.allowedValues.min();
|
79
|
+
this.maximum = this.allowedValues.max();
|
80
|
+
}
|
70
81
|
|
71
82
|
this.eventMouseDown = this.startDrag.bindAsEventListener(this);
|
72
83
|
this.eventMouseUp = this.endDrag.bindAsEventListener(this);
|
73
84
|
this.eventMouseMove = this.update.bindAsEventListener(this);
|
74
|
-
this.eventKeypress = this.keyPress.bindAsEventListener(this);
|
75
85
|
|
76
|
-
|
86
|
+
// Initialize handles in reverse (make sure first handle is active)
|
87
|
+
this.handles.each( function(h,i) {
|
88
|
+
i = slider.handles.length-1-i;
|
89
|
+
slider.setValue(parseFloat(
|
90
|
+
(slider.options.sliderValue instanceof Array ?
|
91
|
+
slider.options.sliderValue[i] : slider.options.sliderValue) ||
|
92
|
+
slider.range.start), i);
|
93
|
+
Element.makePositioned(h); // fix IE
|
94
|
+
Event.observe(h, "mousedown", slider.eventMouseDown);
|
95
|
+
});
|
96
|
+
|
97
|
+
Event.observe(this.track, "mousedown", this.eventMouseDown);
|
77
98
|
Event.observe(document, "mouseup", this.eventMouseUp);
|
78
99
|
Event.observe(document, "mousemove", this.eventMouseMove);
|
79
|
-
|
100
|
+
|
101
|
+
this.initialized = true;
|
80
102
|
},
|
81
103
|
dispose: function() {
|
82
|
-
|
104
|
+
var slider = this;
|
105
|
+
Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
|
83
106
|
Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
84
107
|
Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
85
|
-
|
108
|
+
this.handles.each( function(h) {
|
109
|
+
Event.stopObserving(h, "mousedown", slider.eventMouseDown);
|
110
|
+
});
|
86
111
|
},
|
87
112
|
setDisabled: function(){
|
88
113
|
this.disabled = true;
|
89
|
-
if(this.handleDisabled)
|
90
|
-
this.handleImage.src = this.handleDisabled;
|
91
114
|
},
|
92
115
|
setEnabled: function(){
|
93
116
|
this.disabled = false;
|
94
|
-
if(this.handleEnabled)
|
95
|
-
this.handleImage.src = this.handleEnabled;
|
96
117
|
},
|
97
|
-
currentLeft: function() {
|
98
|
-
return parseInt(this.handle.style.left || '0');
|
99
|
-
},
|
100
|
-
currentTop: function() {
|
101
|
-
return parseInt(this.handle.style.top || '0');
|
102
|
-
},
|
103
|
-
setCurrentLeft: function(left) {
|
104
|
-
this.handle.style.left = left +"px";
|
105
|
-
},
|
106
|
-
setCurrentTop: function(top) {
|
107
|
-
this.handle.style.top = top +"px";
|
108
|
-
},
|
109
|
-
trackLeft: function(){
|
110
|
-
return Position.cumulativeOffset(this.track)[0];
|
111
|
-
},
|
112
|
-
trackTop: function(){
|
113
|
-
return Position.cumulativeOffset(this.track)[1];
|
114
|
-
},
|
115
118
|
getNearestValue: function(value){
|
116
|
-
if(this.
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
119
|
+
if(this.allowedValues){
|
120
|
+
if(value >= this.allowedValues.max()) return(this.allowedValues.max());
|
121
|
+
if(value <= this.allowedValues.min()) return(this.allowedValues.min());
|
122
|
+
|
123
|
+
var offset = Math.abs(this.allowedValues[0] - value);
|
124
|
+
var newValue = this.allowedValues[0];
|
125
|
+
this.allowedValues.each( function(v) {
|
126
|
+
var currentOffset = Math.abs(v - value);
|
127
|
+
if(currentOffset <= offset){
|
128
|
+
newValue = v;
|
125
129
|
offset = currentOffset;
|
126
|
-
}
|
127
|
-
}
|
130
|
+
}
|
131
|
+
});
|
128
132
|
return newValue;
|
129
133
|
}
|
134
|
+
if(value > this.range.end) return this.range.end;
|
135
|
+
if(value < this.range.start) return this.range.start;
|
130
136
|
return value;
|
131
137
|
},
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
var offsetDiff = (sliderValue - (this.value||this.minimum)) * this.increment;
|
138
|
-
|
139
|
-
if(this.isVertical()){
|
140
|
-
this.setCurrentTop(offsetDiff + this.currentTop());
|
141
|
-
} else {
|
142
|
-
this.setCurrentLeft(offsetDiff + this.currentLeft());
|
138
|
+
setValue: function(sliderValue, handleIdx){
|
139
|
+
if(!this.active) {
|
140
|
+
this.activeHandle = this.handles[handleIdx];
|
141
|
+
this.activeHandleIdx = handleIdx;
|
142
|
+
this.updateStyles();
|
143
143
|
}
|
144
|
-
this.
|
145
|
-
this.
|
146
|
-
|
144
|
+
handleIdx = handleIdx || this.activeHandleIdx || 0;
|
145
|
+
if(this.initialized && this.restricted) {
|
146
|
+
if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
|
147
|
+
sliderValue = this.values[handleIdx-1];
|
148
|
+
if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
|
149
|
+
sliderValue = this.values[handleIdx+1];
|
150
|
+
}
|
151
|
+
sliderValue = this.getNearestValue(sliderValue);
|
152
|
+
this.values[handleIdx] = sliderValue;
|
153
|
+
this.value = this.values[0]; // assure backwards compat
|
154
|
+
|
155
|
+
this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
|
156
|
+
this.translateToPx(sliderValue);
|
157
|
+
|
158
|
+
this.drawSpans();
|
159
|
+
if(!this.dragging || !this.event) this.updateFinished();
|
160
|
+
},
|
161
|
+
setValueBy: function(delta, handleIdx) {
|
162
|
+
this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
|
163
|
+
handleIdx || this.activeHandleIdx || 0);
|
164
|
+
},
|
165
|
+
translateToPx: function(value) {
|
166
|
+
return Math.round(
|
167
|
+
((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
|
168
|
+
(value - this.range.start)) + "px";
|
169
|
+
},
|
170
|
+
translateToValue: function(offset) {
|
171
|
+
return ((offset/(this.trackLength-this.handleLength) *
|
172
|
+
(this.range.end-this.range.start)) + this.range.start);
|
173
|
+
},
|
174
|
+
getRange: function(range) {
|
175
|
+
var v = this.values.sortBy(Prototype.K);
|
176
|
+
range = range || 0;
|
177
|
+
return $R(v[range],v[range+1]);
|
178
|
+
},
|
147
179
|
minimumOffset: function(){
|
148
|
-
return(this.isVertical() ?
|
149
|
-
this.trackTop() + this.alignY :
|
150
|
-
this.trackLeft() + this.alignX);
|
180
|
+
return(this.isVertical() ? this.alignY : this.alignX);
|
151
181
|
},
|
152
182
|
maximumOffset: function(){
|
153
183
|
return(this.isVertical() ?
|
154
|
-
this.
|
155
|
-
this.trackLeft() + this.alignX + (this.maximum - this.minimum) * this.increment);
|
184
|
+
this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
|
156
185
|
},
|
157
186
|
isVertical: function(){
|
158
187
|
return (this.axis == 'vertical');
|
159
188
|
},
|
189
|
+
drawSpans: function() {
|
190
|
+
var slider = this;
|
191
|
+
if(this.spans)
|
192
|
+
$R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
|
193
|
+
if(this.options.startSpan)
|
194
|
+
this.setSpan(this.options.startSpan,
|
195
|
+
$R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
|
196
|
+
if(this.options.endSpan)
|
197
|
+
this.setSpan(this.options.endSpan,
|
198
|
+
$R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
|
199
|
+
},
|
200
|
+
setSpan: function(span, range) {
|
201
|
+
if(this.isVertical()) {
|
202
|
+
span.style.top = this.translateToPx(range.start);
|
203
|
+
span.style.height = this.translateToPx(range.end - range.start);
|
204
|
+
} else {
|
205
|
+
span.style.left = this.translateToPx(range.start);
|
206
|
+
span.style.width = this.translateToPx(range.end - range.start);
|
207
|
+
}
|
208
|
+
},
|
209
|
+
updateStyles: function() {
|
210
|
+
this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
|
211
|
+
Element.addClassName(this.activeHandle, 'selected');
|
212
|
+
},
|
160
213
|
startDrag: function(event) {
|
161
214
|
if(Event.isLeftClick(event)) {
|
162
215
|
if(!this.disabled){
|
163
216
|
this.active = true;
|
164
|
-
|
165
|
-
var
|
166
|
-
|
167
|
-
this.
|
168
|
-
|
169
|
-
|
217
|
+
|
218
|
+
var handle = Event.element(event);
|
219
|
+
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
220
|
+
if(handle==this.track) {
|
221
|
+
var offsets = Position.cumulativeOffset(this.track);
|
222
|
+
this.event = event;
|
223
|
+
this.setValue(this.translateToValue(
|
224
|
+
(this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
|
225
|
+
));
|
226
|
+
var offsets = Position.cumulativeOffset(this.activeHandle);
|
227
|
+
this.offsetX = (pointer[0] - offsets[0]);
|
228
|
+
this.offsetY = (pointer[1] - offsets[1]);
|
229
|
+
} else {
|
230
|
+
// find the handle (prevents issues with Safari)
|
231
|
+
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
|
232
|
+
handle = handle.parentNode;
|
233
|
+
|
234
|
+
this.activeHandle = handle;
|
235
|
+
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
|
236
|
+
this.updateStyles();
|
237
|
+
|
238
|
+
var offsets = Position.cumulativeOffset(this.activeHandle);
|
239
|
+
this.offsetX = (pointer[0] - offsets[0]);
|
240
|
+
this.offsetY = (pointer[1] - offsets[1]);
|
241
|
+
}
|
170
242
|
}
|
171
243
|
Event.stop(event);
|
172
244
|
}
|
173
245
|
},
|
174
246
|
update: function(event) {
|
175
247
|
if(this.active) {
|
176
|
-
if(!this.dragging)
|
177
|
-
var style = this.handle.style;
|
178
|
-
this.dragging = true;
|
179
|
-
if(style.position=="") style.position = "relative";
|
180
|
-
style.zIndex = this.options.zindex;
|
181
|
-
}
|
248
|
+
if(!this.dragging) this.dragging = true;
|
182
249
|
this.draw(event);
|
183
250
|
// fix AppleWebKit rendering
|
184
251
|
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
@@ -187,43 +254,13 @@ Control.Slider.prototype = {
|
|
187
254
|
},
|
188
255
|
draw: function(event) {
|
189
256
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
190
|
-
var offsets = Position.cumulativeOffset(this.
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
pointer[1] -= this.offsetY;
|
198
|
-
var style = this.handle.style;
|
199
|
-
|
200
|
-
if(this.isVertical()){
|
201
|
-
if(pointer[1] > this.maximumOffset())
|
202
|
-
pointer[1] = this.maximumOffset();
|
203
|
-
if(pointer[1] < this.minimumOffset())
|
204
|
-
pointer[1] = this.minimumOffset();
|
205
|
-
|
206
|
-
// Increment by values
|
207
|
-
if(this.values){
|
208
|
-
this.value = this.getNearestValue(Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum);
|
209
|
-
pointer[1] = this.trackTop() + this.alignY + (this.value - this.minimum) * this.increment;
|
210
|
-
} else {
|
211
|
-
this.value = Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum;
|
212
|
-
}
|
213
|
-
style.top = pointer[1] - offsets[1] + "px";
|
214
|
-
} else {
|
215
|
-
if(pointer[0] > this.maximumOffset()) pointer[0] = this.maximumOffset();
|
216
|
-
if(pointer[0] < this.minimumOffset()) pointer[0] = this.minimumOffset();
|
217
|
-
// Increment by values
|
218
|
-
if(this.values){
|
219
|
-
this.value = this.getNearestValue(Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum);
|
220
|
-
pointer[0] = this.trackLeft() + this.alignX + (this.value - this.minimum) * this.increment;
|
221
|
-
} else {
|
222
|
-
this.value = Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum;
|
223
|
-
}
|
224
|
-
style.left = (pointer[0] - offsets[0]) + "px";
|
225
|
-
}
|
226
|
-
if(this.options.onSlide) this.options.onSlide(this.value);
|
257
|
+
var offsets = Position.cumulativeOffset(this.track);
|
258
|
+
pointer[0] -= this.offsetX + offsets[0];
|
259
|
+
pointer[1] -= this.offsetY + offsets[1];
|
260
|
+
this.event = event;
|
261
|
+
this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
|
262
|
+
if(this.initialized && this.options.onSlide)
|
263
|
+
this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
|
227
264
|
},
|
228
265
|
endDrag: function(event) {
|
229
266
|
if(this.active && this.dragging) {
|
@@ -236,23 +273,11 @@ Control.Slider.prototype = {
|
|
236
273
|
finishDrag: function(event, success) {
|
237
274
|
this.active = false;
|
238
275
|
this.dragging = false;
|
239
|
-
this.handle.style.zIndex = this.originalZ;
|
240
|
-
this.originalLeft = this.currentLeft();
|
241
|
-
this.originalTop = this.currentTop();
|
242
276
|
this.updateFinished();
|
243
277
|
},
|
244
278
|
updateFinished: function() {
|
245
|
-
if(this.
|
246
|
-
|
247
|
-
|
248
|
-
if(this.active && !this.disabled) {
|
249
|
-
switch(event.keyCode) {
|
250
|
-
case Event.KEY_ESC:
|
251
|
-
this.finishDrag(event, false);
|
252
|
-
Event.stop(event);
|
253
|
-
break;
|
254
|
-
}
|
255
|
-
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
|
256
|
-
}
|
279
|
+
if(this.initialized && this.options.onChange)
|
280
|
+
this.options.onChange(this.values.length>1 ? this.values : this.value, this);
|
281
|
+
this.event = null;
|
257
282
|
}
|
258
|
-
}
|
283
|
+
}
|
data/test/fixtures/elts.yml
CHANGED
@@ -1,17 +1,36 @@
|
|
1
1
|
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
2
2
|
first_elts:
|
3
3
|
id: ROOT
|
4
|
+
lft: 1
|
5
|
+
rgt: 10
|
6
|
+
elts_count: 3
|
4
7
|
second_elts:
|
5
8
|
id: 0
|
6
9
|
parent_id: ROOT
|
7
10
|
subject: zeroth element
|
8
11
|
body: zeroeth element
|
12
|
+
lft: 2
|
13
|
+
rgt: 3
|
14
|
+
elts_count: 0
|
9
15
|
another_elts:
|
10
16
|
id: 1
|
11
17
|
parent_id: ROOT
|
12
18
|
subject: Another element
|
19
|
+
lft: 4
|
20
|
+
rgt: 5
|
21
|
+
elts_count: 0
|
13
22
|
mail:
|
14
23
|
id: mail
|
15
24
|
parent_id: ROOT
|
16
25
|
subject: Mails
|
17
26
|
body: The different mailing lists managed on this server
|
27
|
+
lft: 6
|
28
|
+
rgt: 9
|
29
|
+
elts_count: 0
|
30
|
+
mailList:
|
31
|
+
id: mailList
|
32
|
+
parent_id: mail
|
33
|
+
subject: Mail list
|
34
|
+
body: One mailing lists managed on this server
|
35
|
+
lft: 7
|
36
|
+
rgt: 8
|
@@ -19,6 +19,7 @@ To: mailingList@leparlement.org
|
|
19
19
|
Subject: test parlement
|
20
20
|
Date: Fri, 20 Jan 2006 18:11:00 -0000
|
21
21
|
Content-Type: text/plain; charset="utf-8"
|
22
|
+
Content-Transfer-Encoding: quoted-printable
|
22
23
|
Message-Id: <E1F02OK-0002EG-DN@vvv>
|
23
24
|
Status: RO
|
24
25
|
Content-Length: 1007
|
@@ -33,3 +34,6 @@ Et ici de faux votes qui ne devraient pas être pris en compte:
|
|
33
34
|
1
|
34
35
|
+ 1
|
35
36
|
|
37
|
+
Due to quoted-printable transformation, it breaks over that bit (note,
|
38
|
+
this is a null character):
|
39
|
+
+ =00 +
|
@@ -14,7 +14,7 @@ Received: from manu by vvv with local (Exim 4.60)
|
|
14
14
|
(envelope-from <manu@leparlement.org>)
|
15
15
|
id 1F02OK-0002EG-DN
|
16
16
|
for manu@localhost; Fri, 20 Jan 2006 20:57:48 +0100
|
17
|
-
From:
|
17
|
+
From: echarp2 <manu2@leparlement.org>
|
18
18
|
To: mailingList@leparlement.org
|
19
19
|
Subject: test threaded parlement reply
|
20
20
|
Date: Fri, 20 Jan 2006 18:11:00 -0000
|
@@ -14,7 +14,7 @@ Received: from manu by vvv with local (Exim 4.60)
|
|
14
14
|
(envelope-from <manu@leparlement.org>)
|
15
15
|
id 1F02OK-0002EG-DN
|
16
16
|
for manu@localhost; Fri, 20 Jan 2006 20:57:48 +0100
|
17
|
-
From:
|
17
|
+
From: echarp3 <manu3@leparlement.org>
|
18
18
|
To: mailingList@leparlement.org
|
19
19
|
Subject: test threaded parlement reply
|
20
20
|
Date: Fri, 20 Jan 2006 18:11:00 -0000
|
@@ -19,6 +19,8 @@ class AccountControllerTest < Test::Unit::TestCase
|
|
19
19
|
@controller = AccountController.new
|
20
20
|
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
|
21
21
|
@request.host = "localhost"
|
22
|
+
|
23
|
+
@elt = Elt.find '1'
|
22
24
|
end
|
23
25
|
|
24
26
|
|
@@ -237,5 +239,27 @@ class AccountControllerTest < Test::Unit::TestCase
|
|
237
239
|
assert_not_nil session[:user]
|
238
240
|
get :logout
|
239
241
|
end
|
242
|
+
|
243
|
+
def test_update_subscribe
|
244
|
+
post :login, :person => { :name => "bob_other", :email => "" },
|
245
|
+
:user => { :password => "" }, :divId => 'author_ROOT'
|
246
|
+
|
247
|
+
controller = @controller
|
248
|
+
@controller = EltController.new
|
249
|
+
post :create, :id => @elt.id, :commit => "Propose!",
|
250
|
+
:elt =>{
|
251
|
+
:body => "+1", :subject => "test_create", :parent_id => @elt.id }
|
252
|
+
@controller = controller
|
253
|
+
get :logout
|
254
|
+
|
255
|
+
post :login, :person => { :name => "bob_other", :email => "" },
|
256
|
+
:user => { :password => "" }, :divId => 'author_1'
|
257
|
+
|
258
|
+
assert_success
|
259
|
+
assert_not_nil session[:person]
|
260
|
+
assert_template 'account/_show'
|
261
|
+
|
262
|
+
assert_tag :tag => "div", :attributes => { :class => "choicesToUpdate" }
|
263
|
+
end
|
240
264
|
end
|
241
265
|
|