knitkit 2.0.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.
- data/GPL-3-LICENSE +674 -0
- data/README.md +6 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/knitkit/application.js +9 -0
- data/app/assets/stylesheets/knitkit/application.css +7 -0
- data/app/controllers/knitkit/articles_controller.rb +7 -0
- data/app/controllers/knitkit/base_controller.rb +45 -0
- data/app/controllers/knitkit/blogs_controller.rb +27 -0
- data/app/controllers/knitkit/comments_controller.rb +18 -0
- data/app/controllers/knitkit/erp_app/desktop/app_controller.rb +135 -0
- data/app/controllers/knitkit/erp_app/desktop/articles_controller.rb +144 -0
- data/app/controllers/knitkit/erp_app/desktop/comments_controller.rb +43 -0
- data/app/controllers/knitkit/erp_app/desktop/content_controller.rb +27 -0
- data/app/controllers/knitkit/erp_app/desktop/file_assets_controller.rb +145 -0
- data/app/controllers/knitkit/erp_app/desktop/image_assets_controller.rb +28 -0
- data/app/controllers/knitkit/erp_app/desktop/inquiries_controller.rb +68 -0
- data/app/controllers/knitkit/erp_app/desktop/position_controller.rb +20 -0
- data/app/controllers/knitkit/erp_app/desktop/theme_controller.rb +272 -0
- data/app/controllers/knitkit/erp_app/desktop/versions_controller.rb +135 -0
- data/app/controllers/knitkit/erp_app/desktop/website_controller.rb +177 -0
- data/app/controllers/knitkit/erp_app/desktop/website_nav_controller.rb +143 -0
- data/app/controllers/knitkit/erp_app/desktop/website_section_controller.rb +116 -0
- data/app/controllers/knitkit/unauthorized_controller.rb +8 -0
- data/app/controllers/knitkit/website_sections_controller.rb +17 -0
- data/app/helpers/application_helper.rb +132 -0
- data/app/models/article.rb +14 -0
- data/app/models/blog.rb +21 -0
- data/app/models/comment.rb +24 -0
- data/app/models/content.rb +158 -0
- data/app/models/extensions/user.rb +5 -0
- data/app/models/published_element.rb +9 -0
- data/app/models/published_website.rb +118 -0
- data/app/models/theme.rb +239 -0
- data/app/models/website.rb +457 -0
- data/app/models/website_host.rb +3 -0
- data/app/models/website_inquiry.rb +11 -0
- data/app/models/website_inquiry_mailer.rb +12 -0
- data/app/models/website_nav.rb +17 -0
- data/app/models/website_nav_item.rb +21 -0
- data/app/models/website_section.rb +152 -0
- data/app/models/website_section_content.rb +4 -0
- data/app/views/knitkit/articles/index.html.erb +3 -0
- data/app/views/knitkit/articles/show.html.erb +4 -0
- data/app/views/knitkit/blogs/_add_comment.html.erb +28 -0
- data/app/views/knitkit/blogs/_comment.html.erb +8 -0
- data/app/views/knitkit/blogs/index.html.erb +51 -0
- data/app/views/knitkit/blogs/index.rss.builder +23 -0
- data/app/views/knitkit/blogs/show.html.erb +22 -0
- data/app/views/knitkit/unauthorized/index.html.erb +4 -0
- data/app/views/knitkit/website_sections/index.html.erb +6 -0
- data/app/views/layouts/knitkit/base.html.erb +59 -0
- data/app/views/menus/knitkit/_default_menu.html.erb +23 -0
- data/app/views/menus/knitkit/_default_section_menu.html.erb +27 -0
- data/app/views/menus/knitkit/_default_sub_menu.html.erb +45 -0
- data/app/views/menus/knitkit/_default_sub_section_menu.html.erb +49 -0
- data/app/views/shared/knitkit/_bread_crumb.html.erb +7 -0
- data/app/views/shared/knitkit/_footer.html.erb +3 -0
- data/app/views/website_inquiry_mailer/inquiry.erb +3 -0
- data/app/widgets/contact_us/base.rb +86 -0
- data/app/widgets/contact_us/javascript/contact_us.js +13 -0
- data/app/widgets/contact_us/views/_contact_form.html.erb +36 -0
- data/app/widgets/contact_us/views/error.html.erb +10 -0
- data/app/widgets/contact_us/views/index.html.erb +1 -0
- data/app/widgets/contact_us/views/layouts/base.html.erb +7 -0
- data/app/widgets/contact_us/views/success.html.erb +4 -0
- data/app/widgets/google_map/base.rb +48 -0
- data/app/widgets/google_map/javascript/google_map.js +174 -0
- data/app/widgets/google_map/views/index.html.erb +41 -0
- data/app/widgets/login/base.rb +61 -0
- data/app/widgets/login/javascript/login.js +162 -0
- data/app/widgets/login/views/index.html.erb +37 -0
- data/app/widgets/login/views/layouts/base.html.erb +14 -0
- data/app/widgets/login/views/login_header.html.erb +9 -0
- data/app/widgets/login/views/reset_password.html.erb +26 -0
- data/app/widgets/manage_profile/base.rb +327 -0
- data/app/widgets/manage_profile/javascript/manage_profile.js +11 -0
- data/app/widgets/manage_profile/views/_contact_information_form.html.erb +180 -0
- data/app/widgets/manage_profile/views/_password_form.html.erb +20 -0
- data/app/widgets/manage_profile/views/_user_information_form.html.erb +30 -0
- data/app/widgets/manage_profile/views/contact_type_in_use.html.erb +4 -0
- data/app/widgets/manage_profile/views/default_type_error.html.erb +5 -0
- data/app/widgets/manage_profile/views/error.html.erb +3 -0
- data/app/widgets/manage_profile/views/index.html.erb +46 -0
- data/app/widgets/manage_profile/views/layouts/base.html.erb +1 -0
- data/app/widgets/manage_profile/views/password_blank.html.erb +4 -0
- data/app/widgets/manage_profile/views/password_invalid.html.erb +4 -0
- data/app/widgets/manage_profile/views/password_success.html.erb +3 -0
- data/app/widgets/manage_profile/views/success.html.erb +3 -0
- data/app/widgets/reset_password/base.rb +42 -0
- data/app/widgets/reset_password/javascript/reset_password.js +13 -0
- data/app/widgets/reset_password/views/index.html.erb +31 -0
- data/app/widgets/reset_password/views/layouts/base.html.erb +1 -0
- data/app/widgets/search/base.rb +80 -0
- data/app/widgets/search/javascript/search.js +31 -0
- data/app/widgets/search/views/_search.html.erb +39 -0
- data/app/widgets/search/views/index.html.erb +3 -0
- data/app/widgets/search/views/layouts/base.html.erb +24 -0
- data/app/widgets/search/views/show.html.erb +48 -0
- data/app/widgets/signup/base.rb +72 -0
- data/app/widgets/signup/javascript/signup.js +13 -0
- data/app/widgets/signup/views/_signup_form.html.erb +36 -0
- data/app/widgets/signup/views/error.html.erb +11 -0
- data/app/widgets/signup/views/index.html.erb +1 -0
- data/app/widgets/signup/views/layouts/base.html.erb +7 -0
- data/app/widgets/signup/views/success.html.erb +4 -0
- data/config/environment.rb +0 -0
- data/config/routes.rb +41 -0
- data/db/data_migrations/20110509223702_add_publisher_role.rb +11 -0
- data/db/data_migrations/20110816153456_add_knitkit_application.rb +31 -0
- data/db/data_migrations/upgrade/20111011203718_create_paths_for_sections.rb +13 -0
- data/db/data_migrations/upgrade/20111216192114_add_secured_models_to_menu_items.rb +18 -0
- data/db/data_migrations/upgrade/20111216202819_set_contents_iid_to_permalink_where_null.rb +12 -0
- data/db/migrate/20110211002317_setup_knitkit.rb +259 -0
- data/db/migrate/upgrade/20111014190442_update_contents.rb +25 -0
- data/db/migrate/upgrade/20111014201502_add_published_by_to_published_elements.rb +22 -0
- data/db/migrate/upgrade/20111017133851_add_iid_to_section.rb +21 -0
- data/db/migrate/upgrade/20111027145006_add_in_menu_to_section.rb +19 -0
- data/lib/knitkit.rb +12 -0
- data/lib/knitkit/engine.rb +26 -0
- data/lib/knitkit/extensions.rb +18 -0
- data/lib/knitkit/extensions/action_controller/theme_support/acts_as_themed_controller.rb +88 -0
- data/lib/knitkit/extensions/active_record/acts_as_commentable.rb +28 -0
- data/lib/knitkit/extensions/active_record/acts_as_publishable.rb +38 -0
- data/lib/knitkit/extensions/active_record/theme_support/has_many_themes.rb +34 -0
- data/lib/knitkit/extensions/compass/widgets/base.rb +53 -0
- data/lib/knitkit/extensions/core/array.rb +5 -0
- data/lib/knitkit/extensions/railties/action_view.rb +187 -0
- data/lib/knitkit/extensions/railties/theme_support/asset_tag_helper.rb +198 -0
- data/lib/knitkit/extensions/railties/theme_support/theme_file_resolver.rb +44 -0
- data/lib/knitkit/routing_filter/section_router.rb +55 -0
- data/lib/knitkit/syntax_validator.rb +32 -0
- data/lib/knitkit/version.rb +3 -0
- data/lib/tasks/knitkit_tasks.rake +4 -0
- data/public/images/knitkit/bullet.png +0 -0
- data/public/images/knitkit/content.png +0 -0
- data/public/images/knitkit/footer.png +0 -0
- data/public/images/knitkit/graphic.png +0 -0
- data/public/images/knitkit/greyFadeDown.png +0 -0
- data/public/images/knitkit/link.png +0 -0
- data/public/images/knitkit/logo.png +0 -0
- data/public/images/knitkit/menu.png +0 -0
- data/public/images/knitkit/menu_select.png +0 -0
- data/public/images/knitkit/search.png +0 -0
- data/public/javascripts/datepicker.js +440 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/articles_grid_panel.js +473 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +576 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/comments_grid_panel.js +217 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/east_region.js +26 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/file_assets_panel.js +109 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_data_view.js +30 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_panel.js +160 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/inquiries_grid_panel.js +46 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/module.js +46 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/publish_window.js +92 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/published_grid_panel.js +220 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/section_articles_grid_panel.js +613 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/themes_tree_panel.js +573 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/versions_grid_panel.js +664 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/west_region.js +2161 -0
- data/public/javascripts/erp_app/desktop/applications/knitkit/widgets_panel.js +52 -0
- data/public/stylesheets/datepicker.css +121 -0
- data/public/stylesheets/erp_app/desktop/applications/knitkit/knitkit.css +114 -0
- data/public/stylesheets/extjs/resources/css/knitkit_extjs_4.css +219 -0
- data/public/stylesheets/knitkit/style.css +394 -0
- metadata +289 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Knitkit
|
|
2
|
+
module Extensions
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ActsAsCommentable
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend(ClassMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
|
|
11
|
+
def acts_as_commentable
|
|
12
|
+
has_many :comments, :as => :commented_record, :dependent => :destroy
|
|
13
|
+
|
|
14
|
+
extend ActsAsCommentable::SingletonMethods
|
|
15
|
+
include ActsAsCommentable::InstanceMethods
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module SingletonMethods
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module InstanceMethods
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Knitkit
|
|
2
|
+
module Extensions
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ActsAsPublishable
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend(ClassMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
|
|
11
|
+
def can_be_published
|
|
12
|
+
after_destroy :destroy_published_elements
|
|
13
|
+
|
|
14
|
+
extend ActsAsPublishable::SingletonMethods
|
|
15
|
+
include ActsAsPublishable::InstanceMethods
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module SingletonMethods
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module InstanceMethods
|
|
24
|
+
def publish(site, comment, version, current_user)
|
|
25
|
+
site.publish_element(comment, self, version, current_user)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def destroy_published_elements
|
|
29
|
+
published_elements = PublishedElement.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', self.id, self.class.to_s, self.class.superclass.to_s)
|
|
30
|
+
published_elements.each do |published_element|
|
|
31
|
+
published_element.destroy
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Knitkit
|
|
2
|
+
module Extensions
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ThemeSupport
|
|
5
|
+
module HasManyThemes
|
|
6
|
+
def self.included(base)
|
|
7
|
+
base.extend ActMacro
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ActMacro
|
|
11
|
+
def has_many_themes(options = {})
|
|
12
|
+
return if has_many_themes?
|
|
13
|
+
|
|
14
|
+
has_many :themes, :dependent => :delete_all do
|
|
15
|
+
def active
|
|
16
|
+
find(:all, :conditions => 'active = 1')
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
include InstanceMethods # FIXME instead, check for the association being present
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def has_many_themes?
|
|
24
|
+
included_modules.include?(Knitkit::Extensions::ActiveRecord::ThemeSupport::HasManyThemes::InstanceMethods)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module InstanceMethods
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
::ErpApp::Widgets::Base.class_eval do
|
|
2
|
+
private
|
|
3
|
+
|
|
4
|
+
def add_view_paths
|
|
5
|
+
#set default view paths
|
|
6
|
+
cached_resolver = ErpApp::Widgets::Base.view_resolver_cache.find{|resolver| resolver.to_path == File.join(locate,"/views")}
|
|
7
|
+
if cached_resolver.nil?
|
|
8
|
+
resolver = ActionView::OptimizedFileSystemResolver.new(File.join(locate,"/views"))
|
|
9
|
+
prepend_view_path(resolver)
|
|
10
|
+
ErpApp::Widgets::Base.view_resolver_cache << resolver
|
|
11
|
+
else
|
|
12
|
+
prepend_view_path(cached_resolver)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
#set overrides by themes
|
|
16
|
+
current_theme_paths.each do |theme|
|
|
17
|
+
resolver = case ErpTechSvcs::FileSupport.options[:storage]
|
|
18
|
+
when :s3
|
|
19
|
+
ErpTechSvcs::FileSupport::S3Manager.reload
|
|
20
|
+
path = "/#{theme[:url]}/widgets/#{self.name}"
|
|
21
|
+
cached_resolver = ErpApp::Widgets::Base.view_resolver_cache.find{|cached_resolver| cached_resolver.to_path == path}
|
|
22
|
+
if cached_resolver.nil?
|
|
23
|
+
resolver = ActionView::S3Resolver.new(path)
|
|
24
|
+
ErpApp::Widgets::Base.view_resolver_cache << resolver
|
|
25
|
+
resolver
|
|
26
|
+
else
|
|
27
|
+
cached_resolver
|
|
28
|
+
end
|
|
29
|
+
when :filesystem
|
|
30
|
+
path = "#{theme[:path]}/widgets/#{self.name}"
|
|
31
|
+
cached_resolver = ErpApp::Widgets::Base.view_resolver_cache.find{|cached_resolver| cached_resolver.to_path == path}
|
|
32
|
+
if cached_resolver.nil?
|
|
33
|
+
resolver = ActionView::ThemeFileResolver.new(path)
|
|
34
|
+
ErpApp::Widgets::Base.view_resolver_cache << resolver
|
|
35
|
+
resolver
|
|
36
|
+
else
|
|
37
|
+
cached_resolver
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
prepend_view_path(resolver)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def current_themes
|
|
45
|
+
@website = Website.find_by_host(request.host_with_port) if @website.nil?
|
|
46
|
+
@website.themes.active if @website
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def current_theme_paths
|
|
50
|
+
current_themes ? current_themes.map { |theme| {:path => theme.path.to_s, :url => theme.url.to_s}} : []
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
ActionView::Base.class_eval do
|
|
2
|
+
|
|
3
|
+
def published_content_created_by
|
|
4
|
+
"by #{@published_content.content.created_by.username}" rescue ''
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def blog_add_comment_form
|
|
8
|
+
render :partial => 'add_comment' unless current_user.nil?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def blog_topics(css_class='tag_link')
|
|
12
|
+
html = ''
|
|
13
|
+
|
|
14
|
+
@website_section.get_topics.each do |tag|
|
|
15
|
+
html += '<div class="'+css_class+'">'
|
|
16
|
+
html += link_to(tag.name, main_app.blog_tag_path(@website_section.id, tag.id))
|
|
17
|
+
html += '</div>'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
raw html
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def blog_rss_links(link_title='RSS Feed')
|
|
24
|
+
if params[:action] == 'tag'
|
|
25
|
+
return link_to link_title, main_app.blog_tag_url(params[:section_id], params[:tag_id], :rss)
|
|
26
|
+
else
|
|
27
|
+
return link_to link_title, main_app.blogs_url(params[:section_id], :rss)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def blog_recent_approved_comments
|
|
32
|
+
if @published_content.content.comments.recent.approved.empty?
|
|
33
|
+
return 'No Comments'
|
|
34
|
+
else
|
|
35
|
+
html = ''
|
|
36
|
+
|
|
37
|
+
@published_content.content.comments.recent.approved.each do |comment|
|
|
38
|
+
html += render :partial => 'comment', :locals => {:comment => comment}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return raw html
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def blog_pagination(css_class, params)
|
|
46
|
+
return will_paginate @contents, :class => css_class, :params => {
|
|
47
|
+
:section_id => params[:section_id],
|
|
48
|
+
:per_page => params[:per_page],
|
|
49
|
+
:format => params[:format],
|
|
50
|
+
:only_path => true,
|
|
51
|
+
:use_route => params[:use_route],
|
|
52
|
+
:scope => main_app
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# render a piece of content by internal identifier regardless if it belongs to a section or not
|
|
57
|
+
def render_content(iid)
|
|
58
|
+
content = Content.find_by_internal_identifier(iid)
|
|
59
|
+
content_version = Content.get_published_version(@active_publication, content)
|
|
60
|
+
raw content_version.body_html.nil? ? '' : content_version.body_html
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def render_content_area(name)
|
|
64
|
+
html = ''
|
|
65
|
+
|
|
66
|
+
section_contents = WebsiteSectionContent.find(:all,
|
|
67
|
+
:joins => :content,
|
|
68
|
+
:conditions => {
|
|
69
|
+
:website_section_id => @website_section.id,
|
|
70
|
+
:content_area => name.to_s },
|
|
71
|
+
:order => :position )
|
|
72
|
+
|
|
73
|
+
published_contents = []
|
|
74
|
+
section_contents.each do |sc|
|
|
75
|
+
content_version = Content.get_published_version(@active_publication, sc.content)
|
|
76
|
+
published_contents << content_version unless content_version.nil?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
published_contents.each do |content|
|
|
80
|
+
body_html = content.body_html.nil? ? '' : content.body_html
|
|
81
|
+
html << body_html
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
raw html
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def render_version_viewing
|
|
88
|
+
html = ''
|
|
89
|
+
|
|
90
|
+
if !session[:website_version].blank? && !session[:website_version].empty?
|
|
91
|
+
site_version_hash = session[:website_version].find{|item| item[:website_id] == @website.id}
|
|
92
|
+
unless site_version_hash.nil?
|
|
93
|
+
if site_version_hash[:version].to_f != @website.active_publication.version
|
|
94
|
+
html = "<div style='float:left;'>Viewing version #{site_version_hash[:version].to_f} <a href='/view_current_publication'>View current publication</a></div>"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
raw html
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def menu_item_selected(menu_item)
|
|
103
|
+
result = false
|
|
104
|
+
result = request.path == menu_item.path
|
|
105
|
+
unless result
|
|
106
|
+
menu_item.descendants.each do |child|
|
|
107
|
+
result = request.path == child.path
|
|
108
|
+
break if result
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
result
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#options
|
|
115
|
+
#nothing
|
|
116
|
+
# - uses current page to lookup section and go up tree
|
|
117
|
+
#menu
|
|
118
|
+
# - menu to look for menu title in
|
|
119
|
+
#menu_item
|
|
120
|
+
# - title of menu_item to start breadcrumbs at
|
|
121
|
+
#section_unique_name
|
|
122
|
+
# - sections permalink to start breadcrumbs at
|
|
123
|
+
def build_crumbs(options={})
|
|
124
|
+
links = []
|
|
125
|
+
if options[:menu]
|
|
126
|
+
menu = WebsiteNav.find_by_name(options[:menu])
|
|
127
|
+
raise "Menu with name #{options[:menu]} does not exist" if menu.nil?
|
|
128
|
+
menu_item = menu.website_nav_items.find(:first, :conditions => ["title = ?", options[:menu_item]])
|
|
129
|
+
raise "Menu Item with Title #{options[:menu]} does not exist" if menu_item.nil?
|
|
130
|
+
links = menu_item.self_and_ancestors.map{|child| {:url => child.path, :title => child.title}}
|
|
131
|
+
elsif options[:section_unique_name]
|
|
132
|
+
section = WebsiteSection.find_by_internal_identifier(options[:section_unique_name])
|
|
133
|
+
raise "Website Section with that unique name does not exist" if section.nil?
|
|
134
|
+
links = section.self_and_ancestors.map{|child| {:url => child.path, :title => child.title}}
|
|
135
|
+
else
|
|
136
|
+
links = @website_section.self_and_ancestors.collect{|child| {:url => child.path, :title => child.title}}
|
|
137
|
+
end
|
|
138
|
+
links
|
|
139
|
+
|
|
140
|
+
render :partial => 'shared/knitkit/bread_crumb', :locals => {:links => links}
|
|
141
|
+
end
|
|
142
|
+
#options
|
|
143
|
+
#menu
|
|
144
|
+
# - use a designed layout not sections
|
|
145
|
+
#layout
|
|
146
|
+
# - use defined layout
|
|
147
|
+
def render_menu(contents, options={})
|
|
148
|
+
locals = {:contents => contents}
|
|
149
|
+
if options[:menu]
|
|
150
|
+
menu = WebsiteNav.find_by_name_and_website_id(options[:menu], @website.id)
|
|
151
|
+
raise "Menu with name #{options[:menu]} does not exist" if menu.nil?
|
|
152
|
+
layout = options[:layout] ? "menus/#{options[:layout]}" : "menus/knitkit/default_menu"
|
|
153
|
+
locals[:menu_items] = menu.website_nav_items.positioned
|
|
154
|
+
else
|
|
155
|
+
layout = options[:layout] ? "menus/#{options[:layout]}" : "menus/knitkit/default_section_menu"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
render :partial => layout, :locals => locals
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
#options
|
|
162
|
+
#menu
|
|
163
|
+
# - use a designed layout not sections
|
|
164
|
+
#menu_item
|
|
165
|
+
# - menu item title to start at
|
|
166
|
+
#section_unique_name
|
|
167
|
+
# - section to begin at
|
|
168
|
+
#layout
|
|
169
|
+
# - use defined layout
|
|
170
|
+
def render_sub_menu(contents, options={})
|
|
171
|
+
locals = {:contents => contents}
|
|
172
|
+
if options[:menu]
|
|
173
|
+
menu = WebsiteNav.find_by_name_and_website_id(options[:menu], @website.id)
|
|
174
|
+
raise "Menu with name #{options[:menu]} does not exist" if menu.nil?
|
|
175
|
+
locals[:menu_items] = (options[:menu_item].nil? ? menu.all_menu_items.find{|item| menu_item_selected(item)}.positioned_children : menu.all_menu_items.find{|item| item.title = options[:menu_item]}.positioned_children)
|
|
176
|
+
raise "No menu items exist" if locals[:menu_items].nil?
|
|
177
|
+
layout = options[:layout] ? "menus/#{options[:layout]}" : "menus/knitkit/default_sub_menu"
|
|
178
|
+
else
|
|
179
|
+
section = options[:section_unique_name].nil? ? @website_section : WebsiteSection.find_by_internal_identifier(options[:section_unique_name])
|
|
180
|
+
raise "No website sections exist" if section.nil?
|
|
181
|
+
locals[:section] = section
|
|
182
|
+
layout = options[:layout] ? "menus/#{options[:layout]}" : "menus/knitkit/default_sub_section_menu"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
render :partial => layout, :locals => locals
|
|
186
|
+
end
|
|
187
|
+
end
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# With http://github.com/rails/rails/commit/104898fcb7958bcb69ba0239d6de8aa37f2da9ba
|
|
2
|
+
# Rails edge (2.3) reverted all the nice oop changes that were introduced to
|
|
3
|
+
# asset_tag_helper in 2.2 ... so no point to code against the 2.2'ish API
|
|
4
|
+
# any more. Ok, let's instead overwrite everything. OMG ... suck, why does
|
|
5
|
+
# this so remind me of PHP.
|
|
6
|
+
|
|
7
|
+
require 'action_view/helpers/asset_tag_helper'
|
|
8
|
+
|
|
9
|
+
module ActionView
|
|
10
|
+
module Helpers
|
|
11
|
+
module AssetTagHelper
|
|
12
|
+
def theme_javascript_path(theme, source)
|
|
13
|
+
theme = controller.website.themes.find_by_theme_id(theme) unless theme.is_a?(Theme)
|
|
14
|
+
file = theme.files.where('name = ? and directory = ?', source, "/#{theme.url}/javascripts").first
|
|
15
|
+
file.nil? ? '' : file.data.url
|
|
16
|
+
end
|
|
17
|
+
alias_method :theme_path_to_javascript, :theme_javascript_path
|
|
18
|
+
|
|
19
|
+
def theme_javascript_include_tag(theme_id, *sources)
|
|
20
|
+
theme = controller.website.themes.find_by_theme_id(theme_id)
|
|
21
|
+
return("could not find theme with the id #{theme_id}") unless theme
|
|
22
|
+
|
|
23
|
+
options = sources.extract_options!.stringify_keys
|
|
24
|
+
cache = options.delete("cache")
|
|
25
|
+
recursive = options.delete("recursive")
|
|
26
|
+
|
|
27
|
+
if ActionController::Base.perform_caching && cache
|
|
28
|
+
joined_javascript_name = (cache == true ? "all" : cache) + ".js"
|
|
29
|
+
joined_javascript_path = File.join(theme.path + '/javascripts', joined_javascript_name)
|
|
30
|
+
|
|
31
|
+
paths = theme_compute_javascript_paths(theme, sources, recursive)
|
|
32
|
+
theme_write_asset_file_contents(theme, joined_javascript_path, paths) unless File.exists?(joined_javascript_path)
|
|
33
|
+
raw theme_javascript_src_tag(theme, joined_javascript_name, options)
|
|
34
|
+
else
|
|
35
|
+
sources = theme_expand_javascript_sources(theme, sources, recursive).collect do |source|
|
|
36
|
+
theme_javascript_src_tag(theme, source, options)
|
|
37
|
+
end.join("\n")
|
|
38
|
+
raw sources
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def theme_stylesheet_path(theme, source)
|
|
43
|
+
theme = controller.website.themes.find_by_theme_id(theme) unless theme.is_a?(Theme)
|
|
44
|
+
file = theme.files.where('name = ? and directory = ?', source, "/#{theme.url}/stylesheets").first
|
|
45
|
+
file.nil? ? '' : file.data.url
|
|
46
|
+
end
|
|
47
|
+
alias_method :theme_path_to_stylesheet, :theme_stylesheet_path
|
|
48
|
+
|
|
49
|
+
def theme_stylesheet_link_tag(theme_id, *sources)
|
|
50
|
+
theme = controller.website.themes.find_by_theme_id(theme_id)
|
|
51
|
+
return("could not find theme with the id #{theme_id}") unless theme
|
|
52
|
+
|
|
53
|
+
options = sources.extract_options!.stringify_keys
|
|
54
|
+
cache = options.delete("cache")
|
|
55
|
+
recursive = options.delete("recursive")
|
|
56
|
+
|
|
57
|
+
if ActionController::Base.perform_caching && cache
|
|
58
|
+
joined_stylesheet_name = (cache == true ? "all" : cache) + ".css"
|
|
59
|
+
joined_stylesheet_path = File.join(theme.path + '/stylesheets', joined_stylesheet_name)
|
|
60
|
+
|
|
61
|
+
paths = theme_compute_stylesheet_paths(theme, sources, recursive)
|
|
62
|
+
theme_write_asset_file_contents(theme, joined_stylesheet_path, paths) unless File.exists?(joined_stylesheet_path)
|
|
63
|
+
raw theme_stylesheet_tag(theme, joined_stylesheet_name, options)
|
|
64
|
+
else
|
|
65
|
+
sources = theme_expand_stylesheet_sources(theme, sources, recursive).collect do |source|
|
|
66
|
+
theme_stylesheet_tag(theme, source, options)
|
|
67
|
+
end.join("\n")
|
|
68
|
+
raw sources
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def theme_image_path(theme, source)
|
|
73
|
+
theme = controller.website.themes.find_by_theme_id(theme) unless theme.is_a?(Theme)
|
|
74
|
+
file = theme.files.where('name = ? and directory = ?', source, "/#{theme.url}/images").first
|
|
75
|
+
file.nil? ? '' : file.data.url
|
|
76
|
+
end
|
|
77
|
+
alias_method :theme_path_to_image, :theme_image_path # aliased to avoid conflicts with an image_path named route
|
|
78
|
+
|
|
79
|
+
def theme_image_tag(theme_id, source, options = {})
|
|
80
|
+
theme = controller.website.themes.find_by_theme_id(theme_id)
|
|
81
|
+
return("could not find theme with the id #{theme_id}") unless theme
|
|
82
|
+
|
|
83
|
+
options.symbolize_keys!
|
|
84
|
+
options[:src] = theme_path_to_image(theme, source)
|
|
85
|
+
options[:alt] ||= File.basename(options[:src], '.*').split('.').first.to_s.capitalize
|
|
86
|
+
|
|
87
|
+
if size = options.delete(:size)
|
|
88
|
+
options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if mouseover = options.delete(:mouseover)
|
|
92
|
+
options[:onmouseover] = "this.src='#{theme_image_path(theme, mouseover)}'"
|
|
93
|
+
options[:onmouseout] = "this.src='#{theme_image_path(theme, options[:src])}'"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
tag("img", options)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
def theme_compute_public_path(theme, source, dir, ext = nil, include_host = true)
|
|
101
|
+
has_request = controller.respond_to?(:request)
|
|
102
|
+
|
|
103
|
+
if ext && (File.extname(source).blank? || File.exist?(File.join(theme.path, dir, "#{source}.#{ext}")))
|
|
104
|
+
source += ".#{ext}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
unless source =~ %r{^[-a-z]+://}
|
|
108
|
+
source = "/#{dir}/#{source}" unless source[0] == ?/
|
|
109
|
+
|
|
110
|
+
source = theme_rewrite_asset_path(theme, source)
|
|
111
|
+
|
|
112
|
+
if has_request && include_host
|
|
113
|
+
unless source =~ %r{^#{ActionController::Base.config.relative_url_root}/}
|
|
114
|
+
source = "#{ActionController::Base.config.relative_url_root}#{source}"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
source
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def theme_rails_asset_id(theme, source)
|
|
123
|
+
if asset_id = ENV["RAILS_ASSET_ID"]
|
|
124
|
+
asset_id
|
|
125
|
+
else
|
|
126
|
+
path = File.join(theme.path, source)
|
|
127
|
+
asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : ''
|
|
128
|
+
asset_id
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def theme_rewrite_asset_path(theme, source)
|
|
133
|
+
asset_id = theme_rails_asset_id(theme, source)
|
|
134
|
+
if asset_id.blank?
|
|
135
|
+
source
|
|
136
|
+
else
|
|
137
|
+
source + "?#{asset_id}"
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def theme_javascript_src_tag(theme, source, options)
|
|
142
|
+
options = { "type" => Mime::JS, "src" => theme_path_to_javascript(theme, source) }.merge(options)
|
|
143
|
+
content_tag("script", "", options)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def theme_stylesheet_tag(theme, source, options)
|
|
147
|
+
options = { "rel" => "stylesheet", "type" => Mime::CSS, "media" => "screen",
|
|
148
|
+
"href" => html_escape(theme_path_to_stylesheet(theme, source)) }.merge(options)
|
|
149
|
+
tag("link", options, false, false)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def theme_compute_javascript_paths(theme, *args)
|
|
153
|
+
theme_expand_javascript_sources(theme, *args).collect do |source|
|
|
154
|
+
theme_compute_public_path(theme, source, theme.url + '/javascripts', 'js', false)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def theme_compute_stylesheet_paths(theme, *args)
|
|
159
|
+
theme_expand_stylesheet_sources(theme, *args).collect do |source|
|
|
160
|
+
theme_compute_public_path(theme, source, theme.url + '/stylesheets', 'css', false)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def theme_expand_javascript_sources(theme, sources, recursive = false)
|
|
165
|
+
if sources.include?(:all)
|
|
166
|
+
all_javascript_files = collect_asset_files(theme.path + '/javascripts', ('**' if recursive), '*.js').uniq
|
|
167
|
+
else
|
|
168
|
+
sources.flatten
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def theme_expand_stylesheet_sources(theme, sources, recursive)
|
|
173
|
+
if sources.first == :all
|
|
174
|
+
collect_asset_files(theme.path + '/stylesheets', ('**' if recursive), '*.css')
|
|
175
|
+
else
|
|
176
|
+
sources.flatten
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def theme_write_asset_file_contents(theme, joined_asset_path, asset_paths)
|
|
181
|
+
FileUtils.mkdir_p(File.dirname(joined_asset_path))
|
|
182
|
+
File.open(joined_asset_path, "w+") do |cache|
|
|
183
|
+
cache.write(theme_join_asset_file_contents(theme, asset_paths))
|
|
184
|
+
end
|
|
185
|
+
mt = asset_paths.map { |p| File.mtime(theme_asset_file_path(theme, p)) }.max
|
|
186
|
+
File.utime(mt, mt, joined_asset_path)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def theme_join_asset_file_contents(theme, paths)
|
|
190
|
+
paths.collect { |path| File.read(theme_asset_file_path(theme, path)) }.join("\n\n")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def theme_asset_file_path(theme, path)
|
|
194
|
+
File.join(Theme.root_dir, path.split('?').first)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|