radiant 0.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of radiant might be problematic. Click here for more details.

Files changed (205) hide show
  1. data/CHANGELOG +1 -0
  2. data/CONTRIBUTORS +12 -0
  3. data/LICENSE +9 -0
  4. data/README +91 -0
  5. data/Rakefile +10 -0
  6. data/app/behaviors/archive_behavior.rb +42 -0
  7. data/app/behaviors/archive_day_index_behavior.rb +30 -0
  8. data/app/behaviors/archive_month_index_behavior.rb +30 -0
  9. data/app/behaviors/archive_year_index_behavior.rb +30 -0
  10. data/app/behaviors/env_behavior.rb +18 -0
  11. data/app/behaviors/page_missing_behavior.rb +31 -0
  12. data/app/controllers/admin/export_controller.rb +8 -0
  13. data/app/controllers/admin/layout_controller.rb +23 -0
  14. data/app/controllers/admin/model_controller.rb +119 -0
  15. data/app/controllers/admin/page_controller.rb +119 -0
  16. data/app/controllers/admin/snippet_controller.rb +6 -0
  17. data/app/controllers/admin/user_controller.rb +45 -0
  18. data/app/controllers/admin/welcome_controller.rb +39 -0
  19. data/app/controllers/application.rb +32 -0
  20. data/app/controllers/site_controller.rb +54 -0
  21. data/app/filters/markdown_filter.rb +9 -0
  22. data/app/filters/textile_filter.rb +9 -0
  23. data/app/helpers/admin/export_helper.rb +2 -0
  24. data/app/helpers/admin/layout_helper.rb +2 -0
  25. data/app/helpers/admin/page_helper.rb +10 -0
  26. data/app/helpers/admin/snippet_helper.rb +2 -0
  27. data/app/helpers/admin/user_helper.rb +2 -0
  28. data/app/helpers/admin/welcome_helper.rb +2 -0
  29. data/app/helpers/application_helper.rb +141 -0
  30. data/app/helpers/site_helper.rb +2 -0
  31. data/app/models/archive_finder.rb +66 -0
  32. data/app/models/behavior.rb +194 -0
  33. data/app/models/layout.rb +13 -0
  34. data/app/models/page.rb +91 -0
  35. data/app/models/page_context.rb +526 -0
  36. data/app/models/page_part.rb +13 -0
  37. data/app/models/radiant/config.rb +53 -0
  38. data/app/models/radiant/exporter.rb +11 -0
  39. data/app/models/response_cache.rb +112 -0
  40. data/app/models/snippet.rb +16 -0
  41. data/app/models/status.rb +31 -0
  42. data/app/models/text_filter.rb +11 -0
  43. data/app/models/user.rb +70 -0
  44. data/app/models/user_action_observer.rb +13 -0
  45. data/app/views/admin/layout/index.rhtml +38 -0
  46. data/app/views/admin/layout/new.rhtml +37 -0
  47. data/app/views/admin/layout/remove.rhtml +17 -0
  48. data/app/views/admin/page/_node.rhtml +51 -0
  49. data/app/views/admin/page/_part.rhtml +17 -0
  50. data/app/views/admin/page/children.rhtml +4 -0
  51. data/app/views/admin/page/index.rhtml +172 -0
  52. data/app/views/admin/page/new.rhtml +164 -0
  53. data/app/views/admin/page/remove.rhtml +14 -0
  54. data/app/views/admin/snippet/index.rhtml +36 -0
  55. data/app/views/admin/snippet/new.rhtml +28 -0
  56. data/app/views/admin/snippet/remove.rhtml +16 -0
  57. data/app/views/admin/user/index.rhtml +43 -0
  58. data/app/views/admin/user/new.rhtml +48 -0
  59. data/app/views/admin/user/preferences.rhtml +29 -0
  60. data/app/views/admin/user/remove.rhtml +16 -0
  61. data/app/views/admin/welcome/login.rhtml +51 -0
  62. data/app/views/layouts/application.rhtml +75 -0
  63. data/app/views/site/not_found.rhtml +3 -0
  64. data/bin/radiant +305 -0
  65. data/config/boot.rb +80 -0
  66. data/config/database.mysql.yml +20 -0
  67. data/config/database.postgresql.yml +20 -0
  68. data/config/database.sqlite.yml +20 -0
  69. data/config/environment.rb +76 -0
  70. data/config/environments/development.rb +20 -0
  71. data/config/environments/production.rb +22 -0
  72. data/config/environments/test.rb +20 -0
  73. data/config/locomotive.yml +6 -0
  74. data/config/routes.rb +64 -0
  75. data/db/development_structure.sql +80 -0
  76. data/db/migrate/001_create_radiant_tables.rb +73 -0
  77. data/db/migrate/002_insert_initial_data.rb +45 -0
  78. data/db/migrate/003_rename_behavior_column.rb +9 -0
  79. data/db/migrate/004_rename_filter_column.rb +11 -0
  80. data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
  81. data/db/migrate/006_integer_columns_to_boolean.rb +11 -0
  82. data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
  83. data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
  84. data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
  85. data/db/schema.rb +74 -0
  86. data/db/templates/empty.yml +2 -0
  87. data/db/templates/simple-blog.yml +197 -0
  88. data/db/templates/styled-blog.yml +472 -0
  89. data/lib/advanced_delegation.rb +21 -0
  90. data/lib/archive_index_behavior_tags_and_methods.rb +48 -0
  91. data/lib/generators/behavior/USAGE +16 -0
  92. data/lib/generators/behavior/behavior_generator.rb +22 -0
  93. data/lib/generators/behavior/templates/model.rb.template +9 -0
  94. data/lib/generators/behavior/templates/unit_test.rb.template +16 -0
  95. data/lib/generators/filter/USAGE +16 -0
  96. data/lib/generators/filter/filter_generator.rb +22 -0
  97. data/lib/generators/filter/templates/model.rb.template +8 -0
  98. data/lib/generators/filter/templates/unit_test.rb.template +7 -0
  99. data/lib/inheritable_class_attributes.rb +65 -0
  100. data/lib/login_system.rb +80 -0
  101. data/lib/plugins/index_quoting_fix/init.rb +32 -0
  102. data/lib/plugins/string_io/init.rb +2 -0
  103. data/lib/radiant.rb +5 -0
  104. data/lib/registerable.rb +70 -0
  105. data/lib/tasks/release.rake +84 -0
  106. data/public/404.html +8 -0
  107. data/public/500.html +8 -0
  108. data/public/dispatch.cgi +10 -0
  109. data/public/dispatch.fcgi +24 -0
  110. data/public/dispatch.rb +10 -0
  111. data/public/favicon.ico +0 -0
  112. data/public/images/add-child.png +0 -0
  113. data/public/images/brown-bottom-line.gif +0 -0
  114. data/public/images/clear-page-cache.png +0 -0
  115. data/public/images/collapse.png +0 -0
  116. data/public/images/expand.png +0 -0
  117. data/public/images/minus.png +0 -0
  118. data/public/images/new-homepage.png +0 -0
  119. data/public/images/new-layout.png +0 -0
  120. data/public/images/new-snippet.png +0 -0
  121. data/public/images/new-user.png +0 -0
  122. data/public/images/page.png +0 -0
  123. data/public/images/plus.png +0 -0
  124. data/public/images/remove-disabled.png +0 -0
  125. data/public/images/remove.png +0 -0
  126. data/public/images/snippet.png +0 -0
  127. data/public/images/spinner.gif +0 -0
  128. data/public/images/view-site.gif +0 -0
  129. data/public/images/virtual-page.png +0 -0
  130. data/public/javascripts/application.js +2 -0
  131. data/public/javascripts/controls.js +815 -0
  132. data/public/javascripts/dragdrop.js +913 -0
  133. data/public/javascripts/effects.js +958 -0
  134. data/public/javascripts/pngfix.js +78 -0
  135. data/public/javascripts/prototype.js +2006 -0
  136. data/public/javascripts/ruledtable.js +28 -0
  137. data/public/javascripts/string.js +23 -0
  138. data/public/javascripts/tabcontrol.js +140 -0
  139. data/public/robots.txt +1 -0
  140. data/public/stylesheets/admin.css +464 -0
  141. data/script/about +3 -0
  142. data/script/breakpointer +3 -0
  143. data/script/console +3 -0
  144. data/script/destroy +3 -0
  145. data/script/generate +3 -0
  146. data/script/performance/benchmarker +3 -0
  147. data/script/performance/profiler +3 -0
  148. data/script/plugin +3 -0
  149. data/script/process/reaper +3 -0
  150. data/script/process/spawner +3 -0
  151. data/script/process/spinner +3 -0
  152. data/script/runner +3 -0
  153. data/script/server +3 -0
  154. data/script/setup_database +297 -0
  155. data/test/fixtures/layouts.yml +26 -0
  156. data/test/fixtures/page_parts.yml +99 -0
  157. data/test/fixtures/pages.yml +359 -0
  158. data/test/fixtures/pages.yml.rej +28 -0
  159. data/test/fixtures/snippets.yml +18 -0
  160. data/test/fixtures/users.yml +30 -0
  161. data/test/functional/admin/export_controller_test.rb +22 -0
  162. data/test/functional/admin/layout_controller_test.rb +40 -0
  163. data/test/functional/admin/model_controller_test.rb +152 -0
  164. data/test/functional/admin/page_controller_test.rb +179 -0
  165. data/test/functional/admin/snippet_controller_test.rb +11 -0
  166. data/test/functional/admin/user_controller_test.rb +71 -0
  167. data/test/functional/admin/welcome_controller_test.rb +48 -0
  168. data/test/functional/application_controller_test.rb +44 -0
  169. data/test/functional/login_system_test.rb +155 -0
  170. data/test/functional/site_controller_test.rb +172 -0
  171. data/test/helpers/archive_index_test_helper.rb +35 -0
  172. data/test/helpers/behavior_render_test_helper.rb +34 -0
  173. data/test/helpers/behavior_test_helper.rb +47 -0
  174. data/test/helpers/caching_test_helper.rb +41 -0
  175. data/test/helpers/layout_test_helper.rb +35 -0
  176. data/test/helpers/page_part_test_helper.rb +49 -0
  177. data/test/helpers/page_test_helper.rb +36 -0
  178. data/test/helpers/snippet_test_helper.rb +32 -0
  179. data/test/helpers/user_test_helper.rb +34 -0
  180. data/test/helpers/validation_test_helper.rb +42 -0
  181. data/test/test_helper.rb +54 -0
  182. data/test/unit/behavior_test.rb +196 -0
  183. data/test/unit/behaviors/archive_behavior_test.rb +33 -0
  184. data/test/unit/behaviors/archive_day_index_behavior_test.rb +21 -0
  185. data/test/unit/behaviors/archive_month_index_behavior_test.rb +21 -0
  186. data/test/unit/behaviors/archive_year_index_behavior_test.rb +21 -0
  187. data/test/unit/behaviors/page_missing_behavior_test.rb +27 -0
  188. data/test/unit/filters/markdown_filter_test.rb +14 -0
  189. data/test/unit/filters/textile_filter_test.rb +14 -0
  190. data/test/unit/inheritable_class_attributes_test.rb +47 -0
  191. data/test/unit/layout_test.rb +29 -0
  192. data/test/unit/page_context_test.rb +375 -0
  193. data/test/unit/page_context_test.rb.rej +26 -0
  194. data/test/unit/page_part_test.rb +44 -0
  195. data/test/unit/page_test.rb +224 -0
  196. data/test/unit/radiant/config_test.rb +46 -0
  197. data/test/unit/radiant/exporter_test.rb +26 -0
  198. data/test/unit/registerable_test.rb +68 -0
  199. data/test/unit/response_cache_test.rb +133 -0
  200. data/test/unit/snippet_test.rb +47 -0
  201. data/test/unit/status_test.rb +43 -0
  202. data/test/unit/text_filter_test.rb +14 -0
  203. data/test/unit/user_action_observer_test.rb +40 -0
  204. data/test/unit/user_test.rb +138 -0
  205. metadata +355 -0
@@ -0,0 +1,17 @@
1
+ <%
2
+ @part = part
3
+ @index = (params[:index] || @index || 1).to_i
4
+ -%>
5
+ <div class="page" id="page-<%= @index %>">
6
+ <div class="part" id="part-<%= @index %>">
7
+ <%= hidden_field_tag "part[#{@index - 1}][name]", @part.name %>
8
+ <p>
9
+ <label for="part[<%= @index - 1 %>}][filter_id]">Filter</label>
10
+ <%= select_tag "part[#{@index - 1}][filter_id]", options_for_select([['<none>', '']] + TextFilter.find_all.map { |s| s.registered_id }, @part.filter_id) %>
11
+ </p>
12
+ <div><%= text_area_tag "part[#{@index - 1}][content]", h(@part.content), :class => "textarea", :style => "width: 100%" %></div>
13
+ </div>
14
+ </div>
15
+ <%
16
+ @index += 1;
17
+ -%>
@@ -0,0 +1,4 @@
1
+ <% level = @level + 1 -%>
2
+ <% @parent.children.each do |child| -%>
3
+ <%= render_node child, :expand => 1, :level => level %>
4
+ <% end -%>
@@ -0,0 +1,172 @@
1
+ <% content_for('page_scripts') do -%>
2
+ var SiteMap = Class.create();
3
+ SiteMap.prototype = Object.extend({}, RuledTable.prototype); // Inherit from RuledTable
4
+ Object.extend(SiteMap.prototype, {
5
+
6
+ onRowSetup: function(row) {
7
+ Event.observe(row, 'click', this.onMouseClickRow.bindAsEventListener(this), false);
8
+ },
9
+
10
+ onMouseClickRow: function(event) {
11
+ var element = Event.element(event);
12
+ if (this.isExpander(element)) {
13
+ var row = Event.findElement(event, 'tr');
14
+ if (this.hasChildren(row)) {
15
+ this.toggleBranch(row, element);
16
+ }
17
+ }
18
+ },
19
+
20
+ hasChildren: function(row) {
21
+ return ! /\bno-children\b/.test(row.className);
22
+ },
23
+
24
+ isExpander: function(element) {
25
+ return (element.tagName.strip().downcase() == 'img') && /\bexpander\b/i.test(element.className);
26
+ },
27
+
28
+ isExpanded: function(row) {
29
+ return /\bchildren-visible\b/i.test(row.className);
30
+ },
31
+
32
+ isRow: function(element) {
33
+ return element.tagName && (element.tagName.strip().downcase() == 'tr');
34
+ },
35
+
36
+ extractLevel: function(row) {
37
+ if (/level-(\d+)/i.test(row.className))
38
+ return RegExp.$1.toInteger();
39
+ },
40
+
41
+ extractPageId: function(row) {
42
+ if (/page-(\d+)/i.test(row.id))
43
+ return RegExp.$1.toInteger();
44
+ },
45
+
46
+ getExpanderImageForRow: function(row) {
47
+ var images = $A(row.getElementsByTagName('img', row));
48
+ var expanders = [];
49
+ images.each(function(image){
50
+ expanders.push(image);
51
+ }.bind(this));
52
+ return expanders.first();
53
+ },
54
+
55
+ hideBranch: function(row, img) {
56
+ var level = this.extractLevel(row);
57
+ var sibling = row.nextSibling;
58
+ while(sibling != null) {
59
+ if (this.isRow(sibling)) {
60
+ if (this.extractLevel(sibling) <= level) break;
61
+ Element.hide(sibling);
62
+ }
63
+ sibling = sibling.nextSibling;
64
+ }
65
+ if (img == null)
66
+ img = this.getExpanderImageForRow(row);
67
+ img.src = img.src.replace(/collapse/, 'expand');
68
+ Element.removeClassName(row, 'children-visible');
69
+ Element.addClassName(row, 'children-hidden');
70
+ },
71
+
72
+ showBranch: function(row, img) {
73
+ var level = this.extractLevel(row);
74
+ var sibling = row.nextSibling;
75
+ var children = false;
76
+ while(sibling != null) {
77
+ if (this.isRow(sibling)) {
78
+ var siblingLevel = this.extractLevel(sibling);
79
+ if (siblingLevel <= level) break;
80
+ if (siblingLevel == level + 1) {
81
+ Element.show(sibling);
82
+ this.hideBranch(sibling);
83
+ }
84
+ children = true;
85
+ }
86
+ sibling = sibling.nextSibling;
87
+ }
88
+ if (!children)
89
+ this.getBranch(row);
90
+ if (img == null)
91
+ img = this.getExpanderImageForRow(row);
92
+ img.src = img.src.replace(/expand/, 'collapse');
93
+ Element.removeClassName(row, 'children-hidden');
94
+ Element.addClassName(row, 'children-visible');
95
+ },
96
+
97
+ getBranch: function(row) {
98
+ var level = this.extractLevel(row).toString();
99
+ var id = this.extractPageId(row).toString();
100
+ new Ajax.Updater(
101
+ row,
102
+ '<%= admin_url %>/ui/pages/children/' + id + '/' + level,
103
+ {
104
+ asynchronous: true,
105
+ insertion: Insertion.After,
106
+ onLoading: function(request) {
107
+ Element.show('busy-' + id);
108
+ this.updating = true;
109
+ }.bind(this),
110
+ onComplete: function(request) {
111
+ var sibling = row.nextSibling;
112
+ while (sibling != null) {
113
+ if (this.isRow(sibling)) {
114
+ var siblingLevel = this.extractLevel(sibling);
115
+ if (siblingLevel <= level) break;
116
+ this.setupRow(sibling);
117
+ }
118
+ sibling = sibling.nextSibling;
119
+ }
120
+ this.updating = false;
121
+ Effect.Fade('busy-' + id);
122
+ }.bind(this)
123
+ }
124
+ );
125
+ },
126
+
127
+ toggleBranch: function(row, img) {
128
+ if (! this.updating) {
129
+ if (this.isExpanded(row)) {
130
+ this.hideBranch(row, img);
131
+ } else {
132
+ this.showBranch(row, img);
133
+ }
134
+ }
135
+ }
136
+
137
+ });
138
+ <% end -%>
139
+
140
+ <h1>Pages</h1>
141
+
142
+ <table id="site-map" class="index" cellpadding="0" cellspacing="0" border="0">
143
+ <thead>
144
+ <tr>
145
+ <th class="page">Page</th>
146
+ <th class="status">Status</th>
147
+ <th class="modify" colspan="2">Modify</th>
148
+ </tr>
149
+ </thead>
150
+ <tbody>
151
+ <% if @homepage -%>
152
+ <%= render_node @homepage -%>
153
+ <% else -%>
154
+ <tr>
155
+ <td colspan="4" class="note">No Pages</td>
156
+ </tr>
157
+ <% end -%>
158
+ </tbody>
159
+ </table>
160
+ <script type="text/javascript">
161
+ // <![CDATA[
162
+ new SiteMap('site-map');
163
+ // ]]>
164
+ </script>
165
+ <form action="<%= clear_cache_url %>" method="post">
166
+ <p>
167
+ <% unless @homepage -%>
168
+ <%= link_to image_tag('new-homepage', :alt => 'New Homepage'), homepage_new_url %>
169
+ <% end -%>
170
+ <%= image_submit_tag 'clear-page-cache' %>
171
+ </p>
172
+ </form>
@@ -0,0 +1,164 @@
1
+ <% content_for('page_scripts') do -%>
2
+ function part_added() {
3
+ var partNameField = $('part-name-field');
4
+ var partIndexField = $('part-index-field');
5
+ var index = parseInt(partIndexField.value);
6
+ var tab = 'tab-' + index;
7
+ var caption = partNameField.value;
8
+ var page = 'page-' + index;
9
+ tabControl.addTab(tab, caption, page);
10
+ Element.hide('add-part-popup');
11
+ Element.hide('busy');
12
+ partNameField.value = '';
13
+ partIndexField.value = (index + 1).toString();
14
+ $('add-part-button').disabled = false;
15
+ Field.focus(partNameField);
16
+ tabControl.select(tab);
17
+ }
18
+ function part_loading() {
19
+ $('add-part-button').disabled = true;
20
+ new Effect.Appear('busy');
21
+ }
22
+ function valid_part_name() {
23
+ var partNameField = $('part-name-field');
24
+ var name = partNameField.value.downcase().strip();
25
+ var result = true;
26
+ if (name == '') {
27
+ alert('Part name cannot be empty.');
28
+ return false;
29
+ }
30
+ tabControl.tabs.each(function(pair){
31
+ if (tabControl.tabs[pair.key].caption == name) {
32
+ result = false;
33
+ alert('Part name must be unique.');
34
+ throw $break;
35
+ }
36
+ })
37
+ return result;
38
+ }
39
+ function center(element) {
40
+ var header = $('header')
41
+ element = $(element);
42
+ element.style.position = 'fixed'
43
+ var dim = Element.getDimensions(element)
44
+ element.style.top = '200px';
45
+ element.style.left = ((header.offsetWidth - dim.width) / 2) + 'px';
46
+ }
47
+ function toggle_add_part_popup() {
48
+ var popup = $('add-part-popup');
49
+ var partNameField = $('part-name-field');
50
+ center(popup);
51
+ Element.toggle(popup);
52
+ Field.focus(partNameField);
53
+ }
54
+ <% end -%>
55
+
56
+ <% if @page.new_record? -%>
57
+ <h1 id="new_page">New Page</h1>
58
+ <% else -%>
59
+ <h1 id="edit_page">Edit Page</h1>
60
+ <% end -%>
61
+
62
+ <form method="post">
63
+ <div class="form-area">
64
+ <p class="title">
65
+ <label for="page_title">Page Title</label>
66
+ <%= text_field "page", "title", :class => 'textbox', :maxlength => 255 %>
67
+ </p>
68
+ <div id="extended-metadata" class="row"<%= meta_visible(:meta) %>>
69
+ <table class="fieldset" cellpadding="0" cellspacing="0" border="0">
70
+ <tr>
71
+ <td><label for="page_slug">Slug</label></td>
72
+ <td class="field"><%= text_field "page", "slug", :class => 'textbox', :maxlength => 100 %></td>
73
+ </tr>
74
+ <tr>
75
+ <td><label for="page_breadcrumb">Breadcrumb</label></td>
76
+ <td class="field"><%= text_field "page", "breadcrumb", :class => 'textbox', :maxlength => 160 %></td>
77
+ </tr>
78
+ </table>
79
+ <script type="text/javascript">
80
+ // <![CDATA[
81
+ $title = $('page_title');
82
+ $slug = $('page_slug');
83
+ $breadcrumb = $('page_breadcrumb');
84
+ $old_title = $title.value || '';
85
+ function title_updated() {
86
+ if ($old_title.toSlug() == $slug.value) $slug.value = $title.value.toSlug();
87
+ if ($old_title == $breadcrumb.value) $breadcrumb.value = $title.value;
88
+ $old_title = $title.value;
89
+ }
90
+ Event.observe('page_title', 'keyup', title_updated);
91
+ // ]]>
92
+ </script>
93
+ </div>
94
+ <p class="more-or-less">
95
+ <small>
96
+ <a href="<%= toggle_javascript_for('extended-metadata') %>"<%= meta_visible(:meta_more) %> id="more-extended-metadata">More</a>
97
+ <a href="<%= toggle_javascript_for('extended-metadata') %>"<%= meta_visible(:meta_less) %> id="less-extended-metadata">Less</a>
98
+ </small>
99
+ </p>
100
+ <div id="tab-control">
101
+ <div id="tabs" class="tabs">
102
+ <div id="tab-toolbar">
103
+ <%= link_to image_tag('plus'), 'javascript: toggle_add_part_popup()', :title => 'Add Tab' %>
104
+ <%= link_to image_tag('minus'), 'javascript: tabControl.removeTab(tabControl.selected)', :title => 'Remove Tab', :confirm => 'Delete the current tab?' %>
105
+ </div>
106
+ </div>
107
+ <div id="pages" class="pages">
108
+ <%= render :partial => 'part', :collection => @page.parts %>
109
+ </div>
110
+ </div>
111
+ <script type="text/javascript">
112
+ // <![CDATA[
113
+ var tabControl = new TabControl('tab-control');
114
+ <%
115
+ @index = 0
116
+ for @part in @page.parts do
117
+ @index += 1
118
+ -%>
119
+ tabControl.addTab('tab-<%= @index %>', '<%= @part.name %>', 'page-<%= @index %>');
120
+ <%
121
+ end
122
+ -%>
123
+ tabControl.select(tabControl.firstTab());
124
+ // ]]>
125
+ </script>
126
+ <div class="row">
127
+ <p><label for="page_layout_id">Layout</label>
128
+ <%= select "page", "layout_id", [['<inherit>', '']] + Layout.find_all.map { |s| [s.name, s.id] } %></p>
129
+ <p><label for="page_behavior">Behavior</label>
130
+ <%= select "page", "behavior_id", [['<none>', '']] + Behavior.find_all.map { |s| s.registered_id } %></p>
131
+ <p><label for="page_status_id">Status</label>
132
+ <%= select "page", "status_id", Status.find_all.map { |s| [s.name, s.id] } %></p>
133
+ </div>
134
+ <span class="clear">&nbsp;</span>
135
+ <%= updated_stamp @page %>
136
+ </div>
137
+ <p class="buttons">
138
+ <%= save_model_button(@page) %> <%= save_model_and_continue_editing_button(@page) %> or <%= link_to "Cancel", page_index_url %>
139
+ </p>
140
+ </form>
141
+
142
+ <div id="popups">
143
+ <div class="popup" id="add-part-popup" style="display:none;">
144
+ <div id="busy" class="busy" style="display: none"><%= image_tag 'spinner.gif' %></div>
145
+ <h3>Add Part</h3>
146
+ <%= form_remote_tag(
147
+ :url => page_add_part_url,
148
+ :update => "pages",
149
+ :position => :bottom,
150
+ :loading => 'part_loading()',
151
+ :complete => 'part_added()',
152
+ :condition => 'valid_part_name()'
153
+ ) %>
154
+ <div>
155
+ <%= hidden_field_tag 'index', @index + 1, :id => 'part-index-field' %>
156
+ <%= text_field_tag "part[name]", "", :id => 'part-name-field', :maxlength => 100 %>
157
+ <%= submit_tag "Add Part", :id => 'add-part-button' %>
158
+ </div>
159
+ <p><%= link_to_function 'Close', "Element.hide('add-part-popup')", :class => 'close-link' %></p>
160
+ <%= end_form_tag %>
161
+ </div>
162
+ </div>
163
+
164
+ <%= focus 'page_title' %>
@@ -0,0 +1,14 @@
1
+ <% pages = pluralize(@page.children.count + 1, 'Page') -%>
2
+
3
+ <h1 id="remove_article">Remove <%= pages %></h1>
4
+ <p>Are you sure you want to <strong class="warning">permanently remove</strong> the following <%= pages.downcase %>?</p>
5
+
6
+ <table id="site-map" class="index" cellpadding="0" cellspacing="0" border="0">
7
+ <tbody>
8
+ <%= render_node @page, :simple => true -%>
9
+ </tbody>
10
+ </table>
11
+
12
+ <form method="post">
13
+ <p class="buttons"><%= submit_tag "Delete #{pages}", :class => 'button' %> or <%= link_to 'Cancel', page_index_url %></p>
14
+ </form>
@@ -0,0 +1,36 @@
1
+ <h1>Snippets</h1>
2
+
3
+ <p>Snippets are generally small pieces of content which are included in other pages or layouts.</p>
4
+
5
+ <table id="snippets" class="index" cellpadding="0" cellspacing="0" border="0">
6
+ <thead>
7
+ <tr>
8
+ <th class="snippet">Snippet</th>
9
+ <th class="modify">Modify</th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <% unless @snippets.empty? -%>
14
+ <% for snippet in @snippets -%>
15
+ <tr class="node level-1">
16
+ <td class="snippet">
17
+ <%= image_tag "snippet", :class => "icon", :alt => 'snippet-icon', :title => '', :align => 'center' %>
18
+ <%= link_to snippet.name, snippet_edit_url(:id => snippet) %></span>
19
+ </td>
20
+ <td class="remove"><%= link_to image_tag('remove', :alt => 'Remove Snippet'), snippet_remove_url(:id => snippet) %></td>
21
+ </tr>
22
+ <% end -%>
23
+ <% else -%>
24
+ <tr>
25
+ <td colspan="2" class="note">No Snippets</td>
26
+ </tr>
27
+ <% end -%>
28
+ </tbody>
29
+ </table>
30
+ <script type="text/javascript">
31
+ // <![CDATA[
32
+ new RuledTable('snippets');
33
+ // ]]>
34
+ </script>
35
+
36
+ <p><%= link_to image_tag('new-snippet', :alt => 'New Snippet'), snippet_new_url %></p>
@@ -0,0 +1,28 @@
1
+ <% if @snippet.new_record? -%>
2
+ <h1>New Snippet</h1>
3
+ <% else -%>
4
+ <h1>Edit Snippet</h1>
5
+ <% end -%>
6
+
7
+ <form method="post">
8
+ <div class="form-area">
9
+ <p class="title">
10
+ <label for="snippet_name">Name</label>
11
+ <%= text_field "snippet", "name", :class => 'textbox', :maxlength => 100 %>
12
+ </p>
13
+
14
+ <p class="content">
15
+ <label for="snippet_content">Body</label>
16
+ <%= text_area "snippet", "content", :class => "textarea", :style => "width: 100%" %></p>
17
+ <p>
18
+ <label for="snippet_filter">Filter</label>
19
+ <%= select_tag "snippet[filter_id]", options_for_select([['none', '']] + TextFilter.find_all.map { |f| f.registered_id }, @snippet.filter_id) %>
20
+ </p>
21
+ <%= updated_stamp @snippet %>
22
+ </div>
23
+ <p class="buttons">
24
+ <%= save_model_button(@snippet) %> <%= save_model_and_continue_editing_button(@snippet) %> or <%= link_to "Cancel", snippet_index_url %>
25
+ </p>
26
+ </form>
27
+
28
+ <%= focus 'snippet_name' %>
@@ -0,0 +1,16 @@
1
+ <h1>Remove Snippet</h1>
2
+ <p>Are you sure you want to <strong class="warning">permanently remove</strong> the following snippet?</p>
3
+
4
+ <table id="snippets" class="index" cellpadding="0" cellspacing="0" border="0">
5
+ <tbody>
6
+ <tr class="node level-1" onmouseover="Element.addClassName(this, 'highlight');" onmouseout="Element.removeClassName(this, 'highlight');">
7
+ <td class="snippet">
8
+ <%= @snippet.name %>
9
+ </td>
10
+ </tr>
11
+ </tbody>
12
+ </table>
13
+
14
+ <form method="post">
15
+ <p class="buttons"><%= submit_tag "Delete Snippet", :class => 'button' %> or <%= link_to 'Cancel', snippet_index_url %></p>
16
+ </form>