hobo 1.3.0.pre19 → 1.3.0.pre20
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +282 -234
- data/VERSION +1 -1
- data/lib/generators/hobo/admin_subsite/templates/controller.rb.erb +5 -5
- data/lib/generators/hobo/assets/templates/dryml-support.js +2 -2
- data/lib/generators/hobo/i18n/templates/hobo.it.yml +1 -1
- data/lib/generators/hobo/rapid/templates/hobo-rapid.js +64 -64
- data/lib/generators/hobo/rapid/templates/ie7-recalc.js +21 -21
- data/lib/generators/hobo/rapid/templates/lowpro.js +31 -31
- data/lib/generators/hobo/rapid/templates/reset.css +1 -1
- data/lib/generators/hobo/rapid/templates/themes/clean/public/stylesheets/clean.css +15 -15
- data/lib/generators/hobo/rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +3 -3
- data/lib/generators/hobo/rapid/templates/themes/clean/views/clean.dryml +1 -1
- data/lib/generators/hobo/setup_wizard/setup_wizard_generator.rb +15 -14
- data/lib/generators/hobo/subsite/templates/controller.rb.erb +1 -1
- data/lib/generators/hobo/user_controller/templates/controller.rb.erb +2 -2
- data/lib/hobo.rb +1 -0
- data/lib/hobo/controller.rb +6 -6
- data/lib/hobo/controller/authentication_support.rb +1 -1
- data/lib/hobo/controller/model.rb +10 -10
- data/lib/hobo/controller/user.rb +6 -6
- data/lib/hobo/engine.rb +6 -0
- data/lib/hobo/extensions/action_view/translation_helper.rb +20 -0
- data/lib/hobo/extensions/active_model/translation.rb +1 -1
- data/lib/hobo/extensions/i18n.rb +16 -0
- data/lib/hobo/helper.rb +2 -2
- data/lib/hobo/helper/translations.rb +61 -80
- data/lib/hobo/model/lifecycles/lifecycle.rb +5 -1
- data/lib/hobo/model/lifecycles/transition.rb +1 -0
- data/lib/hobo/rapid/generators/rapid/cards.dryml.erb +2 -2
- data/lib/hobo/rapid/generators/rapid/forms.dryml.erb +2 -2
- data/lib/hobo/rapid/generators/rapid/pages.dryml.erb +7 -7
- data/lib/hobo/rapid/taglibs/rapid.dryml +1 -1
- data/lib/hobo/rapid/taglibs/rapid_core.dryml +8 -8
- data/lib/hobo/rapid/taglibs/rapid_document_tags.dryml +2 -2
- data/lib/hobo/rapid/taglibs/rapid_forms.dryml +9 -9
- data/lib/hobo/rapid/taglibs/rapid_generics.dryml +1 -1
- data/lib/hobo/rapid/taglibs/rapid_i18n.dryml +0 -17
- data/lib/hobo/rapid/taglibs/rapid_lifecycles.dryml +5 -5
- data/lib/hobo/rapid/taglibs/rapid_navigation.dryml +1 -1
- data/lib/hobo/rapid/taglibs/rapid_plus.dryml +6 -6
- data/lib/hobo/rapid/taglibs/rapid_user_pages.dryml +8 -8
- data/test/permissions/test_permissions.rb +103 -103
- metadata +15 -14
- data/lib/hobo/rapid/taglibs/rapid_translations.dryml +0 -36
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.0.
|
1
|
+
1.3.0.pre20
|
@@ -1,13 +1,13 @@
|
|
1
1
|
class <%= subsite_name %>::<%= subsite_name %>SiteController < ApplicationController
|
2
2
|
|
3
3
|
hobo_controller
|
4
|
-
|
4
|
+
|
5
5
|
before_filter :admin_required
|
6
|
-
|
6
|
+
|
7
7
|
private
|
8
|
-
|
8
|
+
|
9
9
|
def admin_required
|
10
10
|
redirect_to home_page unless current_user.administrator?
|
11
|
-
end
|
12
|
-
|
11
|
+
end
|
12
|
+
|
13
13
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
Event.addBehavior({
|
2
|
-
'body:click' : function(event) {
|
2
|
+
'body:click' : function(event) {
|
3
3
|
if (event.shiftKey && event.altKey) {
|
4
4
|
Dryml.click(event)
|
5
5
|
Event.stop(event)
|
@@ -122,7 +122,7 @@ var Dryml = {
|
|
122
122
|
},
|
123
123
|
|
124
124
|
removeMenu: function() {
|
125
|
-
if (Dryml.menu) {
|
125
|
+
if (Dryml.menu) {
|
126
126
|
$("dryml-menu-style").remove()
|
127
127
|
Dryml.menu.remove()
|
128
128
|
Dryml.menu = null
|
@@ -52,7 +52,7 @@ it:
|
|
52
52
|
remember_me: "Ricorda i miei dati"
|
53
53
|
login: "Identificazione"
|
54
54
|
signup: "Iscrizione"
|
55
|
-
forgot_password: &forgot_password "Parola Chiave
|
55
|
+
forgot_password: &forgot_password "Parola Chiave dimenticata?"
|
56
56
|
|
57
57
|
signup:
|
58
58
|
title: "Iscrizione"
|
@@ -16,7 +16,7 @@ var Hobo = {
|
|
16
16
|
searchRequest: null,
|
17
17
|
uidCounter: 0,
|
18
18
|
ipeOldValues: {},
|
19
|
-
spinnerMinTime: 500, // milliseconds
|
19
|
+
spinnerMinTime: 500, // milliseconds
|
20
20
|
|
21
21
|
uid: function() {
|
22
22
|
Hobo.uidCounter += 1
|
@@ -88,7 +88,7 @@ var Hobo = {
|
|
88
88
|
if (typeof(formAuthToken) != "undefined") {
|
89
89
|
params.push(formAuthToken.name + "=" + formAuthToken.value)
|
90
90
|
}
|
91
|
-
|
91
|
+
|
92
92
|
updateParams = Hobo.ajaxUpdateParams(updates, options.resultUpdate)
|
93
93
|
if (updateParams != "") { params.push(updateParams) }
|
94
94
|
|
@@ -102,7 +102,7 @@ var Hobo = {
|
|
102
102
|
}
|
103
103
|
|
104
104
|
if (options.message != false) Hobo.showSpinner(options.message, options.spinnerNextTo)
|
105
|
-
|
105
|
+
|
106
106
|
var complete = function() {
|
107
107
|
if (options.message != false) Hobo.hideSpinner();
|
108
108
|
if (options.onComplete) options.onComplete.apply(this, arguments)
|
@@ -111,7 +111,7 @@ var Hobo = {
|
|
111
111
|
}
|
112
112
|
var success = function() {
|
113
113
|
if (options.onSuccess) options.onSuccess.apply(this, arguments)
|
114
|
-
if (form && options.resetForm) form.reset();
|
114
|
+
if (form && options.resetForm) form.reset();
|
115
115
|
}
|
116
116
|
if (options.method && options.method.toLowerCase() == "put") {
|
117
117
|
delete options.method
|
@@ -154,7 +154,7 @@ var Hobo = {
|
|
154
154
|
}
|
155
155
|
}
|
156
156
|
},
|
157
|
-
|
157
|
+
|
158
158
|
onFieldEditComplete: function(el, newValue) {
|
159
159
|
el = $(el)
|
160
160
|
var oldValue = Hobo.ipeOldValues[el.id]
|
@@ -206,7 +206,7 @@ var Hobo = {
|
|
206
206
|
el.innerHTML = editable_text
|
207
207
|
}
|
208
208
|
if (el.innerHTML.gsub(" ", " ") == blank_message) {
|
209
|
-
el.innerHTML = ""
|
209
|
+
el.innerHTML = ""
|
210
210
|
} else {
|
211
211
|
Hobo.ipeOldValues[el.id] = el.innerHTML
|
212
212
|
}
|
@@ -227,7 +227,7 @@ var Hobo = {
|
|
227
227
|
var clear = function() { Hobo.hide(search_results_panel); el.clear() }
|
228
228
|
|
229
229
|
// Close window on [Escape]
|
230
|
-
Event.observe(el, 'keypress', function(ev) {
|
230
|
+
Event.observe(el, 'keypress', function(ev) {
|
231
231
|
if (ev.keyCode == 27) clear()
|
232
232
|
});
|
233
233
|
|
@@ -261,7 +261,7 @@ var Hobo = {
|
|
261
261
|
return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id + "?_method=PUT"
|
262
262
|
},
|
263
263
|
|
264
|
-
|
264
|
+
|
265
265
|
urlForId: function(id) {
|
266
266
|
var spec = Hobo.parseModelSpec(id)
|
267
267
|
var url = urlBase + "/" + Hobo.pluralise(spec.name)
|
@@ -269,7 +269,7 @@ var Hobo = {
|
|
269
269
|
return url
|
270
270
|
},
|
271
271
|
|
272
|
-
|
272
|
+
|
273
273
|
fieldSetParam: function(el, val) {
|
274
274
|
var spec = Hobo.modelSpecForElement(el)
|
275
275
|
var res = spec.name + '[' + spec.field + ']=' + encodeURIComponent(val)
|
@@ -282,8 +282,8 @@ var Hobo = {
|
|
282
282
|
|
283
283
|
fadeObjectElement: function(el) {
|
284
284
|
var fadeEl = Hobo.objectElementFor(el)
|
285
|
-
new Effect.Fade(fadeEl, { duration: 0.5, afterFinish: function (ef) {
|
286
|
-
ef.element.remove()
|
285
|
+
new Effect.Fade(fadeEl, { duration: 0.5, afterFinish: function (ef) {
|
286
|
+
ef.element.remove()
|
287
287
|
} });
|
288
288
|
Hobo.showEmptyMessageAfterLastRemove(fadeEl)
|
289
289
|
},
|
@@ -330,13 +330,13 @@ var Hobo = {
|
|
330
330
|
new Effect.Appear(empty, {delay:0.3})
|
331
331
|
}
|
332
332
|
},
|
333
|
-
|
333
|
+
|
334
334
|
|
335
335
|
getClassData: function(el, name) {
|
336
336
|
var match = el.className.match(new RegExp("(^| )" + name + "::(\\S+)($| )"))
|
337
337
|
return match && match[2]
|
338
338
|
},
|
339
|
-
|
339
|
+
|
340
340
|
|
341
341
|
getModelId: function(el) {
|
342
342
|
return Hobo.getClassData(el, 'model')
|
@@ -442,8 +442,8 @@ var Hobo = {
|
|
442
442
|
|
443
443
|
return window.location.href.sub(/(\?.*|$)/, "?" + params.toQueryString())
|
444
444
|
},
|
445
|
-
|
446
|
-
|
445
|
+
|
446
|
+
|
447
447
|
fixSectionGroup: function(e) {
|
448
448
|
rows = e.childElements().map(function(e, i) {
|
449
449
|
cells = e.childElements().map(function(e, i) {
|
@@ -456,7 +456,7 @@ var Hobo = {
|
|
456
456
|
|
457
457
|
var attrs = e.outerHTML.match(/<DIV([^>]+)/)[1]
|
458
458
|
|
459
|
-
var table= "<table cellpadding='0' cellspacing='0' border='0' style='border-collapse: collapse; border-spacing: 0'" + attrs + ">" +
|
459
|
+
var table= "<table cellpadding='0' cellspacing='0' border='0' style='border-collapse: collapse; border-spacing: 0'" + attrs + ">" +
|
460
460
|
rows + "</table>"
|
461
461
|
e.outerHTML = table
|
462
462
|
},
|
@@ -500,8 +500,8 @@ Ajax.InPlaceEditor.prototype.enterEditMode = function(evt) {
|
|
500
500
|
// Fix Safari in-place-editor bug
|
501
501
|
Ajax.InPlaceEditor.prototype.removeForm = function() {
|
502
502
|
if (!this._form) return;
|
503
|
-
|
504
|
-
if (this._form.parentNode) { try { Element.remove(this._form); } catch (e) {}}
|
503
|
+
|
504
|
+
if (this._form.parentNode) { try { Element.remove(this._form); } catch (e) {}}
|
505
505
|
this._form = null;
|
506
506
|
this._controls = { };
|
507
507
|
}
|
@@ -522,7 +522,7 @@ Element.Methods.$$ = function(e, css) {
|
|
522
522
|
|
523
523
|
|
524
524
|
HoboBehavior = Class.create({
|
525
|
-
|
525
|
+
|
526
526
|
initialize: function(mainSelector, features) {
|
527
527
|
this.mainSelector = mainSelector
|
528
528
|
this.features = features
|
@@ -531,10 +531,10 @@ HoboBehavior = Class.create({
|
|
531
531
|
document.observe("dom:loaded", features.initialize);
|
532
532
|
}
|
533
533
|
},
|
534
|
-
|
534
|
+
|
535
535
|
addEvents: function(parentSelector, events) {
|
536
536
|
var self = this
|
537
|
-
|
537
|
+
|
538
538
|
for (selector in events) {
|
539
539
|
fullSelector = parentSelector + ' ' + selector
|
540
540
|
var rhs = events[selector]
|
@@ -544,9 +544,9 @@ HoboBehavior = Class.create({
|
|
544
544
|
this.addEvents(fullSelector, rhs)
|
545
545
|
}
|
546
546
|
}
|
547
|
-
|
547
|
+
|
548
548
|
},
|
549
|
-
|
549
|
+
|
550
550
|
addBehavior: function(selector, handler) {
|
551
551
|
var self = this
|
552
552
|
behavior = {}
|
@@ -556,12 +556,12 @@ HoboBehavior = Class.create({
|
|
556
556
|
}
|
557
557
|
Event.addBehavior(behavior)
|
558
558
|
}
|
559
|
-
|
559
|
+
|
560
560
|
})
|
561
561
|
|
562
562
|
|
563
563
|
HoboInputMany = {
|
564
|
-
|
564
|
+
|
565
565
|
events: {
|
566
566
|
"> li > div.buttons": {
|
567
567
|
".add-item:click": 'addOne',
|
@@ -598,12 +598,12 @@ HoboInputMany = {
|
|
598
598
|
|
599
599
|
createSortable: function() {
|
600
600
|
Sortable.create(this.id, {
|
601
|
-
constraint: 'vertical',
|
602
|
-
handle: 'ordering-handle',
|
603
|
-
overlap: 'vertical',
|
601
|
+
constraint: 'vertical',
|
602
|
+
handle: 'ordering-handle',
|
603
|
+
overlap: 'vertical',
|
604
604
|
scroll: 'window',
|
605
605
|
onUpdate: function(list) {
|
606
|
-
HoboInputMany.fixIndices.call(list);
|
606
|
+
HoboInputMany.fixIndices.call(list);
|
607
607
|
}
|
608
608
|
});
|
609
609
|
},
|
@@ -618,7 +618,7 @@ HoboInputMany = {
|
|
618
618
|
var id_sub = id_prefix + '_' + new_index.toString();
|
619
619
|
var class_re = RegExp(RegExp.escape(name_prefix)+ "\[\-?[0-9]+\]");
|
620
620
|
var class_sub = name_sub;
|
621
|
-
|
621
|
+
|
622
622
|
return function() {
|
623
623
|
if(this.name) {
|
624
624
|
this.name = this.name.replace(name_re, name_sub);
|
@@ -645,9 +645,9 @@ HoboInputMany = {
|
|
645
645
|
return Number(this.id.match(/_([-0-9]+)$/)[1]);
|
646
646
|
},
|
647
647
|
|
648
|
-
/* For some reason, select() and down() and all those useful functions aren't working for us. Roll our own replacement.
|
648
|
+
/* For some reason, select() and down() and all those useful functions aren't working for us. Roll our own replacement.
|
649
649
|
|
650
|
-
this: element to recurse on.
|
650
|
+
this: element to recurse on.
|
651
651
|
klass: class to filter on
|
652
652
|
f: function to invoke
|
653
653
|
*/
|
@@ -737,7 +737,7 @@ HoboInputMany = {
|
|
737
737
|
li.childWithClass("buttons").childWithClass("remove-item").removeClassName("hidden");
|
738
738
|
li.childWithClass("buttons").childWithClass("add-item").addClassName("hidden");
|
739
739
|
}
|
740
|
-
|
740
|
+
|
741
741
|
return;
|
742
742
|
},
|
743
743
|
|
@@ -757,10 +757,10 @@ HoboInputMany = {
|
|
757
757
|
// rename everybody from me onwards
|
758
758
|
var i=this.getIndex.call(li)
|
759
759
|
var n=li.next();
|
760
|
-
for(; n; i+=1, n=n.next()) {
|
760
|
+
for(; n; i+=1, n=n.next()) {
|
761
761
|
var name_updater = this.getNameUpdater.call(ul, i);
|
762
762
|
HoboInputMany.recurse_elements_with_class.call(n, null, function(el) {name_updater.call(el);});
|
763
|
-
}
|
763
|
+
}
|
764
764
|
|
765
765
|
// adjust +/- buttons on the button element as appropriate
|
766
766
|
var last=ul.childElements()[ul.childElements().length-1];
|
@@ -783,7 +783,7 @@ HoboInputMany = {
|
|
783
783
|
|
784
784
|
new Effect.BlindUp(li, { duration: 0.3, afterFinish: function (ef) {
|
785
785
|
ul.fire("rapid:change")
|
786
|
-
li.remove()
|
786
|
+
li.remove()
|
787
787
|
} });
|
788
788
|
|
789
789
|
}
|
@@ -791,7 +791,7 @@ HoboInputMany = {
|
|
791
791
|
|
792
792
|
|
793
793
|
}
|
794
|
-
|
794
|
+
|
795
795
|
new HoboBehavior("ul.input-many", HoboInputMany);
|
796
796
|
|
797
797
|
|
@@ -803,7 +803,7 @@ SelectManyInput = Behavior.create({
|
|
803
803
|
},
|
804
804
|
|
805
805
|
addOne : function() {
|
806
|
-
var select = this.element.down('select')
|
806
|
+
var select = this.element.down('select')
|
807
807
|
var selected = select.options[select.selectedIndex]
|
808
808
|
if ($F(select) != "") {
|
809
809
|
var newItem = $(DOM.Builder.fromHTML(this.element.down('.item-proto').innerHTML.strip()))
|
@@ -827,13 +827,13 @@ SelectManyInput = Behavior.create({
|
|
827
827
|
|
828
828
|
removeOne : function(el) {
|
829
829
|
var element = this.element
|
830
|
-
new Effect.BlindUp(el,
|
830
|
+
new Effect.BlindUp(el,
|
831
831
|
{ duration: 0.3,
|
832
|
-
afterFinish: function (ef) {
|
833
|
-
ef.element.remove()
|
832
|
+
afterFinish: function (ef) {
|
833
|
+
ef.element.remove()
|
834
834
|
element.fire("rapid:remove", { element: el })
|
835
835
|
element.fire("rapid:change", { element: el })
|
836
|
-
} } )
|
836
|
+
} } )
|
837
837
|
var label = el.down('span').innerHTML
|
838
838
|
var optgroup = element.down("optgroup[label="+label+"]")
|
839
839
|
var option = new Element("option", {value:optgroup.readAttribute("alt")})
|
@@ -846,7 +846,7 @@ SelectManyInput = Behavior.create({
|
|
846
846
|
},
|
847
847
|
|
848
848
|
hiddenField: function(item) {
|
849
|
-
return item.down('input[type=hidden]')
|
849
|
+
return item.down('input[type=hidden]')
|
850
850
|
//return item.getElementsByClassName("hidden-field")[0]
|
851
851
|
}
|
852
852
|
|
@@ -855,7 +855,7 @@ SelectManyInput = Behavior.create({
|
|
855
855
|
|
856
856
|
NameManyInput = Object.extend(SelectManyInput, {
|
857
857
|
addOne : function() {
|
858
|
-
var select = this.element.down('select')
|
858
|
+
var select = this.element.down('select')
|
859
859
|
var selected = select.options[select.selectedIndex]
|
860
860
|
if (selected.value != "") {
|
861
861
|
var newItem = $(DOM.Builder.fromHTML(this.element.down('.item-proto').innerHTML.strip()))
|
@@ -869,10 +869,10 @@ NameManyInput = Object.extend(SelectManyInput, {
|
|
869
869
|
}
|
870
870
|
})
|
871
871
|
|
872
|
-
|
872
|
+
|
873
873
|
AutocompleteBehavior = Behavior.create({
|
874
874
|
initialize : function() {
|
875
|
-
this.minChars = parseInt(Hobo.getClassData(this.element, "min-chars"));
|
875
|
+
this.minChars = parseInt(Hobo.getClassData(this.element, "min-chars"));
|
876
876
|
var match = this.element.className.match(/complete-on::([\S]+)/)
|
877
877
|
var target = match[1].split('::')
|
878
878
|
var typedId = target[0]
|
@@ -881,9 +881,9 @@ AutocompleteBehavior = Behavior.create({
|
|
881
881
|
var spec = Hobo.parseModelSpec(typedId)
|
882
882
|
var url = urlBase + "/" + Hobo.pluralise(spec.name) + "/complete_" + completer
|
883
883
|
var parameters = spec.id ? "id=" + spec.id : ""
|
884
|
-
this.autocompleter = new Ajax.Autocompleter(this.element,
|
885
|
-
this.element.next('.completions-popup'),
|
886
|
-
url,
|
884
|
+
this.autocompleter = new Ajax.Autocompleter(this.element,
|
885
|
+
this.element.next('.completions-popup'),
|
886
|
+
url,
|
887
887
|
{paramName:'query', method:'get', parameters: parameters, minChars: this.minChars,
|
888
888
|
afterUpdateElement: this.afterUpdateElement});
|
889
889
|
},
|
@@ -893,7 +893,7 @@ AutocompleteBehavior = Behavior.create({
|
|
893
893
|
this.element.value = '';
|
894
894
|
this.element.removeClassName("nil-value");
|
895
895
|
}
|
896
|
-
if(this.minChars==0) {
|
896
|
+
if(this.minChars==0) {
|
897
897
|
this.autocompleter.activate();
|
898
898
|
}
|
899
899
|
},
|
@@ -901,14 +901,14 @@ AutocompleteBehavior = Behavior.create({
|
|
901
901
|
afterUpdateElement: function(input, li) {
|
902
902
|
input.fire("rapid:autocomplete-assigned");
|
903
903
|
}
|
904
|
-
|
904
|
+
|
905
905
|
})
|
906
906
|
|
907
907
|
|
908
908
|
|
909
909
|
Event.addBehavior.reassignAfterAjax = true;
|
910
910
|
Event.addBehavior({
|
911
|
-
|
911
|
+
|
912
912
|
'div.section-group' : function() {
|
913
913
|
if (Prototype.Browser.IE) Hobo.fixSectionGroup(this);
|
914
914
|
},
|
@@ -923,7 +923,7 @@ Event.addBehavior({
|
|
923
923
|
var paramName = this.getAttribute('name')
|
924
924
|
var params = {}
|
925
925
|
var remove = [ 'page' ]
|
926
|
-
if ($F(this) == '') {
|
926
|
+
if ($F(this) == '') {
|
927
927
|
remove.push(paramName)
|
928
928
|
} else {
|
929
929
|
params[paramName] = $F(this)
|
@@ -953,10 +953,10 @@ Event.addBehavior({
|
|
953
953
|
if (Hobo.makeInPlaceHtmlEditor) {
|
954
954
|
Hobo.makeInPlaceHtmlEditor(this)
|
955
955
|
} else {
|
956
|
-
var options = {
|
956
|
+
var options = {
|
957
957
|
rows: 2, handleLineBreaks: false, okButton: true, cancelLink: true, okText: "Save", submitOnBlur: false
|
958
958
|
}
|
959
|
-
var ipe = Hobo._makeInPlaceEditor(this, options)
|
959
|
+
var ipe = Hobo._makeInPlaceEditor(this, options)
|
960
960
|
ipe.getText = function() {
|
961
961
|
// Be careful! we're not calling unescapeHTML() here!
|
962
962
|
return this.element.innerHTML
|
@@ -970,7 +970,7 @@ Event.addBehavior({
|
|
970
970
|
Hobo.ajaxSetFieldForElement(el, $F(el))
|
971
971
|
}
|
972
972
|
},
|
973
|
-
|
973
|
+
|
974
974
|
"input.live-search[type=search]" : function(e) {
|
975
975
|
var element = this
|
976
976
|
new Form.Element.Observer(element, 1.0, function() { Hobo.doSearch(element) })
|
@@ -980,23 +980,23 @@ Event.addBehavior({
|
|
980
980
|
});
|
981
981
|
|
982
982
|
ElementSet = Class.create(Enumerable, {
|
983
|
-
|
983
|
+
|
984
984
|
initialize: function(array) {
|
985
985
|
this.items = array
|
986
986
|
},
|
987
|
-
|
987
|
+
|
988
988
|
_each: function(fn) {
|
989
989
|
return this.items.each(fn)
|
990
990
|
},
|
991
|
-
|
991
|
+
|
992
992
|
selectChildren: function(selector) {
|
993
993
|
return new ElementSet(this.items.invoke('selectChildren', selector).pluck('items').flatten())
|
994
994
|
},
|
995
|
-
|
995
|
+
|
996
996
|
child: function(selector) {
|
997
997
|
return this.selectChildren(selector).first()
|
998
998
|
},
|
999
|
-
|
999
|
+
|
1000
1000
|
select: function(selector) {
|
1001
1001
|
return new ElementSet(this.items.invoke('select', selector).flatten())
|
1002
1002
|
},
|
@@ -1008,11 +1008,11 @@ ElementSet = Class.create(Enumerable, {
|
|
1008
1008
|
}
|
1009
1009
|
return null
|
1010
1010
|
},
|
1011
|
-
|
1011
|
+
|
1012
1012
|
size: function() {
|
1013
1013
|
return this.items.length
|
1014
1014
|
},
|
1015
|
-
|
1015
|
+
|
1016
1016
|
first: function() {
|
1017
1017
|
return this.items.first()
|
1018
1018
|
},
|
@@ -1020,7 +1020,7 @@ ElementSet = Class.create(Enumerable, {
|
|
1020
1020
|
last: function() {
|
1021
1021
|
return this.items.last()
|
1022
1022
|
}
|
1023
|
-
|
1023
|
+
|
1024
1024
|
})
|
1025
1025
|
|
1026
1026
|
Element.addMethods({
|