tb_cms 0.9.18

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 (150) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.markdown +110 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/images/spud/admin/menus_thumb.png +0 -0
  6. data/app/assets/images/spud/admin/menus_thumb@2x.png +0 -0
  7. data/app/assets/images/spud/admin/pages_thumb.png +0 -0
  8. data/app/assets/images/spud/admin/snippets_thumb.png +0 -0
  9. data/app/assets/images/spud/admin/snippets_thumb@2x.png +0 -0
  10. data/app/assets/javascripts/spud/admin/cms/application.js +25 -0
  11. data/app/assets/javascripts/spud/admin/cms/menu_items.js +35 -0
  12. data/app/assets/javascripts/spud/admin/cms/pages.js +29 -0
  13. data/app/assets/javascripts/spud/admin/snippets.js +2 -0
  14. data/app/assets/stylesheets/spud/admin/cms/application.css +28 -0
  15. data/app/assets/stylesheets/spud/admin/cms.css +4 -0
  16. data/app/assets/stylesheets/spud/admin/snippets.css +4 -0
  17. data/app/controllers/pages_controller.rb +90 -0
  18. data/app/controllers/spud/admin/cms_controller.rb +3 -0
  19. data/app/controllers/spud/admin/menu_items_controller.rb +115 -0
  20. data/app/controllers/spud/admin/menus_controller.rb +55 -0
  21. data/app/controllers/spud/admin/pages_controller.rb +182 -0
  22. data/app/controllers/spud/admin/snippets_controller.rb +61 -0
  23. data/app/controllers/spud/cms/sitemaps_controller.rb +13 -0
  24. data/app/helpers/spud/cms/application_helper.rb +283 -0
  25. data/app/models/spud_menu.rb +9 -0
  26. data/app/models/spud_menu_item.rb +72 -0
  27. data/app/models/spud_page.rb +131 -0
  28. data/app/models/spud_page_liquid_tag.rb +4 -0
  29. data/app/models/spud_page_partial.rb +67 -0
  30. data/app/models/spud_page_partial_revision.rb +5 -0
  31. data/app/models/spud_snippet.rb +42 -0
  32. data/app/observers/page_sweeper.rb +48 -0
  33. data/app/observers/snippet_sweeper.rb +41 -0
  34. data/app/views/pages/not_found.html.erb +2 -0
  35. data/app/views/pages/show.html.erb +24 -0
  36. data/app/views/spud/admin/menu_items/_form.html.erb +51 -0
  37. data/app/views/spud/admin/menu_items/_menu_item_row.html.erb +22 -0
  38. data/app/views/spud/admin/menu_items/edit.html.erb +10 -0
  39. data/app/views/spud/admin/menu_items/index.html.erb +17 -0
  40. data/app/views/spud/admin/menu_items/new.html.erb +12 -0
  41. data/app/views/spud/admin/menus/_form.html.erb +11 -0
  42. data/app/views/spud/admin/menus/edit.html.erb +13 -0
  43. data/app/views/spud/admin/menus/index.html.erb +24 -0
  44. data/app/views/spud/admin/menus/new.html.erb +7 -0
  45. data/app/views/spud/admin/pages/_form.html.erb +95 -0
  46. data/app/views/spud/admin/pages/_page_partials_form.html.erb +18 -0
  47. data/app/views/spud/admin/pages/_page_row.html.erb +18 -0
  48. data/app/views/spud/admin/pages/edit.html.erb +32 -0
  49. data/app/views/spud/admin/pages/index.html.erb +13 -0
  50. data/app/views/spud/admin/pages/new.html.erb +34 -0
  51. data/app/views/spud/admin/pages/show.html.erb +20 -0
  52. data/app/views/spud/admin/snippets/_form.html.erb +8 -0
  53. data/app/views/spud/admin/snippets/edit.html.erb +7 -0
  54. data/app/views/spud/admin/snippets/index.html.erb +24 -0
  55. data/app/views/spud/admin/snippets/new.html.erb +7 -0
  56. data/app/views/spud/admin/templates/_form.html.erb +43 -0
  57. data/app/views/spud/admin/templates/edit.html.erb +9 -0
  58. data/app/views/spud/admin/templates/index.html.erb +17 -0
  59. data/app/views/spud/admin/templates/new.html.erb +11 -0
  60. data/app/views/spud/cms/sitemaps/show.xml.builder +16 -0
  61. data/config/boot.rb +6 -0
  62. data/config/routes.rb +29 -0
  63. data/db/migrate/20120101192412_create_spud_pages.rb +19 -0
  64. data/db/migrate/20120101193138_create_spud_menus.rb +10 -0
  65. data/db/migrate/20120101193255_create_spud_menu_items.rb +17 -0
  66. data/db/migrate/20120101194124_create_spud_templates.rb +11 -0
  67. data/db/migrate/20120103034659_create_spud_page_partials.rb +13 -0
  68. data/db/migrate/20120104194032_add_visibility_to_spud_pages.rb +6 -0
  69. data/db/migrate/20120107181337_add_menu_name_to_spud_menu_items.rb +5 -0
  70. data/db/migrate/20120111134754_add_use_custom_url_name_to_spud_pages.rb +5 -0
  71. data/db/migrate/20120118141852_add_notes_to_spud_pages.rb +5 -0
  72. data/db/migrate/20120126232428_add_menu_id_to_spud_menu_items.rb +7 -0
  73. data/db/migrate/20120128163601_add_classes_to_spud_menu_items.rb +6 -0
  74. data/db/migrate/20120329132314_add_site_id_to_spud_pages.rb +6 -0
  75. data/db/migrate/20120329132322_add_site_id_to_spud_templates.rb +6 -0
  76. data/db/migrate/20120329132330_add_site_id_to_spud_menus.rb +6 -0
  77. data/db/migrate/20120510195151_create_spud_page_partial_revisions.rb +13 -0
  78. data/db/migrate/20120911190030_add_symbol_name_to_spud_page_partials.rb +5 -0
  79. data/db/migrate/20120912121313_modify_site_id_for_spud_pages.rb +15 -0
  80. data/db/migrate/20121016233715_add_content_processed_to_spud_page_partials.rb +5 -0
  81. data/db/migrate/20121112151110_add_layout_to_spud_pages.rb +8 -0
  82. data/db/migrate/20121112212113_create_spud_page_liquid_tags.rb +11 -0
  83. data/db/migrate/20121119025608_create_spud_snippets.rb +17 -0
  84. data/db/migrate/20121119030136_change_liquid_tags_to_polymorphic.rb +17 -0
  85. data/lib/generators/spud/cms/template_generator.rb +17 -0
  86. data/lib/generators/spud/cms/templates/template.html.erb +28 -0
  87. data/lib/spud_cms/configuration.rb +27 -0
  88. data/lib/spud_cms/engine.rb +69 -0
  89. data/lib/spud_cms/liquid_snippet.rb +29 -0
  90. data/lib/spud_cms/page_route.rb +5 -0
  91. data/lib/spud_cms/template_parser.rb +126 -0
  92. data/lib/spud_cms/test_files.rb +25 -0
  93. data/lib/spud_cms/version.rb +5 -0
  94. data/lib/spud_cms.rb +10 -0
  95. data/lib/tasks/spud_cms_tasks.rake +4 -0
  96. data/spec/controllers/pages_controller_spec.rb +108 -0
  97. data/spec/controllers/spud/admin/cms_controller_spec.rb +11 -0
  98. data/spec/controllers/spud/admin/menu_items_controller_spec.rb +148 -0
  99. data/spec/controllers/spud/admin/menus_controller_spec.rb +121 -0
  100. data/spec/controllers/spud/admin/pages_controller_spec.rb +111 -0
  101. data/spec/controllers/spud/admin/snippets_controller_spec.rb +5 -0
  102. data/spec/controllers/spud/cms/sitemaps_controller_spec.rb +48 -0
  103. data/spec/dummy/README.rdoc +261 -0
  104. data/spec/dummy/Rakefile +7 -0
  105. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  106. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  107. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  108. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  109. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  110. data/spec/dummy/app/views/layouts/content_left.html.erb +0 -0
  111. data/spec/dummy/config/application.rb +59 -0
  112. data/spec/dummy/config/boot.rb +10 -0
  113. data/spec/dummy/config/database.yml +15 -0
  114. data/spec/dummy/config/environment.rb +5 -0
  115. data/spec/dummy/config/environments/development.rb +37 -0
  116. data/spec/dummy/config/environments/production.rb +67 -0
  117. data/spec/dummy/config/environments/test.rb +37 -0
  118. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  119. data/spec/dummy/config/initializers/inflections.rb +15 -0
  120. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  121. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  122. data/spec/dummy/config/initializers/session_store.rb +8 -0
  123. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  124. data/spec/dummy/config/locales/en.yml +5 -0
  125. data/spec/dummy/config/routes.rb +3 -0
  126. data/spec/dummy/config.ru +4 -0
  127. data/spec/dummy/db/migrate/20120307002859_create_spud_admin_permissions.spud_core.rb +12 -0
  128. data/spec/dummy/db/migrate/20120307002860_create_spud_users.spud_core.rb +30 -0
  129. data/spec/dummy/db/migrate/20120307003559_create_spud_permalinks.spud_permalinks.rb +12 -0
  130. data/spec/dummy/db/migrate/20120610123555_add_time_zone_to_spud_user.spud_core.rb +7 -0
  131. data/spec/dummy/db/migrate/20120610123556_add_scope_to_spud_admin_permissions.spud_core.rb +7 -0
  132. data/spec/dummy/db/migrate/20120610123557_create_spud_user_settings.spud_core.rb +12 -0
  133. data/spec/dummy/db/migrate/20120610123615_add_site_id_to_spud_permalinks.spud_permalinks.rb +7 -0
  134. data/spec/dummy/db/schema.rb +171 -0
  135. data/spec/dummy/log/test.log +1874 -0
  136. data/spec/dummy/public/404.html +26 -0
  137. data/spec/dummy/public/422.html +26 -0
  138. data/spec/dummy/public/500.html +25 -0
  139. data/spec/dummy/public/favicon.ico +0 -0
  140. data/spec/dummy/script/rails +6 -0
  141. data/spec/helpers/spud/cms/application_helper_spec.rb +160 -0
  142. data/spec/models/spud_menu_item_spec.rb +31 -0
  143. data/spec/models/spud_page_liquid_tag_spec.rb +5 -0
  144. data/spec/models/spud_page_partial_revision_spec.rb +5 -0
  145. data/spec/models/spud_page_partial_spec.rb +44 -0
  146. data/spec/models/spud_page_spec.rb +163 -0
  147. data/spec/models/spud_snippet_spec.rb +5 -0
  148. data/spec/spec_helper.rb +40 -0
  149. data/spec/support/authlogic_helper.rb +2 -0
  150. metadata +427 -0
@@ -0,0 +1,131 @@
1
+ class SpudPage < ActiveRecord::Base
2
+ spud_searchable
3
+ belongs_to :spud_page
4
+ has_many :spud_page_partial_revisions
5
+ has_many :spud_pages, :dependent => :nullify
6
+ has_many :spud_page_partials,:dependent => :destroy
7
+ has_many :spud_permalinks,:as => :attachment, :dependent => :destroy
8
+ belongs_to :created_by_user,:class_name => "SpudUser",:foreign_key => :created_by
9
+ belongs_to :updated_by_user,:class_name => "SpudUser",:foreign_key => :updated_by
10
+
11
+
12
+ attr_accessible :name,:url_name,:created_by,:updated_by,:layout,:visibility,:spud_page_id,:publish_at,:format,:meta_description,:meta_keywords,:page_order,:spud_page_partials_attributes,:use_custom_url_name,:published,:notes
13
+
14
+ before_validation :generate_url_name
15
+ validates :name,:presence => true
16
+ validates_uniqueness_of :name, :scope => [:site_id,:spud_page_id]
17
+ validates :url_name,:presence => true
18
+ validates_uniqueness_of :url_name, :scope => :site_id
19
+
20
+ accepts_nested_attributes_for :spud_page_partials, :allow_destroy => true
21
+ scope :parent_pages, where(:spud_page_id => nil)
22
+ scope :site, lambda {|sid| where(:site_id => sid)}
23
+ scope :published_pages, where(:published => true)
24
+ scope :public, where(:visibility => 0)
25
+
26
+ def full_content_processed
27
+ self.spud_page_partials.collect{|partial| partial.content_processed }.join(' ')
28
+ end
29
+
30
+ def self.grouped(site_id=0)
31
+
32
+ if(Spud::Core.multisite_mode_enabled)
33
+ return site(site_id).all.group_by(&:spud_page_id)
34
+ else
35
+ return all.group_by(&:spud_page_id)
36
+ end
37
+ end
38
+
39
+ def to_liquid
40
+ return {'name' => self.name, 'url_name' => self.url_name}
41
+ end
42
+
43
+ # Returns an array of pages in order of heirarchy
44
+ # :fitler Filters out a page by ID, and all of its children
45
+ # :value Pick an attribute to be used in the value field, defaults to ID
46
+ def self.options_tree_for_page(config={})
47
+ collection = config[:collection] || self.grouped(config[:site_id])
48
+ level = config[:level] || 0
49
+ parent_id = config[:parent_id] || nil
50
+ filter = config[:filter] || nil
51
+ value = config[:value] || :id
52
+ list = []
53
+ if collection[parent_id]
54
+ collection[parent_id].each do |c|
55
+ if filter.blank? || c.id != filter.id
56
+ list << [level.times.collect{ '- ' }.join('') + c.name, c[value]]
57
+ list += self.options_tree_for_page({:collection => collection, :parent_id => c.id, :level => level+1, :filter => filter})
58
+ end
59
+ end
60
+ end
61
+ return list
62
+ end
63
+
64
+
65
+ def generate_url_name
66
+ return true if self.name.blank?
67
+ if !self.use_custom_url_name || self.url_name.blank?
68
+ url_name = ""
69
+ if !self.spud_page.blank?
70
+ url_name += self.spud_page.url_name + "/"
71
+ end
72
+ url_name += self.name.parameterize.downcase
73
+ if !self.use_custom_url_name
74
+ pages = SpudPage
75
+
76
+ if !self.id.blank?
77
+ pages = pages.where("id != #{self.id}")
78
+ end
79
+ url_names = pages.site(self.site_id).all.collect{|p| p.url_name}
80
+
81
+ counter = 1
82
+ url_name_new = url_name
83
+ while url_names.include?(url_name_new) do
84
+ url_name_new = url_name + "-#{counter}"
85
+ counter += 1
86
+ end
87
+ # url_name = url_name_new
88
+ # Check Permalinks List
89
+
90
+ permalink = SpudPermalink.site(self.site_id).where(:url_name => url_name_new).first
91
+ counter = 1
92
+ while permalink.blank? == false
93
+
94
+ if permalink.attachment == self
95
+ permalink.destroy
96
+ permalink = nil
97
+ else
98
+ url_name_new = url_name + "-#{counter}"
99
+ counter += 1
100
+ permalink = SpudPermalink.site(self.site_id).where(:url_name => url_name_new).first
101
+ end
102
+ end
103
+ url_name = url_name_new
104
+ end
105
+ if self.url_name.blank? == false && url_name != self.url_name
106
+ self.spud_permalinks.create(:url_name => self.url_name,:site_id => self.site_id)
107
+ end
108
+ self.url_name = url_name
109
+ self.use_custom_url_name = false
110
+ elsif self.id.to_i > 0
111
+ page = SpudPage.where(:id => self.id).first
112
+ if page.url_name.blank? == false && page.url_name != self.url_name
113
+ permalink = SpudPermalink.site(self.site_id).where(:url_name => self.url_name).first
114
+ if permalink.blank? == false
115
+ if permalink.attachment == self
116
+ permalink.destroy
117
+ else
118
+ self.errors.add :url_name, "This permalink has already been used by another page."
119
+ return false
120
+ end
121
+ end
122
+ self.spud_permalinks.create(:url_name => page.url_name,:site_id => self.site_id)
123
+ end
124
+ end
125
+ return true
126
+ end
127
+
128
+ def is_private?
129
+ return self.visibility == 1
130
+ end
131
+ end
@@ -0,0 +1,4 @@
1
+ class SpudPageLiquidTag < ActiveRecord::Base
2
+ attr_accessible :attachment_type,:attachment_id, :tag_name, :value
3
+ belongs_to :attachment, :polymorphic => true
4
+ end
@@ -0,0 +1,67 @@
1
+ class SpudPagePartial < ActiveRecord::Base
2
+ belongs_to :spud_page
3
+ has_many :spud_page_liquid_tags, :as => :attachment, :dependent => :destroy
4
+ validates :name,:presence => true
5
+ attr_accessible :name, :spud_page_id, :content, :format, :content_processed
6
+ before_save :maintain_revisions
7
+ before_save :update_symbol_name
8
+ before_save :postprocess_content
9
+ after_save :update_taglist
10
+ def update_symbol_name
11
+ self.symbol_name = self.name.parameterize.underscore
12
+ end
13
+
14
+ def symbol_name
15
+ return @symbol_name || self.name.parameterize.underscore
16
+ end
17
+
18
+ def postprocess_content
19
+ template = Liquid::Template.parse(self.content) # Parses and compiles the template
20
+
21
+ self.content_processed = template.render('page' => self.spud_page)
22
+ end
23
+
24
+ def update_taglist
25
+ template = Liquid::Template.parse(self.content) # Parses and compiles the template
26
+
27
+ self.spud_page_liquid_tags.all.each do |tag|
28
+ tag.destroy
29
+ end
30
+ template.root.nodelist.each do |node|
31
+ if !node.is_a?(String) && defined?(node.tag_name) && defined?(node.tag_value)
32
+ self.spud_page_liquid_tags.create(:tag_name => node.tag_name,:value => node.tag_value)
33
+ end
34
+ end
35
+ end
36
+
37
+ def content_processed=(content)
38
+ write_attribute(:content_processed,content)
39
+ end
40
+
41
+ def content_processed
42
+ if read_attribute(:content_processed).blank?
43
+ if self.new_record?
44
+ self.content_processed = postprocess_content()
45
+ else
46
+ self.update_column(:content_processed, postprocess_content)
47
+ end
48
+ end
49
+ return read_attribute(:content_processed)
50
+ end
51
+
52
+ def maintain_revisions
53
+ if !self.changed.include?('content')
54
+ return true
55
+ end
56
+ revision = SpudPagePartialRevision.new(:spud_page_id => self.spud_page_id,:name => self.name,:format => self.format,:content => self.content)
57
+ revision.save
58
+ if Spud::Cms.max_revisions > 0
59
+ revision_count = SpudPagePartialRevision.where(:spud_page_id => self.spud_page_id,:name => self.name).count
60
+ if revision_count > Spud::Cms.max_revisions
61
+ revision_bye = SpudPagePartialRevision.where(:spud_page_id => self.spud_page_id,:name => self.name).order("created_at ASC").first
62
+ revision_bye.destroy if !revision_bye.blank?
63
+ end
64
+ end
65
+ return true
66
+ end
67
+ end
@@ -0,0 +1,5 @@
1
+ class SpudPagePartialRevision < ActiveRecord::Base
2
+ belongs_to :spud_page
3
+
4
+ attr_accessible :name,:content,:format,:spud_page_id
5
+ end
@@ -0,0 +1,42 @@
1
+ class SpudSnippet < ActiveRecord::Base
2
+ attr_accessible :content, :content_processed, :format, :name
3
+ has_many :spud_page_liquid_tags, :as => :attachment, :dependent => :destroy
4
+
5
+ validates :name, :presence => true
6
+ validates_uniqueness_of :name, :scope => :site_id
7
+
8
+ scope :site, lambda {|sid| where(:site_id => sid)}
9
+
10
+ before_save :postprocess_content
11
+ after_save :update_taglist
12
+ def postprocess_content
13
+ template = Liquid::Template.parse(self.content) # Parses and compiles the template
14
+ self.content_processed = template.render()
15
+ end
16
+
17
+ def content_processed=(content)
18
+ write_attribute(:content_processed,content)
19
+ end
20
+
21
+ def content_processed
22
+ if read_attribute(:content_processed).blank?
23
+ self.update_column(:content_processed, postprocess_content)
24
+ end
25
+ return read_attribute(:content_processed)
26
+ end
27
+
28
+
29
+ def update_taglist
30
+ template = Liquid::Template.parse(self.content) # Parses and compiles the template
31
+
32
+ self.spud_page_liquid_tags.all.each do |tag|
33
+ tag.destroy
34
+ end
35
+ template.root.nodelist.each do |node|
36
+ if !node.is_a?(String) && defined?(node.tag_name) && defined?(node.tag_value)
37
+ self.spud_page_liquid_tags.create(:tag_name => node.tag_name,:value => node.tag_value)
38
+ end
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,48 @@
1
+ class PageSweeper < ActionController::Caching::Sweeper
2
+ observe :spud_page,:spud_menu_item
3
+
4
+ def before_save(record)
5
+ if record.is_a?(SpudPage) && record.url_name_was.blank? == false && record.url_name_was != record.url_name
6
+ if Spud::Cms.cache_mode == :full_page
7
+ expire_page cache_path_for_page(record.url_name_was)
8
+ elsif Spud::Cms.cache_mode == :action
9
+ expire_action cache_path_for_page(record.url_name_was)
10
+ end
11
+ end
12
+ end
13
+
14
+ def after_save(record)
15
+ expire_cache_for(record)
16
+ expire_page spud_cms_sitemap_path(:format => :xml)
17
+ expire_page spud_sitemap_path(:format => :xml)
18
+ end
19
+
20
+ def after_destroy(record)
21
+ expire_cache_for(record)
22
+ expire_page spud_cms_sitemap_path
23
+ expire_page spud_sitemap_path
24
+ end
25
+
26
+ private
27
+ def expire_cache_for(record)
28
+ if record.is_a?(SpudPage)
29
+ if Spud::Cms.cache_mode == :full_page
30
+ expire_page cache_path_for_page(record.url_name)
31
+ elsif Spud::Cms.cache_mode == :action
32
+ expire_action cache_path_for_page(record.url_name)
33
+ end
34
+ else
35
+ Rails.cache.clear
36
+ SpudPage.published_pages.all.each {|page| expire_cache_for(page)}
37
+ end
38
+ end
39
+
40
+ def cache_path_for_page(url_name)
41
+ if url_name == Spud::Cms.root_page_name
42
+ root_path
43
+ else
44
+ page_path(:id => url_name)
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,41 @@
1
+ class SnippetSweeper < ActionController::Caching::Sweeper
2
+ observe :spud_snippet
3
+
4
+ def before_save(record)
5
+ if record.is_a?(SpudSnippet)
6
+ @old_name = record.name_was
7
+ else
8
+ @old_name = nil
9
+ end
10
+ end
11
+
12
+ def after_save(record)
13
+ reset_cms_pages(record)
14
+ end
15
+
16
+ def after_destroy(record)
17
+ reset_cms_pages(record)
18
+ end
19
+
20
+ private
21
+ def reset_cms_pages(record)
22
+
23
+ values = [record.name]
24
+ values << @old_name if !@old_name.blank?
25
+ SpudPageLiquidTag.where(:tag_name => "snippet",:value => values).includes(:attachment).each do |tag|
26
+ partial = tag.attachment
27
+ partial.postprocess_content
28
+ partial.save
29
+ page = partial.try(:spud_page)
30
+ if page.blank? == false
31
+ page.updated_at = Time.now.utc
32
+ page.save
33
+ end
34
+
35
+
36
+ end
37
+ end
38
+
39
+
40
+
41
+ end
@@ -0,0 +1,2 @@
1
+ <h1>Not Found</h1>
2
+ <p>The file you were looking for does not exist.</p>
@@ -0,0 +1,24 @@
1
+ <%=content_for :title do%>
2
+ <%= @page.name %> | <%=current_site_name%>
3
+ <% end %>
4
+ <%=content_for :head do%>
5
+ <%if !@page.meta_description.blank?%>
6
+ <meta name="description" content="<%=@page.meta_description%>" />
7
+ <%end%>
8
+
9
+ <meta name="keywords" content="<%=@page.meta_keywords%>" />
10
+
11
+ <%end%>
12
+
13
+ <%if !@inline.blank?%>
14
+ <%=render :inline => @inline%>
15
+ <%end%>
16
+ <%@page.spud_page_partials.each do |page_partial|%>
17
+ <%if(page_partial.name.match(/^body$/i) && Spud::Cms.yield_body_as_content_block == false)%>
18
+ <%=page_partial.content_processed.html_safe%>
19
+ <%else%>
20
+ <%=content_for page_partial.symbol_name.to_sym do%>
21
+ <%=page_partial.content_processed.html_safe%>
22
+ <%end%>
23
+ <%end%>
24
+ <%end%>
@@ -0,0 +1,51 @@
1
+ <%=error_messages_for(f.object)%>
2
+ <fieldset>
3
+ <div class="control-group">
4
+ <%=f.label :name, :required=>true,:class => "control-label"%>
5
+ <div class="controls">
6
+ <%=f.text_field :name,:title => "",:size=>40%>
7
+ </div>
8
+
9
+ </div>
10
+ <div class="control-group">
11
+
12
+ <%=f.label :menu_order, :required=>true,:class => "control-label"%>
13
+ <div class="controls">
14
+ <%=f.text_field :menu_order,:title => "",:size=>5%>
15
+ </div>
16
+
17
+ </div>
18
+ <div class="control-group">
19
+ <%=f.label :spud_page_id, "Page",:class => "control-label"%>
20
+ <div class="controls">
21
+ <%=f.select :spud_page_id,options_for_select(SpudPage.options_tree_for_page(:site_id => session[:admin_site]),@menu_item.spud_page_id),{:include_blank => 'Use URL instead'},{:title => "",:onchange => "if($(this).val() != '') {$('#spud_menu_item_url').val('');}"}%>
22
+ </div>
23
+
24
+ </div>
25
+
26
+
27
+
28
+ <div class="control-group">
29
+ <%=f.label :url,:class => "control-label"%>
30
+ <div class="controls">
31
+ <%=f.text_field :url,:title => "",:size=>40%>
32
+ </div>
33
+ </div>
34
+ <div class="control-group">
35
+ <%=f.label :classes,:class => "control-label"%>
36
+ <div class="controls">
37
+ <%=f.text_field :classes,:title => "",:size=>40%>
38
+ </div>
39
+ </div>
40
+ <div class="control-group">
41
+ <%=f.label :parent, "Parent Menu",:class => "control-label"%>
42
+ <div class="controls">
43
+ <%=f.select :parent_id,options_for_select(SpudMenuItem.options_tree_for_item(@menu,:filter => @menu_item),@menu_item.parent_type == 'SpudMenuItem' ? @menu_item.parent_id : nil),{:include_blank => "#{@menu.name}"},{:title => ""}%>
44
+ </div>
45
+
46
+ </div>
47
+
48
+ </fieldset>
49
+
50
+
51
+
@@ -0,0 +1,22 @@
1
+ <div class="page_row" menu_item_id="<%=menu_item.id%>">
2
+
3
+ <span class="row_meta"><%=prefix if defined? prefix%><%=link_to menu_item.name,edit_spud_admin_menu_menu_item_path(:id => menu_item.id)%></span>
4
+
5
+ <span class="edit_controls"><%=link_to "Edit",edit_spud_admin_menu_menu_item_path(:id => menu_item.id), :title => "Edit Menu Item",:class => 'btn'%>&nbsp;&nbsp;<%=link_to "Remove",spud_admin_menu_menu_item_path(:id => menu_item.id),:method => :delete,:class => 'btn btn-danger',:confirm => "Are you sure you want to remove this menu item?"%></span>
6
+ <br style="clear:both;"/>
7
+ </div>
8
+ <ul class="menu_list subitem sortable connectedSortable">
9
+
10
+ <%if !menu_item.spud_menu_items.all.blank?%>
11
+
12
+
13
+ <%menu_item.spud_menu_items.order(:menu_order).each do |menu_item|%>
14
+ <li>
15
+ <%=render :partial => 'menu_item_row',:locals => {:menu_item => menu_item}%>
16
+ </li>
17
+ <%end%>
18
+
19
+
20
+
21
+ <%end%>
22
+ </ul>
@@ -0,0 +1,10 @@
1
+
2
+
3
+
4
+ <%=form_for @menu_item,:url => spud_admin_menu_menu_item_path(:id => @menu_item.id),:html=>{:class=>"form-horizontal"} do |f|%>
5
+ <%=render :partial => "form",:locals => {:f => f}%>
6
+ <div class="form-actions">
7
+ <%=f.submit "Save Menu Item", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menu_menu_items_path,:class => "btn"%>
8
+ </div>
9
+ <%end%>
10
+
@@ -0,0 +1,17 @@
1
+ <%=content_for :data_controls do%>
2
+ <%=link_to "New Menu Item",new_spud_admin_menu_menu_item_path(),:class => "btn btn-primary",:title => "New Menu Item"%>
3
+ <%end%>
4
+ <%=content_for :detail do%>
5
+ <ul id="root_menu_list" class="menu_list page_list sortable connectedSortable">
6
+ <%@menu_items.each do |menu_item|%>
7
+ <li>
8
+ <%=render :partial => "menu_item_row",:locals => {:menu_item => menu_item}%>
9
+ </li>
10
+ <%end%>
11
+
12
+ </ul>
13
+
14
+ <script type="text/javascript">
15
+ $(document).ready(function() { spud.admin.cms.menu_items.init();})
16
+ </script>
17
+ <%end%>
@@ -0,0 +1,12 @@
1
+
2
+
3
+
4
+ <%=form_for @menu_item,:url => spud_admin_menu_menu_items_path,:html=>{:class=>"form-horizontal"} do |f|%>
5
+ <%=render :partial => "form",:locals => {:f => f}%>
6
+ <div class="form-actions">
7
+ <%=f.submit "Create Menu Item", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menu_menu_items_path,:class => "btn"%>
8
+ </div>
9
+ <%end%>
10
+
11
+
12
+
@@ -0,0 +1,11 @@
1
+ <%=error_messages_for(f.object)%>
2
+ <fieldset>
3
+ <div class="control-group">
4
+ <%=f.label :name, :required=>true,:class => "control-label"%>
5
+ <div class="controls">
6
+ <%=f.text_field :name,:title => "",:size=>40%>
7
+ </div>
8
+
9
+ </div>
10
+ </fieldset>
11
+
@@ -0,0 +1,13 @@
1
+
2
+
3
+
4
+ <%=form_for @menu,:url => spud_admin_menu_path(:id => @menu.id),:html=>{:class=>"form-horizontal"} do |f|%>
5
+ <%=render :partial => "form",:locals => {:f => f}%>
6
+ <div class="form-actions">
7
+ <%=f.submit "Save Menu", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menus_path,:class => "btn"%>
8
+ </div>
9
+
10
+ <%end%>
11
+
12
+
13
+
@@ -0,0 +1,24 @@
1
+ <%=content_for :data_controls do%>
2
+ <%=link_to "New Menu",new_spud_admin_menu_path(),:class => "btn btn-primary",:title => "New Menu"%>
3
+ <%end%>
4
+ <%=content_for :detail do%>
5
+ <div class="page_list">
6
+ <%@menus.each do |menu|%>
7
+ <div class="page_row">
8
+
9
+ <span class="row_meta"><%=link_to menu.name,spud_admin_menu_menu_items_path(:menu_id => menu.id)%></span>
10
+
11
+ <span class="edit_controls">
12
+ <%=link_to "Edit",edit_spud_admin_menu_path(:id => menu.id),:class => 'btn'%>
13
+ <%=link_to "Remove",spud_admin_menu_path(:id => menu.id),:method => :delete,:class => 'btn btn-danger',:confirm => "Are you sure you want to remove this menu and all items associated with it?"%>
14
+ </span>
15
+ <br style="clear:both;"/>
16
+ </div>
17
+ <%end%>
18
+ <%=will_paginate @menus%>
19
+
20
+ </div>
21
+
22
+
23
+
24
+ <%end%>
@@ -0,0 +1,7 @@
1
+ <%=form_for @menu,:url => spud_admin_menus_path,:html=>{:class=>"form-horizontal"} do |f|%>
2
+ <%=render :partial => "form",:locals => {:f => f}%>
3
+ <div class="form-actions">
4
+ <%=f.submit "Create Menu", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menus_path,:class => "btn"%>
5
+ </div>
6
+
7
+ <%end%>
@@ -0,0 +1,95 @@
1
+ <%=error_messages_for(f.object)%>
2
+ <fieldset>
3
+ <div class="control-group">
4
+ <legend>Page Title</legend>
5
+ <%=f.label :name, :required=>true,:style =>"display:none;", :class=>"control-label"%>
6
+
7
+ <%=f.text_field :name, :class => "full-width"%>
8
+
9
+ </div>
10
+ </fieldset>
11
+ <div id="page_partials_form" class="formtabs tab-content">
12
+ <ul class="formtab_buttons nav nav-tabs">
13
+ </ul>
14
+ <%=f.fields_for :spud_page_partials do |b|%>
15
+ <div class="formtab tab-pane">
16
+ <%=b.hidden_field :name,:class => "tab_name"%>
17
+ <%=b.text_area :content,:class => "tinymce"%>
18
+ </div>
19
+ <%end%>
20
+ </div>
21
+ <br />
22
+ <fieldset>
23
+ <legend>Advanced Settings (optional)</legend>
24
+
25
+ <div class="control-group">
26
+
27
+ <%=f.label :layout, "Template", :class=>"control-label"%>
28
+ <div class="controls">
29
+ <%=f.select :layout, options_for_select(layout_options,@page.layout),{},{:title => "", 'data-source' => page_parts_spud_admin_pages_path(:page => @page.id) }%>
30
+ <span class="help-inline">Use this to control the layout template to be used for this page if they are available.</span>
31
+ </div>
32
+ </div>
33
+
34
+ <div class="control-group">
35
+
36
+ <%=f.label :spud_page_id, "Parent Page", :class=>"control-label"%>
37
+ <div class="controls">
38
+ <%=f.select :spud_page_id,options_for_select(SpudPage.options_tree_for_page(:filter => @page,:site_id => session[:admin_site]),@page.spud_page_id),{:include_blank => 'None'},{:title => ""}%>
39
+
40
+ </div>
41
+ </div>
42
+ <div class="control-group">
43
+
44
+ <%=f.label :url_name, "Perma Link",:disabled => true, :class=>"control-label"%>
45
+ <div class="controls">
46
+ <%=root_url%><%=f.text_field :url_name,:title => "",:size=>20%>
47
+ <label class="checkbox inline">
48
+ <%=f.check_box :use_custom_url_name,:onchange => "$('#spud_page_url_name').attr('disabled',!this.checked);"%>
49
+ Customize this pages url
50
+ </label>
51
+ </div>
52
+ </div>
53
+
54
+ </fieldset>
55
+ <fieldset>
56
+ <legend>Meta Information (optional)</legend>
57
+ <p>These fields are used to notify search engines about important keywords and the appropriate description to display in a search result.</p>
58
+
59
+ <div class="control-group">
60
+ <%=f.label :meta_keywords,"Keywords", :class=>"control-label"%>
61
+ <div class="controls">
62
+ <%=f.text_field :meta_keywords,:title => "",:style=>"width:600px;" %>
63
+ <span class="help-inline">A Comma seperated list of keywords for search engines. Keep it short (no more than 10 keywords)</span>
64
+ </div>
65
+
66
+ </div>
67
+ <div class="control-group">
68
+ <%=f.label :meta_description,"Description", :class=>"control-label"%>
69
+ <div class="controls">
70
+ <%=f.text_area :meta_description,:style =>"width:600px;height:40px;"%>
71
+ <span class="help-inline">A short description of the page. This is what appears on a search engines search result page.</span>
72
+ </div>
73
+ </div>
74
+ <div class="control-group">
75
+ <%=f.label :visibility, :class=>"control-label"%>
76
+ <div class="controls">
77
+ <%=f.select :visibility, [["Public",0],["Private",1]]%>
78
+ </div>
79
+ </div>
80
+ <div class="control-group">
81
+ <%=f.label :published, :class=>"control-label"%>
82
+ <div class="controls">
83
+ <%=f.check_box :published%>
84
+ </div>
85
+ </div>
86
+ <div class="control-group">
87
+ <%=f.label :notes,"Notes", :class=>"control-label"%>
88
+ <div class="controls">
89
+ <%=f.text_area :notes,:style =>"width:400px;height:40px;"%>
90
+ <span class="help-inline">Have a note to make about this page while you work? Place it here for later.</span>
91
+ </div>
92
+ </div>
93
+ <%=hidden_field_tag "preview",:value => 0%>
94
+ </fieldset>
95
+
@@ -0,0 +1,18 @@
1
+ <div id="page_partials_form" class="formtabs tab-content">
2
+ <ul class="formtab_buttons nav nav-tabs">
3
+ </ul>
4
+ <% last_index = 0 %>
5
+ <% spud_page_partials.each_with_index do |spud_page_partial, index| %>
6
+ <div class="formtab tab-pane">
7
+ <input type="hidden" class="tab_name" name="spud_page[spud_page_partials_attributes][<%= index %>][name]" value="<%= spud_page_partial.name %>" />
8
+ <textarea class="wysiwym tinymce" name="spud_page[spud_page_partials_attributes][<%= index %>][content]">
9
+ <%= spud_page_partial.content %>
10
+ </textarea>
11
+ </div>
12
+ <% last_index = index + 1 %>
13
+ <% end %>
14
+ <% remove_page_partials.each_with_index do |spud_page_partial, index| %>
15
+ <input type="hidden" name="spud_page[spud_page_partials_attributes][<%= last_index + index %>][id]" value="<%= spud_page_partial.id %>" />
16
+ <input type="hidden" name="spud_page[spud_page_partials_attributes][<%= last_index + index %>][_destroy]", value="1" />
17
+ <% end %>
18
+ </div>