zena 1.2.3 → 1.2.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 (98) hide show
  1. data/History.txt +29 -1
  2. data/Rakefile +0 -1
  3. data/app/controllers/documents_controller.rb +1 -1
  4. data/app/controllers/nodes_controller.rb +34 -8
  5. data/app/controllers/sites_controller.rb +8 -1
  6. data/app/controllers/user_sessions_controller.rb +13 -3
  7. data/app/models/acl.rb +16 -0
  8. data/app/models/document.rb +33 -14
  9. data/app/models/idx_nodes_integer.rb +5 -0
  10. data/app/models/image.rb +16 -4
  11. data/app/models/node.rb +16 -3
  12. data/app/models/relation_proxy.rb +3 -3
  13. data/app/models/site.rb +11 -1
  14. data/app/models/string_hash.rb +1 -1
  15. data/app/models/template.rb +1 -1
  16. data/app/models/user.rb +6 -1
  17. data/app/models/virtual_class.rb +36 -1
  18. data/app/views/acls/_form.rhtml +5 -1
  19. data/app/views/acls/_li.rhtml +1 -1
  20. data/app/views/templates/document_create_tabs/_file.rhtml +1 -0
  21. data/app/views/templates/document_create_tabs/_template.rhtml +1 -1
  22. data/app/views/users/_form.rhtml +1 -0
  23. data/app/views/virtual_classes/_form.erb +8 -7
  24. data/bricks/acls/lib/bricks/acls.rb +43 -15
  25. data/bricks/acls/zena/migrate/20130313110443_add_create_kpath_to_acl.rb +13 -0
  26. data/bricks/acls/zena/migrate/20130429073432_fix_create_kpath_default.rb +8 -0
  27. data/bricks/acls/zena/test/integration/acl_integration_test.rb +53 -1
  28. data/bricks/acls/zena/test/sites/erebus/acls.yml +21 -0
  29. data/bricks/acls/zena/test/unit/acl_test.rb +35 -2
  30. data/bricks/math/lib/bricks/math.rb +1 -1
  31. data/bricks/sphinx/zena/tasks.rb +1 -1
  32. data/bricks/spreadsheet/lib/bricks/spreadsheet.rb +1 -1
  33. data/bricks/worker/zena/worker +25 -0
  34. data/config/environment.rb +1 -1
  35. data/config/environments/production.rb +1 -1
  36. data/config/gems.yml +6 -5
  37. data/lib/bricks/requirements_validation.rb +1 -1
  38. data/lib/log_recorder/lib/log_recorder.rb +1 -1
  39. data/lib/tasks/zena.rake +10 -2
  40. data/lib/zena.rb +4 -3
  41. data/lib/zena/app.rb +1 -0
  42. data/lib/zena/deploy/httpd.rhtml +2 -2
  43. data/lib/zena/deploy/template.rb +15 -5
  44. data/lib/zena/info.rb +1 -1
  45. data/lib/zena/parser/zazen_rules.rb +9 -2
  46. data/lib/zena/remote/connection.rb +2 -2
  47. data/lib/zena/remote/interface.rb +8 -2
  48. data/lib/zena/remote/node.rb +1 -1
  49. data/lib/zena/routes.rb +2 -1
  50. data/lib/zena/use/action.rb +8 -2
  51. data/lib/zena/use/ajax.rb +31 -20
  52. data/lib/zena/use/calendar.rb +2 -0
  53. data/lib/zena/use/conditional.rb +15 -14
  54. data/lib/zena/use/dates.rb +5 -2
  55. data/lib/zena/use/display.rb +3 -2
  56. data/lib/zena/use/forms.rb +36 -9
  57. data/lib/zena/use/i18n.rb +8 -2
  58. data/lib/zena/use/image_builder.rb +7 -0
  59. data/lib/zena/use/query_node.rb +24 -8
  60. data/lib/zena/use/relations.rb +2 -6
  61. data/lib/zena/use/rendering.rb +10 -6
  62. data/lib/zena/use/upload.rb +6 -4
  63. data/lib/zena/use/urls.rb +13 -5
  64. data/lib/zena/use/zafu_safe_definitions.rb +1 -1
  65. data/public/javascripts/grid.js +11 -2
  66. data/public/javascripts/upload-progress.js +5 -3
  67. data/public/javascripts/zena.js +6 -2
  68. data/public/stylesheets/upload-progress.css +1 -0
  69. data/test/fixtures/files/TestNode.zafu +2 -2
  70. data/test/fixtures/files/translations_fr.yml +2 -1
  71. data/test/functional/acls_controller_test.rb +6 -0
  72. data/test/functional/nodes_controller_test.rb +1 -1
  73. data/test/functional/sites_controller_test.rb +19 -0
  74. data/test/integration/navigation_test.rb +7 -0
  75. data/test/integration/query_node/filters.yml +10 -0
  76. data/test/integration/zafu_compiler/action.yml +8 -4
  77. data/test/integration/zafu_compiler/ajax.yml +4 -4
  78. data/test/integration/zafu_compiler/calendar.yml +8 -15
  79. data/test/integration/zafu_compiler/context.yml +1 -1
  80. data/test/integration/zafu_compiler/dates.yml +5 -1
  81. data/test/integration/zafu_compiler/display.yml +1 -2
  82. data/test/integration/zafu_compiler/forms.yml +37 -10
  83. data/test/integration/zafu_compiler/query.yml +5 -5
  84. data/test/integration/zafu_compiler/relations.yml +8 -8
  85. data/test/integration/zafu_compiler/safe_definitions.yml +7 -2
  86. data/test/integration/zafu_compiler/urls.yml +24 -3
  87. data/test/integration/zafu_compiler/zazen.yml +9 -1
  88. data/test/selenium/Destroy/destroy1.rsel +2 -1
  89. data/test/selenium/Destroy/destroy2.rsel +17 -0
  90. data/test/unit/document_test.rb +17 -4
  91. data/test/unit/relation_proxy_test.rb +19 -8
  92. data/test/unit/string_hash_test.rb +1 -1
  93. data/test/unit/template_test.rb +3 -3
  94. data/test/unit/virtual_class_test.rb +77 -0
  95. data/test/unit/zena/use/urls_test.rb +9 -1
  96. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +1 -1
  97. data/zena.gemspec +60 -53
  98. metadata +145 -125
@@ -5,9 +5,9 @@ class AclTest < Zena::Unit::TestCase
5
5
  def base_node
6
6
  visitor.node_without_secure
7
7
  end
8
- MockRequest = Struct.new(:method, :params, :port)
8
+ MockRequest = Struct.new(:method, :params, :port, :path)
9
9
 
10
- def mock_request(method = :get, params = {}, port = 0)
10
+ def mock_request(method = :get, params = {}, port = 0, path = '/nodes/33')
11
11
  MockRequest.new(method, params, port)
12
12
  end
13
13
 
@@ -81,6 +81,21 @@ class AclTest < Zena::Unit::TestCase
81
81
  end
82
82
  end # saving an acl with asset_host in query
83
83
 
84
+ context 'saving an acl with a wrong create_kpath' do
85
+ subject do
86
+ acls(:rap)
87
+ end
88
+
89
+ should 'return an error' do
90
+ erebus_id = groups_id(:erebus)
91
+ visitor.instance_eval do
92
+ @group_ids = self.group_ids + [erebus_id]
93
+ end
94
+ assert !subject.update_attributes(:query => "nodes in site")
95
+ assert_equal 'parse error on value ["in", 1] (kIN)', subject.errors[:query]
96
+ end
97
+ end # saving an acl with asset_host in query
98
+
84
99
 
85
100
  context 'a visitor' do
86
101
  context 'with normal access' do
@@ -110,6 +125,24 @@ class AclTest < Zena::Unit::TestCase
110
125
  nil, nodes_zip(:queen), nil, mock_request(:get)
111
126
  ).id
112
127
  end
128
+
129
+ context 'creating an object' do
130
+
131
+ should 'not find node if kpath does not match' do
132
+ assert_raise(ActiveRecord::RecordNotFound) do
133
+ subject.find_node(
134
+ nil, nodes_zip(:queen), nil, mock_request(:post, {'node' => {'klass' => 'Page'}})
135
+ ).id
136
+ end
137
+ end
138
+
139
+ should 'find node if kpath matches' do
140
+ assert_equal nodes(:queen).id,
141
+ subject.find_node(
142
+ nil, nodes_zip(:queen), nil, mock_request(:post, {'node' => {'klass' => 'Contact'}})
143
+ ).id
144
+ end
145
+ end
113
146
 
114
147
  should 'not find node out of acl scope' do
115
148
  assert_raise(ActiveRecord::RecordNotFound) do
@@ -6,7 +6,7 @@ module Bricks
6
6
  def math_asset(opts)
7
7
  content = opts[:content]
8
8
  node = opts[:node]
9
- if !(content =~ /^\s*\\begin\{(align|equation|itemize|equation)/)
9
+ if !(content =~ /^\s*\\begin\{(align|equation|itemize)/)
10
10
  pre = '\['
11
11
  post = '\]'
12
12
  else
@@ -1,7 +1,7 @@
1
1
  # The ThinkingSphinx::Configuration needs RAILS_ROOT and RAILS_ENV in order to function. Only 'setup' needs the
2
2
  # environment since it needs to get configuration settings from the classes in zena.
3
3
  require 'tempfile'
4
- require 'yaml'
4
+ require 'safe_yaml'
5
5
  require 'thinking_sphinx'
6
6
  require 'zlib'
7
7
 
@@ -84,6 +84,7 @@ module Bricks
84
84
  def render_html
85
85
  html = []
86
86
  @sheets.each do |s|
87
+ html << "<h3>#{s.name}</h3>"
87
88
  html << '<table>'
88
89
  s.rows.each do |r|
89
90
  html << '<tr>'
@@ -189,7 +190,6 @@ td{border:1px solid #444; padding:2px;}
189
190
  </style>
190
191
  </head>
191
192
  <body>
192
- <h1>Render as #{type}</h1>
193
193
  #{data}
194
194
  </body>
195
195
  </html>
@@ -38,6 +38,31 @@ Daemons.run_proc('worker', daemon_options) do
38
38
  require File.join('config', 'environment')
39
39
 
40
40
  require 'delayed/worker'
41
+ class Delayed::Job
42
+ private
43
+ # FIX Delayed Job to work with safe_yaml
44
+ # TODO: Remove this when we upgrade to Ruby 1.9
45
+ def deserialize(source)
46
+ handler = YAML.load(source, :safe => false) rescue nil
47
+
48
+ unless handler.respond_to?(:perform)
49
+ if handler.nil? && source =~ ParseObjectFromYaml
50
+ handler_class = $1
51
+ end
52
+ attempt_to_load(handler_class || handler.class)
53
+ handler = YAML.load(source, :safe => false)
54
+ end
55
+
56
+ return handler if handler.respond_to?(:perform)
57
+
58
+ raise DeserializationError,
59
+ 'Job failed to load: Unknown handler. Try to manually require the appropriate file.'
60
+ rescue TypeError, LoadError, NameError => e
61
+ raise DeserializationError,
62
+ "Job failed to load: #{e.message}. Try to manually require the required file."
63
+ end
64
+ end
65
+
41
66
  begin
42
67
  require 'thinking_sphinx'
43
68
  require 'thinking_sphinx/deltas/delayed_delta'
@@ -1,5 +1,5 @@
1
1
  # Specifies gem version of Rails to use when vendor/rails is not present
2
- RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION
2
+ RAILS_GEM_VERSION = '2.3.18' unless defined? RAILS_GEM_VERSION
3
3
 
4
4
  # Bootstrap the Rails environment, frameworks, and default configuration
5
5
  require File.join(File.dirname(__FILE__), 'boot')
@@ -1,5 +1,5 @@
1
1
  # Settings specified here will take precedence over those in config/environment.rb
2
- config.log_level = :info
2
+ # config.log_level = :debug
3
3
 
4
4
  # The production environment is meant for finished, "live" apps.
5
5
  # Code is not reloaded between requests
@@ -4,23 +4,24 @@ ruby-recaptcha: '= 1.0.3'
4
4
  syntax: '= 1.0.0'
5
5
  tzinfo:
6
6
  uuidtools: '= 2.0.0'
7
- rails: '= 2.3.11'
7
+ rails: '= 2.3.18'
8
8
  json: '= 1.5.1'
9
9
  authlogic: '= 2.1.3'
10
10
  fast_gettext: '~> 0.4.16'
11
11
  will_paginate: '~> 2.3.12'
12
12
  differ: '= 0.1.2'
13
13
  shoulda: '= 2.10.3'
14
- httparty: '= 0.7.8'
14
+ httmultiparty : '= 0.3.8'
15
15
  open4:
16
16
  daemons: # upload progress
17
17
  gem_plugin: # upload progress
18
18
  simple_xlsx_writer: # spreadsheet
19
19
  lib: 'simple_xlsx'
20
20
 
21
- querybuilder: '= 1.2.1'
21
+ querybuilder: '= 1.2.2'
22
22
  yamltest: '= 0.7.0'
23
- rubyless: '= 0.8.8'
23
+ safe_yaml: '= 0.8.0'
24
+ rubyless: '= 0.8.10'
24
25
  property: '= 2.3.2'
25
26
  versions: '= 0.3.1'
26
27
 
@@ -44,7 +45,7 @@ thinking-sphinx:
44
45
  optional: yes
45
46
  brick: sphinx
46
47
  lib: 'thinking_sphinx'
47
- version: '= 1.3.14'
48
+ version: '~> 1.3.14'
48
49
 
49
50
  # needs riddle 1.0.10
50
51
 
@@ -1,4 +1,4 @@
1
- require 'yaml'
1
+ require 'safe_yaml'
2
2
 
3
3
  module Bricks
4
4
  module RequirementsValidation
@@ -2,7 +2,7 @@
2
2
  # on debian install ?????
3
3
  require 'rubygems'
4
4
  require 'mysql' # to have Mysql class
5
- require 'yaml'
5
+ require 'safe_yaml'
6
6
  require 'date'
7
7
 
8
8
  # Use this custom format (we do not record the logname or user):
@@ -1,4 +1,4 @@
1
- require 'yaml'
1
+ require 'safe_yaml'
2
2
  require 'fileutils'
3
3
 
4
4
  # We need to make sure the RAILS_ENV is set before brick activation or the wrong bricks will
@@ -373,7 +373,7 @@ namespace :zena do
373
373
  nodes = Node.find(:all,
374
374
  :conditions => ['site_id = ?', site.id]
375
375
  )
376
- site.rebuild_index(secure_result(nodes))
376
+ site.rebuild_index(secure_result(nodes), 1)
377
377
  else
378
378
  # We try to use the site worker.
379
379
  site.rebuild_index
@@ -562,6 +562,14 @@ namespace :zena do
562
562
  exec cmd
563
563
  end
564
564
  end
565
+
566
+ desc "Remove rdoc warning/error"
567
+ task :fix_rakefile do
568
+ # Fix Rakefile
569
+ path = "#{RAILS_ROOT}/Rakefile"
570
+ text = File.read(path)
571
+ File.open(path, 'wb') {|f| f.puts text.gsub("require 'rake/rdoctask'\n", '')}
572
+ end
565
573
  end # zena
566
574
 
567
575
  namespace :gettext do
@@ -1,10 +1,11 @@
1
- # FIXME: ========== cleanup and remove ====================
2
- require 'yaml'
1
+ require 'safe_yaml'
2
+ SafeYAML::OPTIONS[:default_mode] = :safe
3
3
  require 'date'
4
4
  require 'fileutils'
5
5
  require 'zena/info'
6
6
  require 'bricks'
7
7
 
8
+ # FIXME: ========== cleanup
8
9
  SITES_ROOT = "#{RAILS_ROOT}/sites"
9
10
  AUTHENTICATED_PREFIX = "oo"
10
11
  PASSWORD_SALT = "jf93jfnvnas09093nas0923" # type anything here (but change this line !)
@@ -303,8 +304,8 @@ EXT_TYPE = [
303
304
  [ "gz" , "application/x-gzip" ],
304
305
  [ "hdf" , "application/x-hdf" ],
305
306
  [ "hqx" , "application/mac-binhex40" ],
306
- [ "htm" , "text/html" ],
307
307
  [ "html" , "text/html" ],
308
+ [ "htm" , "text/html" ],
308
309
  [ "ice" , "x-conference/x-cooltalk" ],
309
310
  [ "ief" , "image/ief" ],
310
311
  [ "iges" , "model/iges" ],
@@ -52,6 +52,7 @@ module Zena
52
52
  end
53
53
 
54
54
  helper_method :render_to_string
55
+ filter_parameter_logging :password
55
56
  end
56
57
  Bricks.apply_patches('application_controller.rb')
57
58
  Bricks.apply_patches('application_helper.rb')
@@ -12,8 +12,8 @@ NameVirtualHost *
12
12
  <% end %>
13
13
 
14
14
  <% if config[:app_type] == :passenger %>
15
- LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/<%= config[:passenger_version] || 'passenger-3.0.17' %>/ext/apache2/mod_passenger.so
16
- PassengerRoot /usr/lib/ruby/gems/1.8/gems/<%= config[:passenger_version] || 'passenger-3.0.17' %>
15
+ LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/<%= config[:passenger_version] || 'passenger-3.0.19' %>/ext/apache2/mod_passenger.so
16
+ PassengerRoot /usr/lib/ruby/gems/1.8/gems/<%= config[:passenger_version] || 'passenger-3.0.19' %>
17
17
  PassengerRuby /usr/bin/ruby1.8
18
18
  PassengerDefaultUser www-data
19
19
  <% elsif config[:app_type] == :mongrel %>
@@ -9,7 +9,11 @@ else
9
9
  end
10
10
 
11
11
  gem 'zena', :version => Zena::VERSION
12
+ route '# Insert custom routes here.'
13
+ route ''
12
14
  route 'map.zen_routes'
15
+ route ''
16
+ route '# Routes below this are never reached.'
13
17
 
14
18
  rakefile("zena_tasks.rake") do
15
19
  <<-TASK
@@ -32,13 +36,19 @@ end
32
36
  end
33
37
 
34
38
  inside('app/controllers') do
35
- app = File.read('application_controller.rb')
36
- app.gsub!(/class\s+ApplicationController\s+<\s+ActionController::Base/, "class ApplicationController < ActionController::Base\n include Zena::App")
37
- app.gsub!(/^(\s+)protect_from_forgery/, '\1# protect_from_forgery')
38
39
  File.open('application_controller.rb', 'wb') do |f|
39
- f.write(app)
40
+ f.write %q{
41
+ # Filters added to this controller apply to all controllers in the application.
42
+ # Likewise, all the methods added will be available for all controllers.
43
+
44
+ class ApplicationController < ActionController::Base
45
+ include Zena::App
46
+ helper :all # include all helpers, all the time
47
+ # protect_from_forgery # See ActionController::RequestForgeryProtection for details
48
+ end
49
+ }
40
50
  end
41
51
  end
42
52
 
43
53
  rake 'zena:assets OVERWRITE_ASSETS=true'
44
-
54
+ rake 'zena:fix_rakefile'
@@ -1,4 +1,4 @@
1
1
  module Zena
2
- VERSION = '1.2.3'
2
+ VERSION = '1.2.4'
3
3
  ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
4
4
  end
@@ -334,11 +334,18 @@ module Zena
334
334
  def extract_code(fulltext)
335
335
  @escaped_code = []
336
336
  @block_counter = -1
337
- fulltext.gsub!( /<code([^>]*)>(.*?)<\/code>/m ) do
337
+ fulltext.gsub!( /<(code|notextile|html)([^>]*)>(.*?)<\/\1>/m ) do
338
338
  if @translate_ids
339
339
  raw_content([nil, $&])
340
+ elsif $1 == 'notextile' || $1 == 'html'
341
+ # FIXME: SECURITY. How to avoid the use of notextile in comments and such ?
342
+ if @context[:notextile] == 'true'
343
+ raw_content($3)
344
+ else
345
+ ''
346
+ end
340
347
  else
341
- params, text = $1, $2
348
+ params, text = $2, $3
342
349
  pre_params = []
343
350
  if params =~ /\A(.*)lang\s*=\s*("|')([^"']+)\2(.*)\Z/m
344
351
  pre, lang, post = $1.strip, $3, $4.strip
@@ -1,4 +1,4 @@
1
- require 'httparty'
1
+ require 'httmultiparty'
2
2
 
3
3
  module Zena
4
4
  module Remote
@@ -10,7 +10,7 @@ module Zena
10
10
  # We create a new class because HTTParty works this way (class globals).
11
11
  def self.connect(uri, token)
12
12
  Class.new(self) do
13
- include HTTParty
13
+ include HTTMultiParty
14
14
  extend Zena::Remote::Interface::ConnectionMethods
15
15
 
16
16
  class << self
@@ -284,7 +284,7 @@ module Zena
284
284
  node
285
285
  elsif errors = result['errors']
286
286
  @errors = errors
287
- log_message errors
287
+ log_message errors.inspect
288
288
  false
289
289
  else
290
290
  log_message "Could not save:"
@@ -293,7 +293,7 @@ module Zena
293
293
  end
294
294
  elsif errors = result['errors']
295
295
  log_message "Could not save:"
296
- log_message errors
296
+ log_message errors.inspect
297
297
  false
298
298
  else
299
299
  log_message "Could not save:"
@@ -305,6 +305,12 @@ module Zena
305
305
  def new_record?
306
306
  id.nil?
307
307
  end
308
+
309
+ def save!
310
+ if !save
311
+ raise Exception.new("Could not save.")
312
+ end
313
+ end
308
314
  end
309
315
  end # Update
310
316
 
@@ -41,7 +41,7 @@ module Zena
41
41
  @attributes['tag_names'] = SerializableArray.new('tag_names', 'tag', list)
42
42
  end
43
43
 
44
- def parent_id(v)
44
+ def parent_id=(v)
45
45
  if v then
46
46
  # Cannot have nil values here (root node special case).
47
47
  @attributes['parent_id'] = v
@@ -63,7 +63,8 @@ module Zena
63
63
 
64
64
  resources :columns
65
65
 
66
- resources :sites, :member => { :action => :put, :jobs => :get }
66
+ resources :sites, :collection => { :clear_cache => :get },
67
+ :member => { :action => :put, :jobs => :get }
67
68
 
68
69
  resources :comments,
69
70
  :collection => { :empty_bin => :delete },
@@ -198,11 +198,14 @@ class #{node.klass}: #{Array(node.klass).first.columns.keys.join(', ')}
198
198
  else_markup.set_dyn_param('href', '<%= logout_path %>')
199
199
 
200
200
  markup.set_dyn_param('href', '<%= login_path %>')
201
+ unless markup.params[:rel]
202
+ markup.set_param(:rel, 'nofollow')
203
+ end
201
204
 
202
205
  out markup.wrap(expand_if("visitor.is_anon?", self.node, else_markup))
203
206
  else
204
207
  out "<% if visitor.is_anon? %>"
205
- out "<%= link_to #{_('login').inspect}, login_path %>"
208
+ out "<%= link_to #{_('login').inspect}, login_path, :rel => 'nofollow' %>"
206
209
  out "<% else %>"
207
210
  out "<%= link_to #{_('logout').inspect}, logout_path %>"
208
211
  out "<% end %>"
@@ -265,7 +268,10 @@ class #{node.klass}: #{Array(node.klass).first.columns.keys.join(', ')}
265
268
  end
266
269
  end
267
270
  end
268
-
271
+
272
+ def r_versions_list
273
+ out "<%= render :partial=>'versions/list' %>"
274
+ end
269
275
 
270
276
  # TODO: test
271
277
  def r_swap
@@ -9,10 +9,13 @@ module Zena
9
9
  # to avoid the clash with Rails' dom_id method.
10
10
  def ndom_id(node = @node, append_form = true)
11
11
  if node.kind_of?(Node) && !node.new_record?
12
- if params[:action] == 'create' && !params[:udom_id]
12
+ if params[:action] == 'create' && !params[:udom_id] && !params[:s]
13
+ # !params[:s] is to not use this when executing Zena.post
14
+
15
+ # We cannot filter with params[:zadd] because this breaks when editing in lists.
13
16
  return "#{params[:dom_id]}_#{node.zip}"
14
17
  end
15
- elsif append_form && node.kind_of?(Node) && params[:zadd]
18
+ elsif append_form && node.kind_of?(Node) && params[:zadd]
16
19
  return "#{params[:dom_id]}_#{node.zip.to_i}"
17
20
  end
18
21
 
@@ -68,7 +71,7 @@ module Zena
68
71
  end
69
72
  end
70
73
  end
71
- page.replace params[:udom_id], :file => template_path_from_template_url('', params[:u_url])
74
+ page.replace params[:udom_id], :file => template_path_from_template_url('', params[:u_url] || params[:t_url])
72
75
  if params[:upd_both]
73
76
  @dom_id = params[:dom_id]
74
77
  page.replace params[:dom_id], :file => template_path_from_template_url
@@ -92,19 +95,26 @@ module Zena
92
95
  page.replace params[:dom_id], :file => template_path_from_template_url
93
96
  page << "$('#{params[:dom_id]}_form_t').focusFirstElement();"
94
97
  when 'create'
95
- pos = params[:position] || :before
96
- ref = params[:reference] || "#{params[:dom_id]}_add"
97
- page.insert_html pos.to_sym, ref, :file => template_path_from_template_url
98
- if obj.kind_of?(Node)
99
- @node = obj.parent.new_child(:class => obj.class)
98
+ if params[:zadd]
99
+ # ADD WITH FORM...
100
+ pos = params[:position] || :before
101
+ ref = params[:reference] || "#{params[:dom_id]}_add"
102
+ page.insert_html pos.to_sym, ref, :file => template_path_from_template_url
103
+ if obj.kind_of?(Node)
104
+ @node = obj.parent.new_child(:class => obj.class)
105
+ else
106
+ instance_variable_set("@#{base_class.to_s.underscore}", obj.clone)
107
+ end
108
+ page.replace ndom_id, :file => template_path_from_template_url('_form')
109
+ if params[:done]
110
+ page << params[:done]
111
+ elsif params[:zadd]
112
+ page.toggle "#{params[:dom_id]}_0", "#{params[:dom_id]}_add"
113
+ end
100
114
  else
101
- instance_variable_set("@#{base_class.to_s.underscore}", obj.clone)
102
- end
103
- page.replace ndom_id, :file => template_path_from_template_url('_form')
104
- if params[:done]
105
- page << params[:done]
106
- elsif params[:zadd]
107
- page.toggle "#{params[:dom_id]}_0", "#{params[:dom_id]}_add"
115
+ # Zena.post operation
116
+ page.replace ndom_id, :file => template_path_from_template_url
117
+ page << params[:done] if params[:done]
108
118
  end
109
119
  when 'update'
110
120
  page.replace ndom_id, :file => template_path_from_template_url
@@ -410,6 +420,7 @@ module Zena
410
420
  return parser_error("Invalid class 'for' parameter: #{finder.klass}") unless finder.klass <= Node
411
421
 
412
422
  node.dom_prefix = dom_name
423
+ var = root.get_unique_name('tog')
413
424
  dom_id = node.dom_id(:erb => false)
414
425
  markup.set_id(node.dom_id)
415
426
  markup.append_param(:class, 'toggle')
@@ -453,16 +464,16 @@ module Zena
453
464
 
454
465
  markup.append_param(:class, 'toggle')
455
466
 
456
- opts = {}
467
+ opts = []
457
468
  if arity = @params.delete(:arity)
458
- opts[:arity] = arity
469
+ opts << ":arity => #{RubyLess.translate_string(self, arity)}"
459
470
  end
460
471
 
461
472
  if js = @params.delete(:js)
462
- opts[:js] = js
473
+ opts << ":js => #{RubyLess.translate_string(self, js)}"
463
474
  end
464
-
465
- markup.pre_wrap[:toggle] = "<% add_toggle_id(\"#{dom_id}\", #{"#{var}_tog".inspect}, #{RubyLess.translate_string(self, role)},#{opts.inspect}) { #{finder} } %>"
475
+ var = root.get_unique_name('tog')
476
+ markup.pre_wrap[:toggle] = "<% add_toggle_id(\"#{dom_id}\", #{var.inspect}, #{RubyLess.translate_string(self, role)},{#{opts.join(', ')}}) { #{finder} } %>"
466
477
  end
467
478
 
468
479
  def r_unlink