knitkit 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/README.md
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
#Knitkit CMS
|
2
|
+
|
3
|
+
Knitkit is an application that sits on top of the Compass AE framework that adds a fully functional CMS to Compass AE. It integrates with Amazon S3 and has extensions for our <a href="https://github.com/portablemind/Erp-Modules">Erp Modules</a>.
|
4
|
+
|
5
|
+
![Logo](http://development.compassagile.com/sites/site-1/images/knitkit.png?1323038265)
|
6
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'Knitkit'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require "rspec/core/rake_task"
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
30
|
+
task :default => :spec
|
@@ -0,0 +1,9 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into including all the files listed below.
|
2
|
+
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
|
3
|
+
// be included in the compiled file accessible from http://example.com/assets/application.js
|
4
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
5
|
+
// the compiled file.
|
6
|
+
//
|
7
|
+
//= require jquery
|
8
|
+
//= require jquery_ujs
|
9
|
+
//= require_tree .
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
3
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
4
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
5
|
+
*= require_self
|
6
|
+
*= require_tree .
|
7
|
+
*/
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Knitkit
|
2
|
+
class BaseController < ::ErpApp::ApplicationController
|
3
|
+
before_filter :set_website
|
4
|
+
before_filter :set_active_publication, :load_sections, :set_section, :except => [:view_current_publication]
|
5
|
+
acts_as_themed_controller :current_themes => lambda {|c| c.website.themes.active if c.website }
|
6
|
+
|
7
|
+
layout 'knitkit/base'
|
8
|
+
|
9
|
+
def website
|
10
|
+
@website
|
11
|
+
end
|
12
|
+
|
13
|
+
def view_current_publication
|
14
|
+
session[:website_version].delete_if{|item| item[:website_id] == @website.id}
|
15
|
+
redirect_to request.env["HTTP_REFERER"]
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def set_website
|
20
|
+
@website = Website.find_by_host(request.host_with_port)
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_sections
|
24
|
+
@website_sections = @website.website_sections.positioned
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_section
|
28
|
+
unless params[:section_id].nil?
|
29
|
+
@website_section = WebsiteSection.find(params[:section_id])
|
30
|
+
else
|
31
|
+
raise "No Id set"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_active_publication
|
36
|
+
@active_publication = @website.active_publication
|
37
|
+
if !session[:website_version].blank? && !session[:website_version].empty?
|
38
|
+
site_version_hash = session[:website_version].find{|item| item[:website_id] == @website.id}
|
39
|
+
unless site_version_hash.nil?
|
40
|
+
@active_publication = @website.published_websites.where('version = ?', site_version_hash[:version].to_f).first
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Knitkit
|
2
|
+
class BlogsController < ArticlesController
|
3
|
+
PER_PAGE = 10
|
4
|
+
|
5
|
+
def index
|
6
|
+
@blog = Blog.find(params[:section_id])
|
7
|
+
params[:use_route] = 'blogs'
|
8
|
+
|
9
|
+
@contents = @blog.find_published_blog_posts(@active_publication).paginate(:page => params[:page], :per_page => PER_PAGE)
|
10
|
+
end
|
11
|
+
|
12
|
+
def tag
|
13
|
+
@blog = Blog.find(params[:section_id])
|
14
|
+
@tag = ActsAsTaggableOn::Tag.find(params[:tag_id])
|
15
|
+
params[:use_route] = 'blog_tag'
|
16
|
+
|
17
|
+
@contents = @blog.find_published_blog_posts_with_tag(@active_publication, @tag).paginate(:page => params[:page], :per_page => PER_PAGE)
|
18
|
+
|
19
|
+
render :index
|
20
|
+
end
|
21
|
+
|
22
|
+
def show
|
23
|
+
@blog = Blog.find(params[:section_id])
|
24
|
+
@published_content = @blog.find_published_blog_post(@active_publication, params[:id])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Knitkit
|
2
|
+
class CommentsController < BaseController
|
3
|
+
def add
|
4
|
+
user = current_user
|
5
|
+
content = Content.find(params[:content_id])
|
6
|
+
comment = params[:comment]
|
7
|
+
|
8
|
+
@comment = content.add_comment({:commentor_name => user.party.description, :email => user.email, :comment => comment})
|
9
|
+
|
10
|
+
render :text => (@comment.valid? ? '<div class="sexysuccess">Comment pending approval.</span>' : '<div class="sexyerror">Error. Comment cannot be blank.</span>')
|
11
|
+
end
|
12
|
+
|
13
|
+
#no section to set
|
14
|
+
def set_section
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module Knitkit
|
2
|
+
module ErpApp
|
3
|
+
module Desktop
|
4
|
+
class AppController < ::ErpApp::Desktop::BaseController
|
5
|
+
KNIT_KIT_ROOT = Knitkit::Engine.root.to_s
|
6
|
+
|
7
|
+
def websites
|
8
|
+
websites = Website.all
|
9
|
+
|
10
|
+
tree = []
|
11
|
+
|
12
|
+
websites.each do |website|
|
13
|
+
website_hash = {
|
14
|
+
:text => website.name,
|
15
|
+
:iconCls => 'icon-globe_disconnected',
|
16
|
+
:id => "website_#{website.id}",
|
17
|
+
:leaf => false,
|
18
|
+
:url => "http://#{website.hosts.first.attributes['host']}",
|
19
|
+
:name => website.name,
|
20
|
+
:title => website.title,
|
21
|
+
:subtitle => website.subtitle,
|
22
|
+
:isWebsite => true,
|
23
|
+
:email => website.email,
|
24
|
+
:siteName => website.name,
|
25
|
+
:emailInquiries => website.email_inquiries?,
|
26
|
+
:autoActivatePublication => website.auto_activate_publication?,
|
27
|
+
:children => []
|
28
|
+
}
|
29
|
+
|
30
|
+
#handle hosts
|
31
|
+
hosts_hash = {:text => 'Hosts', :iconCls => 'icon-gear', :isHostRoot => true, :websiteId => website.id, :leaf => false, :children => []}
|
32
|
+
website.hosts.each do |website_host|
|
33
|
+
hosts_hash[:children] << {:text => website_host.attributes['host'], :websiteHostId => website_host.id, :host => website_host.attributes['host'], :iconCls => 'icon-globe', :url => "http://#{website_host.attributes['host']}", :isHost => true, :leaf => true, :children => []}
|
34
|
+
end
|
35
|
+
|
36
|
+
website_hash[:children] << hosts_hash
|
37
|
+
|
38
|
+
#handle sections
|
39
|
+
sections_hash = {:text => 'Sections', :isSectionRoot => true, :websiteId => website.id, :iconCls => 'icon-content', :leaf => false, :children => []}
|
40
|
+
website.website_sections.positioned.each do |website_section|
|
41
|
+
sections_hash[:children] << build_section_hash(website_section, website)
|
42
|
+
end
|
43
|
+
|
44
|
+
website_hash[:children] << sections_hash
|
45
|
+
|
46
|
+
|
47
|
+
#handle menus
|
48
|
+
menus_hash = {:text => 'Menus', :iconCls => 'icon-content', :isMenuRoot => true, :websiteId => website.id, :leaf => false, :children => []}
|
49
|
+
website.website_navs.each do |website_nav|
|
50
|
+
menu_hash = {:text => website_nav.name, :websiteNavId => website_nav.id, :websiteId => website.id, :canAddMenuItems => true, :iconCls => 'icon-index', :isWebsiteNav => true, :leaf => false, :children => []}
|
51
|
+
menu_hash[:children] = website_nav.website_nav_items.positioned.map{|item|build_menu_item_hash(website, item)}
|
52
|
+
menus_hash[:children] << menu_hash
|
53
|
+
end
|
54
|
+
|
55
|
+
website_hash[:children] << menus_hash
|
56
|
+
|
57
|
+
#added website to main tree
|
58
|
+
tree << website_hash
|
59
|
+
end
|
60
|
+
|
61
|
+
render :json => tree
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
|
66
|
+
def page
|
67
|
+
offset = params[:start].to_f
|
68
|
+
offset > 0 ? ((offset / params[:limit].to_f).to_i + 1) : 1
|
69
|
+
end
|
70
|
+
|
71
|
+
def per_page
|
72
|
+
params[:limit].nil? ? 20 : params[:limit].to_i
|
73
|
+
end
|
74
|
+
|
75
|
+
def build_menu_item_hash(website, item)
|
76
|
+
url = item.url
|
77
|
+
linked_to_item_id = nil
|
78
|
+
link_to_type = 'url'
|
79
|
+
unless item.linked_to_item.nil?
|
80
|
+
linked_to_item_id = item.linked_to_item_id
|
81
|
+
link_to_type = item.linked_to_item.class.to_s.underscore
|
82
|
+
url = "http://#{website.hosts.first.attributes['host']}" + item.linked_to_item.path
|
83
|
+
end
|
84
|
+
|
85
|
+
menu_item_hash = {
|
86
|
+
:text => item.title,
|
87
|
+
:linkToType => link_to_type,
|
88
|
+
:canAddMenuItems => true,
|
89
|
+
:websiteId => website.id,
|
90
|
+
:isSecured => !item.roles.empty?,
|
91
|
+
:linkedToId => linked_to_item_id,
|
92
|
+
:websiteNavItemId => item.id,
|
93
|
+
:url => url,
|
94
|
+
:iconCls => 'icon-document',
|
95
|
+
:isWebsiteNavItem => true,
|
96
|
+
:leaf => false
|
97
|
+
}
|
98
|
+
|
99
|
+
menu_item_hash[:children] = item.positioned_children.map{ |child| build_menu_item_hash(website, child)}
|
100
|
+
|
101
|
+
menu_item_hash
|
102
|
+
end
|
103
|
+
|
104
|
+
def build_section_hash(website_section, website)
|
105
|
+
website_section_hash = {
|
106
|
+
:text => website_section.title,
|
107
|
+
:siteName => website.name,
|
108
|
+
:siteId => website.id,
|
109
|
+
:type => website_section.type,
|
110
|
+
:isSecured => !website_section.roles.empty?,
|
111
|
+
:isSection => true,
|
112
|
+
:inMenu => website_section.in_menu,
|
113
|
+
:hasLayout => !website_section.layout.blank?,
|
114
|
+
:id => "section_#{website_section.id}",
|
115
|
+
:url => "http://#{website.hosts.first.attributes['host']}#{website_section.path}",
|
116
|
+
:internal_identifier => website_section.internal_identifier
|
117
|
+
}
|
118
|
+
|
119
|
+
if website_section.is_a?(Blog) || website_section.type == 'Blog'
|
120
|
+
website_section_hash[:isBlog] = true
|
121
|
+
website_section_hash[:iconCls] = 'icon-blog'
|
122
|
+
website_section_hash[:leaf] = true
|
123
|
+
else
|
124
|
+
website_section_hash[:leaf] = false
|
125
|
+
website_section_hash[:children] = website_section.positioned_children.map {|child| build_section_hash(child, website)}
|
126
|
+
website_section_hash[:isSecured] ? website_section_hash[:iconCls] = 'icon-document_lock' : website_section_hash[:iconCls] = 'icon-document'
|
127
|
+
end
|
128
|
+
|
129
|
+
website_section_hash
|
130
|
+
end
|
131
|
+
|
132
|
+
end#AppController
|
133
|
+
end#Desktop
|
134
|
+
end#ErpApp
|
135
|
+
end#Knitkit
|
@@ -0,0 +1,144 @@
|
|
1
|
+
module Knitkit
|
2
|
+
module ErpApp
|
3
|
+
module Desktop
|
4
|
+
class ArticlesController < Knitkit::ErpApp::Desktop::AppController
|
5
|
+
|
6
|
+
def new
|
7
|
+
result = {}
|
8
|
+
website_section_id = params[:section_id]
|
9
|
+
article = Article.new
|
10
|
+
|
11
|
+
article.tag_list = params[:tags].split(',').collect{|t| t.strip() } unless params[:tags].blank?
|
12
|
+
article.title = params[:title]
|
13
|
+
article.internal_identifier = params[:internal_identifier]
|
14
|
+
article.display_title = params[:display_title] == 'yes'
|
15
|
+
article.created_by = current_user
|
16
|
+
|
17
|
+
if article.save
|
18
|
+
unless website_section_id.blank?
|
19
|
+
website_section = WebsiteSection.find(website_section_id)
|
20
|
+
article.website_sections << website_section
|
21
|
+
article.update_content_area_and_position_by_section(website_section, params['content_area'], params['position'])
|
22
|
+
end
|
23
|
+
|
24
|
+
result[:success] = true
|
25
|
+
else
|
26
|
+
result[:success] = false
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
render :json => result
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
result = {}
|
35
|
+
website_section_id = params[:section_id]
|
36
|
+
article = Article.find(params[:id])
|
37
|
+
|
38
|
+
article.tag_list = params[:tags].split(',').collect{|t| t.strip() } unless params[:tags].blank?
|
39
|
+
article.title = params[:title]
|
40
|
+
article.internal_identifier = params[:internal_identifier]
|
41
|
+
article.display_title = params[:display_title] == 'yes'
|
42
|
+
article.updated_by = current_user
|
43
|
+
|
44
|
+
if article.save
|
45
|
+
unless website_section_id.blank?
|
46
|
+
website_section = WebsiteSection.find(website_section_id)
|
47
|
+
article.update_content_area_and_position_by_section(website_section, params['content_area'], params['position'])
|
48
|
+
end
|
49
|
+
|
50
|
+
result[:success] = true
|
51
|
+
else
|
52
|
+
result[:success] = false
|
53
|
+
end
|
54
|
+
|
55
|
+
render :json => result
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete
|
59
|
+
render :json => Article.destroy(params[:id]) ? {:success => true} : {:success => false}
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_existing
|
63
|
+
website_section = WebsiteSection.find(params[:section_id])
|
64
|
+
website_section.contents << Article.find(params[:article_id])
|
65
|
+
|
66
|
+
render :json => {:success => true}
|
67
|
+
end
|
68
|
+
|
69
|
+
def existing_articles
|
70
|
+
render :inline => Article.all.to_json(:only => [:internal_identifier, :id])
|
71
|
+
end
|
72
|
+
|
73
|
+
def get
|
74
|
+
sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
|
75
|
+
sort = sort_hash[:property] || 'created_at'
|
76
|
+
dir = sort_hash[:direction] || 'DESC'
|
77
|
+
limit = params[:limit] || 10
|
78
|
+
start = params[:start] || 0
|
79
|
+
|
80
|
+
website_section_id = params[:section_id]
|
81
|
+
articles = Article.joins("INNER JOIN website_section_contents ON website_section_contents.content_id = contents.id").where("website_section_id = #{website_section_id}").order("contents.#{sort} #{dir}").limit(limit).offset(start)
|
82
|
+
total_count = Article.joins("INNER JOIN website_section_contents ON website_section_contents.content_id = contents.id").where("website_section_id = #{website_section_id}").count
|
83
|
+
|
84
|
+
Article.class_exec(website_section_id) do
|
85
|
+
@@website_section_id = website_section_id
|
86
|
+
def website_section_position
|
87
|
+
self.website_section_contents.find_by_website_section_id(@@website_section_id).position
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
articles_array = []
|
92
|
+
articles.each do |a|
|
93
|
+
articles_hash = {}
|
94
|
+
articles_hash[:content_area] = a.content_area_by_website_section(WebsiteSection.find(website_section_id))
|
95
|
+
articles_hash[:id] = a.id
|
96
|
+
articles_hash[:title] = a.title
|
97
|
+
articles_hash[:tag_list] = a.tag_list.join(', ')
|
98
|
+
articles_hash[:body_html] = a.body_html
|
99
|
+
articles_hash[:excerpt_html] = a.excerpt_html
|
100
|
+
articles_hash[:internal_identifier] = a.internal_identifier
|
101
|
+
articles_hash[:display_title] = a.display_title
|
102
|
+
articles_hash[:position] = a.position(website_section_id)
|
103
|
+
articles_array << articles_hash
|
104
|
+
end
|
105
|
+
|
106
|
+
render :inline => "{totalCount:#{total_count},data:#{articles_array.to_json(:only => [:content_area, :id, :title, :tag_list, :body_html, :excerpt_html, :position, :internal_identifier, :display_title], :methods => [:website_section_position])}}"
|
107
|
+
end
|
108
|
+
|
109
|
+
def all
|
110
|
+
Article.include_root_in_json = false
|
111
|
+
sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
|
112
|
+
sort = sort_hash[:property] || 'created_at'
|
113
|
+
dir = sort_hash[:direction] || 'DESC'
|
114
|
+
limit = params[:limit] || 40
|
115
|
+
start = params[:start] || 0
|
116
|
+
|
117
|
+
articles = params[:iid].blank? ? Article.order( "contents.#{sort} #{dir}").limit(limit).offset(start).all : Article.where('internal_identifier like ?', "%#{params[:iid]}%").order("contents.#{sort} #{dir}").limit(limit).offset(start)
|
118
|
+
total_count = Article.all.count
|
119
|
+
|
120
|
+
articles_array = []
|
121
|
+
articles.each do |a|
|
122
|
+
articles_hash = {}
|
123
|
+
articles_hash[:id] = a.id
|
124
|
+
articles_hash[:sections] = a.website_sections.collect{|section| section.title}.join(',')
|
125
|
+
articles_hash[:title] = a.title
|
126
|
+
articles_hash[:tag_list] = a.tag_list.join(', ')
|
127
|
+
articles_hash[:body_html] = a.body_html
|
128
|
+
articles_hash[:internal_identifier] = a.internal_identifier
|
129
|
+
articles_hash[:display_title] = a.display_title
|
130
|
+
articles_hash[:excerpt_html] = a.excerpt_html
|
131
|
+
articles_hash[:created_by] = a.created_by.login rescue ''
|
132
|
+
articles_hash[:last_update_by] = a.updated_by.login rescue ''
|
133
|
+
|
134
|
+
articles_array << articles_hash
|
135
|
+
end
|
136
|
+
|
137
|
+
render :inline => "{totalCount:#{total_count},data:#{articles_array.to_json(:only => [:content_area, :id, :title, :tag_list, :body_html, :excerpt_html, :sections, :internal_identifier, :display_title, :created_by, :last_update_by])}}"
|
138
|
+
end
|
139
|
+
|
140
|
+
end#ArticlesController
|
141
|
+
end#Desktop
|
142
|
+
end#ErpApp
|
143
|
+
end#Knitkit
|
144
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Knitkit
|
2
|
+
module ErpApp
|
3
|
+
module Desktop
|
4
|
+
class CommentsController < Knitkit::ErpApp::Desktop::AppController
|
5
|
+
|
6
|
+
def index
|
7
|
+
content = Content.find(params[:content_id])
|
8
|
+
sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
|
9
|
+
sort = sort_hash[:property] || 'created_at'
|
10
|
+
dir = sort_hash[:direction] || 'DESC'
|
11
|
+
limit = params[:limit] || 10
|
12
|
+
start = params[:start] || 0
|
13
|
+
|
14
|
+
Comment.class_eval do
|
15
|
+
def approved_by_username
|
16
|
+
approved_by.nil? ? '' : approved_by.username
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
#limit and offset are not working rails issue?
|
21
|
+
comments = content.comments.order("#{sort} #{dir}").offset(start).limit(limit)
|
22
|
+
|
23
|
+
render :inline => "{totalCount:#{comments.count}, comments:#{comments.to_json(:methods => [:approved?, :approved_by_username])}}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def approve
|
27
|
+
comment = Comment.find(params[:id])
|
28
|
+
comment.approve(current_user)
|
29
|
+
|
30
|
+
render :json => {:success => true}
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete
|
34
|
+
comment = Comment.find(params[:id])
|
35
|
+
comment.destroy
|
36
|
+
|
37
|
+
render :json => {:success => true}
|
38
|
+
end
|
39
|
+
|
40
|
+
end#CommentsController
|
41
|
+
end#Desktop
|
42
|
+
end#ErpApp
|
43
|
+
end#Knitkit
|