imagine_cms 4.1.4 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +2 -1
  3. data/app/assets/images/interface/form_loading.gif +0 -0
  4. data/app/assets/images/management/btn-top-delete.png +0 -0
  5. data/app/assets/images/management/btn-top-edit.png +0 -0
  6. data/app/assets/images/management/btn-top-exterminate.png +0 -0
  7. data/app/assets/images/management/btn-top-new.png +0 -0
  8. data/app/assets/images/management/btn-top-preview.png +0 -0
  9. data/app/assets/images/management/btn-top-properties.png +0 -0
  10. data/app/assets/javascripts/codemirror/modes-custom/imagine_cms.js +87 -0
  11. data/app/assets/javascripts/imagine_cms/core.js +510 -0
  12. data/app/assets/javascripts/imagine_cms/legacy/misc.js +537 -0
  13. data/app/assets/javascripts/imagine_cms/legacy/rollovers.js +193 -0
  14. data/app/assets/javascripts/imagine_cms/legacy/slideshow.js +116 -0
  15. data/app/assets/javascripts/imagine_cms/legacy/textfieldhints.js +55 -0
  16. data/app/assets/javascripts/imagine_cms.js +14 -1
  17. data/app/assets/javascripts/imagine_cms_compat.js +26 -0
  18. data/app/assets/javascripts/jquery-ui.js +16608 -0
  19. data/app/assets/javascripts/tag-it.js +591 -0
  20. data/app/assets/stylesheets/imagine_cms.css.scss +26 -10
  21. data/app/assets/stylesheets/imagine_controls.css.scss +8 -0
  22. data/app/assets/stylesheets/jquery-ui.css +1225 -0
  23. data/app/assets/stylesheets/jquery-ui.structure.css +833 -0
  24. data/app/assets/stylesheets/jquery-ui.theme.css +410 -0
  25. data/app/assets/stylesheets/jquery.tagit.css +69 -0
  26. data/app/assets/stylesheets/management.css.scss +7 -0
  27. data/app/assets/stylesheets/tagit.ui-imagine.css +100 -0
  28. data/app/controllers/cms/content_controller.rb +28 -45
  29. data/app/controllers/management/cms_controller.rb +116 -94
  30. data/app/helpers/cms_application_helper.rb +76 -39
  31. data/app/models/cms_page.rb +32 -14
  32. data/app/models/cms_page_object.rb +1 -1
  33. data/app/models/cms_page_tag.rb +2 -2
  34. data/app/models/cms_template.rb +1 -1
  35. data/app/models/user.rb +6 -6
  36. data/app/models/user_group.rb +1 -1
  37. data/app/views/cms/content/_photo_gallery.html.erb +12 -12
  38. data/app/views/cms/content/_search.html.erb +2 -2
  39. data/app/views/cms/content/_search_result.html.erb +16 -10
  40. data/app/views/layouts/management.html.erb +18 -17
  41. data/app/views/management/cms/_edit_page.html.erb +47 -33
  42. data/app/views/management/cms/_gallery_index.html.erb +4 -4
  43. data/app/views/management/cms/_image.html.erb +3 -3
  44. data/app/views/management/cms/_image_details.html.erb +9 -8
  45. data/app/views/management/cms/_list_page.html.erb +2 -2
  46. data/app/views/management/cms/_list_page_select.html.erb +1 -1
  47. data/app/views/management/cms/_page_list.html.erb +69 -48
  48. data/app/views/management/cms/_page_list_source_folder.html.erb +2 -2
  49. data/app/views/management/cms/_template_options.html.erb +4 -4
  50. data/app/views/management/cms/_template_reference.html.erb +13 -15
  51. data/app/views/management/cms/edit_page_content.html.erb +3 -3
  52. data/app/views/management/cms/edit_snippet.html.erb +19 -41
  53. data/app/views/management/cms/edit_template.html.erb +15 -38
  54. data/app/views/management/cms/pages.html.erb +17 -29
  55. data/app/views/management/cms/snippets.html.erb +2 -2
  56. data/app/views/management/cms/templates.html.erb +2 -2
  57. data/app/views/management/cms/toolbar_edit.html.erb +2 -0
  58. data/app/views/management/cms/toolbar_preview.html.erb +2 -2
  59. data/config/initializers/config_file.rb +1 -1
  60. data/imagine_cms.gemspec +7 -4
  61. data/lib/extensions/action_controller_extensions.rb +50 -19
  62. data/lib/imagine_cms/engine.rb +12 -8
  63. data/lib/imagine_cms/version.rb +1 -1
  64. data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +2 -2
  65. data/lib/tasks/imagine_cms_tasks.rake +8 -0
  66. metadata +69 -91
  67. data/app/assets/images/management/btn_archive.gif +0 -0
  68. data/app/assets/images/management/btn_delete.gif +0 -0
  69. data/app/assets/images/management/btn_duplicate.gif +0 -0
  70. data/app/assets/images/management/btn_edit.gif +0 -0
  71. data/app/assets/images/management/btn_new_page.gif +0 -0
  72. data/app/assets/images/management/btn_preview.gif +0 -0
  73. data/app/assets/images/management/btn_properties.gif +0 -0
  74. data/app/assets/images/management/btn_restore.gif +0 -0
  75. data/app/assets/images/management/btn_top_delete.gif +0 -0
  76. data/app/assets/images/management/btn_top_duplicate.gif +0 -0
  77. data/app/assets/images/management/btn_top_edit.gif +0 -0
  78. data/app/assets/images/management/btn_top_new.gif +0 -0
  79. data/app/assets/images/management/btn_top_preview.gif +0 -0
  80. data/app/assets/images/management/btn_top_properties.gif +0 -0
  81. data/app/assets/javascripts/codepress/codepress.html +0 -36
  82. data/app/assets/javascripts/codepress/codepress.js +0 -130
  83. data/app/assets/javascripts/codepress/engines/gecko.js +0 -240
  84. data/app/assets/javascripts/codepress/engines/khtml.js +0 -0
  85. data/app/assets/javascripts/codepress/engines/msie.js +0 -263
  86. data/app/assets/javascripts/codepress/engines/older.js +0 -0
  87. data/app/assets/javascripts/codepress/engines/opera.js +0 -259
  88. data/app/assets/javascripts/codepress/languages/css.js +0 -23
  89. data/app/assets/javascripts/codepress/languages/generic.js +0 -25
  90. data/app/assets/javascripts/codepress/languages/html.js +0 -63
  91. data/app/assets/javascripts/codepress/languages/java.js +0 -24
  92. data/app/assets/javascripts/codepress/languages/javascript.js +0 -30
  93. data/app/assets/javascripts/codepress/languages/perl.js +0 -27
  94. data/app/assets/javascripts/codepress/languages/php.js +0 -60
  95. data/app/assets/javascripts/codepress/languages/ruby.js +0 -26
  96. data/app/assets/javascripts/codepress/languages/sql.js +0 -30
  97. data/app/assets/javascripts/codepress/languages/text.js +0 -9
  98. data/app/assets/javascripts/imagine.js +0 -1393
  99. data/app/assets/stylesheets/codepress/codepress.css +0 -7
  100. data/app/assets/stylesheets/codepress/languages/css.css +0 -10
  101. data/app/assets/stylesheets/codepress/languages/generic.css +0 -9
  102. data/app/assets/stylesheets/codepress/languages/html.css +0 -18
  103. data/app/assets/stylesheets/codepress/languages/java.css +0 -7
  104. data/app/assets/stylesheets/codepress/languages/javascript.css +0 -8
  105. data/app/assets/stylesheets/codepress/languages/perl.css +0 -11
  106. data/app/assets/stylesheets/codepress/languages/php.css +0 -12
  107. data/app/assets/stylesheets/codepress/languages/ruby.css +0 -10
  108. data/app/assets/stylesheets/codepress/languages/sql.css +0 -10
  109. data/app/assets/stylesheets/codepress/languages/text.css +0 -5
@@ -230,6 +230,7 @@ module CmsApplicationHelper
230
230
 
231
231
  def page_list_items(pg, key, options = {})
232
232
  pages = []
233
+ single_pages = []
233
234
  instance_tags_include = []
234
235
  instance_tags_exclude = []
235
236
  instance_tags_require = []
@@ -265,7 +266,7 @@ module CmsApplicationHelper
265
266
  require_tags = instance_tags_require.map { |t| t.strip }.reject { |t| t.blank? }
266
267
 
267
268
  if include_tags.empty?
268
- include_tags = (options[:include_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.blank? }
269
+ include_tags = substitute_placeholders(options[:include_tags] || '', pg).split(',').map { |t| t.strip }.reject { |t| t.blank? }
269
270
  include_tags.each do |t|
270
271
  i = @page_objects["#{key}-sources-tag-count"]
271
272
  @page_objects["#{key}-sources-tag#{i}"] = t
@@ -274,7 +275,7 @@ module CmsApplicationHelper
274
275
  end
275
276
  end
276
277
  if exclude_tags.empty?
277
- exclude_tags = (options[:exclude_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.blank? }
278
+ exclude_tags = substitute_placeholders(options[:exclude_tags] || '', pg).split(',').map { |t| t.strip }.reject { |t| t.blank? }
278
279
  exclude_tags.each do |t|
279
280
  i = @page_objects["#{key}-sources-tag-count"]
280
281
  @page_objects["#{key}-sources-tag#{i}"] = t
@@ -283,7 +284,7 @@ module CmsApplicationHelper
283
284
  end
284
285
  end
285
286
  if require_tags.empty?
286
- require_tags = (options[:require_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.blank? }
287
+ require_tags = substitute_placeholders(options[:require_tags] || '', pg).split(',').map { |t| t.strip }.reject { |t| t.blank? }
287
288
  require_tags.each do |t|
288
289
  i = @page_objects["#{key}-sources-tag-count"]
289
290
  @page_objects["#{key}-sources-tag#{i}"] = t
@@ -295,13 +296,13 @@ module CmsApplicationHelper
295
296
  # pull all folder content
296
297
  folders = []
297
298
  for i in 0...@page_objects["#{key}-sources-folder-count"].to_i
298
- folders << HashObject.new(:src => @page_objects["#{key}-sources-folder#{i}"].strip,
299
- :expand_folders => @page_objects["#{key}-sources-folder#{i}-expand-folders"])
299
+ folders << HashObject.new(src: @page_objects["#{key}-sources-folder#{i}"].strip,
300
+ expand_folders: @page_objects["#{key}-sources-folder#{i}-expand-folders"])
300
301
  end
301
302
  folders = folders.reject { |f| f.src.blank? }
302
303
 
303
304
  if folders.empty?
304
- folders = (options[:folders] || '').split(',').map do |f|
305
+ folders = substitute_placeholders(options[:folders] || '', pg).split(',').map do |f|
305
306
  bits = f.strip.split(':')
306
307
 
307
308
  obj = HashObject.new
@@ -339,12 +340,9 @@ module CmsApplicationHelper
339
340
  end
340
341
 
341
342
  folders.each do |f|
343
+ logger.debug "Expanding folder #{f.src} (expand_folders: #{f.expand_folders})"
342
344
  begin
343
- if f.expand_folders && f.expand_folders == 'false'
344
- f.src = f.src.slice(1...f.src.length) if f.src.slice(0,1) == '/'
345
- parent_page = CmsPage.find_by_path(f.src)
346
- pages.concat parent_page.children.includes(:tags).where([ conditions.join(' and ') ].concat(cond_vars)).to_a
347
- else
345
+ if f.expand_folders && f.expand_folders == 'true' # expand folders (i.e. specified path is prefix)
348
346
  if f.src == '/'
349
347
  pages.concat CmsPage.includes(:tags).where([ conditions.join(' and ') ].concat(cond_vars))
350
348
  else
@@ -355,6 +353,16 @@ module CmsApplicationHelper
355
353
  fcond_vars << f.src+'/%'
356
354
  pages.concat CmsPage.includes(:tags).where([ fconditions.join(' and ') ].concat(fcond_vars))
357
355
  end
356
+ else
357
+ f.src = f.src.slice(1...f.src.length) if f.src.slice(0,1) == '/'
358
+ parent_page = CmsPage.find_by_path(f.src)
359
+ if parent_page.children.size > 0
360
+ logger.debug " > Adding children of #{f.src}"
361
+ pages.concat parent_page.children.includes(:tags).where([ conditions.join(' and ') ].concat(cond_vars)).to_a
362
+ else
363
+ logger.debug " > Adding single page #{f.src}"
364
+ single_pages << parent_page # user specified a single page, not a folder
365
+ end
358
366
  end
359
367
  rescue Exception => e
360
368
  logger.debug e
@@ -396,9 +404,9 @@ module CmsApplicationHelper
396
404
  index = 0
397
405
  result = 0
398
406
  while result == 0 && index < keys_with_dir.size
399
- key = keys_with_dir[index][0]
400
- aval = a.send(key)
401
- bval = b.send(key)
407
+ sort_key = keys_with_dir[index][0]
408
+ aval = a.send(sort_key)
409
+ bval = b.send(sort_key)
402
410
 
403
411
  if !aval
404
412
  result = 1
@@ -416,11 +424,21 @@ module CmsApplicationHelper
416
424
  end
417
425
 
418
426
  offset = first_non_empty(@page_objects["#{key}-item-offset"], options[:item_offset], 0).to_i
427
+ @page_objects["#{key}-item-offset"] = offset
428
+
429
+ logger.debug "Page List Offset: #{offset} / #{pages.size} #{pages.map(&:id)}"
419
430
  pages = pages[offset, pages.size] || []
420
431
 
432
+ # since the user selected these pages individually, they expect them to be included (and prioritized!), no matter what
433
+ # (but make sure they are unique)
434
+ pages = (single_pages + pages).uniq
435
+
421
436
  # randomize if requested
422
437
  randomize = first_non_empty(@page_objects["#{key}-use-randomization"], options[:use_randomization], 'false').to_s == 'true'
423
438
  random_pool_size = first_non_empty(@page_objects["#{key}-random-pool-size"], options[:random_pool_size], '').to_i
439
+ @page_objects["#{key}-use-randomization"] = randomize
440
+ @page_objects["#{key}-random-pool-size"] = random_pool_size
441
+
424
442
  if randomize
425
443
  if random_pool_size > 0
426
444
  pages = pages.first(random_pool_size)
@@ -433,43 +451,61 @@ module CmsApplicationHelper
433
451
  end
434
452
  end
435
453
 
454
+ # make options specified in templates/snippets accessible to page list segments and rss feeds
455
+ @page_objects["#{key}-max-item-count"] = first_non_empty(@page_objects["#{key}-max-item-count"], options[:item_count], pages.size).to_i
456
+ @page_objects["#{key}-template"] = options[:template] if @page_objects["#{key}-template"].blank?
457
+ @page_objects["#{key}-use-pagination"] = options[:use_pagination] unless options[:use_pagination].blank?
458
+
459
+ # also make return value accessible to page list segments and rss feeds (so we don't have to do this all again)
460
+ @page_list_pages ||= {}
461
+ @page_list_pages[key] = pages
462
+
436
463
  pages
437
464
  end
438
465
 
466
+ def substitute_placeholder(html, page, key, value)
467
+ val = value
468
+
469
+ html.gsub(/<#\s*#{key}(\..*?)*\s*#>/) do |match|
470
+ $1.to_s.scan(/\.([\w]+)(\(.*?\))?/).each do |func, args|
471
+ case func
472
+ when 'gsub', 'downcase', 'upcase'
473
+ val = eval(%["#{val}".#{func}#{args}])
474
+ end
475
+ end
476
+
477
+ val
478
+ end
479
+ end
480
+
439
481
  def substitute_placeholders(html, page, extra_attributes = {})
440
482
  return html unless page
441
483
 
442
484
  temp = html.dup
443
485
 
444
486
  # mangle anything inside of an insert_object so that it won't be caught (yet)
445
- temp.gsub!(/(insert_object\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
487
+ temp.gsub!(/((?:insert_object|text_editor|texteditor|page_list|pagelist|snippet)\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
446
488
  one, two, three = $1, $2, $3
447
489
  one + two.gsub(/<#/, '<!#') + three
448
490
  end
449
491
 
450
492
  # first, extras passed in args
451
- extra_attributes.each do |k,v|
452
- temp.gsub!(/<#\s*#{k.to_s}\s*#>/, v.to_s)
453
- end
493
+ extra_attributes.each { |k,v| temp = substitute_placeholder(temp, page, k, v) }
454
494
 
455
495
  # next, page object attributes and template options (from page properties)
456
- page.objects.where(:obj_type => 'attribute').each do |obj|
457
- temp.gsub!(/<#\s*#{obj.name}\s*#>/, (obj.content || '').to_s)
458
- end
459
- page.objects.where(:obj_type => 'option').each do |obj|
460
- temp.gsub!(/<#\s*option_#{obj.name.gsub(/[^\w\d]/, '_')}\s*#>/, obj.content || '')
461
- end
496
+ page.objects.where(obj_type: 'attribute').each { |obj| temp = substitute_placeholder(temp, page, obj.name, obj.content) }
497
+ page.objects.where(obj_type: 'option').each { |obj| temp = substitute_placeholder(temp, page, "option_#{obj.name.gsub(/[^\w\d]/, '_')}", obj.content) }
462
498
 
463
499
  # path is kind of a special case, we like to see it with a leading /
464
- temp.gsub!(/<#\s*path\s*#>/, '/' + (page.path || ''))
500
+ temp = substitute_placeholder(temp, page, 'path', "/#{page.path}")
465
501
 
466
502
  # substitute tags in a helpful way
467
- temp.gsub!(/<#\s*tags\s*#>/, page.tags.map { |t| t.name }.join(', '))
468
- temp.gsub!(/<#\s*tags_as_css_classes\s*#>/, page.tags_as_css_classes)
503
+ temp = substitute_placeholder(temp, page, 'tags', page.tags.map { |t| t.name }.join(', '))
504
+ temp = substitute_placeholder(temp, page, 'tags_as_css_classes', page.tags_as_css_classes)
469
505
 
470
506
  # use full date/time format for created_on and updated_on
471
- temp.gsub!(/<#\s*created_on\s*#>/, "#{page.created_on.strftime('%a')} #{date_to_str(page.created_on)} #{time_to_str(page.created_on)}") if page.created_on
472
- temp.gsub!(/<#\s*updated_on\s*#>/, "#{page.updated_on.strftime('%a')} #{date_to_str(page.updated_on)} #{time_to_str(page.updated_on)}") if page.updated_on
507
+ temp = substitute_placeholder(temp, page, 'created_on', "#{page.created_on.strftime('%a')} #{date_to_str(page.created_on)} #{time_to_str(page.created_on)}") if page.created_on
508
+ temp = substitute_placeholder(temp, page, 'updated_on', "#{page.updated_on.strftime('%a')} #{date_to_str(page.updated_on)} #{time_to_str(page.updated_on)}") if page.updated_on
473
509
 
474
510
  # handle any custom substitutions
475
511
  temp = substitute_placeholders_custom(temp, page)
@@ -494,13 +530,18 @@ module CmsApplicationHelper
494
530
  # val = '<!-- attribute not found -->'
495
531
  val = ''
496
532
  end
497
- temp.gsub!(/<#\s*#{attr}\s*#>/, val.to_s)
533
+ temp = substitute_placeholder(temp, page, attr, val)
498
534
  end
499
- # temp.gsub!(/<#\s*(.*?)\s*#>/, "<!-- attribute not found -->")
535
+
536
+ # unknown attributes will be simply deleted (unless we enable some kind of substitution debugging in the future)
537
+ # if SomeKindOfDebuggingEnabled
538
+ # temp.gsub!(/<#\s*(.*?)\s*#>/, "<!-- attribute not found -->")
539
+ # else
500
540
  temp.gsub!(/<#\s*(.*?)\s*#>/, '')
541
+ # end
501
542
 
502
543
  # unmangle mangled stuff
503
- temp.gsub!(/(insert_object\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
544
+ temp.gsub!(/((?:insert_object|text_editor|texteditor|page_list|pagelist|snippet)\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
504
545
  one, two, three = $1, $2, $3
505
546
  one + two.gsub(/<!#/, '<#') + three
506
547
  end
@@ -606,7 +647,7 @@ module CmsApplicationHelper
606
647
  ret << '</div>'
607
648
 
608
649
  ret << "<div id=\"#{object_name}_#{method_name}_loading\" class=\"form-loading\" style=\"display: none;\">"
609
- ret << "<img src=\"/assets/interface/form_loading.gif\" width=\"16\" height=\"16\" border=\"0\" style=\"margin: 0 1px 1px 0;\" />"
650
+ ret << image_tag("interface/form_loading.gif", size: '16x16', border: 0, style: "margin: 0 1px 1px 0;")
610
651
  ret << "</div>"
611
652
 
612
653
  if errors.size > 0 && options[:display_messages]
@@ -641,12 +682,8 @@ module CmsApplicationHelper
641
682
  link << ' '.html_safe + link_to(flash[:link][0], flash[:link][1]) if flash[:link].present? && flash[:link].is_a?(Array)
642
683
 
643
684
  output = ''.html_safe
644
- if (flash[:error] || @error || '') != ''
645
- output << content_tag('div', h(flash[:error] || @error) + link, :class => 'alert alert-error error')
646
- end
647
- if (flash[:notice] || @notice || '') != ''
648
- output << content_tag('div', h(flash[:notice] || @notice) + link, :class => 'alert alert-info notice')
649
- end
685
+ output << content_tag('div', h(flash[:error]) + link, class: 'alert alert-error error') if flash[:error].present?
686
+ output << content_tag('div', h(flash[:notice]) + link, class: 'alert alert-info notice') if flash[:notice].present?
650
687
  output
651
688
  end
652
689
 
@@ -3,16 +3,21 @@ class CmsPage < ActiveRecord::Base
3
3
  include ActsAsTree
4
4
 
5
5
  acts_as_versioned
6
- acts_as_tree :order => 'path'
6
+ acts_as_tree order: 'path'
7
7
 
8
- belongs_to :template, :class_name => 'CmsTemplate', :foreign_key => 'cms_template_id'
9
- has_many :objects, :class_name => 'CmsPageObject', :dependent => :destroy
10
- has_many :tags, :class_name => 'CmsPageTag', :dependent => :destroy
11
- has_many :versions, :class_name => 'CmsPageVersion', :dependent => :destroy
12
- has_many :sub_pages, -> { where('published_version >= 0').order(:position, :title, :name) }, :class_name => 'CmsPage', :foreign_key => :parent_id
8
+ belongs_to :template, class_name: 'CmsTemplate', foreign_key: 'cms_template_id'
13
9
 
14
- validates_format_of :name, :with => /\A[-\w\d%]+\Z/
15
- validates_uniqueness_of :path, :message => 'conflicts with an existing page'
10
+ has_many :tags, class_name: 'CmsPageTag', dependent: :destroy
11
+ has_many :versions, class_name: 'CmsPageVersion', dependent: :destroy
12
+ has_many :sub_pages, -> { where('published_version >= 0').order(:position, :title, :name) }, class_name: 'CmsPage', foreign_key: :parent_id
13
+
14
+ has_many :objects, class_name: 'CmsPageObject', dependent: :destroy
15
+ has_many :custom_attributes, -> { where(obj_type: 'attribute') }, class_name: 'CmsPageObject'
16
+ has_many :options, -> { where(obj_type: 'option') }, class_name: 'CmsPageObject'
17
+ has_many :custom_attributes_and_options, -> { where(obj_type: ['attribute', 'option']) }, class_name: 'CmsPageObject'
18
+
19
+ validates_format_of :name, with: /\A[-\w\d%]+\Z/
20
+ validates_uniqueness_of :path, message: 'conflicts with an existing page'
16
21
 
17
22
  before_validation :compute_and_store_path, :set_versions
18
23
 
@@ -37,12 +42,18 @@ class CmsPage < ActiveRecord::Base
37
42
 
38
43
  self.published_version ||= -1
39
44
  self.published_date ||= self.created_on || Time.now
45
+
46
+ if path == '' && published_version == -1
47
+ self.published_version = 0 # home page should never be set to offline
48
+ end
49
+
50
+ true
40
51
  end
41
52
 
42
53
  def resave_children
43
54
  if path_changed?
44
55
  # get all pages under this one (even the offline ones)
45
- CmsPage.where(:parent_id => id).each do |subpg|
56
+ CmsPage.where(parent_id: id).each do |subpg|
46
57
  subpg.save_without_revision if subpg.valid?
47
58
  end
48
59
  end
@@ -88,7 +99,10 @@ class CmsPage < ActiveRecord::Base
88
99
  if self.published_version.to_i >= 0
89
100
  idx_version = self.published_version.to_i == 0 ? self.version : self.published_version
90
101
  self.objects.where(cms_page_version: idx_version, obj_type: [ 'text', 'string' ]).each do |obj|
91
- content << obj.content << "\n"
102
+ content << obj.content << "\n" if obj.content.to_s =~ /[^\d\.]/
103
+ end
104
+ self.custom_attributes_and_options.each do |obj|
105
+ content << obj.content << "\n" if obj.content.to_s =~ /[^\d\.]/
92
106
  end
93
107
  end
94
108
 
@@ -97,7 +111,11 @@ class CmsPage < ActiveRecord::Base
97
111
 
98
112
  def update_index!
99
113
  update_index
100
- self.class.without_revision { save }
114
+ begin
115
+ self.class.without_revision { save }
116
+ rescue NoMethodError => e
117
+ # sometime the cache sweeper fails, but that's okay here
118
+ end
101
119
  end
102
120
 
103
121
  def set_parent_id!(new_id)
@@ -121,15 +139,15 @@ class CmsPage < ActiveRecord::Base
121
139
  if html.index("<")
122
140
  text = ""
123
141
  tokenizer = HTML::Tokenizer.new(html)
124
-
142
+
125
143
  while token = tokenizer.next
126
144
  node = HTML::Node.parse(nil, 0, 0, token, false)
127
145
  # result is only the content of any Text nodes
128
- text << node.to_s if node.class == HTML::Text
146
+ text << ' ' + node.to_s if node.class == HTML::Text
129
147
  end
130
148
  # strip any comments, and if they have a newline at the end (ie. line with
131
149
  # only a comment) strip that too, as well as any erb stuff
132
- text.gsub(/<!--(.*?)-->[\n]?/m, "").gsub(/\<%.*?%\>/m, '').gsub(/&\w+;/, '')
150
+ text.gsub(/<!--(.*?)-->[\n]?/m, "").gsub(/\<%.*?%\>/m, '').gsub(/&\w+;/, '').strip
133
151
  else
134
152
  html # already plain text
135
153
  end
@@ -1,7 +1,7 @@
1
1
  class CmsPageObject < ActiveRecord::Base
2
2
  # attr_accessible :name, :obj_type
3
3
 
4
- belongs_to :page, :class_name => 'CmsPage', :foreign_key => 'cms_page_id'
4
+ belongs_to :page, class_name: 'CmsPage', foreign_key: 'cms_page_id'
5
5
 
6
6
  before_create :set_page_version
7
7
 
@@ -1,7 +1,7 @@
1
1
  class CmsPageTag < ActiveRecord::Base
2
2
  # attr_accessible :name
3
3
 
4
- belongs_to :page, :class_name => 'CmsPage', :foreign_key => 'cms_page_id'
4
+ belongs_to :page, class_name: 'CmsPage', foreign_key: 'cms_page_id'
5
5
 
6
- validates_uniqueness_of :name, :scope => 'cms_page_id'
6
+ validates_uniqueness_of :name, scope: 'cms_page_id'
7
7
  end
@@ -3,7 +3,7 @@ class CmsTemplate < ActiveRecord::Base
3
3
 
4
4
  attr_accessor :options
5
5
 
6
- has_many :pages, :class_name => 'CmsPage'
6
+ has_many :pages, class_name: 'CmsPage'
7
7
 
8
8
  after_find :deserialize_yaml
9
9
  before_save :serialize_yaml
data/app/models/user.rb CHANGED
@@ -5,14 +5,14 @@ class User < ActiveRecord::Base # :nodoc:
5
5
  # attr_accessible :first_name, :last_name
6
6
  attr_reader :password # :nodoc:
7
7
 
8
- has_and_belongs_to_many :groups, :class_name => 'UserGroup', :join_table => 'user_group_memberships'
8
+ has_and_belongs_to_many :groups, class_name: 'UserGroup', join_table: 'user_group_memberships'
9
9
 
10
- validates_presence_of [ :username, :password, :first_name, :last_name ], :message => 'is required'
11
- validates_length_of :password, :minimum => 4
12
- validates_uniqueness_of :username, :message => 'already in use'
10
+ validates_presence_of [ :username, :password, :first_name, :last_name ], message: 'is required'
11
+ validates_length_of :password, minimum: 4
12
+ validates_uniqueness_of :username, message: 'already in use'
13
13
  validates_confirmation_of :password
14
14
 
15
- before_validation :fake_password_confirmation, :on => :update
15
+ before_validation :fake_password_confirmation, on: :update
16
16
 
17
17
  def name ; [ first_name, last_name ].compact.join(' ') ; end
18
18
 
@@ -44,7 +44,7 @@ class User < ActiveRecord::Base # :nodoc:
44
44
  def fake_password_confirmation # :nodoc:
45
45
  # if password is blank, user is not trying to change it.
46
46
  # just appease the validator by setting something valid
47
- if ((@password ||= "") == "")
47
+ if @password.blank?
48
48
  @password = "imapassword"
49
49
  @password_confirmation = "imapassword"
50
50
  end
@@ -1,5 +1,5 @@
1
1
  class UserGroup < ActiveRecord::Base # :nodoc:
2
- has_and_belongs_to_many :users, :join_table => 'user_group_memberships'
2
+ has_and_belongs_to_many :users, join_table: 'user_group_memberships'
3
3
 
4
4
  validates_presence_of :name
5
5
  validates_uniqueness_of :name
@@ -2,7 +2,7 @@
2
2
  timeout ||= 0
3
3
  captions = []
4
4
  settings = HashObject.new({})
5
- path = File.join(Rails.root, 'public', 'images', 'content', @pg.path, name)
5
+ path = File.join(Rails.root, 'public', 'assets', 'content', @pg.path, name)
6
6
 
7
7
  begin
8
8
  captions = YAML.load(File.open(File.join(path, 'captions.yml')).read)
@@ -23,11 +23,11 @@
23
23
  -%>
24
24
  <%= javascript_tag "gallerySize['#{name}'] = #{images.size};" %>
25
25
 
26
- <div class="slideshow">
26
+ <div class="imagine_cms-gallery">
27
27
 
28
- <div class="slideshow-images">
28
+ <div class="imagine_cms-gallery-images">
29
29
  <%- images.each_with_index do |image, index| -%>
30
- <table width="100%" id="<%= name %>_image_<%= index %>" class="<%= name %>_image slideshow-image" border="0" cellpadding="0" cellspacing="2" style="<%= index > 0 ? 'display: none;' : '' %>">
30
+ <table width="100%" id="<%= name %>_image_<%= index %>" class="<%= name %>_image imagine_cms-gallery-image" border="0" cellpadding="0" cellspacing="2" style="<%= index > 0 ? 'display: none;' : '' %>">
31
31
  <tr>
32
32
  <td align="center" style="vertical-align:middle;">
33
33
  <%= image_tag '/' + image, :style => "border: 7px solid white" %>
@@ -38,7 +38,7 @@
38
38
  <br clear="all" />
39
39
  </div>
40
40
 
41
- <div id="<%= name %>_caption" class="slideshow-caption" style="<%= "display: none;" if captions[1].blank? %>">
41
+ <div id="<%= name %>_caption" class="imagine_cms-gallery-caption" style="<%= "display: none;" if captions[1].blank? %>">
42
42
  <%= captions[1] rescue '' %>
43
43
  </div>
44
44
 
@@ -47,19 +47,19 @@
47
47
  <%- end -%>
48
48
 
49
49
 
50
- <div class="slideshow-nav">
50
+ <div class="imagine_cms-gallery-nav">
51
51
  <table width="100%" cellspacing="0" cellpadding="0" align="center">
52
52
  <tr>
53
- <td id="<%= name %>_prev_button" class="slideshow-nav-button" align="right" onclick="changeGalleryImage('<%= name %>', <%= images.size-1 %>);">
53
+ <td id="<%= name %>_prev_button" class="imagine_cms-gallery-nav-button" align="right" onclick="changeGalleryImage('<%= name %>', <%= images.size-1 %>);">
54
54
  <img src="/assets/interface/photo_prev.gif" alt="prev" style="float: right; padding-right: 6px;" />
55
55
  </td>
56
- <td id="<%= name %>_play_button" class="slideshow-nav-button" style="<%= autoplay ? ' display: none' : '' %>" align="left" onclick="clearTimeout(galleryTimeouts['<%= name %>']); setTimeout(function () { advanceGallerySlideshow('<%= name %>', <%= timeout*1000 %>); }, <%= timeout*1000 %>); $('<%= name %>_play_button').hide(); $('<%= name %>_pause_button').show();">
56
+ <td id="<%= name %>_play_button" class="imagine_cms-gallery-nav-button" style="<%= autoplay ? ' display: none' : '' %>" align="left" onclick="clearTimeout(galleryTimeouts['<%= name %>']); setTimeout(function () { advanceGallerySlideshow('<%= name %>', <%= timeout*1000 %>); }, <%= timeout*1000 %>); $('<%= name %>_play_button').hide(); $('<%= name %>_pause_button').show();">
57
57
  <img src="/assets/interface/photo_play.gif" alt="play" style="float: left" />
58
58
  </td>
59
- <td id="<%= name %>_pause_button" class="slideshow-nav-button" style="<%= autoplay ? '' : ' display: none' %>" align="left" onclick="clearTimeout(galleryTimeouts['<%= name %>']); $('<%= name %>_pause_button').hide(); $('<%= name %>_play_button').show();">
59
+ <td id="<%= name %>_pause_button" class="imagine_cms-gallery-nav-button" style="<%= autoplay ? '' : ' display: none' %>" align="left" onclick="clearTimeout(galleryTimeouts['<%= name %>']); $('<%= name %>_pause_button').hide(); $('<%= name %>_play_button').show();">
60
60
  <img src="/assets/interface/photo_pause.gif" alt="pause" style="float: left;" />
61
61
  </td>
62
- <td id="<%= name %>_next_button" class="slideshow-nav-button" align="left" onclick="changeGalleryImage('<%= name %>', 1);">
62
+ <td id="<%= name %>_next_button" class="imagine_cms-gallery-nav-button" align="left" onclick="changeGalleryImage('<%= name %>', 1);">
63
63
  <img src="/assets/interface/photo_next.gif" alt="next" style="float: left; padding-left: 6px;" />
64
64
  </td>
65
65
  </tr>
@@ -67,9 +67,9 @@
67
67
  </div>
68
68
 
69
69
  <%- unless settings.show_thumbs == 'false' -%>
70
- <div class="slideshow-thumbs">
70
+ <div class="imagine_cms-gallery-thumbs">
71
71
  <%- thumbs.each_with_index do |thumb, index| -%>
72
- <div id="<%= name %>_thumb_<%= index %>" class="<%= name %>_thumb slideshow-thumb<%= index == 0 ? ' current' : '' %>" onmouseover="$(this).addClassName('current');" onmouseout="$(this).removeClassName('current');" onclick="changeGalleryImage('<%= name %>', <%= index %>);">
72
+ <div id="<%= name %>_thumb_<%= index %>" class="<%= name %>_thumb imagine_cms-gallery-thumb<%= index == 0 ? ' current' : '' %>" onmouseover="$(this).addClassName('current');" onmouseout="$(this).removeClassName('current');" onclick="changeGalleryImage('<%= name %>', <%= index %>);">
73
73
  <%= image_tag '/' + thumb, :width => 39, :height => 39, :style => "float: left;" %>
74
74
  </div>
75
75
  <%- end -%>
@@ -1,5 +1,5 @@
1
- <%- if @pages.blank? -%>
1
+ <%- if @pages.empty? -%>
2
2
  Sorry, no pages matched your search.
3
3
  <%- else -%>
4
- <%= render :partial => 'search_result', :collection => @pages %>
4
+ <%= render partial: 'search_result', collection: @pages %>
5
5
  <%- end -%>
@@ -1,23 +1,29 @@
1
1
  <%-
2
2
  page = search_result
3
-
4
3
  title = page.title
4
+ summary = nil
5
5
 
6
- summary = 'error'
7
6
  begin
8
- summary = truncate(page.search_index, :length => 300)
9
- summary = excerpt(page.search_index, @terms.first, 150) || truncate(page.search_index, :length => 300)
7
+ @terms.each do |term|
8
+ [ term, term.singularize, term.pluralize ].uniq.each do |term_variant|
9
+ summary ||= excerpt(page.search_index, term_variant, radius: 150)
10
+ end
11
+ end
10
12
  rescue Exception => e
11
13
  logger.error "Error creating search index excerpt: #{e}"
12
14
  end
13
15
 
16
+ summary ||= truncate(page.search_index, length: 300)
17
+
14
18
  @terms.each do |term|
15
- title = highlight(title, term)
16
- summary = highlight(summary, term)
19
+ [ term, term.singularize, term.pluralize ].uniq.each do |term_variant|
20
+ title = highlight(title, term_variant)
21
+ summary = highlight(summary, term_variant)
22
+ end
17
23
  end
18
24
  -%>
19
25
 
20
- <p>
21
- <a href="/<%= page.path %>"><%= title %></a><br/>
22
- <%= summary %>
23
- </p>
26
+ <div class="search-result">
27
+ <div class="search-result-title"><a href="/<%= page.path %>"><%= title %></a></div>
28
+ <div class="search-result-summary"><%= summary %></div>
29
+ </div>
@@ -4,26 +4,32 @@
4
4
 
5
5
  if is_logged_in_user?
6
6
  if user_has_permission?(:manage_cms)
7
- @nav_sections << [ 'Pages', { :controller => '/management/cms', :action => 'pages' } ]
8
- @nav_sections << [ 'Templates', { :controller => '/management/cms', :action => 'templates' } ]
9
- @nav_sections << [ 'Snippets', { :controller => '/management/cms', :action => 'snippets' } ]
7
+ @nav_sections << [ 'Pages', { controller: '/management/cms', action: 'pages' } ]
8
+ @nav_sections << [ 'Templates', { controller: '/management/cms', action: 'templates' } ]
9
+ @nav_sections << [ 'Snippets', { controller: '/management/cms', action: 'snippets' } ]
10
10
  end
11
11
  if user_has_permission?(:manage_users)
12
- @nav_sections << [ 'Users', { :controller => '/management/users', :action => 'index' } ]
12
+ @nav_sections << [ 'Users', { controller: '/management/users', action: 'index' } ]
13
13
  end
14
14
  end
15
+
16
+ if defined?(ImagineCmsAdditionalNavSections)
17
+ @nav_sections += ImagineCmsAdditionalNavSections.is_a?(Proc) ? ImagineCmsAdditionalNavSections.call(self) : ImagineCmsAdditionalNavSections
18
+ end
15
19
  -%>
16
20
  <!DOCTYPE html>
17
21
  <html>
18
22
  <head>
23
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
24
+
19
25
  <title><%= controller.controller_path.split('/').concat([ params[:action] ]).map { |s| s.titlecase }.join(' > ') %></title>
20
26
  <%- if is_logged_in_user? -%>
21
27
  <script src="/assets/dojo/dojo.js" type="text/javascript"></script>
22
- <script src="/assets/codepress/codepress.js" type="text/javascript"></script>
23
28
  <%- end -%>
24
- <%= stylesheet_link_tag "application", :media => "all" %>
25
- <%= stylesheet_link_tag "management", :media => "all" %>
29
+ <%= stylesheet_link_tag "application", media: "all" %>
30
+ <%= stylesheet_link_tag "management", media: "all" %>
26
31
  <%= javascript_include_tag "application" %>
32
+
27
33
  <%= csrf_meta_tag %>
28
34
  </head>
29
35
 
@@ -34,14 +40,14 @@
34
40
  <%- if is_logged_in_user? -%>
35
41
  <!-- Header Navigation -->
36
42
  <div style="float: left; padding-top: 2px;">
37
- <%= link_to image_tag("management/start.gif", :size => "44x14", :alt => "Start"), '/manage' %>
43
+ <%= link_to image_tag("management/start.gif", size: "44x14", alt: "Start"), '/manage' %>
38
44
  </div>
39
45
  <div style="float: left; padding-left: 20px;">
40
- <%= @nav_sections.map { |nav| link_to(nav[0], nav[1], :style => 'color: white') }.safe_join(' | ') %>
46
+ <%= @nav_sections.map { |nav| link_to(nav[0], nav[1], style: 'color: white') }.safe_join(' | ') %>
41
47
  </div>
42
48
  <div style="float: right">
43
- <%= link_to 'Change password', { :controller => '/management/users', :action => 'edit', :id => session[:user_id] }, :style => 'color: white' %> |
44
- <%= link_to 'Log out', { :controller => '/management/user', :action => 'logout' }, :style => 'color: white' %>
49
+ <%= link_to 'Change password', { controller: '/management/users', action: 'edit', id: session[:user_id] }, style: 'color: white' %> |
50
+ <%= link_to 'Log out', { controller: '/management/user', action: 'logout' }, style: 'color: white' %>
45
51
  </div>
46
52
  <%- end -%>
47
53
  </td>
@@ -51,7 +57,7 @@
51
57
  <td style="padding: 7px 15px 0 15px; border-bottom: solid #ffffff 1px; color: white">
52
58
  <!-- Header Navigation -->
53
59
  <div style="float: left; padding-left: 20px;">
54
- <%= @subnav_sections.map { |nav| link_to(nav[0], nav[1], :style => 'color: white') }.safe_join(' | ') %>
60
+ <%= @subnav_sections.map { |nav| link_to(nav[0], nav[1], style: 'color: white') }.safe_join(' | ') %>
55
61
  </div>
56
62
  <div style="float: right">
57
63
  </div>
@@ -61,12 +67,7 @@
61
67
  </table>
62
68
 
63
69
  <div id="management-content" style="padding: 15px 10px 1px 15px">
64
- <!-- Main Content -->
65
70
  <%= yield %>
66
71
  </div>
67
-
68
- <footer>
69
-
70
- </footer>
71
72
  </body>
72
73
  </html>