hobo 0.6.4 → 0.7.0
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/bin/hobo +4 -6
- data/hobo_files/plugin/CHANGES.txt +170 -0
- data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +9 -9
- data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +9 -9
- data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +7 -2
- data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +4 -4
- data/hobo_files/plugin/generators/hobo_rapid/templates/{hobo_rapid.css → hobo-rapid.css} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/{hobo_rapid.js → hobo-rapid.js} +66 -47
- data/hobo_files/plugin/generators/hobo_rapid/templates/lowpro.js +130 -44
- data/hobo_files/plugin/generators/hobo_rapid/templates/{hobo_base.css → reset.css} +0 -5
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/images/pencil.png +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/images/small_close.png +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/application.css +45 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid_ui.css +167 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/views/application.dryml +10 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_bodytop.gif → bkg-bodytop.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_corner_01.gif → bkg-corner-01.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_corner_02.gif → bkg-corner-02.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_corner_03.gif → bkg-corner-03.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_corner_04.gif → bkg-corner-04.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_shadow_bottom.gif → bkg-shadow-bottom.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_shadow_left.gif → bkg-shadow-left.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_shadow_right.gif → bkg-shadow-right.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{bkg_shadow_top.gif → bkg-shadow-top.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{header_blue.gif → header-blue.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{header_dblue.gif → header-dblue.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{header_green.gif → header-green.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{header_purple.gif → header-purple.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{header_red.gif → header-red.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{txt_list_img_dblue.gif → txt-list-img-dblue.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{txt_list_img_green.gif → txt-list-img-green.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{txt_list_img_purple.gif → txt-list-img-purple.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{txt_list_img_red.gif → txt-list-img-red.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_corner_01.gif → window-corner-01.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_corner_02.gif → window-corner-02.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_corner_03.gif → window-corner-03.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_corner_04.gif → window-corner-04.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_shadow_bottom.gif → window-shadow-bottom.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_shadow_left.gif → window-shadow-left.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_shadow_right.gif → window-shadow-right.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/{window_shadow_top.gif → window-shadow-top.gif} +0 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +69 -69
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +39 -53
- data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +1 -1
- data/hobo_files/plugin/lib/extensions.rb +0 -16
- data/hobo_files/plugin/lib/hobo/dryml/part_context.rb +1 -1
- data/hobo_files/plugin/lib/hobo/dryml/tag_parameters.rb +35 -0
- data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +2 -2
- data/hobo_files/plugin/lib/hobo/dryml/template.rb +165 -236
- data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +158 -123
- data/hobo_files/plugin/lib/hobo/hobo_helper.rb +15 -4
- data/hobo_files/plugin/lib/hobo/model.rb +30 -11
- data/hobo_files/plugin/lib/hobo/model_controller.rb +13 -9
- data/hobo_files/plugin/lib/hobo/model_router.rb +27 -7
- data/hobo_files/plugin/lib/hobo/static_tags +0 -2
- data/hobo_files/plugin/lib/hobo/user.rb +3 -3
- data/hobo_files/plugin/lib/rexml.rb +10 -3
- data/hobo_files/plugin/tags/core.dryml +11 -16
- data/hobo_files/plugin/tags/rapid.dryml +147 -110
- data/hobo_files/plugin/tags/rapid_document_tags.dryml +22 -20
- data/hobo_files/plugin/tags/rapid_editing.dryml +41 -41
- data/hobo_files/plugin/tags/rapid_forms.dryml +51 -49
- data/hobo_files/plugin/tags/rapid_navigation.dryml +34 -34
- data/hobo_files/plugin/tags/rapid_pages.dryml +174 -174
- data/hobo_files/plugin/tags/rapid_plus.dryml +19 -19
- data/hobo_files/plugin/tags/rapid_support.dryml +5 -5
- data/hobo_files/plugin/tasks/dump_fixtures.rake +62 -53
- data/hobo_files/plugin/tasks/fix_dryml.rake +144 -0
- data/hobo_files/plugin/tasks/hobo_tasks.rake +0 -4
- metadata +43 -32
- data/hobo_files/plugin/lib/hobo/dryml/tag_module.rb +0 -9
data/bin/hobo
CHANGED
|
@@ -57,10 +57,13 @@ end
|
|
|
57
57
|
puts "\nGenerating Rails app...\n"
|
|
58
58
|
system("rails #{app_path}")
|
|
59
59
|
|
|
60
|
+
|
|
60
61
|
Dir.chdir(app_path) do
|
|
61
62
|
gen = "ruby #{File.join('script', 'generate')}"
|
|
62
63
|
plugin = "ruby #{File.join('script', 'plugin')}"
|
|
63
|
-
|
|
64
|
+
|
|
65
|
+
FileUtils.touch("public/stylesheets/application.css")
|
|
66
|
+
|
|
64
67
|
puts "\nInstalling classic_pagination\n"
|
|
65
68
|
command(plugin, "install svn://errtheblog.com/svn/plugins/classic_pagination")
|
|
66
69
|
|
|
@@ -93,8 +96,3 @@ Dir.chdir(app_path) do
|
|
|
93
96
|
end
|
|
94
97
|
end
|
|
95
98
|
|
|
96
|
-
puts <<-END
|
|
97
|
-
NOTE: If you intend to use the in-place-editors, the new form authenticity
|
|
98
|
-
features (CSRF protection) are not supported. You'll need to comment out the
|
|
99
|
-
'protect_from_forgery' declaration in app/controllers/application.rb
|
|
100
|
-
END
|
|
@@ -1,3 +1,173 @@
|
|
|
1
|
+
=== Release 0.7 ===
|
|
2
|
+
|
|
3
|
+
Hobo 0.7 is tested against Rails 1.99.1 (aka Rais 2.0 RC2)
|
|
4
|
+
|
|
5
|
+
DRYML
|
|
6
|
+
|
|
7
|
+
Switched to dashes instead of underscores for tag and attributes
|
|
8
|
+
names. These are converted to underscores in the underlying ruby
|
|
9
|
+
code.
|
|
10
|
+
|
|
11
|
+
Unification of tempalte tags and non-template tags. There is now
|
|
12
|
+
only one type of tag and two different ways to call a tag:
|
|
13
|
+
|
|
14
|
+
<my-tag>content directly inside the tag</my-tag>
|
|
15
|
+
|
|
16
|
+
<my-tag>
|
|
17
|
+
<a-parameter:>Content inside a named parameter (note the colon)</a-parameter>
|
|
18
|
+
<another-parameter:>Some more content</another-parameter>
|
|
19
|
+
</my-tag>
|
|
20
|
+
|
|
21
|
+
Note that these styles cannot be mixed. If there is a parameter
|
|
22
|
+
inside a tag call, there must be only parameters (and whitespace,
|
|
23
|
+
which is not output)
|
|
24
|
+
|
|
25
|
+
In the first style, the call is implicitly equivalent to:
|
|
26
|
+
|
|
27
|
+
<my-tag>
|
|
28
|
+
<default:>content directly inside the tag</default>
|
|
29
|
+
</my-tag>
|
|
30
|
+
|
|
31
|
+
And by the same token, <tagbody/> is now written:
|
|
32
|
+
|
|
33
|
+
<do param="default"/>
|
|
34
|
+
|
|
35
|
+
The tagbody local variable is gone too. "if tagbody" is now
|
|
36
|
+
"if all_parameters.default?" and "tagbody.call" is now
|
|
37
|
+
"all_parameters.default"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
A rake task hobo:fixdryml has been added which does a pretty good
|
|
41
|
+
job of converting Hobo 0.6 DRYML source-code to the new style. It
|
|
42
|
+
will change every file in app/views/**/*.dryml, and keeps a backup
|
|
43
|
+
copy of app/views in app_views_before_fixdryml. If you pass it CSS=y
|
|
44
|
+
and ID=y it will 'dasherize' css classes and IDs too, which is the
|
|
45
|
+
new Hobo concention. You can also pass DIR=... if you want to point
|
|
46
|
+
it somewhere other than app/views. It won't fix anything in erb
|
|
47
|
+
scriptlets, e.g. use of the tagbody local variable. Expect to do
|
|
48
|
+
some manual fixes after running the task (good job you've got that
|
|
49
|
+
thourough test suite eh?)
|
|
50
|
+
|
|
51
|
+
The add_classes helper now automatically dasherizes all class names.
|
|
52
|
+
|
|
53
|
+
New helper 'element'. Use in place of Rails' tag and content_tag
|
|
54
|
+
helper. It dasherizes attributes given as symbols.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
Migration generator
|
|
58
|
+
|
|
59
|
+
Better support for STI. It no longer wants to generate tables for
|
|
60
|
+
the subclasses. Stil needed: a way of integrating fields declared in
|
|
61
|
+
the subclasses -- they are currently ignored by the generator.
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
Hobo Rapid
|
|
65
|
+
|
|
66
|
+
In place editiing (and Ajax in general) will now provide the form
|
|
67
|
+
authentication token (CSRF protection) if available. No need to
|
|
68
|
+
disable protect_from_forgery any more.
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
Stylesheets:
|
|
72
|
+
|
|
73
|
+
Removed list-style: none from hobo_abse.css
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
Javascript:
|
|
77
|
+
|
|
78
|
+
Dasherized all css classes and dom IDs used.
|
|
79
|
+
|
|
80
|
+
Upgraded to latest low_pro.js
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
New theme 'Clean'
|
|
84
|
+
|
|
85
|
+
New helper 'linkable?' can be given a record or class, and tells you
|
|
86
|
+
if Hobo has a route for it. Only works for 'show' and 'index'
|
|
87
|
+
actions so far.
|
|
88
|
+
|
|
89
|
+
Tag library
|
|
90
|
+
|
|
91
|
+
\\'/;p <a> now automatically knows not to generate (broken) links to
|
|
92
|
+
things that are not 'linkable?'. Outputs just the link content
|
|
93
|
+
instead.
|
|
94
|
+
|
|
95
|
+
We used to have <FieldList> and <field_list>. We now have
|
|
96
|
+
<field-list> and <labelled-item-list>
|
|
97
|
+
|
|
98
|
+
<UL> is now <ul>, and only has the iteration behaviour if you give
|
|
99
|
+
a <li:> parameter. Otherwise it's just like a static tag.
|
|
100
|
+
|
|
101
|
+
<Table> is now <table> and only has the special behaviour if you
|
|
102
|
+
give a 'fields' attribute or '<tr:>' parameter. Otherwise it's
|
|
103
|
+
just like a static tag.
|
|
104
|
+
|
|
105
|
+
<view> for dates and times no longer break when the context is
|
|
106
|
+
nil.
|
|
107
|
+
|
|
108
|
+
<count> - unless-none attribute is gone. user if-any
|
|
109
|
+
|
|
110
|
+
<theme-stylesheet> now takes a 'name' attribute
|
|
111
|
+
|
|
112
|
+
<delete-button> takes a 'subsite' attribute
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
Rake tasks
|
|
116
|
+
|
|
117
|
+
New task hobo:fixdryml (see DRYML section above)
|
|
118
|
+
|
|
119
|
+
dump_fixtures is now hobo:fixtures:dump
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
Hobo models
|
|
125
|
+
|
|
126
|
+
Automatically declares the field 'position :integer' if the model
|
|
127
|
+
acts_as_list.
|
|
128
|
+
|
|
129
|
+
never_show declarations are now inherited
|
|
130
|
+
|
|
131
|
+
Fix: def_scope was broken when the scope name ended '?'
|
|
132
|
+
|
|
133
|
+
Fix: Hobo broke the 'guard_protected_attributes' optional parameter
|
|
134
|
+
to attributes=. (this was breaking attachment_fu)
|
|
135
|
+
|
|
136
|
+
Fix: assigning Date and Time objects in mass-assignment was broken.
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
User model
|
|
140
|
+
|
|
141
|
+
Newly generated user models (hobo_user_model generator) now give
|
|
142
|
+
create permission to all by default (to enable signup).
|
|
143
|
+
|
|
144
|
+
logins_count renamed to login_count (Hobo manages this feild for you
|
|
145
|
+
if it exists).
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
Core extensions
|
|
149
|
+
|
|
150
|
+
Module#alias_tag_chain, which never should have been there is
|
|
151
|
+
gone. (It's not needed now that camel-case tags have gone).
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
1
171
|
=== Release 0.6.4 ===
|
|
2
172
|
|
|
3
173
|
Fix: In-place-editors were not working with the new version of
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
<
|
|
1
|
+
<page title="<%= app_name %>">
|
|
2
2
|
|
|
3
|
-
<
|
|
4
|
-
<h1 class="
|
|
3
|
+
<content-header:>
|
|
4
|
+
<h1 class="front-page-title"><%= app_name %></h1>
|
|
5
5
|
<panel>
|
|
6
|
-
<div
|
|
6
|
+
<div>
|
|
7
7
|
<h3>Congratulations! Your Hobo Rails App is up and running</h3>
|
|
8
8
|
<ul>
|
|
9
9
|
<li>To customise this page: edit app/views/<%= file_name %>/index.dryml </li>
|
|
10
10
|
</ul>
|
|
11
11
|
</div>
|
|
12
12
|
</panel>
|
|
13
|
-
</
|
|
13
|
+
</content-header>
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
<
|
|
16
|
+
<content-body:>
|
|
17
17
|
<repeat with="&Hobo.models">
|
|
18
18
|
<panel>
|
|
19
19
|
<header><h2><%%= this.name.titlecase.pluralize %></h2></header>
|
|
20
20
|
<section>
|
|
21
21
|
<if test="&this.count == 0">
|
|
22
22
|
<p>There are no <%%= this.name.titleize.pluralize %></p>
|
|
23
|
-
<if test="&can_create?
|
|
23
|
+
<if test="&can_create?">
|
|
24
24
|
<p>Create a <a to="&this" action="new"/>.</p>
|
|
25
25
|
</if>
|
|
26
26
|
</if>
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
</section>
|
|
34
34
|
</panel>
|
|
35
35
|
</repeat>
|
|
36
|
-
</
|
|
36
|
+
</content-body>
|
|
37
37
|
|
|
38
|
-
</
|
|
38
|
+
</page>
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
<
|
|
2
|
-
<body onload="Hobo.applyEvents(); Hobo.doSearch('
|
|
1
|
+
<page title="Search">
|
|
2
|
+
<body: onload="Hobo.applyEvents(); Hobo.doSearch('search-field')"/>
|
|
3
3
|
|
|
4
|
-
<
|
|
4
|
+
<content-body:>
|
|
5
5
|
<panel class="red" style="margin-top: 40px">
|
|
6
6
|
<h2>Search</h2>
|
|
7
|
-
<div class=
|
|
8
|
-
<input type=
|
|
7
|
+
<div class="search">
|
|
8
|
+
<input type="text" id="search-field" class="search-bhv" style="width: 90%"/>
|
|
9
9
|
<spinner id="search_spinner"/>
|
|
10
10
|
</div>
|
|
11
11
|
</panel>
|
|
12
12
|
|
|
13
|
-
<panel class="hidden" id="
|
|
13
|
+
<panel class="hidden" id="search-results-panel">
|
|
14
14
|
<h2>Results</h2>
|
|
15
|
-
<section id="
|
|
15
|
+
<section id="search-results"> </section>
|
|
16
16
|
</panel>
|
|
17
|
-
</
|
|
17
|
+
</content-body>
|
|
18
18
|
|
|
19
|
-
</
|
|
19
|
+
</page>
|
|
@@ -7,6 +7,12 @@ class HoboMigrationGenerator < Rails::Generator::Base
|
|
|
7
7
|
"hobo_migration_#{i+1}"
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
|
+
|
|
11
|
+
def table_model_classes
|
|
12
|
+
ActiveRecord::Base.send(:subclasses).
|
|
13
|
+
reject {|c| c.name.starts_with?("CGI::") }.
|
|
14
|
+
select {|c| c.superclass == ActiveRecord::Base}
|
|
15
|
+
end
|
|
10
16
|
|
|
11
17
|
def manifest
|
|
12
18
|
connection = ActiveRecord::Base.connection
|
|
@@ -17,8 +23,7 @@ class HoboMigrationGenerator < Rails::Generator::Base
|
|
|
17
23
|
|
|
18
24
|
ignore_model_names = Hobo::Migrations.ignore.every(:underscore)
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
models, ignore_models = all_models.partition do |m|
|
|
26
|
+
models, ignore_models = table_model_classes.partition do |m|
|
|
22
27
|
m.name.underscore.not_in?(ignore_model_names) && m < Hobo::Model
|
|
23
28
|
end
|
|
24
29
|
ignore_tables = ignore_models.every(:table_name) | Hobo::Migrations.ignore_tables
|
|
@@ -10,10 +10,10 @@ class HoboRapidGenerator < Hobo::Generator
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
record do |m|
|
|
13
|
-
m.file "
|
|
13
|
+
m.file "hobo-rapid.js", "public/javascripts/hobo-rapid.js"
|
|
14
14
|
m.file "lowpro.js", "public/javascripts/lowpro.js"
|
|
15
|
-
m.file "
|
|
16
|
-
m.file "
|
|
15
|
+
m.file "reset.css", "public/stylesheets/reset.css"
|
|
16
|
+
m.file "hobo-rapid.css", "public/stylesheets/hobo-rapid.css"
|
|
17
17
|
create_all(m, "themes/default/public", "public/hobothemes/default")
|
|
18
18
|
create_all(m, "themes/default/views", "app/views/taglibs/themes/default")
|
|
19
19
|
end
|
|
@@ -22,7 +22,7 @@ class HoboRapidGenerator < Hobo::Generator
|
|
|
22
22
|
def import_tags
|
|
23
23
|
path = File.join(RAILS_ROOT, "app/views/taglibs/application.dryml")
|
|
24
24
|
|
|
25
|
-
tag = "<include src=\"plugins/hobo/tags/rapid\"/>\n\n<
|
|
25
|
+
tag = "<include src=\"plugins/hobo/tags/rapid\"/>\n\n<set-theme name=\"default\"/>\n"
|
|
26
26
|
|
|
27
27
|
src = File.read(path)
|
|
28
28
|
return if src.include?(tag)
|
|
File without changes
|
|
@@ -24,19 +24,19 @@ var Hobo = {
|
|
|
24
24
|
|
|
25
25
|
updatesForElement: function(el) {
|
|
26
26
|
el = $(el)
|
|
27
|
-
var updates = el.getAttribute("
|
|
27
|
+
var updates = el.getAttribute("hobo-update")
|
|
28
28
|
return updates ? updates.split(/\s*,\s*/) : []
|
|
29
29
|
},
|
|
30
30
|
|
|
31
31
|
ajaxSetFieldForElement: function(el, val, options) {
|
|
32
32
|
var updates = Hobo.updatesForElement(el)
|
|
33
33
|
var params = Hobo.fieldSetParam(el, val)
|
|
34
|
-
var p = el.getAttribute("
|
|
34
|
+
var p = el.getAttribute("hobo-ajax-params")
|
|
35
35
|
if (p) params = params + "&" + p
|
|
36
36
|
|
|
37
37
|
var opts = Object.merge(options || {}, { params: params})
|
|
38
38
|
Hobo.ajaxRequest(Hobo.putUrl(el),
|
|
39
|
-
el.getAttribute("
|
|
39
|
+
el.getAttribute("hobo-ajax-message") || "Changing...",
|
|
40
40
|
updates,
|
|
41
41
|
opts)
|
|
42
42
|
},
|
|
@@ -48,11 +48,11 @@ var Hobo = {
|
|
|
48
48
|
updates.each(function(id_or_el) {
|
|
49
49
|
var el = $(id_or_el)
|
|
50
50
|
if (el) { // ignore update of parts that do not exist
|
|
51
|
-
var
|
|
52
|
-
|
|
53
|
-
if (!hoboParts[
|
|
54
|
-
params.push("render["+i+"][part_context]=" + encodeURIComponent(hoboParts[
|
|
55
|
-
params.push("render["+i+"][id]=" +
|
|
51
|
+
var partDomId
|
|
52
|
+
partDomId = el.id
|
|
53
|
+
if (!hoboParts[partDomId]) { throw "Update of dom-id that is not a part: " + partDomId }
|
|
54
|
+
params.push("render["+i+"][part_context]=" + encodeURIComponent(hoboParts[partDomId]))
|
|
55
|
+
params.push("render["+i+"][id]=" + partDomId)
|
|
56
56
|
i += 1
|
|
57
57
|
}
|
|
58
58
|
})
|
|
@@ -86,6 +86,10 @@ var Hobo = {
|
|
|
86
86
|
var url = form.action
|
|
87
87
|
}
|
|
88
88
|
var params = []
|
|
89
|
+
|
|
90
|
+
if (typeof(formAuthToken) != "undefined") {
|
|
91
|
+
params.push(formAuthToken.name + "=" + formAuthToken.value)
|
|
92
|
+
}
|
|
89
93
|
|
|
90
94
|
updateParams = Hobo.ajaxUpdateParams(updates, options.resultUpdate)
|
|
91
95
|
if (updateParams != "") { params.push(updateParams) }
|
|
@@ -155,16 +159,16 @@ var Hobo = {
|
|
|
155
159
|
var oldValue = Hobo.ipeOldValues[el.id]
|
|
156
160
|
delete Hobo.ipeOldValues[el.id]
|
|
157
161
|
|
|
158
|
-
var blank = el.getAttribute("
|
|
162
|
+
var blank = el.getAttribute("hobo-blank-message")
|
|
159
163
|
if (blank && newValue.strip().length == 0) {
|
|
160
164
|
el.update(blank)
|
|
161
165
|
} else {
|
|
162
166
|
el.update(newValue)
|
|
163
167
|
}
|
|
164
168
|
|
|
165
|
-
var modelId = el.getAttribute('
|
|
169
|
+
var modelId = el.getAttribute('hobo-model-id')
|
|
166
170
|
if (oldValue) {
|
|
167
|
-
$$("*[
|
|
171
|
+
$$("*[hobo-model-id=" + modelId + "]").each(function(e) {
|
|
168
172
|
if (e != el && e.innerHTML == oldValue) e.update(newValue)
|
|
169
173
|
})
|
|
170
174
|
}
|
|
@@ -182,28 +186,29 @@ var Hobo = {
|
|
|
182
186
|
opts = {okButton: false,
|
|
183
187
|
cancelLink: false,
|
|
184
188
|
submitOnBlur: true,
|
|
185
|
-
callback: function(form, val) {
|
|
186
|
-
old = val
|
|
187
|
-
return (Hobo.fieldSetParam(el, val) + "&" + updateParams)
|
|
188
|
-
},
|
|
189
|
-
onFailure: function(resp) { alert(resp.responseText); el.innerHTML = old },
|
|
190
189
|
evalScripts: true,
|
|
191
190
|
htmlResponse: false,
|
|
192
191
|
ajaxOptions: { method: "put" },
|
|
193
192
|
onEnterHover: null,
|
|
194
|
-
onLeaveHover: null
|
|
193
|
+
onLeaveHover: null,
|
|
194
|
+
callback: function(form, val) {
|
|
195
|
+
old = val
|
|
196
|
+
return (Hobo.fieldSetParam(el, val) + "&" + updateParams)
|
|
197
|
+
},
|
|
198
|
+
onFailure: function(resp) {
|
|
199
|
+
alert(resp.responseText); el.innerHTML = old
|
|
200
|
+
},
|
|
201
|
+
onEnterEditMode: function() {
|
|
202
|
+
var blank_message = el.getAttribute("hobo-blank-message")
|
|
203
|
+
if (el.innerHTML.gsub(" ", " ") == blank_message) {
|
|
204
|
+
el.innerHTML = ""
|
|
205
|
+
} else {
|
|
206
|
+
Hobo.ipeOldValues[el.id] = el.innerHTML
|
|
207
|
+
}
|
|
208
|
+
}
|
|
195
209
|
}
|
|
196
210
|
Object.extend(opts, options)
|
|
197
|
-
|
|
198
|
-
ipe.onEnterEditMode = function() {
|
|
199
|
-
var blank_message = el.getAttribute("hobo_blank_message")
|
|
200
|
-
if (el.innerHTML.gsub(" ", " ") == blank_message) {
|
|
201
|
-
el.innerHTML = ""
|
|
202
|
-
} else {
|
|
203
|
-
Hobo.ipeOldValues[el.id] = el.innerHTML
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return ipe
|
|
211
|
+
return new Ajax.InPlaceEditor(el, Hobo.putUrl(el), opts)
|
|
207
212
|
},
|
|
208
213
|
|
|
209
214
|
applyEvents: function(root) {
|
|
@@ -212,21 +217,21 @@ var Hobo = {
|
|
|
212
217
|
return new Selector(p).findElements(root)
|
|
213
218
|
}
|
|
214
219
|
|
|
215
|
-
select(".
|
|
220
|
+
select(".in-place-textfield-bhv").each(function (el) {
|
|
216
221
|
ipe = Hobo._makeInPlaceEditor(el)
|
|
217
222
|
ipe.getText = function() {
|
|
218
223
|
return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
|
|
219
224
|
}
|
|
220
225
|
})
|
|
221
226
|
|
|
222
|
-
select(".
|
|
227
|
+
select(".in-place-textarea-bhv").each(function (el) {
|
|
223
228
|
ipe = Hobo._makeInPlaceEditor(el, {rows: 2})
|
|
224
229
|
ipe.getText = function() {
|
|
225
230
|
return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
|
|
226
231
|
}
|
|
227
232
|
})
|
|
228
233
|
|
|
229
|
-
select(".
|
|
234
|
+
select(".in-place-html-textarea-bhv").each(function (el) {
|
|
230
235
|
var options = {rows: 2, handleLineBreaks: false}
|
|
231
236
|
if (typeof(tinyMCE) != "undefined") options["submitOnBlur"] = false
|
|
232
237
|
var ipe = Hobo._makeInPlaceEditor(el, options)
|
|
@@ -250,22 +255,22 @@ var Hobo = {
|
|
|
250
255
|
}
|
|
251
256
|
})
|
|
252
257
|
|
|
253
|
-
select("select.
|
|
258
|
+
select("select.number-editor-bhv").each(function(el) {
|
|
254
259
|
el.onchange = function() {
|
|
255
260
|
Hobo.ajaxSetFieldForElement(el, el.value)
|
|
256
261
|
}
|
|
257
262
|
})
|
|
258
263
|
|
|
259
|
-
select(".
|
|
264
|
+
select(".autocomplete-bhv").each(function (el) {
|
|
260
265
|
options = {paramName: "query", minChars: 3, method: 'get' }
|
|
261
266
|
if (el.hasClassName("autosubmit")) {
|
|
262
267
|
options.afterUpdateElement = function(el, item) { el.form.onsubmit(); }
|
|
263
268
|
}
|
|
264
|
-
new Ajax.Autocompleter(el, el.id + "
|
|
269
|
+
new Ajax.Autocompleter(el, el.id + "-completions", el.getAttribute("autocomplete-url"),
|
|
265
270
|
options);
|
|
266
271
|
});
|
|
267
272
|
|
|
268
|
-
select(".
|
|
273
|
+
select(".search-bhv").each(function(el) {
|
|
269
274
|
new Form.Element.Observer(el, 1.0, function() { Hobo.doSearch(el) })
|
|
270
275
|
});
|
|
271
276
|
},
|
|
@@ -273,10 +278,10 @@ var Hobo = {
|
|
|
273
278
|
|
|
274
279
|
doSearch: function(el) {
|
|
275
280
|
el = $(el)
|
|
276
|
-
var spinner = $(el.getAttribute("
|
|
277
|
-
var search_results = $(el.getAttribute("
|
|
278
|
-
var search_results_panel = $(el.getAttribute("
|
|
279
|
-
var url = el.getAttribute("
|
|
281
|
+
var spinner = $(el.getAttribute("search-spinner") || "search-spinner")
|
|
282
|
+
var search_results = $(el.getAttribute("search-results") || "search-results")
|
|
283
|
+
var search_results_panel = $(el.getAttribute("search-results-panel") || "search-results-panel")
|
|
284
|
+
var url = el.getAttribute("search-url") || (urlBase + "/search")
|
|
280
285
|
|
|
281
286
|
el.focus();
|
|
282
287
|
var value = $F(el)
|
|
@@ -311,7 +316,11 @@ var Hobo = {
|
|
|
311
316
|
|
|
312
317
|
fieldSetParam: function(el, val) {
|
|
313
318
|
spec = Hobo.parseFieldId(el)
|
|
314
|
-
|
|
319
|
+
res = spec.name + '[' + spec.field + ']=' + encodeURIComponent(val)
|
|
320
|
+
if (typeof(formAuthToken) != "undefined") {
|
|
321
|
+
res = res + "&" + formAuthToken.name + "=" + formAuthToken.value
|
|
322
|
+
}
|
|
323
|
+
return res
|
|
315
324
|
},
|
|
316
325
|
|
|
317
326
|
fadeObjectElement: function(el) {
|
|
@@ -343,7 +352,7 @@ var Hobo = {
|
|
|
343
352
|
|
|
344
353
|
|
|
345
354
|
parseFieldId: function(el) {
|
|
346
|
-
id = el.getAttribute("
|
|
355
|
+
id = el.getAttribute("hobo-model-id")
|
|
347
356
|
if (!id) return
|
|
348
357
|
m = id.match(/^([a-z_]+)_([0-9]+)_([a-z_]+)$/)
|
|
349
358
|
if (m) return { name: m[1], id: m[2], field: m[3] }
|
|
@@ -360,7 +369,7 @@ var Hobo = {
|
|
|
360
369
|
objectElementFor: function(el) {
|
|
361
370
|
var m
|
|
362
371
|
while(el.getAttribute) {
|
|
363
|
-
id = el.getAttribute("
|
|
372
|
+
id = el.getAttribute("hobo-model-id");
|
|
364
373
|
if (id) m = id.match(/^([a-z_]+)_([0-9]+)(_[a-z0-9_]*)?$/);
|
|
365
374
|
if (m) break;
|
|
366
375
|
el = el.parentNode;
|
|
@@ -370,13 +379,13 @@ var Hobo = {
|
|
|
370
379
|
|
|
371
380
|
|
|
372
381
|
showSpinner: function(message) {
|
|
373
|
-
if(t = $('
|
|
374
|
-
if(e = $('
|
|
382
|
+
if(t = $('ajax-progress-text')) Element.update(t, message);
|
|
383
|
+
if(e = $('ajax-progress')) e.style.display = "block";
|
|
375
384
|
},
|
|
376
385
|
|
|
377
386
|
|
|
378
387
|
hideSpinner: function() {
|
|
379
|
-
if(e = $('
|
|
388
|
+
if(e = $('ajax-progress')) e.style.display = "none";
|
|
380
389
|
},
|
|
381
390
|
|
|
382
391
|
|
|
@@ -426,6 +435,7 @@ Element.findContaining = function(el, tag) {
|
|
|
426
435
|
return null;
|
|
427
436
|
}
|
|
428
437
|
|
|
438
|
+
// Add an afterEnterEditMode hook to in-place-editor
|
|
429
439
|
origEnterEditMode = Ajax.InPlaceEditor.prototype.enterEditMode
|
|
430
440
|
Ajax.InPlaceEditor.prototype.enterEditMode = function(evt) {
|
|
431
441
|
origEnterEditMode.bind(this)(evt)
|
|
@@ -433,6 +443,15 @@ Ajax.InPlaceEditor.prototype.enterEditMode = function(evt) {
|
|
|
433
443
|
return false
|
|
434
444
|
}
|
|
435
445
|
|
|
446
|
+
// Fix Safari in-place-editor bug
|
|
447
|
+
Ajax.InPlaceEditor.prototype.removeForm = function() {
|
|
448
|
+
if (!this._form) return;
|
|
449
|
+
|
|
450
|
+
if (this._form.parentNode) { try { Element.remove(this._form); } catch (e) {}}
|
|
451
|
+
this._form = null;
|
|
452
|
+
this._controls = { };
|
|
453
|
+
}
|
|
454
|
+
|
|
436
455
|
// Silence errors from IE :-(
|
|
437
456
|
Field.scrollFreeActivate = function(field) {
|
|
438
457
|
setTimeout(function() {
|
|
@@ -460,7 +479,7 @@ HasManyThroughInput = Behavior.create({
|
|
|
460
479
|
var select = this.element.down('select')
|
|
461
480
|
var selected = select.options[select.selectedIndex]
|
|
462
481
|
if (selected.style.display != "none" & selected.value != "") {
|
|
463
|
-
var newItem = strToDom(this.element.down('.
|
|
482
|
+
var newItem = strToDom(this.element.down('.item-proto').innerHTML)
|
|
464
483
|
this.element.down('.items').appendChild(newItem);
|
|
465
484
|
newItem.down('span').innerHTML = selected.innerHTML
|
|
466
485
|
newItem.down('input[type=hidden]').value = selected.innerHTML
|
|
@@ -472,7 +491,7 @@ HasManyThroughInput = Behavior.create({
|
|
|
472
491
|
onclick : function(e) {
|
|
473
492
|
var el = Event.element(e);
|
|
474
493
|
Event.stop(e);
|
|
475
|
-
if (el.match(".
|
|
494
|
+
if (el.match(".remove-item")) { this.removeOne(el.parentNode) }
|
|
476
495
|
},
|
|
477
496
|
|
|
478
497
|
removeOne : function(el) {
|
|
@@ -487,5 +506,5 @@ HasManyThroughInput = Behavior.create({
|
|
|
487
506
|
})
|
|
488
507
|
|
|
489
508
|
Event.addBehavior({
|
|
490
|
-
'div.
|
|
509
|
+
'div.has-many-through.input' : HasManyThroughInput()
|
|
491
510
|
});
|