zena 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. data/History.txt +38 -1
  2. data/app/controllers/documents_controller.rb +7 -5
  3. data/app/controllers/nodes_controller.rb +47 -6
  4. data/app/controllers/user_sessions_controller.rb +12 -3
  5. data/app/controllers/virtual_classes_controller.rb +8 -2
  6. data/app/models/acl.rb +5 -2
  7. data/app/models/cached_page.rb +5 -5
  8. data/app/models/column.rb +27 -4
  9. data/app/models/group.rb +1 -1
  10. data/app/models/node.rb +106 -24
  11. data/app/models/note.rb +2 -1
  12. data/app/models/relation.rb +9 -4
  13. data/app/models/relation_proxy.rb +2 -2
  14. data/app/models/role.rb +12 -5
  15. data/app/models/site.rb +10 -9
  16. data/app/models/skin.rb +8 -0
  17. data/app/models/string_hash.rb +65 -0
  18. data/app/models/text_document.rb +1 -1
  19. data/app/models/user.rb +2 -0
  20. data/app/models/virtual_class.rb +43 -10
  21. data/app/views/comments/create.rjs +1 -32
  22. data/app/views/comments/edit.rjs +1 -1
  23. data/app/views/comments/update.rjs +1 -1
  24. data/app/views/documents/show.rhtml +1 -1
  25. data/app/views/groups/_form.rhtml +7 -0
  26. data/app/views/groups/_li.rhtml +1 -1
  27. data/app/views/nodes/500.html +2 -1
  28. data/app/views/nodes/destroy.rjs +2 -0
  29. data/app/views/sites/jobs.erb +2 -3
  30. data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
  31. data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
  32. data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
  33. data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
  34. data/app/views/versions/custom_tab.rhtml +1 -1
  35. data/app/views/versions/edit.rhtml +1 -1
  36. data/bricks/acls/lib/bricks/acls.rb +3 -3
  37. data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
  38. data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
  39. data/bricks/fs_skin/zena/init.rb +1 -0
  40. data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
  41. data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
  42. data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
  43. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
  44. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
  45. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
  46. data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
  47. data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
  48. data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
  49. data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
  50. data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
  51. data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
  52. data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
  53. data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
  54. data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
  55. data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
  56. data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
  57. data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
  58. data/bricks/fs_skin/zena/tasks.rb +26 -0
  59. data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
  60. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
  61. data/bricks/grid/lib/bricks/grid.rb +4 -3
  62. data/bricks/tags/lib/bricks/tags.rb +1 -7
  63. data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
  64. data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
  65. data/config/bricks.yml +3 -3
  66. data/config/gems.yml +2 -3
  67. data/lib/tasks/zena.rake +7 -3
  68. data/lib/zafu.rb +7 -0
  69. data/lib/zafu/all.rb +21 -0
  70. data/lib/zafu/compiler.rb +7 -0
  71. data/lib/zafu/controller_methods.rb +58 -0
  72. data/lib/zafu/handler.rb +57 -0
  73. data/lib/zafu/info.rb +4 -0
  74. data/lib/zafu/markup.rb +309 -0
  75. data/lib/zafu/mock_helper.rb +42 -0
  76. data/lib/zafu/node_context.rb +203 -0
  77. data/lib/zafu/ordered_hash.rb +53 -0
  78. data/lib/zafu/parser.rb +676 -0
  79. data/lib/zafu/parsing_rules.rb +382 -0
  80. data/lib/zafu/process/ajax.rb +530 -0
  81. data/lib/zafu/process/conditional.rb +92 -0
  82. data/lib/zafu/process/context.rb +186 -0
  83. data/lib/zafu/process/forms.rb +143 -0
  84. data/lib/zafu/process/html.rb +186 -0
  85. data/lib/zafu/process/ruby_less_processing.rb +321 -0
  86. data/lib/zafu/security.rb +15 -0
  87. data/lib/zafu/template.rb +25 -0
  88. data/lib/zafu/test_helper.rb +19 -0
  89. data/lib/zafu/view_methods.rb +6 -0
  90. data/lib/zena.rb +1 -1
  91. data/lib/zena/acts/enrollable.rb +1 -1
  92. data/lib/zena/app.rb +4 -17
  93. data/lib/zena/console.rb +18 -1
  94. data/lib/zena/core_ext/file_utils.rb +13 -1
  95. data/lib/zena/core_ext/fixnum.rb +4 -0
  96. data/lib/zena/core_ext/float.rb +7 -0
  97. data/lib/zena/deploy.rb +4 -2
  98. data/lib/zena/deploy/app_init.rhtml +2 -1
  99. data/lib/zena/deploy/database.rhtml +1 -1
  100. data/lib/zena/info.rb +1 -1
  101. data/lib/zena/parser/zazen_rules.rb +4 -4
  102. data/lib/zena/routes.rb +1 -1
  103. data/lib/zena/test_controller.rb +1 -1
  104. data/lib/zena/use.rb +14 -1
  105. data/lib/zena/use/action.rb +4 -2
  106. data/lib/zena/use/ajax.rb +86 -38
  107. data/lib/zena/use/authlogic.rb +16 -1
  108. data/lib/zena/use/calendar.rb +37 -17
  109. data/lib/zena/use/conditional.rb +2 -2
  110. data/lib/zena/use/context.rb +30 -9
  111. data/lib/zena/use/dates.rb +39 -3
  112. data/lib/zena/use/display.rb +6 -19
  113. data/lib/zena/use/forms.rb +100 -79
  114. data/lib/zena/use/i18n.rb +40 -16
  115. data/lib/zena/use/query_builder.rb +0 -6
  116. data/lib/zena/use/query_node.rb +17 -4
  117. data/lib/zena/use/relations.rb +1 -3
  118. data/lib/zena/use/rendering.rb +10 -8
  119. data/lib/zena/use/scope_index.rb +5 -1
  120. data/lib/zena/use/search.rb +2 -1
  121. data/lib/zena/use/urls.rb +82 -77
  122. data/lib/zena/use/workflow.rb +12 -4
  123. data/lib/zena/use/zafu_safe_definitions.rb +37 -9
  124. data/lib/zena/use/zafu_templates.rb +49 -20
  125. data/lib/zena/use/zazen.rb +6 -2
  126. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  127. data/locale/it/zena.mo +0 -0
  128. data/locale/it/zena.po +1982 -0
  129. data/public/images/arrow_back.png +0 -0
  130. data/public/images/remove_tag.png +0 -0
  131. data/public/javascripts/grid.js +800 -199
  132. data/public/javascripts/window.js +1 -1
  133. data/public/javascripts/zena.js +130 -21
  134. data/public/stylesheets/grid.css +11 -2
  135. data/public/stylesheets/zena.css +2 -1
  136. data/test/custom_queries/complex.host.yml +5 -0
  137. data/test/fixtures/files/TestNode.zafu +36 -0
  138. data/test/functional/nodes_controller_test.rb +18 -1
  139. data/test/integration/zafu_compiler/action.yml +2 -2
  140. data/test/integration/zafu_compiler/ajax.yml +44 -26
  141. data/test/integration/zafu_compiler/asset.yml +12 -2
  142. data/test/integration/zafu_compiler/basic.yml +0 -16
  143. data/test/integration/zafu_compiler/calendar.yml +6 -6
  144. data/test/integration/zafu_compiler/complex_ok.yml +23 -1
  145. data/test/integration/zafu_compiler/conditional.yml +5 -5
  146. data/test/integration/zafu_compiler/context.yml +6 -5
  147. data/test/integration/zafu_compiler/dates.yml +23 -2
  148. data/test/integration/zafu_compiler/display.yml +46 -2
  149. data/test/integration/zafu_compiler/errors.yml +2 -2
  150. data/test/integration/zafu_compiler/eval.yml +35 -7
  151. data/test/integration/zafu_compiler/forms.yml +47 -13
  152. data/test/integration/zafu_compiler/i18n.yml +2 -2
  153. data/test/integration/zafu_compiler/meta.yml +35 -1
  154. data/test/integration/zafu_compiler/query.yml +23 -4
  155. data/test/integration/zafu_compiler/relations.yml +10 -6
  156. data/test/integration/zafu_compiler/roles.yml +4 -4
  157. data/test/integration/zafu_compiler/rubyless.yml +11 -1
  158. data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
  159. data/test/integration/zafu_compiler/security.yml +10 -6
  160. data/test/integration/zafu_compiler/urls.yml +23 -6
  161. data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
  162. data/test/integration/zafu_compiler/zazen.yml +14 -0
  163. data/test/selenium/Add/add3.rsel +8 -8
  164. data/test/selenium/Destroy/0setup.rsel +12 -0
  165. data/test/selenium/Destroy/destroy1.rsel +16 -0
  166. data/test/selenium/Edit/edit2.rsel +9 -9
  167. data/test/selenium/Edit/edit5.rsel +9 -9
  168. data/test/selenium/Edit/edit6.rsel +9 -9
  169. data/test/selenium/Form/form4.rsel +17 -0
  170. data/test/selenium/Toggle/toggle1.rsel +2 -0
  171. data/test/selenium/Toggle/toggle2.rsel +18 -0
  172. data/test/sites/zena/columns.yml +3 -0
  173. data/test/sites/zena/versions.yml +7 -0
  174. data/test/unit/cached_page_test.rb +13 -13
  175. data/test/unit/column_test.rb +26 -0
  176. data/test/unit/node_test.rb +16 -1
  177. data/test/unit/project_test.rb +6 -1
  178. data/test/unit/relation_test.rb +1 -1
  179. data/test/unit/role_test.rb +1 -1
  180. data/test/unit/string_hash_test.rb +30 -0
  181. data/test/unit/virtual_class_test.rb +31 -17
  182. data/test/unit/zafu_markup_test.rb +414 -0
  183. data/test/unit/zafu_node_context_test.rb +375 -0
  184. data/test/unit/zafu_ordered_hash_test.rb +69 -0
  185. data/test/unit/zena/acts/enrollable_test.rb +1 -1
  186. data/test/unit/zena/parser/zafu_asset.yml +0 -10
  187. data/test/unit/zena/parser/zazen.yml +1 -1
  188. data/test/unit/zena/parser_test.rb +1 -72
  189. data/test/unit/zena/use/dates_test.rb +1 -1
  190. data/test/unit/zena/use/rendering_test.rb +24 -7
  191. data/test/unit/zena/use/scope_index_test.rb +17 -0
  192. data/test/unit/zena/use/zazen_test.rb +2 -1
  193. data/zena.gemspec +71 -37
  194. metadata +104 -83
  195. data/app/views/nodes/destroy.erb +0 -0
  196. data/bricks/static/lib/bricks/static.rb +0 -151
  197. data/bricks/static/zena/init.rb +0 -1
  198. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
  199. data/bricks/static/zena/test/unit/static_test.rb +0 -33
  200. data/lib/zena/parser/zafu_rules.rb +0 -244
  201. data/lib/zena/parser/zafu_tags.rb +0 -198
  202. data/lib/zena/parser/zena_rules.rb +0 -23
@@ -8,7 +8,7 @@ module Zena
8
8
  ::ENV['LANG'] = 'C'
9
9
 
10
10
  class TranslationDict
11
- attr_reader :last_error, :node_id
11
+ attr_reader :last_error, :node_id, :static
12
12
 
13
13
  include Zena::Acts::Secure
14
14
  include RubyLess
@@ -16,8 +16,9 @@ module Zena
16
16
  # never returns nil
17
17
  safe_method [:get, String] => {:class => String, :accept_nil => true}
18
18
 
19
- def initialize(node_id)
19
+ def initialize(node_id, static = nil)
20
20
  @node_id = node_id
21
+ @static = static
21
22
  end
22
23
 
23
24
  def get(key, use_global = true)
@@ -31,21 +32,30 @@ module Zena
31
32
 
32
33
  def load!(text = nil)
33
34
  unless text
34
- unless dict = secure(Node) { Node.find(:first, :conditions => {:id => @node_id}) }
35
- @dict = {}
36
- error("missing 'dictionary'")
37
- return false
35
+ if @node_id
36
+ if dict = secure(Node) { Node.find(:first, :conditions => {:id => @node_id}) }
37
+ text = dict.prop['text']
38
+ else
39
+ @dict = {}
40
+ error("missing 'dictionary'")
41
+ return false
42
+ end
43
+ else
44
+ text, ignore = ::Skin.text_from_fs_skin(@static[:brick_name], @static[:skin_name], @static[:path], :ext => 'yml')
45
+ unless text
46
+ @dict = {}
47
+ error("missing 'dictionary'")
48
+ return false
49
+ end
38
50
  end
39
- text = dict.prop['text']
40
51
  end
41
-
52
+
42
53
  begin
43
54
  definitions = YAML::load(text)
44
55
  if translations = definitions['translations']
45
56
  if translations.kind_of?(Hash)
46
57
  # ok
47
58
  @dict = translations
48
- true
49
59
  else
50
60
  return error("bad 'translations' content (should be a dictionary)")
51
61
  end
@@ -218,8 +228,8 @@ module Zena
218
228
  ApplicationController.send(:_, str)
219
229
  end
220
230
 
221
- def load_dictionary(node_id)
222
- Zena::Use::I18n::TranslationDict.new(node_id)
231
+ def load_dictionary(node_id, static=nil)
232
+ Zena::Use::I18n::TranslationDict.new(node_id, static)
223
233
  end
224
234
 
225
235
  # show language selector
@@ -284,10 +294,19 @@ module Zena
284
294
  def r_load
285
295
  if dict = @params[:dictionary]
286
296
  # FIXME: replace @options[:base_path] by @options[:skin_id]
287
- dict_content, absolute_url, base_path, doc = @options[:helper].send(:get_template_text, dict, @options[:base_path])
288
- if base_path
297
+ dict_content, absolute_url, base_path, doc = @options[:helper].send(:get_template_text, dict, @options[:base_path], :ext => 'yml')
298
+ if dict_content
289
299
  # Lazy dictionary used for literal resolution
290
- dict = TranslationDict.new(doc.id)
300
+ if doc
301
+ dict = TranslationDict.new(doc.id)
302
+ else
303
+ if absolute_url =~ /^\$([a-zA-Z_]+)-([a-zA-Z_]+)\/(.+)$/
304
+ static = {:brick_name => $1, :skin_name => $2, :path => $3}
305
+ else
306
+ return parser_error("Invalid absolute_url for static asset ('#{absolute_url}')")
307
+ end
308
+ dict = TranslationDict.new(nil, static)
309
+ end
291
310
 
292
311
  if dict.load!(dict_content)
293
312
  # Save dictionary in template for dynamic uses
@@ -297,7 +316,11 @@ module Zena
297
316
  set_context_var('set_var', 'dictionary', RubyLess::TypedString.new(dict_name, :class => TranslationDict, :literal => dict))
298
317
 
299
318
  # Lazy loading (loads file on first request)
300
- out "<% #{dict_name} = load_dictionary(#{doc.id}) %>"
319
+ if doc
320
+ out "<% #{dict_name} = load_dictionary(#{doc.id}) %>"
321
+ else
322
+ out "<% #{dict_name} = load_dictionary(nil, #{static.inspect}) %>"
323
+ end
301
324
  else
302
325
  return parser_error(dict.last_error)
303
326
  end
@@ -390,7 +413,8 @@ module Zena
390
413
  # Lazy loading (loads file on first request)
391
414
  dict_name = get_var_name('dictionary', 'dict', cleared_context)
392
415
  set_context_var('set_var', 'dictionary', dict, cleared_context)
393
- prefix += "<% #{dict_name} = load_dictionary(#{dict.literal.node_id}) %>"
416
+ d = dict.literal
417
+ prefix += "<% #{dict_name} = load_dictionary(#{d.node_id.inspect},#{d.static.inspect}) %>"
394
418
  return cleared_context, prefix
395
419
  else
396
420
  return cleared_context, nil
@@ -458,12 +458,6 @@ module Zena
458
458
  finders = [parts.join(' from ')]
459
459
  if params[:or]
460
460
  finders << params[:or]
461
-
462
- key_counter = 1
463
- while sub_or = params["or#{key_counter}".to_sym]
464
- key_counter += 1
465
- finders << sub_or
466
- end
467
461
  else
468
462
  or_clause = nil
469
463
  end
@@ -80,11 +80,11 @@ module Zena
80
80
  visitor.site.host
81
81
  end
82
82
 
83
- def sfind(sqliss)
83
+ def sfind(sqliss, arity=:all)
84
84
  query = Node.build_query(:all, sqliss,
85
85
  :default => {:scope => 'site'}
86
86
  )
87
- Node.do_find(:all, eval(query.to_s(:find)))
87
+ Node.do_find(arity, eval(query.to_s(arity == :count ? :count : :find)))
88
88
  end
89
89
 
90
90
  # Find a node and propagate visitor
@@ -205,7 +205,13 @@ module Zena
205
205
  def process_field(field_name)
206
206
  if fld = @query.attributes_alias[field_name]
207
207
  # use custom query alias value defined in select clause: 'custom_a AS validation'
208
- return processing_filter? ? "(#{fld})" : fld
208
+ if processing_filter?
209
+ # We need to use the full original clause, except when the clause contains group functions (MAX, MIN, etc).
210
+ # If the clause is too complex, we need to use something simpler or it will break (custom queries).
211
+ "(#{fld})"
212
+ else
213
+ fld
214
+ end
209
215
  elsif processing_filter? && map_def = self.class.filter_fields[field_name]
210
216
  # Special filter fields such as 'role', 'tag' or 'class'
211
217
  if map_def.kind_of?(String)
@@ -378,7 +384,7 @@ module Zena
378
384
  # ******** And maybe overwrite these **********
379
385
  def parse_custom_query_argument(key, value)
380
386
  return nil unless value
381
- super.gsub(/(RELATION_ID|NODE_ATTR|SECURE_TABLE)\(([^)]+)\)|(REF_DATE|NODE_ID|VISITOR_LANG)/) do
387
+ super.gsub(/(RELATION_ID|KPATH_VALUE|NODE_ATTR|SECURE_TABLE)\(([^)]+)\)|(REF_DATE|NODE_ID|VISITOR_LANG)/) do
382
388
  type, value = $1, $2
383
389
  type ||= $3
384
390
  case type
@@ -389,6 +395,13 @@ module Zena
389
395
  else
390
396
  raise ::QueryBuilder::Error.new("Custom query: could not find Relation '#{role}'")
391
397
  end
398
+ when 'KPATH_VALUE'
399
+ klass_name = value
400
+ if rel = VirtualClass[klass_name]
401
+ rel.kpath
402
+ else
403
+ raise ::QueryBuilder::Error.new("Custom query kpath: could not find VirtualClass '#{role}'")
404
+ end
392
405
  when 'SECURE_TABLE'
393
406
  table_name = value
394
407
  add_filter "\#{secure_scope('#{table_name}')}"
@@ -370,9 +370,7 @@ module Zena
370
370
 
371
371
  # Destroy all links related to this node
372
372
  def destroy_links
373
- Link.find(:all, :conditions => ["source_id = ? OR target_id = ?", self[:id], self[:id]]).each do |l|
374
- l.destroy
375
- end
373
+ Zena::Db.execute "DELETE FROM #{Link.table_name} WHERE source_id = #{self[:id].to_i} OR target_id = #{self[:id].to_i}"
376
374
  end
377
375
  end # ModelMethods
378
376
  end # Relations
@@ -207,14 +207,16 @@ module Zena
207
207
  headers['Cache-Control'] = (!current_site.authentication? && @node.public?) ? 'public' : 'private'
208
208
  end
209
209
 
210
- return unless perform_caching && caching_allowed(:authenticated => opts.delete(:authenticated))
211
- url = page_cache_file(opts.delete(:url))
212
- opts = {:expire_after => nil,
213
- :path => (current_site.public_path + url),
214
- :content_data => response.body,
215
- :node_id => @node[:id]
216
- }.merge(opts)
217
- secure!(CachedPage) { CachedPage.create(opts) }
210
+ if perform_caching && caching_allowed(:authenticated => opts.delete(:authenticated))
211
+
212
+ url = page_cache_file(opts.delete(:url))
213
+ opts = {:expire_after => nil,
214
+ :path => (current_site.public_path + url),
215
+ :content_data => response.body,
216
+ :node_id => @node[:id]
217
+ }.merge(opts)
218
+ secure!(CachedPage) { CachedPage.create(opts) }
219
+ end
218
220
  end
219
221
 
220
222
  # Return true if we can cache the current page
@@ -135,6 +135,7 @@ module Zena
135
135
  keys.each do |group_key|
136
136
  next unless list = groups[group_key]
137
137
  next unless should_clear_group?(group_key, deleted_node)
138
+ attrs["#{group_key}_id"] = nil
138
139
  list.each do |key|
139
140
  attrs["#{group_key}_#{key}"] = nil
140
141
  end
@@ -160,7 +161,7 @@ module Zena
160
161
  def set_site_id
161
162
  self[:site_id] = current_site.id
162
163
  end
163
- end # ModelMethods
164
+ end # IndexMethods
164
165
 
165
166
  module ModelMethods
166
167
  def self.included(base)
@@ -232,6 +233,9 @@ module Zena
232
233
  update_scope_indices_on_prop_change(true)
233
234
  # How can we handle this ?
234
235
  # update_scope_indices_on_link_change
236
+ if s = scope_index
237
+ s.destroy
238
+ end
235
239
  end
236
240
 
237
241
  def update_scope_indices_on_prop_change(deleted=false)
@@ -76,9 +76,10 @@ module Zena
76
76
 
77
77
  # Execute a fulltext search using default fulltext support from the database (MyISAM on MySQL).
78
78
  def search_text(query, options = {})
79
+ options[:order] ||= 'zip desc'
79
80
  if offset = options[:offset]
80
81
  limit = options[:limit] || 20
81
- Node.find(:all, match_query(query).merge(:offset => offset, :limit => limit))
82
+ Node.find(:all, match_query(query).merge(:offset => offset, :limit => limit, :order => options[:order]))
82
83
  else
83
84
  # :default argument not used here
84
85
  options.delete(:default)
@@ -395,7 +395,7 @@ module Zena
395
395
  steal_and_eval_html_params_for(markup, @params)
396
396
 
397
397
  href = make_href(remote_target, options)
398
-
398
+
399
399
  # This is to make sure live_id is set *inside* the <a> tag.
400
400
  if @live_param
401
401
  text = add_live_id(text_for_link, markup)
@@ -405,9 +405,9 @@ module Zena
405
405
  end
406
406
 
407
407
  http_method = http_method_from_action(options[:action])
408
-
409
- if http_method == 'delete'
410
- confirm ||= '#{t("Destroy ?")} "#{title}"'
408
+
409
+ if http_method == 'delete' && method != 'unlink'
410
+ confirm ||= '#{t("Destroy")} #{h title} ?'
411
411
  end
412
412
 
413
413
  if confirm
@@ -426,9 +426,64 @@ module Zena
426
426
  # Add href to non-ajax method.
427
427
  markup.set_dyn_param(:href, "<%= #{make_href(nil, options.merge(:update => false))} %>")
428
428
 
429
+ if true
430
+ # Use onclick with Ajax.
431
+ if confirm
432
+ markup.set_dyn_param(:onclick, "if(confirm(\"<%= #{confirm} %>\")) {new Ajax.Request(\"<%= #{href} %>\", {asynchronous:true, evalScripts:true, method:\"#{http_method}\"});} return false;")
433
+ else
434
+ markup.set_dyn_param(:onclick, "new Ajax.Request(\"<%= #{href} %>\", {asynchronous:true, evalScripts:true, method:\"#{http_method}\"}); return false;")
435
+ end
436
+ else
437
+ #### FIXME: We need the 'update' parameter to trigger a js response for delete but we ignore
438
+ #### the content.
439
+
440
+
441
+ if remote_target.kind_of?(String)
442
+ # YUCK. We should have a way to have dom_ids that do not need
443
+ # us to look for remote_target !
444
+ remote_target = find_target(remote_target)
445
+ end
446
+ # Experimental new model for javascript actions.
447
+ # Works for 'swap' but needs more adaptations for 'edit' or other links
448
+
449
+ hash_params = []
450
+ (options[:query_params] || @params).each do |key, value|
451
+ next if [:update, :href, :eval, :text, :attr, :t, :host].include?(key)
452
+ case key
453
+ when :anchor
454
+ # Get anchor and force string interpolation
455
+ value = "%Q{#{get_anchor_name(value)}}"
456
+ when :publish
457
+ if value == 'true'
458
+ key = 'node[v_status]'
459
+ value = Zena::Status::Pub
460
+ else
461
+ next
462
+ end
463
+ when :encode_params, :format, :mode, :insert, :states
464
+ # Force string interpolation
465
+ value = "%Q{#{value}}"
466
+ else
467
+ if value.blank?
468
+ value = "''"
469
+ end
470
+ end
471
+ hash_params << "#{key.inspect} => #{value}"
472
+ end
429
473
 
430
- # Use onclick with Ajax.
431
- markup.set_dyn_param(:onclick, "new Ajax.Request(\"<%= #{href} %>\", {asynchronous:true, evalScripts:true, method:\"#{http_method}\"}); return false;")
474
+ if host = param(:host)
475
+ hash_params << ":host => %Q{#{host}}"
476
+ end
477
+
478
+ if !hash_params.blank?
479
+ query = RubyLess.translate(self, "{#{hash_params.join(', ')}}.to_json")
480
+ else
481
+ query = ''
482
+ end
483
+
484
+ dom_id, dom_prefix = get_dom_id(remote_target)
485
+ markup.set_dyn_param(:onclick, %Q{return Zena.#{http_method}("<%= #{dom_id} %>",<%= #{query} %>)})
486
+ end
432
487
  else
433
488
  markup.set_dyn_param(:href, "<%= #{href} %>")
434
489
 
@@ -581,7 +636,7 @@ module Zena
581
636
  method = 'zafu_node_path'
582
637
  elsif NODE_ACTIONS[opts[:action]]
583
638
  method = "#{opts[:action]}_node_path"
584
- elsif remote_target
639
+ elsif remote_target && opts[:action] != 'destroy'
585
640
  method = 'zafu_node_path'
586
641
  else
587
642
  method = 'zen_path'
@@ -593,10 +648,10 @@ module Zena
593
648
  if href = @params[:href]
594
649
  method_args << href
595
650
  elsif node.will_be?(Version)
596
- method_args << "node"
651
+ method_args << "this.node"
597
652
  hash_params << ":lang => this.lang"
598
653
  else
599
- method_args << 'this'
654
+ method_args << '@node'
600
655
  end
601
656
 
602
657
  insert_ajax_args(remote_target, hash_params, opts[:action]) if remote_target
@@ -632,30 +687,16 @@ module Zena
632
687
  unless hash_params.empty?
633
688
  method_args << hash_params.join(', ')
634
689
  end
635
-
690
+
636
691
  method = "#{method}(#{method_args.join(', ')})"
637
-
692
+
638
693
  ::RubyLess.translate(self, method)
639
694
  end
640
695
 
641
696
  def insert_ajax_args(target, hash_params, action)
642
697
  hash_params << ":s => start_id"
643
698
  hash_params << ":link_id => this.link_id" if @context[:has_link_id] && node.will_be?(Node)
644
- if target == '_page'
645
- # reload full page
646
- hash_params << ":udom_id => '_page'"
647
- return
648
- elsif target.kind_of?(String)
649
- # named target
650
- if target_block = find_target(target)
651
- target = target_block
652
- else
653
- out parser_error("Could not find target name '#{target}'.")
654
- return nil
655
- end
656
- end
657
-
658
-
699
+
659
700
  # FIXME: when we have proper markup.dyn_params[:id] support,
660
701
  # we should not need this crap anymore.
661
702
  case action
@@ -667,63 +708,28 @@ module Zena
667
708
  hash_params << ":t_url => %Q{#{form_url(node.dom_prefix)}}"
668
709
  # To enable link edit fix the following line:
669
710
  # hash_params << "'node[link_id]' => link_id"
670
- when 'unlink', 'delete'
711
+ when 'unlink', 'destroy'
671
712
  @insert_dom_id = %Q{"#{node.dom_id(:erb => false)}"}
672
713
  hash_params << ":dom_id => insert_dom_id"
673
714
  hash_params << ":t_url => %Q{#{template_url(node.dom_prefix)}}"
674
715
  else #drop, #swap
716
+ if target == '_page'
717
+ # reload full page
718
+ hash_params << ":udom_id => '_page'"
719
+ return
720
+ elsif target.kind_of?(String)
721
+ # named target
722
+ if target_block = find_target(target)
723
+ target = target_block
724
+ else
725
+ out parser_error("Could not find target name '#{target}'.")
726
+ return nil
727
+ end
728
+ end
675
729
  @insert_dom_id, dom_prefix = get_dom_id(target)
676
730
  hash_params << ":dom_id => insert_dom_id"
677
731
  hash_params << ":t_url => %Q{#{template_url(dom_prefix)}}"
678
732
  end
679
-
680
- # method = opts[:method] || :get
681
- #
682
- # html_params = opts[:html_params] || {}
683
- # node_id = opts[:node_id] || self.node_id
684
- #
685
- # url = opts[:url] || "/#{base_class.to_s.pluralize.underscore}/\#{#{node_id}}#{method == :get ? '/zafu' : ''}"
686
- # opts[:cond] ||= "#{node}.can_write?" if method != :get
687
- #
688
- # query_params = [opts[:query_params]].flatten.compact
689
- #
690
- # if method == :get
691
- # if target
692
- # query_params << "t_url=#{CGI.escape(target.template_url)}"
693
- # query_params << "dom_id=#{target.dom_id}"
694
- # else
695
- # query_params << "dom_id=_page"
696
- # end
697
- # else
698
- # query_params << "t_url=#{CGI.escape(template_url)}" if method != :delete
699
- #
700
- # query_params << "dom_id=#{dom_id}"
701
- # if target != self
702
- # if target
703
- # query_params << "u_url=#{CGI.escape(target.template_url)}"
704
- # query_params << "udom_id=#{target.dom_id}"
705
- # else
706
- # query_params << "udom_id=_page"
707
- # end
708
- # end
709
- # end
710
- #
711
- # query_params << "node[v_status]=#{Zena::Status::Pub}" if @params[:publish] # FIXME: this acts like publish = 'force'
712
- # query_params << start_node_s_param(:string)
713
- #
714
- # res = ''
715
- # res += "<% if #{opts[:cond]} %>" if opts[:cond]
716
- # res += "<%= tag_to_remote({:url => \"#{url}?#{query_params.join('&')}\", :method => #{method.inspect}}#{params_to_erb(html_params)}) %>"
717
- # res += text_for_link(opts[:default_text])
718
- # res += "</a>"
719
- # if opts[:cond]
720
- # if opts[:else] != :void
721
- # res += "<% else %>"
722
- # res += text_for_link(opts[:default_text])
723
- # end
724
- # res += "<% end %>"
725
- # end
726
- # res
727
733
  end
728
734
 
729
735
  # <r:link page='next'/> <r:link page='previous'/> <r:link page='list'/>
@@ -792,13 +798,12 @@ module Zena
792
798
  end
793
799
 
794
800
  if !descendant('else')
795
- else_tag = {:method => 'else', :text => '<r:this/>'}
801
+ else_tag = {:method => 'else', :text => "#{@markup.space_before}<r:this/>"}
796
802
  else_tag[:tag] = tag if tag
797
803
  add_block else_tag
798
804
  # Clear cached descendants
799
805
  @all_descendants = nil
800
806
  end
801
-
802
807
  out "<% page_numbers(#{curr_page}, #{page_count}, #{(@params[:join] || ' ').inspect}, #{@params[:page_count] ? @params[:page_count].to_i : 'nil'}) do |#{page_number}, #{page_join}, #{page_name}| %>"
803
808
  out "<%= #{page_join} %>"
804
809
  with_context(:node => node.move_to(page_number, Number)) do