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.
- 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>
|