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.
- checksums.yaml +4 -4
- data/README.rdoc +2 -1
- data/app/assets/images/interface/form_loading.gif +0 -0
- data/app/assets/images/management/btn-top-delete.png +0 -0
- data/app/assets/images/management/btn-top-edit.png +0 -0
- data/app/assets/images/management/btn-top-exterminate.png +0 -0
- data/app/assets/images/management/btn-top-new.png +0 -0
- data/app/assets/images/management/btn-top-preview.png +0 -0
- data/app/assets/images/management/btn-top-properties.png +0 -0
- data/app/assets/javascripts/codemirror/modes-custom/imagine_cms.js +87 -0
- data/app/assets/javascripts/imagine_cms/core.js +510 -0
- data/app/assets/javascripts/imagine_cms/legacy/misc.js +537 -0
- data/app/assets/javascripts/imagine_cms/legacy/rollovers.js +193 -0
- data/app/assets/javascripts/imagine_cms/legacy/slideshow.js +116 -0
- data/app/assets/javascripts/imagine_cms/legacy/textfieldhints.js +55 -0
- data/app/assets/javascripts/imagine_cms.js +14 -1
- data/app/assets/javascripts/imagine_cms_compat.js +26 -0
- data/app/assets/javascripts/jquery-ui.js +16608 -0
- data/app/assets/javascripts/tag-it.js +591 -0
- data/app/assets/stylesheets/imagine_cms.css.scss +26 -10
- data/app/assets/stylesheets/imagine_controls.css.scss +8 -0
- data/app/assets/stylesheets/jquery-ui.css +1225 -0
- data/app/assets/stylesheets/jquery-ui.structure.css +833 -0
- data/app/assets/stylesheets/jquery-ui.theme.css +410 -0
- data/app/assets/stylesheets/jquery.tagit.css +69 -0
- data/app/assets/stylesheets/management.css.scss +7 -0
- data/app/assets/stylesheets/tagit.ui-imagine.css +100 -0
- data/app/controllers/cms/content_controller.rb +28 -45
- data/app/controllers/management/cms_controller.rb +116 -94
- data/app/helpers/cms_application_helper.rb +76 -39
- data/app/models/cms_page.rb +32 -14
- data/app/models/cms_page_object.rb +1 -1
- data/app/models/cms_page_tag.rb +2 -2
- data/app/models/cms_template.rb +1 -1
- data/app/models/user.rb +6 -6
- data/app/models/user_group.rb +1 -1
- data/app/views/cms/content/_photo_gallery.html.erb +12 -12
- data/app/views/cms/content/_search.html.erb +2 -2
- data/app/views/cms/content/_search_result.html.erb +16 -10
- data/app/views/layouts/management.html.erb +18 -17
- data/app/views/management/cms/_edit_page.html.erb +47 -33
- data/app/views/management/cms/_gallery_index.html.erb +4 -4
- data/app/views/management/cms/_image.html.erb +3 -3
- data/app/views/management/cms/_image_details.html.erb +9 -8
- data/app/views/management/cms/_list_page.html.erb +2 -2
- data/app/views/management/cms/_list_page_select.html.erb +1 -1
- data/app/views/management/cms/_page_list.html.erb +69 -48
- data/app/views/management/cms/_page_list_source_folder.html.erb +2 -2
- data/app/views/management/cms/_template_options.html.erb +4 -4
- data/app/views/management/cms/_template_reference.html.erb +13 -15
- data/app/views/management/cms/edit_page_content.html.erb +3 -3
- data/app/views/management/cms/edit_snippet.html.erb +19 -41
- data/app/views/management/cms/edit_template.html.erb +15 -38
- data/app/views/management/cms/pages.html.erb +17 -29
- data/app/views/management/cms/snippets.html.erb +2 -2
- data/app/views/management/cms/templates.html.erb +2 -2
- data/app/views/management/cms/toolbar_edit.html.erb +2 -0
- data/app/views/management/cms/toolbar_preview.html.erb +2 -2
- data/config/initializers/config_file.rb +1 -1
- data/imagine_cms.gemspec +7 -4
- data/lib/extensions/action_controller_extensions.rb +50 -19
- data/lib/imagine_cms/engine.rb +12 -8
- data/lib/imagine_cms/version.rb +1 -1
- data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +2 -2
- data/lib/tasks/imagine_cms_tasks.rake +8 -0
- metadata +69 -91
- data/app/assets/images/management/btn_archive.gif +0 -0
- data/app/assets/images/management/btn_delete.gif +0 -0
- data/app/assets/images/management/btn_duplicate.gif +0 -0
- data/app/assets/images/management/btn_edit.gif +0 -0
- data/app/assets/images/management/btn_new_page.gif +0 -0
- data/app/assets/images/management/btn_preview.gif +0 -0
- data/app/assets/images/management/btn_properties.gif +0 -0
- data/app/assets/images/management/btn_restore.gif +0 -0
- data/app/assets/images/management/btn_top_delete.gif +0 -0
- data/app/assets/images/management/btn_top_duplicate.gif +0 -0
- data/app/assets/images/management/btn_top_edit.gif +0 -0
- data/app/assets/images/management/btn_top_new.gif +0 -0
- data/app/assets/images/management/btn_top_preview.gif +0 -0
- data/app/assets/images/management/btn_top_properties.gif +0 -0
- data/app/assets/javascripts/codepress/codepress.html +0 -36
- data/app/assets/javascripts/codepress/codepress.js +0 -130
- data/app/assets/javascripts/codepress/engines/gecko.js +0 -240
- data/app/assets/javascripts/codepress/engines/khtml.js +0 -0
- data/app/assets/javascripts/codepress/engines/msie.js +0 -263
- data/app/assets/javascripts/codepress/engines/older.js +0 -0
- data/app/assets/javascripts/codepress/engines/opera.js +0 -259
- data/app/assets/javascripts/codepress/languages/css.js +0 -23
- data/app/assets/javascripts/codepress/languages/generic.js +0 -25
- data/app/assets/javascripts/codepress/languages/html.js +0 -63
- data/app/assets/javascripts/codepress/languages/java.js +0 -24
- data/app/assets/javascripts/codepress/languages/javascript.js +0 -30
- data/app/assets/javascripts/codepress/languages/perl.js +0 -27
- data/app/assets/javascripts/codepress/languages/php.js +0 -60
- data/app/assets/javascripts/codepress/languages/ruby.js +0 -26
- data/app/assets/javascripts/codepress/languages/sql.js +0 -30
- data/app/assets/javascripts/codepress/languages/text.js +0 -9
- data/app/assets/javascripts/imagine.js +0 -1393
- data/app/assets/stylesheets/codepress/codepress.css +0 -7
- data/app/assets/stylesheets/codepress/languages/css.css +0 -10
- data/app/assets/stylesheets/codepress/languages/generic.css +0 -9
- data/app/assets/stylesheets/codepress/languages/html.css +0 -18
- data/app/assets/stylesheets/codepress/languages/java.css +0 -7
- data/app/assets/stylesheets/codepress/languages/javascript.css +0 -8
- data/app/assets/stylesheets/codepress/languages/perl.css +0 -11
- data/app/assets/stylesheets/codepress/languages/php.css +0 -12
- data/app/assets/stylesheets/codepress/languages/ruby.css +0 -10
- data/app/assets/stylesheets/codepress/languages/sql.css +0 -10
- 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(:
|
299
|
-
:
|
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 == '
|
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
|
-
|
400
|
-
aval = a.send(
|
401
|
-
bval = b.send(
|
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
|
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(:
|
457
|
-
|
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
|
500
|
+
temp = substitute_placeholder(temp, page, 'path', "/#{page.path}")
|
465
501
|
|
466
502
|
# substitute tags in a helpful way
|
467
|
-
temp
|
468
|
-
temp
|
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
|
472
|
-
temp
|
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
|
533
|
+
temp = substitute_placeholder(temp, page, attr, val)
|
498
534
|
end
|
499
|
-
|
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 << "
|
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
|
-
|
645
|
-
|
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
|
|
data/app/models/cms_page.rb
CHANGED
@@ -3,16 +3,21 @@ class CmsPage < ActiveRecord::Base
|
|
3
3
|
include ActsAsTree
|
4
4
|
|
5
5
|
acts_as_versioned
|
6
|
-
acts_as_tree :
|
6
|
+
acts_as_tree order: 'path'
|
7
7
|
|
8
|
-
belongs_to :template, :
|
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
|
-
|
15
|
-
|
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(:
|
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
|
-
|
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
|
data/app/models/cms_page_tag.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class CmsPageTag < ActiveRecord::Base
|
2
2
|
# attr_accessible :name
|
3
3
|
|
4
|
-
belongs_to :page, :
|
4
|
+
belongs_to :page, class_name: 'CmsPage', foreign_key: 'cms_page_id'
|
5
5
|
|
6
|
-
validates_uniqueness_of :name, :
|
6
|
+
validates_uniqueness_of :name, scope: 'cms_page_id'
|
7
7
|
end
|
data/app/models/cms_template.rb
CHANGED
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, :
|
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 ], :
|
11
|
-
validates_length_of :password, :
|
12
|
-
validates_uniqueness_of :username, :
|
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, :
|
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
|
47
|
+
if @password.blank?
|
48
48
|
@password = "imapassword"
|
49
49
|
@password_confirmation = "imapassword"
|
50
50
|
end
|
data/app/models/user_group.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
timeout ||= 0
|
3
3
|
captions = []
|
4
4
|
settings = HashObject.new({})
|
5
|
-
path = File.join(Rails.root, 'public', '
|
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="
|
26
|
+
<div class="imagine_cms-gallery">
|
27
27
|
|
28
|
-
<div class="
|
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
|
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="
|
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="
|
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="
|
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="
|
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="
|
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="
|
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="
|
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
|
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,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
|
-
|
9
|
-
|
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
|
-
|
16
|
-
|
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
|
-
<
|
21
|
-
<a href="/<%= page.path %>"><%= title %></a
|
22
|
-
|
23
|
-
</
|
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', { :
|
8
|
-
@nav_sections << [ 'Templates', { :
|
9
|
-
@nav_sections << [ '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', { :
|
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", :
|
25
|
-
<%= stylesheet_link_tag "management", :
|
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", :
|
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], :
|
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', { :
|
44
|
-
<%= link_to 'Log out', { :
|
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], :
|
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>
|