imagine_cms 4.1.4 → 4.2.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.
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>