knitkit 2.1.3 → 2.1.4

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.
Files changed (31) hide show
  1. data/app/controllers/knitkit/base_controller.rb +1 -0
  2. data/app/controllers/knitkit/erp_app/desktop/app_controller.rb +2 -0
  3. data/app/controllers/knitkit/erp_app/desktop/content_controller.rb +2 -2
  4. data/app/controllers/knitkit/erp_app/desktop/website_nav_controller.rb +17 -7
  5. data/app/controllers/knitkit/erp_app/desktop/website_section_controller.rb +8 -1
  6. data/app/controllers/knitkit/online_document_sections_controller.rb +25 -17
  7. data/app/models/documented_content.rb +3 -3
  8. data/app/models/online_document_section.rb +1 -0
  9. data/app/models/published_website.rb +18 -11
  10. data/app/models/website.rb +49 -28
  11. data/app/models/website_nav_item.rb +12 -0
  12. data/app/models/website_section.rb +1 -3
  13. data/app/views/knitkit/online_document_sections/index.html.erb +77 -46
  14. data/app/views/layouts/knitkit/online_document_sections.html.erb +13 -14
  15. data/app/widgets/login/base.rb +1 -1
  16. data/config/routes.rb +1 -1
  17. data/db/migrate/20110211002317_setup_knitkit.rb +1 -0
  18. data/db/migrate/20130405184234_add_use_markdown_to_section.rb +19 -0
  19. data/lib/knitkit/extensions/railties/action_view/helpers/knitkit_helper.rb +1 -1
  20. data/lib/knitkit/extensions/railties/action_view/helpers/menu_helper.rb +0 -1
  21. data/lib/knitkit/version.rb +1 -1
  22. data/public/javascripts/erp_app/desktop/applications/knitkit/articles_grid_panel.js +1 -0
  23. data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +109 -26
  24. data/public/javascripts/erp_app/desktop/applications/knitkit/section_articles_grid_panel.js +60 -61
  25. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/document.js +26 -0
  26. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/menu.js +3 -2
  27. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/section.js +9 -24
  28. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/helpers/website_nav_items.js +232 -248
  29. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region/west_region.js +33 -43
  30. metadata +19 -3
  31. data/public/stylesheets/knitkit/documentation.css +0 -50
@@ -33,6 +33,7 @@ module Knitkit
33
33
  @website_section = WebsiteSection.find(params[:section_id])
34
34
  if @website_section.protected_with_capability?(:view)
35
35
  if !current_user and @website_section.path != @login_path
36
+ session[:return_to_url] = @website_section.path
36
37
  redirect_to @login_path
37
38
  elsif current_user and !current_user.has_capability?(:view, @website_section)
38
39
  redirect_to Knitkit::Config.unauthorized_url
@@ -90,6 +90,7 @@ module Knitkit
90
90
  :canAddMenuItems => true,
91
91
  :websiteId => website.id,
92
92
  :isSecured => item.is_secured?,
93
+ :roles => item.roles.collect{|item| item.internal_identifier},
93
94
  :linkedToId => linked_to_item_id,
94
95
  :websiteNavItemId => item.id,
95
96
  :url => url,
@@ -114,6 +115,7 @@ module Knitkit
114
115
  :roles => website_section.roles.collect{|item| item.internal_identifier},
115
116
  :isSection => website_section.is_section?,
116
117
  :isDocument => website_section.is_document_section?,
118
+ :useMarkdown => website_section.use_markdown,
117
119
  :inMenu => website_section.in_menu,
118
120
  :renderWithBaseLayout => website_section.render_base_layout?,
119
121
  :hasLayout => !website_section.layout.blank?,
@@ -13,7 +13,7 @@ module Knitkit
13
13
  content.body_html = html
14
14
 
15
15
  if content.save
16
- if params[:site_id]
16
+ unless params[:site_id].blank?
17
17
  website = Website.find(params[:site_id])
18
18
  content.publish(website, 'Auto Publish', content.version, current_user) if website.publish_on_save?
19
19
  end
@@ -40,7 +40,7 @@ module Knitkit
40
40
  content.excerpt_html = html
41
41
 
42
42
  if content.save
43
- if params[:site_id]
43
+ unless params[:site_id].blank?
44
44
  website = Website.find(params[:site_id])
45
45
  content.publish(website, 'Auto Publish', content.version, current_user) if website.publish_on_save?
46
46
  end
@@ -93,6 +93,7 @@ module Knitkit
93
93
  :websiteId => website_nav.website.id,
94
94
  :url => url,
95
95
  :isSecure => false,
96
+ :roles => [],
96
97
  :canAddMenuItems => true,
97
98
  :websiteNavItemId => website_nav_item.id,
98
99
  :iconCls => 'icon-document',
@@ -155,18 +156,27 @@ module Knitkit
155
156
  if current_user.has_capability?('secure', 'WebsiteNavItem') or current_user.has_capability?('unsecure', 'WebsiteNavItem')
156
157
  website_nav_item = WebsiteNavItem.find(params[:id])
157
158
 
158
- if params[:secure] == 'true'
159
- c = website_nav_item.add_capability(:view)
160
- roles = ['admin', 'website_author', website_nav_item.website_nav.website.website_role_iid]
159
+ roles = []
160
+
161
+ #get roles
162
+ params.each do |k, v|
163
+ if v == 'on'
164
+ roles.push(k)
165
+ end
166
+ end
167
+
168
+ if roles.empty?
169
+ website_nav_item.remove_capability(:view)
170
+ else
171
+ capability = website_nav_item.add_capability(:view)
172
+ capability.remove_all_roles
161
173
  roles.each do |r|
162
174
  role = SecurityRole.find_by_internal_identifier(r)
163
- role.add_capability(c)
175
+ role.add_capability(capability)
164
176
  end
165
- else
166
- website_nav_item.remove_capability(:view)
167
177
  end
168
178
 
169
- render :json => {:success => true}
179
+ render :json => {:success => true, :secured => website_nav_item.is_secured?, :roles => website_nav_item.roles.collect{|item| item.internal_identifier}}
170
180
  else
171
181
  render :json => {:success => false, :message => "User does not have capability."}
172
182
  end
@@ -14,7 +14,6 @@ module Knitkit
14
14
  result = {:success => false, :message => 'Blog can not be the title of a Blog'}
15
15
  else
16
16
  website_section = WebsiteSection.new
17
- website_section.website_id = website.id
18
17
  website_section.in_menu = params[:in_menu] == 'yes'
19
18
  website_section.title = params[:title]
20
19
  website_section.render_base_layout = params[:render_with_base_layout] == 'yes'
@@ -26,6 +25,8 @@ module Knitkit
26
25
  if params[:website_section_id]
27
26
  parent_website_section = WebsiteSection.find(params[:website_section_id])
28
27
  website_section.move_to_child_of(parent_website_section)
28
+ else
29
+ website_section.website_id = website.id
29
30
  end
30
31
 
31
32
  if params[:type] == "OnlineDocumentSection"
@@ -104,6 +105,12 @@ module Knitkit
104
105
  @website_section.render_base_layout = params[:render_with_base_layout] == 'yes'
105
106
  @website_section.internal_identifier = params[:internal_identifier]
106
107
 
108
+
109
+ #check if this is a OnlineDocumentSection if so set markdown
110
+ if @website_section.is_a?(OnlineDocumentSection) || @website_section.type == 'OnlineDocumentSection'
111
+ @website_section.use_markdown = (params[:use_markdown] == 'yes')
112
+ end
113
+
107
114
  website = @website_section.website
108
115
  if @website_section.save
109
116
  @website_section.publish(website, 'Auto Publish', @website_section.version, current_user) if website.publish_on_save?
@@ -1,45 +1,53 @@
1
+ require 'github/markdown'
2
+
1
3
  module Knitkit
2
4
  class OnlineDocumentSectionsController < BaseController
3
5
  layout 'knitkit/online_document_sections'
4
-
6
+
5
7
  before_filter :find_root
6
8
  before_filter :find_document_sections, :only => :build_tree
7
9
 
8
10
  def index
9
-
11
+
10
12
  end
11
-
13
+
12
14
  def build_tree
13
15
  render :inline => build_document_hash.to_json
14
16
  end
15
-
16
- protected
17
-
17
+
18
+ def get_content
19
+ document_section = OnlineDocumentSection.find(params[:document_section_id])
20
+ content = document_section.documented_item_published_content(@active_publication)
21
+ if document_section.use_markdown and content
22
+ html = GitHub::Markdown.render_gfm(content.body_html)
23
+ else
24
+ html = content ? content.body_html : ''
25
+ end
26
+
27
+ render :json => {:success => true, :html => html}
28
+ end
29
+
30
+ protected
31
+
18
32
  def id_or_node
19
33
  (params[:node].to_i == 0) ? params[:section_id] : params[:node]
20
34
  end
21
-
35
+
22
36
  def find_root
23
37
  @root = OnlineDocumentSection.find(params[:section_id])
24
- if @root.documented_item_published_content(@active_publication)
25
- @root_content = @root.documented_item_published_content(@active_publication).body_html.gsub(/\n/, '<br/>')
26
- else
27
- @root_content = ""
28
- end
29
38
  end
30
-
39
+
31
40
  def find_document_sections
32
41
  @document_sections = OnlineDocumentSection.find(id_or_node).positioned_children
33
42
  end
34
-
43
+
35
44
  def build_document_hash
36
45
  [].tap do |documents|
37
46
  @document_sections.each do |section|
38
- documents << {:id => section.id, :title => section.title,
39
- :leaf => section.leaf, :documented_item_published_content_html => section.documented_item_published_content_html(@active_publication)}
47
+ documents << {:id => section.id, :title => section.title, :leaf => section.leaf}
40
48
  end
41
49
  end
42
50
  end
43
-
51
+
44
52
  end
45
53
  end
@@ -1,17 +1,17 @@
1
1
  class DocumentedContent < Content
2
2
 
3
- before_save :check_internal_indentifier
3
+ before_save :check_internal_identifier
4
4
 
5
5
  def to_param
6
6
  permalink
7
7
  end
8
8
 
9
- def check_internal_indentifier
9
+ def check_internal_identifier
10
10
  self.internal_identifier = self.permalink if self.internal_identifier.blank?
11
11
  end
12
12
 
13
13
  def content_hash
14
- {:id => self.id, :title => self.title, :body_html => self.body_html}
14
+ {:id => self.id, :title => self.title, :body_html => self.body_html}
15
15
  end
16
16
 
17
17
  def self.find_published_by_section(active_publication, website_section)
@@ -19,6 +19,7 @@ class OnlineDocumentSection < WebsiteSection
19
19
  section_hash = {
20
20
  :name => self.title,
21
21
  :has_layout => false,
22
+ :use_markdown => self.use_markdown,
22
23
  :type => self.class.to_s,
23
24
  :in_menu => self.in_menu,
24
25
  :path => self.path,
@@ -3,7 +3,7 @@ class PublishedWebsite < ActiveRecord::Base
3
3
 
4
4
  belongs_to :website
5
5
  belongs_to :published_by, :class_name => "User"
6
- has_many :published_elements, :dependent => :destroy
6
+ has_many :published_elements, :dependent => :destroy
7
7
 
8
8
  def published_by_username
9
9
  self.published_by.username rescue ''
@@ -16,7 +16,7 @@ class PublishedWebsite < ActiveRecord::Base
16
16
  published_website.active = false
17
17
  published_website.save
18
18
  end
19
-
19
+
20
20
  #activate
21
21
  published_website = self.where(:website_id => website.id).where(:version => version).first
22
22
  published_website.active = true
@@ -30,18 +30,25 @@ class PublishedWebsite < ActiveRecord::Base
30
30
 
31
31
  #get a publish sections
32
32
  website_sections = new_publication.website.website_sections
33
- website_sections = website_sections | website_sections.collect{|section| section.descendants}.flatten
33
+ website_sections = website_sections | website_sections.collect { |section| section.descendants }.flatten
34
34
  website_sections.each do |website_section|
35
- if new_publication.published_elements.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', website_section.id, website_section.class.to_s, website_section.class.superclass.to_s).first.nil?
36
- published_element = PublishedElement.new
37
- published_element.published_website = new_publication
38
- published_element.published_element_record = website_section
39
- published_element.version = website_section.version
40
- published_element.published_by = current_user
41
- published_element.save
35
+ #get nested elements too
36
+ website_section.self_and_descendants.each do |website_section|
37
+ if new_publication.published_elements.where('published_element_record_id = ? and (published_element_record_type = ? or published_element_record_type = ?)', website_section.id, website_section.class.to_s, website_section.class.superclass.to_s).first.nil?
38
+ published_element = PublishedElement.new
39
+ published_element.published_website = new_publication
40
+ published_element.published_element_record = website_section
41
+ published_element.version = website_section.version
42
+ published_element.published_by = current_user
43
+ published_element.save
44
+ end
42
45
  end
43
46
 
44
- elements = elements | website_section.contents
47
+ if website_section.is_a?(OnlineDocumentSection)
48
+ elements = elements | [website_section.documented_item.content]
49
+ else
50
+ elements = elements | website_section.contents
51
+ end
45
52
  end
46
53
 
47
54
  #make sure all elements have published_element objects
@@ -1,8 +1,9 @@
1
1
  class Website < ActiveRecord::Base
2
2
  attr_protected :created_at, :updated_at
3
3
 
4
- after_destroy :remove_sites_directory, :remove_website_role
5
- after_create :setup_website
4
+ after_destroy :remove_sites_directory, :remove_website_role
5
+ before_destroy :destroy_sections
6
+ after_create :setup_website
6
7
 
7
8
  protected_with_capabilities
8
9
  has_file_assets
@@ -24,7 +25,7 @@ class Website < ActiveRecord::Base
24
25
  where('role_type_id = ?', RoleType.website_owner)
25
26
  end
26
27
  end
27
- has_many :website_sections, :dependent => :destroy, :order => :lft do
28
+ has_many :website_sections, :order => :lft do
28
29
  def paths
29
30
  collect { |website_section| website_section.paths }.flatten
30
31
  end
@@ -53,6 +54,18 @@ class Website < ActiveRecord::Base
53
54
 
54
55
  alias :sections :website_sections
55
56
  alias :hosts :website_hosts
57
+
58
+ #We only want to destroy parent sections as better nested set will destroy children for us
59
+ def destroy_sections
60
+ parents = []
61
+ website_sections.each do |section|
62
+ unless section.child?
63
+ parents << section
64
+ end
65
+ end
66
+
67
+ parents.each {|parent| parent.destroy}
68
+ end
56
69
 
57
70
  def to_label
58
71
  self.name
@@ -208,7 +221,7 @@ class Website < ActiveRecord::Base
208
221
  setup_hash[:website_navs] = website_navs.collect do |website_nav|
209
222
  {
210
223
  :name => website_nav.name,
211
- :items => website_nav.items.positioned.map { |website_nav_item| build_menu_item_hash(website_nav_item) }
224
+ :items => website_nav.items.positioned.map { |website_nav_item| website_nav_item.build_menu_item_hash }
212
225
  }
213
226
  end
214
227
 
@@ -260,7 +273,8 @@ class Website < ActiveRecord::Base
260
273
  end
261
274
 
262
275
  online_document_sections.each do |online_documented_section|
263
- File.open(File.join(documented_contents_path, "#{online_documented_section.internal_identifier}.html"), 'wb+') { |f| f.puts(online_documented_section.documented_item_published_content_html(active_publication)) }
276
+ extension = online_documented_section.use_markdown == true ? 'md' : 'html'
277
+ File.open(File.join(documented_contents_path, "#{online_documented_section.internal_identifier}.#{extension}"), 'wb+') { |f| f.puts(online_documented_section.documented_item_published_content_html(active_publication)) }
264
278
  end
265
279
 
266
280
  self.files.where("directory like '%/sites/#{self.iid}/images%'").all.each do |image_asset|
@@ -452,9 +466,16 @@ class Website < ActiveRecord::Base
452
466
  child_website_item = build_menu_item(item)
453
467
  child_website_item.move_to_child_of(website_item)
454
468
  end
455
- #add role if is_secured
456
- website_item.add_role(website.role) if hash[:is_secured]
457
-
469
+
470
+ #handle security
471
+ unless hash[:roles].empty?
472
+ capability = website_item.add_capability(:view)
473
+ hash[:roles].each do |role_iid|
474
+ role = SecurityRole.find_by_internal_identifier(role_iid)
475
+ role.add_capability(capability)
476
+ end
477
+ end
478
+
458
479
  website_item
459
480
  end
460
481
 
@@ -497,23 +518,38 @@ class Website < ActiveRecord::Base
497
518
  end
498
519
  end
499
520
  if section.is_a? OnlineDocumentSection
500
- entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{section.internal_identifier}.html" }[:data]
521
+ section.use_markdown = hash[:use_markdown]
522
+ section.save
523
+ extension_type = hash[:use_markdown] ? 'md' : 'html'
524
+ entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{section.internal_identifier}.#{extension_type}" }[:data]
501
525
  documented_content = DocumentedContent.create(:title => section.title, :body_html => entry_data)
502
526
  DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => section.id)
503
527
  end
504
528
  if hash[:online_document_sections]
505
529
  hash[:online_document_sections].each do |section_hash|
506
530
  child_section = build_section(section_hash, entries, website, current_user)
531
+ child_section.use_markdown = section_hash[:use_markdown]
532
+ child_section.save
507
533
  child_section.move_to_child_of(section)
508
534
  # CREATE THE DOCUMENTED CONTENT HERE
509
- entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{child_section.internal_identifier}.html" }[:data]
535
+ extension_type = section_hash[:use_markdown] ? 'md' : 'html'
536
+ entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{child_section.internal_identifier}.#{extension_type}" }[:data]
510
537
  documented_content = DocumentedContent.create(:title => child_section.title, :body_html => entry_data)
511
538
  DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => child_section.id)
512
539
  end
513
540
  end
514
- #add role if is_secured
515
- section.add_role(website.role) if hash[:is_secured]
516
-
541
+
542
+ #handle security
543
+ if hash[:roles] #if this is a OnlineDocumentSection will not have roles
544
+ unless hash[:roles].empty?
545
+ capability = section.add_capability(:view)
546
+ hash[:roles].each do |role_iid|
547
+ role = SecurityRole.find_by_internal_identifier(role_iid)
548
+ role.add_capability(capability)
549
+ end
550
+ end
551
+ end
552
+
517
553
  section
518
554
  end
519
555
 
@@ -522,19 +558,4 @@ class Website < ActiveRecord::Base
522
558
  def website_role_iid
523
559
  "website_#{self.iid}_access"
524
560
  end
525
-
526
- private
527
-
528
- def build_menu_item_hash(menu_item)
529
- {
530
- :title => menu_item.title,
531
- :url => menu_item.url,
532
- :is_secured => menu_item.is_secured?,
533
- :linked_to_item_type => menu_item.linked_to_item_type,
534
- :linked_to_item_path => menu_item.linked_to_item.nil? ? nil : menu_item.linked_to_item.path,
535
- :position => menu_item.position,
536
- :items => menu_item.children.collect { |child| build_menu_item_hash(child) }
537
- }
538
- end
539
-
540
561
  end
@@ -25,4 +25,16 @@ class WebsiteNavItem < ActiveRecord::Base
25
25
  self.protected_with_capability?('view')
26
26
  end
27
27
 
28
+ def build_menu_item_hash
29
+ {
30
+ :title => self.title,
31
+ :url => self.url,
32
+ :roles => self.roles.collect(&:internal_identifier),
33
+ :linked_to_item_type => self.linked_to_item_type,
34
+ :linked_to_item_path => self.linked_to_item.nil? ? nil : self.linked_to_item.path,
35
+ :position => self.position,
36
+ :items => self.children.collect { |child| child.build_menu_item_hash }
37
+ }
38
+ end
39
+
28
40
  end
@@ -141,7 +141,7 @@ class WebsiteSection < ActiveRecord::Base
141
141
  :type => self.class.to_s,
142
142
  :in_menu => self.in_menu,
143
143
  :articles => [],
144
- :is_secured => self.is_secured?,
144
+ :roles => self.roles.collect(&:internal_identifier),
145
145
  :path => self.path,
146
146
  :permalink => self.permalink,
147
147
  :internal_identifier => self.internal_identifier,
@@ -191,8 +191,6 @@ class WebsiteSection < ActiveRecord::Base
191
191
  self.internal_identifier = self.permalink if self.internal_identifier.blank?
192
192
  end
193
193
 
194
-
195
-
196
194
  private
197
195
 
198
196
  def self.get_published_version(active_publication, content)