imagine_cms 3.0.0.beta6 → 3.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/app/assets/images/codepress/line-numbers.png +0 -0
- data/app/assets/images/cropper/marqueeHoriz.gif +0 -0
- data/app/assets/images/cropper/marqueeVert.gif +0 -0
- data/app/assets/images/management/btn_add.gif +0 -0
- 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_help.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/{manage → images/management}/bullet.gif +0 -0
- data/app/assets/images/management/cvv2_graphic.gif +0 -0
- data/app/assets/images/management/error.gif +0 -0
- data/app/assets/images/management/gallery_index.gif +0 -0
- data/app/assets/images/management/gallery_preview_overlay.png +0 -0
- data/app/assets/images/management/gallery_small_drag_overlay.png +0 -0
- data/app/assets/images/management/gallery_small_overlay.png +0 -0
- data/app/assets/images/management/gallery_sort.gif +0 -0
- data/app/assets/images/management/icon_download.gif +0 -0
- data/app/assets/images/management/icon_locked.png +0 -0
- data/app/assets/images/management/icon_page.gif +0 -0
- data/app/assets/images/management/icon_time.gif +0 -0
- data/app/assets/images/management/icon_unlocked.png +0 -0
- data/app/assets/images/management/page_loading.gif +0 -0
- data/app/assets/{manage → images/management}/start.gif +0 -0
- data/app/assets/images/management/vcard.gif +0 -0
- data/app/assets/javascripts/builder.js +101 -0
- data/app/assets/javascripts/codepress/codepress.html +36 -0
- data/app/assets/javascripts/codepress/codepress.js +130 -0
- data/app/assets/javascripts/codepress/engines/gecko.js +240 -0
- data/{vendor/gems/acts_as_tree/test/abstract_unit.rb → app/assets/javascripts/codepress/engines/khtml.js} +0 -0
- data/app/assets/javascripts/codepress/engines/msie.js +263 -0
- data/{vendor/gems/acts_as_tree/test/database.yml → app/assets/javascripts/codepress/engines/older.js} +0 -0
- data/app/assets/javascripts/codepress/engines/opera.js +259 -0
- data/app/assets/javascripts/codepress/languages/css.js +23 -0
- data/app/assets/javascripts/codepress/languages/generic.js +25 -0
- data/app/assets/javascripts/codepress/languages/html.js +63 -0
- data/app/assets/javascripts/codepress/languages/java.js +24 -0
- data/app/assets/javascripts/codepress/languages/javascript.js +30 -0
- data/app/assets/javascripts/codepress/languages/perl.js +27 -0
- data/app/assets/javascripts/codepress/languages/php.js +60 -0
- data/app/assets/javascripts/codepress/languages/ruby.js +26 -0
- data/app/assets/javascripts/codepress/languages/sql.js +30 -0
- data/app/assets/javascripts/codepress/languages/text.js +9 -0
- data/app/assets/javascripts/cropper.js +568 -0
- data/app/assets/javascripts/dojo/dojo.js +14155 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowB.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowBL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowBR.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowR.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowT.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowTL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowTR.png +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/Editor2/showtableborder_gecko.css +19 -0
- data/app/assets/javascripts/dojo/src/widget/templates/HslColorPicker.svg +30 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.psd +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/backcolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/bg-fade.png +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/bold.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/cancel.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/copy.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/createlink.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/cut.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/delete.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/forecolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserthorizontalrule.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertimage.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertorderedlist.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserttable.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/italic.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyleft.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyright.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/paste.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/redo.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/removeformat.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/save.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/sep.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/space.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/subscript.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/superscript.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/underline.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/undo.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/wikiword.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/check.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/decrementMonth.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/decrementWeek.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/grabCorner.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionOff.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionSelected.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/tab_close.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/toolbar-bg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/incrementMonth.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/incrementWeek.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/richtextframe.html +24 -0
- data/app/assets/javascripts/imagine.js +1385 -0
- data/app/assets/javascripts/jquery_no_conflict.js +9405 -0
- data/app/assets/stylesheets/codepress/codepress.css +7 -0
- data/app/assets/stylesheets/codepress/languages/css.css +10 -0
- data/app/assets/stylesheets/codepress/languages/generic.css +9 -0
- data/app/assets/stylesheets/codepress/languages/html.css +18 -0
- data/app/assets/stylesheets/codepress/languages/java.css +7 -0
- data/app/assets/stylesheets/codepress/languages/javascript.css +8 -0
- data/app/assets/stylesheets/codepress/languages/perl.css +11 -0
- data/app/assets/stylesheets/codepress/languages/php.css +12 -0
- data/app/assets/stylesheets/codepress/languages/ruby.css +10 -0
- data/app/assets/stylesheets/codepress/languages/sql.css +10 -0
- data/app/assets/stylesheets/codepress/languages/text.css +5 -0
- data/app/assets/stylesheets/cropper.css +182 -0
- data/app/assets/stylesheets/management.css +96 -0
- data/app/assets/stylesheets/reset.css +58 -0
- data/app/controllers/cms/content_controller.rb +318 -2
- data/app/controllers/management/cms_controller.rb +1669 -0
- data/app/controllers/management/user_controller.rb +4 -4
- data/app/controllers/management/users_controller.rb +18 -4
- data/app/controllers/util_controller.rb +45 -0
- data/app/helpers/cms_application_helper.rb +662 -15
- data/app/models/cms_content_sweeper.rb +21 -0
- data/app/models/cms_page.rb +126 -0
- data/app/models/cms_page_object.rb +23 -0
- data/app/models/cms_page_tag.rb +5 -0
- data/app/models/cms_page_version.rb +3 -0
- data/app/models/cms_snippet.rb +16 -0
- data/app/models/cms_template.rb +29 -0
- data/app/models/user.rb +6 -3
- data/app/views/management/cms/_complete_gallery.html.erb +5 -0
- data/app/views/management/cms/_create_file_link.html.erb +21 -0
- data/app/views/management/cms/_crop_feature_image.html.erb +188 -0
- data/app/views/management/cms/_crop_image.html.erb +188 -0
- data/app/views/management/cms/_crop_results.html.erb +1 -0
- data/app/views/management/cms/_crop_results_feature_image.html.erb +1 -0
- data/app/views/management/cms/_crop_results_thumb.html.erb +1 -0
- data/app/views/management/cms/_crop_thumb.html.erb +188 -0
- data/app/views/management/cms/_dialogs.html.erb +39 -0
- data/app/views/management/cms/_edit_page.html.erb +176 -0
- data/app/views/management/cms/_gallery_index.html.erb +10 -0
- data/app/views/management/cms/_gallery_setup.html.erb +22 -0
- data/app/views/management/cms/_image.html.erb +3 -0
- data/app/views/management/cms/_image_details.html.erb +26 -0
- data/app/views/management/cms/_image_draggable.html.erb +4 -0
- data/app/views/management/cms/_list_page.html.erb +8 -0
- data/app/views/management/cms/_list_page_select.html.erb +8 -0
- data/app/views/management/cms/_list_pages.html.erb +1 -0
- data/app/views/management/cms/_list_pages_select.html.erb +1 -0
- data/app/views/management/cms/_page_attribute.html.erb +6 -0
- data/app/views/management/cms/_page_list.html.erb +171 -0
- data/app/views/management/cms/_page_list_source_folder.html.erb +20 -0
- data/app/views/management/cms/_page_list_source_tag.html.erb +18 -0
- data/app/views/management/cms/_select_gallery.html.erb +117 -0
- data/app/views/management/cms/_snippet.html.erb +3 -0
- data/app/views/management/cms/_sort_images.html.erb +15 -0
- data/app/views/management/cms/_temp.html.erb +3 -0
- data/app/views/management/cms/_template_options.html.erb +21 -0
- data/app/views/management/cms/_template_reference.html.erb +42 -0
- data/app/views/management/cms/_upload_feature_image.html.erb +35 -0
- data/app/views/management/cms/_upload_file.html.erb +31 -0
- data/app/views/management/cms/_upload_image.html.erb +74 -0
- data/app/views/management/cms/_upload_thumb.html.erb +35 -0
- data/app/views/management/cms/edit_master.html.erb +48 -0
- data/app/views/management/cms/edit_page_content.html.erb +4 -0
- data/app/views/management/cms/edit_snippet.html.erb +47 -0
- data/app/views/management/cms/edit_template.html.erb +48 -0
- data/app/views/management/cms/gallery_management.html.erb +108 -0
- data/app/views/management/cms/index.html.erb +20 -0
- data/app/views/management/cms/page_tags_for_lookup.html.erb +5 -0
- data/app/views/management/cms/pages.html.erb +99 -0
- data/app/views/management/cms/permission_denied.html.erb +1 -0
- data/app/views/management/cms/select_page.html.erb +57 -0
- data/app/views/management/cms/snippets.html.erb +14 -0
- data/app/views/management/cms/templates.html.erb +14 -0
- data/app/views/management/cms/toolbar_edit.html.erb +269 -0
- data/app/views/management/cms/toolbar_preview.html.erb +109 -0
- data/app/views/util/_calendar_days.html.erb +72 -0
- data/app/views/util/_calendar_month_year.html.erb +1 -0
- data/app/views/util/_date_picker.html.erb +56 -0
- data/app/views/util/_message.html.erb +1 -0
- data/app/views/util/_show_message.js.erb +6 -0
- data/app/views/util/_tab.html.erb +4 -0
- data/config/routes.rb +4 -1
- data/imagine_cms.gemspec +4 -0
- data/{vendor/gems → lib}/acts_as_versioned/.document +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/.gitignore +2 -0
- data/{vendor/gems → lib}/acts_as_versioned/CHANGELOG +0 -0
- data/lib/acts_as_versioned/Gemfile +7 -0
- data/{vendor/gems → lib}/acts_as_versioned/MIT-LICENSE +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/README +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/RUNNING_UNIT_TESTS +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/Rakefile +1 -1
- data/{vendor/gems → lib}/acts_as_versioned/acts_as_versioned.gemspec +4 -4
- data/{vendor/gems → lib}/acts_as_versioned/init.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/lib/acts_as_versioned.rb +109 -107
- data/{vendor/gems → lib}/acts_as_versioned/test/abstract_unit.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/database.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/authors.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark_versions.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmarks.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages_revisions.yml +0 -0
- data/{vendor/gems/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb → lib/acts_as_versioned/test/fixtures/migrations/2_add_versioned_tables.rb} +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page_versions.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/pages.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/widget.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/migration_test.rb +0 -1
- data/{vendor/gems → lib}/acts_as_versioned/test/schema.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/versioned_test.rb +0 -0
- data/lib/extensions/action_controller.rb +154 -143
- data/lib/imagine_cms/engine.rb +33 -12
- data/lib/imagine_cms/version.rb +1 -1
- data/lib/imagine_cms.rb +30 -6
- data/lib/prototype_legacy_helper/README.markdown +13 -0
- data/lib/prototype_legacy_helper/init.rb +1 -0
- data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +430 -0
- data/lib/prototype_legacy_helper/test/test_prototype_helper.rb +297 -0
- data/lib/upload_progress/CHANGELOG +5 -0
- data/lib/upload_progress/MIT-LICENSE +20 -0
- data/lib/upload_progress/README +45 -0
- data/{vendor/gems/acts_as_tree → lib/upload_progress}/Rakefile +6 -5
- data/lib/upload_progress/init.rb +7 -0
- data/lib/upload_progress/lib/multipart_progress.rb +176 -0
- data/lib/upload_progress/lib/progress.rb +145 -0
- data/lib/upload_progress/lib/upload_progress.rb +303 -0
- data/lib/upload_progress/lib/upload_progress_helper.rb +425 -0
- data/lib/upload_progress/public/stylesheets/upload_progress.css +21 -0
- data/lib/upload_progress/test/multipart_progress_testx.rb +364 -0
- data/lib/upload_progress/test/upload_progress_helper_testx.rb +134 -0
- data/lib/upload_progress/test/upload_progress_testx.rb +88 -0
- metadata +305 -43
- data/app/assets/manage/btn_delete.gif +0 -0
- data/vendor/gems/.DS_Store +0 -0
- data/vendor/gems/acts_as_tree/README +0 -26
- data/vendor/gems/acts_as_tree/init.rb +0 -1
- data/vendor/gems/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
- data/vendor/gems/acts_as_tree/test/acts_as_tree_test.rb +0 -219
- data/vendor/gems/acts_as_tree/test/fixtures/mixin.rb +0 -0
- data/vendor/gems/acts_as_tree/test/fixtures/mixins.yml +0 -0
- data/vendor/gems/acts_as_tree/test/schema.rb +0 -0
- data/vendor/gems/acts_as_versioned/Gemfile +0 -7
@@ -0,0 +1,21 @@
|
|
1
|
+
class CmsContentSweeper < ActionController::Caching::Sweeper
|
2
|
+
observe CmsPage, CmsTemplate, CmsSnippet
|
3
|
+
|
4
|
+
def after_save(record)
|
5
|
+
delete_all_cached_pages
|
6
|
+
end
|
7
|
+
|
8
|
+
def after_destroy(record)
|
9
|
+
delete_all_cached_pages
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete_all_cached_pages
|
13
|
+
CmsPage.find(:all).each do |page|
|
14
|
+
expire_page :controller => 'cms/content', :action => 'show', :content_path => page.path.split('/')
|
15
|
+
end
|
16
|
+
|
17
|
+
# also delete RSS feed caches
|
18
|
+
expire_fragment %r{rss/\d+/}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
class CmsPage < ActiveRecord::Base
|
2
|
+
include ActsAsTree
|
3
|
+
|
4
|
+
attr_accessible :cms_template_id, :cms_template_version, :parent_id, :name, :title, :path, :article_date, :article_end_date, :summary, :thumbnail_path, :position, :comment_count, :version, :published_version, :published_date, :expiration_date, :expires, :search_index, :updated_by, :updated_by_username
|
5
|
+
|
6
|
+
acts_as_versioned
|
7
|
+
acts_as_tree :order => 'path'
|
8
|
+
|
9
|
+
belongs_to :template, :class_name => 'CmsTemplate', :foreign_key => 'cms_template_id'
|
10
|
+
has_many :objects, :class_name => 'CmsPageObject', :dependent => :destroy
|
11
|
+
has_many :tags, :class_name => 'CmsPageTag', :dependent => :destroy
|
12
|
+
has_many :versions, :class_name => 'CmsPageVersion', :dependent => :destroy
|
13
|
+
|
14
|
+
validates_format_of :name, :with => /\A[-\w\d%]+\Z/
|
15
|
+
validates_uniqueness_of :path, :message => 'conflicts with an existing page'
|
16
|
+
|
17
|
+
before_validation :compute_and_store_path, :set_versions
|
18
|
+
|
19
|
+
def compute_and_store_path
|
20
|
+
if self.parent
|
21
|
+
if self.parent.path != ''
|
22
|
+
self.path = "#{self.parent.path}/#{self.name}"
|
23
|
+
else
|
24
|
+
self.path = self.name
|
25
|
+
end
|
26
|
+
else
|
27
|
+
self.path = ''
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_versions
|
32
|
+
if self.template
|
33
|
+
self.cms_template_version ||= self.template.version
|
34
|
+
end
|
35
|
+
|
36
|
+
self.published_version ||= -1
|
37
|
+
self.published_date ||= self.created_on || Time.now
|
38
|
+
end
|
39
|
+
|
40
|
+
def sub_pages(options = {})
|
41
|
+
# not using options just yet, but you can override if you like
|
42
|
+
conditions = [ 'published_version >= 0' ]
|
43
|
+
self.children.find(:all, :conditions => conditions, :order => 'position')
|
44
|
+
end
|
45
|
+
|
46
|
+
def tags_as_css_classes
|
47
|
+
self.tags.map { |t| t.name.downcase.gsub(/[^\w]+/, '-') }.join(' ')
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.index_all
|
51
|
+
CmsPage.find(:all, :conditions => [ 'search_index is null' ]).each { |pg| pg.update_index ; pg.save_without_revision }
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.reindex_all
|
56
|
+
CmsPage.find(:all).each { |pg| pg.update_index ; pg.save_without_revision }
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def name=(value)
|
61
|
+
if value && value.is_a?(String)
|
62
|
+
# filter suspicious content... go overboard for now, fine-tune later perhaps
|
63
|
+
value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
64
|
+
value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
65
|
+
value.gsub!(/<(%.*?`.*?\s*%)>/, '<\1>')
|
66
|
+
end
|
67
|
+
super(value)
|
68
|
+
end
|
69
|
+
|
70
|
+
def html_head=(value)
|
71
|
+
if value && value.is_a?(String)
|
72
|
+
# filter suspicious content... go overboard for now, fine-tune later perhaps
|
73
|
+
value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
74
|
+
value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
75
|
+
value.gsub!(/<(%.*?`.*?\s*%)>/, '<\1>')
|
76
|
+
end
|
77
|
+
super(value)
|
78
|
+
end
|
79
|
+
|
80
|
+
def update_index
|
81
|
+
content = ''
|
82
|
+
|
83
|
+
if self.published_version.to_i >= 0
|
84
|
+
idx_version = self.published_version.to_i == 0 ? self.version : self.published_version
|
85
|
+
self.objects.find(:all, :conditions => [ "cms_page_version = ? and (obj_type = 'text' or obj_type = 'string')", idx_version ]).each do |obj|
|
86
|
+
content << obj.content << "\n"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
self.search_index = sanitize_index(content)
|
91
|
+
end
|
92
|
+
|
93
|
+
def set_parent_id!(new_id)
|
94
|
+
self.parent_id = new_id
|
95
|
+
self.save_without_revision
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def article_date_month ; article_date.strftime("%B") ; end
|
100
|
+
def article_date_mon ; article_date.strftime("%b") ; end
|
101
|
+
def article_date_day ; article_date.strftime("%d").to_i ; end
|
102
|
+
def article_date_year ; article_date.strftime("%Y").to_i ; end
|
103
|
+
def article_date_yr ; article_date.strftime("%y").to_i ; end
|
104
|
+
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def sanitize_index(html)
|
109
|
+
return html if html.blank?
|
110
|
+
if html.index("<")
|
111
|
+
text = ""
|
112
|
+
tokenizer = HTML::Tokenizer.new(html)
|
113
|
+
|
114
|
+
while token = tokenizer.next
|
115
|
+
node = HTML::Node.parse(nil, 0, 0, token, false)
|
116
|
+
# result is only the content of any Text nodes
|
117
|
+
text << node.to_s if node.class == HTML::Text
|
118
|
+
end
|
119
|
+
# strip any comments, and if they have a newline at the end (ie. line with
|
120
|
+
# only a comment) strip that too, as well as any erb stuff
|
121
|
+
text.gsub(/<!--(.*?)-->[\n]?/m, "").gsub(/\<%.*?%\>/m, '').gsub(/&\w+;/, '')
|
122
|
+
else
|
123
|
+
html # already plain text
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class CmsPageObject < ActiveRecord::Base
|
2
|
+
attr_accessible :name, :obj_type
|
3
|
+
|
4
|
+
belongs_to :page, :class_name => 'CmsPage', :foreign_key => 'cms_page_id'
|
5
|
+
|
6
|
+
before_create :set_page_version
|
7
|
+
|
8
|
+
|
9
|
+
def set_page_version
|
10
|
+
self.cms_page_version ||= page.version
|
11
|
+
end
|
12
|
+
|
13
|
+
def content=(value)
|
14
|
+
if value && value.is_a?(String)
|
15
|
+
# filter suspicious content... go overboard for now, fine-tune later perhaps
|
16
|
+
value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
17
|
+
value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
18
|
+
value.gsub!(/<(%.*?`.*?\s*%)>/, '<\1>')
|
19
|
+
end
|
20
|
+
super(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CmsSnippet < ActiveRecord::Base
|
2
|
+
acts_as_versioned
|
3
|
+
|
4
|
+
attr_accessible :name, :content
|
5
|
+
|
6
|
+
def content=(value)
|
7
|
+
if value && value.is_a?(String)
|
8
|
+
# filter suspicious content... go overboard for now, fine-tune later perhaps
|
9
|
+
value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
10
|
+
value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
11
|
+
value.gsub!(/<(%.*?`.*?\s*%)>/, '<\1>')
|
12
|
+
end
|
13
|
+
super(value)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class CmsTemplate < ActiveRecord::Base
|
2
|
+
acts_as_versioned
|
3
|
+
|
4
|
+
attr_accessible :name, :content
|
5
|
+
attr_accessor :options
|
6
|
+
|
7
|
+
has_many :pages, :class_name => 'CmsPage'
|
8
|
+
|
9
|
+
def after_find
|
10
|
+
require 'yaml'
|
11
|
+
@options = YAML.load(self.options_yaml) if self.options_yaml
|
12
|
+
end
|
13
|
+
|
14
|
+
def content=(value)
|
15
|
+
if value && value.is_a?(String)
|
16
|
+
# filter suspicious content... go overboard for now, fine-tune later perhaps
|
17
|
+
value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
18
|
+
value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
19
|
+
value.gsub!(/<(%.*?`.*?\s*%)>/, '<\1>')
|
20
|
+
end
|
21
|
+
super(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def before_save
|
25
|
+
require 'yaml'
|
26
|
+
self.options_yaml = YAML.dump(@options)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/app/models/user.rb
CHANGED
@@ -2,6 +2,7 @@ class User < ActiveRecord::Base # :nodoc:
|
|
2
2
|
require 'dynamic_methods'
|
3
3
|
include DynamicMethods
|
4
4
|
|
5
|
+
attr_accessible :first_name, :last_name
|
5
6
|
attr_reader :password # :nodoc:
|
6
7
|
|
7
8
|
has_and_belongs_to_many :groups, :class_name => 'UserGroup', :join_table => 'user_group_memberships'
|
@@ -11,9 +12,11 @@ class User < ActiveRecord::Base # :nodoc:
|
|
11
12
|
validates_uniqueness_of :username, :message => 'already in use'
|
12
13
|
validates_confirmation_of :password
|
13
14
|
|
14
|
-
|
15
|
+
before_validation :fake_password_confirmation, :on => :update
|
15
16
|
|
16
|
-
|
17
|
+
def name ; [ first_name, last_name ].compact.join(' ') ; end
|
18
|
+
|
19
|
+
SaltLength = 16 unless defined?(SaltLength) # :nodoc:
|
17
20
|
|
18
21
|
def password=(val) # :nodoc:
|
19
22
|
@password = val
|
@@ -38,7 +41,7 @@ class User < ActiveRecord::Base # :nodoc:
|
|
38
41
|
salt << digest.hexdigest
|
39
42
|
end
|
40
43
|
|
41
|
-
def
|
44
|
+
def fake_password_confirmation # :nodoc:
|
42
45
|
# if password is blank, user is not trying to change it.
|
43
46
|
# just appease the validator by setting something valid
|
44
47
|
if ((@password ||= "") == "")
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%-
|
2
|
+
ext = File.extname(@filename)
|
3
|
+
ext = (ext.blank? ? 'generic' : ext.gsub(/\./, ''))
|
4
|
+
-%>
|
5
|
+
<%= javascript_tag <<-EOF
|
6
|
+
var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
|
7
|
+
linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']);
|
8
|
+
|
9
|
+
curInst.restoreSelection();
|
10
|
+
|
11
|
+
if (!linkNode) {
|
12
|
+
var html = dojo.withGlobal(curInst.window, 'getSelectedHtml', dojo.html.selection);
|
13
|
+
} else {
|
14
|
+
var html = linkNode.innerHTML;
|
15
|
+
dojo.withGlobal(curInst.window, 'selectElement', dojo.html.selection, [linkNode]);
|
16
|
+
}
|
17
|
+
|
18
|
+
curInst.execCommand('inserthtml', '<a href=\"/#{@filename}\" class=\"file-#{ext}\" target=\"_blank\">'+html+'</a>');
|
19
|
+
cancelInsertFile();
|
20
|
+
EOF
|
21
|
+
%>
|
@@ -0,0 +1,188 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
var resize_ratio = 1.0;
|
3
|
+
var aspect_ratio = <%= @width %>.0 / <%= @height %>;
|
4
|
+
var imageSizeLocked = false;
|
5
|
+
|
6
|
+
try {
|
7
|
+
if (cropper) cropper.remove();
|
8
|
+
} catch (e) {}
|
9
|
+
|
10
|
+
onEndCrop = function (coords, dimensions) {
|
11
|
+
if (dimensions.width > 0 && dimensions.height > 0) {
|
12
|
+
var size_changed = false;
|
13
|
+
|
14
|
+
$('image_x1').value = coords.x1;
|
15
|
+
$('image_y1').value = coords.y1;
|
16
|
+
$('image_x2').value = coords.x2;
|
17
|
+
$('image_y2').value = coords.y2;
|
18
|
+
|
19
|
+
if (dimensions.width != $('image_width').value) {
|
20
|
+
$('image_width').value = dimensions.width;
|
21
|
+
size_changed = true;
|
22
|
+
}
|
23
|
+
if (dimensions.height != $('image_height').value) {
|
24
|
+
$('image_height').value = dimensions.height;
|
25
|
+
size_changed = true;
|
26
|
+
}
|
27
|
+
|
28
|
+
if (size_changed) {
|
29
|
+
setResizeRatio();
|
30
|
+
aspect_ratio = 1.0 * dimensions.width / dimensions.height;
|
31
|
+
|
32
|
+
$('selection_x2').value = dimensions.width;
|
33
|
+
$('selection_y2').value = dimensions.height;
|
34
|
+
|
35
|
+
if (!imageSizeLocked) {
|
36
|
+
if (resize_ratio) {
|
37
|
+
$('image_max_width').value = Math.round(dimensions.width * resize_ratio);
|
38
|
+
$('image_max_height').value = Math.round(dimensions.height * resize_ratio);
|
39
|
+
} else {
|
40
|
+
$('image_max_width').value = dimensions.width;
|
41
|
+
$('image_max_height').value = dimensions.height;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
$('aspect_ratio').innerHTML = setPrecision(dimensions.width/dimensions.height, 3);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
resizeCropper = function () {
|
51
|
+
width = $('selection_x2').value;
|
52
|
+
height = $('selection_y2').value;
|
53
|
+
end_x = parseInt(width) + parseInt(cropper.areaCoords.x1);
|
54
|
+
end_y = parseInt(height) + parseInt(cropper.areaCoords.y1);
|
55
|
+
cropper.setAreaCoords(cropper.cloneCoords({ x1:parseInt(cropper.areaCoords.x1),
|
56
|
+
y1:parseInt(cropper.areaCoords.y1),
|
57
|
+
x2:end_x,
|
58
|
+
y2:end_y }), false, false, 1);
|
59
|
+
cropper.selArea.show();
|
60
|
+
cropper.drawArea();
|
61
|
+
cropper.endCrop();
|
62
|
+
|
63
|
+
setResizeRatio();
|
64
|
+
}
|
65
|
+
|
66
|
+
resizeCropperScaled = function () {
|
67
|
+
if (imageSizeLocked) {
|
68
|
+
width = parseInt($('image_max_width').value);
|
69
|
+
height = parseInt($('image_max_height').value);
|
70
|
+
if (width > 10 && height > 10) {
|
71
|
+
cropper.options.ratioDim = { x: width, y: height };
|
72
|
+
reloadCropper();
|
73
|
+
}
|
74
|
+
} else {
|
75
|
+
$('selection_x2').value = Math.round($('image_max_width').value / resize_ratio);
|
76
|
+
$('selection_y2').value = Math.round($('image_max_height').value / resize_ratio);
|
77
|
+
resizeCropper();
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
setResizeRatio = function () {
|
82
|
+
crop_width = parseInt($('image_max_width').value);
|
83
|
+
selection_width = parseInt($('selection_x2').value); // this is correct... x2 is the sel width
|
84
|
+
|
85
|
+
if (crop_width > 10 && selection_width > 10) {
|
86
|
+
resize_ratio = 1.0 * $('image_max_width').value / $('selection_x2').value;
|
87
|
+
} else {
|
88
|
+
resize_ratio = 1.0;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
lockImageSize = function () {
|
93
|
+
imageSizeLocked = true;
|
94
|
+
cropper.options.ratioDim = { x: parseInt($('image_max_width').value),
|
95
|
+
y: parseInt($('image_max_height').value) };
|
96
|
+
reloadCropper();
|
97
|
+
|
98
|
+
$('icon_unlocked').hide();
|
99
|
+
$('icon_locked').show();
|
100
|
+
}
|
101
|
+
|
102
|
+
unlockImageSize = function () {
|
103
|
+
imageSizeLocked = false;
|
104
|
+
cropper.options.ratioDim = { x: 0, y: 0 };
|
105
|
+
reloadCropper();
|
106
|
+
|
107
|
+
$('icon_locked').hide();
|
108
|
+
$('icon_unlocked').show();
|
109
|
+
}
|
110
|
+
|
111
|
+
reloadCropper = function () {
|
112
|
+
oldOptions = cropper.options;
|
113
|
+
oldOptions.displayOnInit = 1;
|
114
|
+
if (($('image_x1').value == $('image_x2').value) && ($('image_y1').value == $('image_y2').value)) {
|
115
|
+
$('image_x1').value = '0';
|
116
|
+
$('image_x2').value = $('image_max_width').value;
|
117
|
+
$('image_y1').value = '0';
|
118
|
+
$('image_y2').value = $('image_max_height').value;
|
119
|
+
}
|
120
|
+
oldOptions.onloadCoords = { x1: $('image_x1').value, y1: $('image_y1').value,
|
121
|
+
x2: $('image_x2').value, y2: $('image_y2').value };
|
122
|
+
cropper.remove();
|
123
|
+
cropper = new Cropper.Img('testImage', oldOptions);
|
124
|
+
}
|
125
|
+
|
126
|
+
recalculateWidth = function () {
|
127
|
+
if (imageSizeLocked) {
|
128
|
+
$('image_max_width').value = Math.round(parseInt($('image_max_height').value) / aspect_ratio);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
recalculateHeight = function () {
|
133
|
+
if (imageSizeLocked) {
|
134
|
+
$('image_max_height').value = Math.round(parseInt($('image_max_width').value) / aspect_ratio);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
</script>
|
138
|
+
|
139
|
+
<h3>Crop Feature Image</h3>
|
140
|
+
|
141
|
+
Crop the image by clicking and dragging the mouse over the image.<br/>
|
142
|
+
Pressing "Save Feature Image" will crop the image and set it as the new feature image for this page.
|
143
|
+
<br/>
|
144
|
+
|
145
|
+
<center>
|
146
|
+
<%= cropper_image_tag({ :url => File.join('content', @pg.path, @image_file) }) %><br/>
|
147
|
+
</center>
|
148
|
+
<br/>
|
149
|
+
|
150
|
+
<center>
|
151
|
+
<%= form_remote_tag :update => 'select_thumbnail_dialog_content',
|
152
|
+
:url => { :action => "save_crop_feature_image", :id => @pg, :filename => @image_file } do -%>
|
153
|
+
<table cellpadding="10">
|
154
|
+
<tr>
|
155
|
+
<td>
|
156
|
+
<fieldset style="padding: 10px 15px; text-align: center; display: none;">
|
157
|
+
<legend>Adjust Crop:</legend>
|
158
|
+
<%= text_field :selection, :x2, :size => 3, :onkeyup => "resizeCropper();" %> x <%= text_field :selection, :y2, :size => 3, :onkeyup => "resizeCropper();" %>
|
159
|
+
</fieldset>
|
160
|
+
|
161
|
+
<fieldset style="padding: 10px 15px; text-align: center;">
|
162
|
+
<legend>Final Image Dimensions:</legend>
|
163
|
+
<%= text_field :image, :max_width, :size => 3, :value => @width, :onchange => "recalculateHeight();" %>
|
164
|
+
x <%= text_field :image, :max_height, :size => 3, :value => @height, :onchange => "recalculateWidth();" %>
|
165
|
+
<%= javascript_tag "$('image_max_width').onkeydown = disableEnterKey; $('image_max_height').onkeydown = disableEnterKey;" %>
|
166
|
+
|
167
|
+
<%= image_tag('/assets/management/icon_unlocked.png', :id => 'icon_unlocked', :onclick => "lockImageSize();") %>
|
168
|
+
<%= image_tag('/assets/management/icon_locked.png', :id => 'icon_locked', :onclick => "unlockImageSize();", :style => 'display: none;') %>
|
169
|
+
|
170
|
+
<%= link_to_function "Apply", "resizeCropperScaled();" %> |
|
171
|
+
<%= link_to_function "Reset", "cropper.reset(); resize_ratio = 1.0;" %>
|
172
|
+
|
173
|
+
<span id="aspect_ratio" style="display: none;"><%= sprintf("%.3f", @aspect_ratio) %></span><br/>
|
174
|
+
<%= text_field :image, :x1, :style => "display: none" %>
|
175
|
+
<%= text_field :image, :y1, :style => "display: none" %>
|
176
|
+
<%= text_field :image, :x2, :style => "display: none" %>
|
177
|
+
<%= text_field :image, :y2, :style => "display: none" %>
|
178
|
+
<%= text_field :image, :width, :style => "display: none" %>
|
179
|
+
<%= text_field :image, :height, :style => "display: none" %>
|
180
|
+
</fieldset>
|
181
|
+
</td>
|
182
|
+
</tr>
|
183
|
+
</table>
|
184
|
+
|
185
|
+
<%= submit_tag 'Save Feature Image', :class => 'form_button', :style => 'width: 90px;', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
|
186
|
+
<%= link_to_function "Cancel", "cancelSelectThumbnail()" %>
|
187
|
+
<%- end -%>
|
188
|
+
</center>
|
@@ -0,0 +1,188 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
var resize_ratio = 1.0;
|
3
|
+
var aspect_ratio = <%= @width %>.0 / <%= @height %>;
|
4
|
+
var imageSizeLocked = false;
|
5
|
+
|
6
|
+
try {
|
7
|
+
if (cropper) cropper.remove();
|
8
|
+
} catch (e) {}
|
9
|
+
|
10
|
+
onEndCrop = function (coords, dimensions) {
|
11
|
+
if (dimensions.width > 0 && dimensions.height > 0) {
|
12
|
+
var size_changed = false;
|
13
|
+
|
14
|
+
$('image_x1').value = coords.x1;
|
15
|
+
$('image_y1').value = coords.y1;
|
16
|
+
$('image_x2').value = coords.x2;
|
17
|
+
$('image_y2').value = coords.y2;
|
18
|
+
|
19
|
+
if (dimensions.width != $('image_width').value) {
|
20
|
+
$('image_width').value = dimensions.width;
|
21
|
+
size_changed = true;
|
22
|
+
}
|
23
|
+
if (dimensions.height != $('image_height').value) {
|
24
|
+
$('image_height').value = dimensions.height;
|
25
|
+
size_changed = true;
|
26
|
+
}
|
27
|
+
|
28
|
+
if (size_changed) {
|
29
|
+
setResizeRatio();
|
30
|
+
aspect_ratio = 1.0 * dimensions.width / dimensions.height;
|
31
|
+
|
32
|
+
$('selection_x2').value = dimensions.width;
|
33
|
+
$('selection_y2').value = dimensions.height;
|
34
|
+
|
35
|
+
if (!imageSizeLocked) {
|
36
|
+
if (resize_ratio) {
|
37
|
+
$('image_max_width').value = Math.round(dimensions.width * resize_ratio);
|
38
|
+
$('image_max_height').value = Math.round(dimensions.height * resize_ratio);
|
39
|
+
} else {
|
40
|
+
$('image_max_width').value = dimensions.width;
|
41
|
+
$('image_max_height').value = dimensions.height;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
$('aspect_ratio').innerHTML = setPrecision(dimensions.width/dimensions.height, 3);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
resizeCropper = function () {
|
51
|
+
width = $('selection_x2').value;
|
52
|
+
height = $('selection_y2').value;
|
53
|
+
end_x = parseInt(width) + parseInt(cropper.areaCoords.x1);
|
54
|
+
end_y = parseInt(height) + parseInt(cropper.areaCoords.y1);
|
55
|
+
cropper.setAreaCoords(cropper.cloneCoords({ x1:parseInt(cropper.areaCoords.x1),
|
56
|
+
y1:parseInt(cropper.areaCoords.y1),
|
57
|
+
x2:end_x,
|
58
|
+
y2:end_y }), false, false, 1);
|
59
|
+
cropper.selArea.show();
|
60
|
+
cropper.drawArea();
|
61
|
+
cropper.endCrop();
|
62
|
+
|
63
|
+
setResizeRatio();
|
64
|
+
}
|
65
|
+
|
66
|
+
resizeCropperScaled = function () {
|
67
|
+
if (imageSizeLocked) {
|
68
|
+
width = parseInt($('image_max_width').value);
|
69
|
+
height = parseInt($('image_max_height').value);
|
70
|
+
if (width > 10 && height > 10) {
|
71
|
+
cropper.options.ratioDim = { x: width, y: height };
|
72
|
+
reloadCropper();
|
73
|
+
}
|
74
|
+
} else {
|
75
|
+
$('selection_x2').value = Math.round($('image_max_width').value / resize_ratio);
|
76
|
+
$('selection_y2').value = Math.round($('image_max_height').value / resize_ratio);
|
77
|
+
resizeCropper();
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
setResizeRatio = function () {
|
82
|
+
crop_width = parseInt($('image_max_width').value);
|
83
|
+
selection_width = parseInt($('selection_x2').value); // this is correct... x2 is the sel width
|
84
|
+
|
85
|
+
if (crop_width > 10 && selection_width > 10) {
|
86
|
+
resize_ratio = 1.0 * $('image_max_width').value / $('selection_x2').value;
|
87
|
+
} else {
|
88
|
+
resize_ratio = 1.0;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
lockImageSize = function () {
|
93
|
+
imageSizeLocked = true;
|
94
|
+
cropper.options.ratioDim = { x: parseInt($('image_max_width').value),
|
95
|
+
y: parseInt($('image_max_height').value) };
|
96
|
+
reloadCropper();
|
97
|
+
|
98
|
+
$('icon_unlocked').hide();
|
99
|
+
$('icon_locked').show();
|
100
|
+
}
|
101
|
+
|
102
|
+
unlockImageSize = function () {
|
103
|
+
imageSizeLocked = false;
|
104
|
+
cropper.options.ratioDim = { x: 0, y: 0 };
|
105
|
+
reloadCropper();
|
106
|
+
|
107
|
+
$('icon_locked').hide();
|
108
|
+
$('icon_unlocked').show();
|
109
|
+
}
|
110
|
+
|
111
|
+
reloadCropper = function () {
|
112
|
+
oldOptions = cropper.options;
|
113
|
+
oldOptions.displayOnInit = 1;
|
114
|
+
if (($('image_x1').value == $('image_x2').value) && ($('image_y1').value == $('image_y2').value)) {
|
115
|
+
$('image_x1').value = '0';
|
116
|
+
$('image_x2').value = $('image_max_width').value;
|
117
|
+
$('image_y1').value = '0';
|
118
|
+
$('image_y2').value = $('image_max_height').value;
|
119
|
+
}
|
120
|
+
oldOptions.onloadCoords = { x1: $('image_x1').value, y1: $('image_y1').value,
|
121
|
+
x2: $('image_x2').value, y2: $('image_y2').value };
|
122
|
+
cropper.remove();
|
123
|
+
cropper = new Cropper.Img('testImage', oldOptions);
|
124
|
+
}
|
125
|
+
|
126
|
+
recalculateWidth = function () {
|
127
|
+
if (imageSizeLocked) {
|
128
|
+
$('image_max_width').value = Math.round(parseInt($('image_max_height').value) / aspect_ratio);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
recalculateHeight = function () {
|
133
|
+
if (imageSizeLocked) {
|
134
|
+
$('image_max_height').value = Math.round(parseInt($('image_max_width').value) / aspect_ratio);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
</script>
|
138
|
+
|
139
|
+
<h3>Crop Image</h3>
|
140
|
+
|
141
|
+
Crop the image by clicking and dragging the mouse over the image.<br/>
|
142
|
+
Pressing "Save Image" will crop the image and insert it into the page.
|
143
|
+
<br/>
|
144
|
+
|
145
|
+
<center>
|
146
|
+
<%= cropper_image_tag({ :url => File.join('content', @pg.path, @image_file) }) %><br/>
|
147
|
+
</center>
|
148
|
+
<br/>
|
149
|
+
|
150
|
+
<center>
|
151
|
+
<%= form_remote_tag :update => 'insert_image_dialog_content',
|
152
|
+
:url => { :action => "save_crop", :id => @pg, :filename => @image_file } do -%>
|
153
|
+
<table cellpadding="10">
|
154
|
+
<tr>
|
155
|
+
<td>
|
156
|
+
<fieldset style="padding: 10px 15px; text-align: center; display: none;">
|
157
|
+
<legend>Adjust Crop:</legend>
|
158
|
+
<%= text_field :selection, :x2, :size => 3, :onkeyup => "resizeCropper();" %> x <%= text_field :selection, :y2, :size => 3, :onkeyup => "resizeCropper();" %>
|
159
|
+
</fieldset>
|
160
|
+
|
161
|
+
<fieldset style="padding: 10px 15px; text-align: center;">
|
162
|
+
<legend>Final Image Dimensions:</legend>
|
163
|
+
<%= text_field :image, :max_width, :size => 3, :value => @width, :onchange => "recalculateHeight();" %>
|
164
|
+
x <%= text_field :image, :max_height, :size => 3, :value => @height, :onchange => "recalculateWidth();" %>
|
165
|
+
<%= javascript_tag "$('image_max_width').onkeydown = disableEnterKey; $('image_max_height').onkeydown = disableEnterKey;" %>
|
166
|
+
|
167
|
+
<%= image_tag('/assets/management/icon_unlocked.png', :id => 'icon_unlocked', :onclick => "lockImageSize();") %>
|
168
|
+
<%= image_tag('/assets/management/icon_locked.png', :id => 'icon_locked', :onclick => "unlockImageSize();", :style => 'display: none;') %>
|
169
|
+
|
170
|
+
<%= link_to_function "Apply", "resizeCropperScaled();" %> |
|
171
|
+
<%= link_to_function "Reset", "cropper.reset(); resize_ratio = 1.0;" %>
|
172
|
+
|
173
|
+
<span id="aspect_ratio" style="display: none;"><%= sprintf("%.3f", @aspect_ratio) %></span><br/>
|
174
|
+
<%= text_field :image, :x1, :style => "display: none" %>
|
175
|
+
<%= text_field :image, :y1, :style => "display: none" %>
|
176
|
+
<%= text_field :image, :x2, :style => "display: none" %>
|
177
|
+
<%= text_field :image, :y2, :style => "display: none" %>
|
178
|
+
<%= text_field :image, :width, :style => "display: none" %>
|
179
|
+
<%= text_field :image, :height, :style => "display: none" %>
|
180
|
+
</fieldset>
|
181
|
+
</td>
|
182
|
+
</tr>
|
183
|
+
</table>
|
184
|
+
|
185
|
+
<%= submit_tag 'Save Image', :class => 'form_button', :style => 'width: 90px;', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
|
186
|
+
<%= link_to_function "Cancel", "cancelInsertImage();" %>
|
187
|
+
<%- end -%>
|
188
|
+
</center>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= javascript_tag "var editor = dojo.widget.Editor2Manager.getCurrentInstance(); editor.execCommand('inserthtml', '#{page_image_tag(@pg, @image_file)}'); cancelInsertImage();" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= javascript_tag "$('pg_feature_image_path').value = '/#{File.join('images', 'content', @pg.path, File.basename(@image_file))}'; $('feature_image_preview').innerHTML = '#{page_image_tag(@pg, @image_file)}'; cancelSelectThumbnail();" %>
|