hobo 0.8.3 → 0.8.4

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.
Files changed (80) hide show
  1. data/CHANGES.txt +330 -0
  2. data/Manifest +12 -4
  3. data/Rakefile +4 -6
  4. data/dryml_generators/rapid/cards.dryml.erb +5 -1
  5. data/dryml_generators/rapid/forms.dryml.erb +8 -10
  6. data/dryml_generators/rapid/pages.dryml.erb +65 -36
  7. data/hobo.gemspec +28 -15
  8. data/lib/active_record/association_collection.rb +3 -22
  9. data/lib/hobo.rb +25 -258
  10. data/lib/hobo/accessible_associations.rb +131 -0
  11. data/lib/hobo/authentication_support.rb +15 -9
  12. data/lib/hobo/composite_model.rb +1 -1
  13. data/lib/hobo/controller.rb +7 -8
  14. data/lib/hobo/dryml.rb +9 -10
  15. data/lib/hobo/dryml/dryml_builder.rb +7 -1
  16. data/lib/hobo/dryml/dryml_doc.rb +161 -0
  17. data/lib/hobo/dryml/dryml_generator.rb +18 -9
  18. data/lib/hobo/dryml/part_context.rb +76 -42
  19. data/lib/hobo/dryml/tag_parameters.rb +1 -0
  20. data/lib/hobo/dryml/taglib.rb +2 -1
  21. data/lib/hobo/dryml/template.rb +39 -29
  22. data/lib/hobo/dryml/template_environment.rb +79 -37
  23. data/lib/hobo/dryml/template_handler.rb +66 -21
  24. data/lib/hobo/guest.rb +2 -10
  25. data/lib/hobo/hobo_helper.rb +125 -53
  26. data/lib/hobo/include_in_save.rb +0 -1
  27. data/lib/hobo/lifecycles.rb +54 -24
  28. data/lib/hobo/lifecycles/actions.rb +95 -31
  29. data/lib/hobo/lifecycles/creator.rb +18 -23
  30. data/lib/hobo/lifecycles/lifecycle.rb +86 -62
  31. data/lib/hobo/lifecycles/state.rb +1 -2
  32. data/lib/hobo/lifecycles/transition.rb +22 -28
  33. data/lib/hobo/model.rb +64 -176
  34. data/lib/hobo/model_controller.rb +67 -54
  35. data/lib/hobo/model_router.rb +5 -2
  36. data/lib/hobo/permissions.rb +397 -0
  37. data/lib/hobo/permissions/associations.rb +167 -0
  38. data/lib/hobo/scopes.rb +15 -38
  39. data/lib/hobo/scopes/association_proxy_extensions.rb +15 -5
  40. data/lib/hobo/scopes/automatic_scopes.rb +43 -18
  41. data/lib/hobo/scopes/named_scope_extensions.rb +2 -2
  42. data/lib/hobo/user.rb +10 -4
  43. data/lib/hobo/user_controller.rb +6 -5
  44. data/lib/hobo/view_hints.rb +58 -0
  45. data/rails_generators/hobo/hobo_generator.rb +7 -3
  46. data/rails_generators/hobo/templates/guest.rb +1 -13
  47. data/rails_generators/hobo_front_controller/hobo_front_controller_generator.rb +1 -1
  48. data/rails_generators/hobo_model/hobo_model_generator.rb +4 -2
  49. data/rails_generators/hobo_model/templates/hints.rb +4 -0
  50. data/rails_generators/hobo_model/templates/model.rb +8 -8
  51. data/rails_generators/hobo_model_controller/hobo_model_controller_generator.rb +10 -0
  52. data/rails_generators/hobo_model_controller/templates/controller.rb +1 -1
  53. data/rails_generators/hobo_rapid/templates/hobo-rapid.js +91 -56
  54. data/rails_generators/hobo_rapid/templates/lowpro.js +15 -15
  55. data/rails_generators/hobo_rapid/templates/reset.css +36 -3
  56. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +13 -17
  57. data/rails_generators/hobo_user_controller/templates/controller.rb +1 -1
  58. data/rails_generators/hobo_user_model/templates/model.rb +18 -16
  59. data/taglibs/core.dryml +60 -18
  60. data/taglibs/rapid.dryml +8 -401
  61. data/taglibs/rapid_core.dryml +586 -0
  62. data/taglibs/rapid_document_tags.dryml +28 -10
  63. data/taglibs/rapid_editing.dryml +92 -55
  64. data/taglibs/rapid_forms.dryml +406 -87
  65. data/taglibs/rapid_generics.dryml +1 -1
  66. data/taglibs/rapid_navigation.dryml +2 -1
  67. data/taglibs/rapid_pages.dryml +7 -16
  68. data/taglibs/rapid_plus.dryml +39 -14
  69. data/taglibs/rapid_support.dryml +1 -1
  70. data/taglibs/rapid_user_pages.dryml +14 -4
  71. data/tasks/{generate_tag_reference.rb → generate_tag_reference.rake} +49 -18
  72. data/tasks/hobo_tasks.rake +16 -0
  73. data/test/permissions/models/models.rb +134 -0
  74. data/test/permissions/models/schema.rb +55 -0
  75. data/test/permissions/models/test.sqlite3 +0 -0
  76. data/test/permissions/test_permissions.rb +436 -0
  77. metadata +27 -14
  78. data/lib/hobo/mass_assignment.rb +0 -64
  79. data/rails_generators/hobo/templates/patch_routing.rb +0 -30
  80. data/uninstall.rb +0 -1
@@ -0,0 +1,58 @@
1
+ module Hobo
2
+
3
+ class ViewHints
4
+
5
+ def self.enable
6
+ ActiveSupport::Dependencies.load_paths |= ["#{RAILS_ROOT}/app/viewhints"]
7
+ end
8
+
9
+ def self.setter(name, default=nil, &block)
10
+ metaclass.send :define_method, name do |*args|
11
+ if args.empty?
12
+ instance_variable_get("@#{name}") || (default.is_a?(Proc) ? instance_eval(&default) : default)
13
+ else
14
+ arg = if block
15
+ block[*args]
16
+ else
17
+ args.first
18
+ end
19
+ instance_variable_set("@#{name}", arg)
20
+ end
21
+ end
22
+ end
23
+
24
+ setter :model_name, proc { name.sub(/Hints$/, "") }
25
+
26
+ setter :field_names, {}
27
+
28
+ setter :field_help, {}
29
+
30
+ setter :children, proc { model.dependent_collections.sort_by(&:to_s) } do |*args|
31
+ args
32
+ end
33
+
34
+ # Accessors
35
+
36
+ class << self
37
+
38
+ def model
39
+ model_name.constantize
40
+ end
41
+
42
+ def field_name(field)
43
+ field_names.fetch(field.to_sym, field.to_s.titleize)
44
+ end
45
+
46
+ def primary_children
47
+ children.first
48
+ end
49
+
50
+ def secondary_children
51
+ children.rest
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -16,13 +16,17 @@ class HoboGenerator < Rails::Generator::Base
16
16
  record do |m|
17
17
  m.directory File.join("app/views/taglibs")
18
18
  m.directory File.join("app/views/taglibs/themes")
19
- m.directory File.join("public/hobothemes")
20
19
  m.template "application.dryml", File.join("app/views/taglibs/application.dryml")
20
+ m.directory File.join("public/hobothemes")
21
+
22
+ m.directory File.join("app/models")
21
23
  m.file "guest.rb", File.join("app/models/guest.rb")
22
- m.file "dryml-support.js", File.join("public/javascripts/dryml-support.js")
24
+
25
+ m.directory File.join("public/stylesheets")
23
26
  m.file "application.css", File.join("public/stylesheets/application.css")
27
+ m.file "dryml-support.js", File.join("public/javascripts/dryml-support.js")
28
+
24
29
  m.file "initializer.rb", File.join("config/initializers/hobo.rb")
25
- m.file "patch_routing.rb", File.join("config/initializers/patch_routing.rb")
26
30
  end
27
31
  end
28
32
 
@@ -1,19 +1,7 @@
1
1
  class Guest < Hobo::Guest
2
2
 
3
- def can_update?(obj, field)
3
+ def administrator?
4
4
  false
5
5
  end
6
6
 
7
- def can_delete?(obj)
8
- false
9
- end
10
-
11
- def can_create?(obj)
12
- false
13
- end
14
-
15
- def can_view?(obj, field)
16
- true
17
- end
18
-
19
7
  end
@@ -47,7 +47,7 @@ class HoboFrontControllerGenerator < Rails::Generator::NamedBase
47
47
  name = full_class_path
48
48
 
49
49
  route = (" map.site_search 'search', :controller => '#{name}', :action => 'search'\n" +
50
- " map.homepage '', :controller => '#{name}', :action => 'index'")
50
+ " map.root :controller => '#{name}', :action => 'index'")
51
51
 
52
52
  route_src = File.read(routes_path)
53
53
  return if route_src.include?(route)
@@ -9,10 +9,12 @@ class HoboModelGenerator < Rails::Generator::NamedBase
9
9
  m.directory File.join('app/models', class_path)
10
10
  m.directory File.join('test/unit', class_path)
11
11
  m.directory File.join('test/fixtures', class_path)
12
+ m.directory File.join("app/viewhints")
12
13
 
13
14
  # Model class, unit test, and fixtures.
14
- m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
15
- m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
15
+ m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
16
+ m.template 'hints.rb', File.join('app/viewhints', class_path, "#{file_name}_hints.rb")
17
+ m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
16
18
  m.template 'fixtures.yml', File.join('test/fixtures', class_path, "#{table_name}.yml")
17
19
  end
18
20
  end
@@ -0,0 +1,4 @@
1
+ class <%= class_name %>Hints < Hobo::ViewHints
2
+
3
+
4
+ end
@@ -10,21 +10,21 @@ class <%= class_name %> < ActiveRecord::Base
10
10
  end
11
11
 
12
12
 
13
- # --- Hobo Permissions --- #
13
+ # --- Permissions --- #
14
14
 
15
- def creatable_by?(user)
16
- user.administrator?
15
+ def create_permitted?
16
+ acting_user.administrator?
17
17
  end
18
18
 
19
- def updatable_by?(user, new)
20
- user.administrator?
19
+ def update_permitted?
20
+ acting_user.administrator?
21
21
  end
22
22
 
23
- def deletable_by?(user)
24
- user.administrator?
23
+ def destroy_permitted?
24
+ acting_user.administrator?
25
25
  end
26
26
 
27
- def viewable_by?(user, field)
27
+ def view_permitted?(field)
28
28
  true
29
29
  end
30
30
 
@@ -4,11 +4,20 @@ class HoboModelControllerGenerator < Rails::Generator::NamedBase
4
4
  args[0] = args[0].pluralize
5
5
  super(args, options)
6
6
  end
7
+
8
+ attr_reader :subsite
7
9
 
8
10
  def manifest
9
11
  record do |m|
10
12
  # Check for class naming collisions.
11
13
  m.class_collisions class_path, "#{class_name}Controller", "#{class_name}ControllerTest", "#{class_name}Helper"
14
+
15
+ if class_path.length == 1 and
16
+ subsite = class_path.first and
17
+ File.exist?(File.join('app/controllers', class_path, "#{subsite}_site_controller.rb"))
18
+
19
+ @subsite = subsite.camelize
20
+ end
12
21
 
13
22
  # Controller, helper, views, and test directories.
14
23
  m.directory File.join('app/controllers', class_path)
@@ -33,4 +42,5 @@ class HoboModelControllerGenerator < Rails::Generator::NamedBase
33
42
  "#{file_name}_helper.rb")
34
43
  end
35
44
  end
45
+
36
46
  end
@@ -1,4 +1,4 @@
1
- class <%= class_name %>Controller < ApplicationController
1
+ class <%= class_name %>Controller < <%= subsite ? "#{subsite}::#{subsite}SiteController" : "ApplicationController" %>
2
2
 
3
3
  hobo_model_controller
4
4
 
@@ -16,7 +16,7 @@ var Hobo = {
16
16
  searchRequest: null,
17
17
  uidCounter: 0,
18
18
  ipeOldValues: {},
19
- spinnerMinTime: 1000, // milliseconds
19
+ spinnerMinTime: 500, // milliseconds
20
20
 
21
21
  uid: function() {
22
22
  Hobo.uidCounter += 1
@@ -101,9 +101,10 @@ var Hobo = {
101
101
  params.push(Form.serialize(form))
102
102
  }
103
103
 
104
- Hobo.showSpinner(options.message, options.spinnerNextTo)
104
+ if (options.message != false) Hobo.showSpinner(options.message, options.spinnerNextTo)
105
+
105
106
  var complete = function() {
106
- Hobo.hideSpinner();
107
+ if (options.message != false) Hobo.hideSpinner();
107
108
  if (options.onComplete) options.onComplete.apply(this, arguments)
108
109
  if (form && options.refocusForm) Form.focusFirstElement(form)
109
110
  Event.addBehavior.reload()
@@ -154,15 +155,6 @@ var Hobo = {
154
155
  }
155
156
  },
156
157
 
157
- getClassData: function(el, name) {
158
- var match = el.className.match(new RegExp("(^| )" + name + ":(\\S+)($| )"))
159
- return match && match[2]
160
- },
161
-
162
- getModelId: function(el) {
163
- return Hobo.getClassData(el, 'model')
164
- },
165
-
166
158
  onFieldEditComplete: function(el, newValue) {
167
159
  el = $(el)
168
160
  var oldValue = Hobo.ipeOldValues[el.id]
@@ -203,7 +195,7 @@ var Hobo = {
203
195
  old = val
204
196
  return (Hobo.fieldSetParam(el, val) + "&" + updateParams)
205
197
  },
206
- onFailure: function(resp) {
198
+ onFailure: function(_, resp) {
207
199
  alert(resp.responseText); el.innerHTML = old
208
200
  },
209
201
  onEnterEditMode: function() {
@@ -260,13 +252,13 @@ var Hobo = {
260
252
 
261
253
 
262
254
  putUrl: function(el) {
263
- var spec = Hobo.parseFieldId(el)
255
+ var spec = Hobo.modelSpecForElement(el)
264
256
  return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id + "?_method=PUT"
265
257
  },
266
258
 
267
259
 
268
260
  urlForId: function(id) {
269
- var spec = Hobo.parseId(id)
261
+ var spec = Hobo.parseModelSpec(id)
270
262
  var url = urlBase + "/" + Hobo.pluralise(spec.name)
271
263
  if (spec.id) { url += "/" + spec.id }
272
264
  return url
@@ -274,7 +266,7 @@ var Hobo = {
274
266
 
275
267
 
276
268
  fieldSetParam: function(el, val) {
277
- var spec = Hobo.parseFieldId(el)
269
+ var spec = Hobo.modelSpecForElement(el)
278
270
  var res = spec.name + '[' + spec.field + ']=' + encodeURIComponent(val)
279
271
  if (typeof(formAuthToken) != "undefined") {
280
272
  res = res + "&" + formAuthToken.name + "=" + formAuthToken.value
@@ -300,7 +292,7 @@ var Hobo = {
300
292
  var objEl = Hobo.objectElementFor(el)
301
293
  Hobo.showSpinner('Removing');
302
294
  function complete() {
303
- if (options.fade) { Hobo.fadeObjectElement(el) }
295
+ if (options.fade) { Hobo.fadeObjectElement(objEl) }
304
296
  Hobo.hideSpinner()
305
297
  }
306
298
  if (updates && updates.length > 0) {
@@ -319,7 +311,7 @@ var Hobo = {
319
311
  ajaxUpdateField: function(element, field, value, updates) {
320
312
  var objectElement = Hobo.objectElementFor(element)
321
313
  var url = Hobo.putUrl(objectElement)
322
- var spec = Hobo.parseFieldId(objectElement)
314
+ var spec = Hobo.modelSpecForElement(objectElement)
323
315
  var params = spec.name + '[' + field + ']=' + encodeURIComponent(value)
324
316
  new Hobo.ajaxRequest(url, updates, { method:'put', message: "Saving...", params: params });
325
317
  },
@@ -333,16 +325,27 @@ var Hobo = {
333
325
  new Effect.Appear(empty, {delay:0.3})
334
326
  }
335
327
  },
328
+
329
+
330
+ getClassData: function(el, name) {
331
+ var match = el.className.match(new RegExp("(^| )" + name + "::(\\S+)($| )"))
332
+ return match && match[2]
333
+ },
334
+
335
+
336
+ getModelId: function(el) {
337
+ return Hobo.getClassData(el, 'model')
338
+ },
336
339
 
337
340
 
338
- parseFieldId: function(el) {
341
+ modelSpecForElement: function(el) {
339
342
  var id = Hobo.getModelId(el)
340
- return id && Hobo.parseId(id)
343
+ return id && Hobo.parseModelSpec(id)
341
344
  },
342
345
 
343
346
 
344
- parseId: function(id) {
345
- m = id.gsub('-', '_').match(/^([a-z_]+)(?:_([0-9]+))?(?:_([a-z_]+))?$/)
347
+ parseModelSpec: function(id) {
348
+ m = id.gsub('-', '_').match(/^([^:]+)(?::([^:]+)(?::([^:]+))?)?$/)
346
349
  if (m) return { name: m[1], id: m[2], field: m[3] }
347
350
  },
348
351
 
@@ -351,7 +354,7 @@ var Hobo = {
351
354
  var m
352
355
  while(el.getAttribute) {
353
356
  id = Hobo.getModelId(el)
354
- if (id) m = id.match(/^([a-z0-9-]+)-([0-9]+)(-[a-z0-9-]*)?$/);
357
+ if (id) m = id.match(/^[^:]+:[^:]+$/);
355
358
  if (m) break;
356
359
  el = el.parentNode;
357
360
  }
@@ -367,12 +370,19 @@ var Hobo = {
367
370
  showSpinner: function(message, nextTo) {
368
371
  clearTimeout(Hobo.spinnerTimer)
369
372
  Hobo.spinnerHideAt = new Date().getTime() + Hobo.spinnerMinTime;
370
- if(t = $('ajax-progress-text')) Element.update(t, message);
371
- if(e = $('ajax-progress')) {
373
+ if (t = $('ajax-progress-text')) {
374
+ if (!message || message.length == 0) {
375
+ t.hide()
376
+ } else {
377
+ Element.update(t, message);
378
+ t.show()
379
+ }
380
+ }
381
+ if (e = $('ajax-progress')) {
372
382
  if (nextTo) {
373
383
  var pos = $(nextTo).cumulativeOffset()
374
- e.style.top = pos.top + "px"
375
- e.style.left = (pos.left + nextTo.offsetWidth) + "px"
384
+ e.style.top = pos.top - nextTo.offsetHeight + "px"
385
+ e.style.left = (pos.left + nextTo.offsetWidth + 5) + "px"
376
386
  }
377
387
  e.style.display = "block";
378
388
  }
@@ -443,8 +453,13 @@ var Hobo = {
443
453
  var table= "<table cellpadding='0' cellspacing='0' border='0' style='border-collapse: collapse; border-spacing: 0'" + attrs + ">" +
444
454
  rows + "</table>"
445
455
  e.outerHTML = table
456
+ },
457
+
458
+ makeHtmlEditor: function(textarea) {
459
+ // do nothing - plugins can overwrite this method
446
460
  }
447
461
 
462
+
448
463
  }
449
464
 
450
465
  Element.findContaining = function(el, tag) {
@@ -549,7 +564,7 @@ new HoboBehavior("ul.input-many", {
549
564
  "</div></li>"
550
565
  var newItem = DOM.Builder.fromHTML(newItem)
551
566
  ul.appendChild(newItem);
552
- $(newItem).select('input').each(function(input){ input.value="" })
567
+ this.clearInputs(newItem);
553
568
 
554
569
  this.updateButtons()
555
570
  this.updateInputNames()
@@ -561,21 +576,35 @@ new HoboBehavior("ul.input-many", {
561
576
  Event.stop(ev)
562
577
  var self = this;
563
578
  var li = el.up('li')
564
- new Effect.BlindUp(li, { duration: 0.3, afterFinish: function (ef) {
565
- li.remove()
566
- self.updateButtons()
567
- self.updateInputNames()
568
- } });
579
+ if (li.parentNode.childElements().length == 1) {
580
+ // It's the last one - don't remove it, just clear it
581
+ this.clearInputs(li)
582
+ } else {
583
+ new Effect.BlindUp(li, { duration: 0.3, afterFinish: function (ef) {
584
+ li.remove()
585
+ self.updateButtons()
586
+ self.updateInputNames()
587
+ } });
588
+ }
569
589
  },
570
590
 
591
+ clearInputs: function(item) {
592
+ $(item).select('input').each(function(input){
593
+ if (input.getAttribute('type').toLowerCase() == 'hidden') {
594
+ input.remove()
595
+ } else {
596
+ input.value = ""
597
+ }
598
+ })
599
+ },
600
+
571
601
  updateButtons: function() {
572
602
  var removeButton = "<button class='remove-item'>-</button>"
573
- var addButton = "<button class='add-item'>+</button>"
574
-
575
-
603
+ var addButton = "<button class='add-item'>+</button>"
604
+
576
605
  var ul = this.element
577
606
  if (ul.childElements().length == 1) {
578
- ul.down('li').down('div.buttons').innerHTML = addButton
607
+ ul.down('li').down('div.buttons').innerHTML = removeButton + ' ' + addButton
579
608
  } else {
580
609
  var add = ul.selectChildren('li').selectChildren('div.buttons').down('button.add-item')
581
610
  if (add) add.remove()
@@ -619,26 +648,32 @@ SelectManyInput = Behavior.create({
619
648
  selected.disabled = true
620
649
  select.value = ""
621
650
  Event.addBehavior.reload()
651
+ this.element.fire("rapid:add", { element: newItem })
652
+ this.element.fire("rapid:change", { element: newItem })
622
653
  }
623
654
  },
624
655
 
625
- onclick : function(e) {
626
- var el = Event.element(e);
627
- Event.stop(e);
656
+ onclick : function(ev) {
657
+ var el = Event.element(ev);
628
658
  if (el.match(".remove-item")) { this.removeOne(el.parentNode) }
629
659
  },
630
660
 
631
661
  removeOne : function(el) {
662
+ var element = this.element
632
663
  new Effect.BlindUp(el,
633
664
  { duration: 0.3,
634
- afterFinish: function (ef) { ef.element.remove() } } )
665
+ afterFinish: function (ef) {
666
+ ef.element.remove()
667
+ element.fire("rapid:remove", { element: el })
668
+ element.fire("rapid:change", { element: el })
669
+ } } )
635
670
  var label = el.down('span').innerHTML
636
- var option = $A(this.element.getElementsByTagName('option')).find(function(o) { return o.innerHTML == label })
671
+ var option = $A(element.getElementsByTagName('option')).find(function(o) { return o.innerHTML == label })
637
672
  option.disabled = false
638
673
  },
639
674
 
640
675
  itemAdded: function(item, option) {
641
- this.hiddenField(item).value = option.innerHTML
676
+ this.hiddenField(item).value = option.value
642
677
  },
643
678
 
644
679
  hiddenField: function(item) {
@@ -668,11 +703,12 @@ NameManyInput = Object.extend(SelectManyInput, {
668
703
 
669
704
  AutocompleteBehavior = Behavior.create({
670
705
  initialize : function() {
671
- var target = this.element.className.match(/complete-on:([\S]+)/)[1].split(':')
672
- var model = target[0]
706
+ var match = this.element.className.match(/complete-on::([\S]+)/)
707
+ var target = match[1].split('::')
708
+ var typedId = target[0]
673
709
  var completer = target[1]
674
710
 
675
- var spec = Hobo.parseId(model)
711
+ var spec = Hobo.parseModelSpec(typedId)
676
712
  var url = urlBase + "/" + Hobo.pluralise(spec.name) + "/complete_" + completer
677
713
  var parameters = spec.id ? "id=" + spec.id : ""
678
714
  new Ajax.Autocompleter(this.element,
@@ -692,13 +728,12 @@ Event.addBehavior({
692
728
 
693
729
  'div.select-many.input' : SelectManyInput(),
694
730
 
695
- '.association-count:click' : function(e) {
696
- new Effect.ScrollTo('primary-collection', {duration: 1.0, offset: -20, transition: Effect.Transitions.sinoidal});
697
- Event.stop(e);
731
+ 'textarea.html' : function() {
732
+ Hobo.makeHtmlEditor(this)
698
733
  },
699
734
 
700
735
  'form.filter-menu select:change': function(event) {
701
- var paramName = this.up('form').down('input[type=hidden]').value.gsub("-", "_")
736
+ var paramName = this.getAttribute('name')
702
737
  var params = {}
703
738
  var remove = [ 'page' ]
704
739
  if ($F(this) == '') {
@@ -713,10 +748,11 @@ Event.addBehavior({
713
748
 
714
749
  '.string.in-place-edit, .datetime.in-place-edit, .date.in-place-edit, .integer.in-place-edit, .float.in-place.edit, big-integer.in-place-edit' :
715
750
  function (ev) {
716
- var ipe = Hobo._makeInPlaceEditor(this)
717
- ipe.getText = function() {
718
- return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
719
- }
751
+
752
+ var ipe = Hobo._makeInPlaceEditor(this)
753
+ ipe.getText = function() {
754
+ return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
755
+ }
720
756
  },
721
757
 
722
758
  '.text.in-place-edit, .markdown.in-place-edit, .textile.in-place-edit' : function (ev) {
@@ -773,7 +809,7 @@ ElementSet = Class.create(Enumerable, {
773
809
  select: function(selector) {
774
810
  return new ElementSet(this.items.invoke('select', selector).flatten())
775
811
  },
776
-
812
+
777
813
  down: function(selector) {
778
814
  for (var i = 0; i < this.items.length; i++) {
779
815
  var match = this.items[i].down(selector)
@@ -801,4 +837,3 @@ Element.addMethods({
801
837
  return new ElementSet(Selector.matchElements(element.childElements(), selector))
802
838
  }
803
839
  })
804
-