outpost-cms 0.0.3

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 (168) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +295 -0
  3. data/Rakefile +26 -0
  4. data/app/assets/images/glyphicons-halflings-red.png +0 -0
  5. data/app/assets/javascripts/outpost/application.js +1 -0
  6. data/app/assets/javascripts/outpost/auto_slug_field.js.coffee +53 -0
  7. data/app/assets/javascripts/outpost/base.js.coffee +1 -0
  8. data/app/assets/javascripts/outpost/date_time_input.js.coffee +108 -0
  9. data/app/assets/javascripts/outpost/field_counter.js.coffee +93 -0
  10. data/app/assets/javascripts/outpost/field_manager.js.coffee +37 -0
  11. data/app/assets/javascripts/outpost/global_plugins.js.coffee +87 -0
  12. data/app/assets/javascripts/outpost/index_manager.js.coffee +88 -0
  13. data/app/assets/javascripts/outpost/notification.js.coffee +46 -0
  14. data/app/assets/javascripts/outpost/preview.js.coffee +60 -0
  15. data/app/assets/javascripts/outpost/templates/date_field.jst.eco +3 -0
  16. data/app/assets/javascripts/outpost/templates/loading.jst.eco +11 -0
  17. data/app/assets/javascripts/outpost/templates/slug_generate_button.jst.eco +1 -0
  18. data/app/assets/javascripts/outpost/templates/time_field.jst.eco +3 -0
  19. data/app/assets/javascripts/outpost/templates.js +1 -0
  20. data/app/assets/javascripts/outpost.js +32 -0
  21. data/app/assets/stylesheets/outpost/_base.css.scss +127 -0
  22. data/app/assets/stylesheets/outpost/_edit.css.scss +13 -0
  23. data/app/assets/stylesheets/outpost/_forms.css.scss +116 -0
  24. data/app/assets/stylesheets/outpost/_index.css.scss +68 -0
  25. data/app/assets/stylesheets/outpost/_utility.css.scss +16 -0
  26. data/app/assets/stylesheets/outpost/application.css.scss +1 -0
  27. data/app/assets/stylesheets/outpost/bootstrap/bootstrap.css.scss +49 -0
  28. data/app/assets/stylesheets/outpost/bootstrap/datepicker.css.scss +301 -0
  29. data/app/assets/stylesheets/outpost.css.scss +14 -0
  30. data/app/controllers/outpost/application_controller.rb +40 -0
  31. data/app/controllers/outpost/base_controller.rb +3 -0
  32. data/app/controllers/outpost/errors_controller.rb +9 -0
  33. data/app/controllers/outpost/home_controller.rb +2 -0
  34. data/app/controllers/outpost/resource_controller.rb +12 -0
  35. data/app/controllers/outpost/sessions_controller.rb +36 -0
  36. data/app/helpers/authorization_helper.rb +44 -0
  37. data/app/helpers/list_helper.rb +243 -0
  38. data/app/helpers/outpost_helper.rb +49 -0
  39. data/app/helpers/render_helper.rb +41 -0
  40. data/app/helpers/utility_helper.rb +136 -0
  41. data/app/inputs/date_time_input.rb +12 -0
  42. data/app/models/permission.rb +18 -0
  43. data/app/models/user_permission.rb +4 -0
  44. data/app/views/kaminari/bootstrap/_first_page.html.erb +3 -0
  45. data/app/views/kaminari/bootstrap/_gap.html.erb +3 -0
  46. data/app/views/kaminari/bootstrap/_last_page.html.erb +3 -0
  47. data/app/views/kaminari/bootstrap/_next_page.html.erb +3 -0
  48. data/app/views/kaminari/bootstrap/_page.html.erb +3 -0
  49. data/app/views/kaminari/bootstrap/_paginator.html.erb +17 -0
  50. data/app/views/kaminari/bootstrap/_prev_page.html.erb +3 -0
  51. data/app/views/layouts/outpost/application.html.erb +101 -0
  52. data/app/views/layouts/outpost/minimal.html.erb +26 -0
  53. data/app/views/outpost/errors/error_404.html.erb +1 -0
  54. data/app/views/outpost/errors/error_500.html.erb +8 -0
  55. data/app/views/outpost/home/dashboard.html.erb +1 -0
  56. data/app/views/outpost/resource/_errors.html.erb +11 -0
  57. data/app/views/outpost/resource/_extra_fields.html.erb +1 -0
  58. data/app/views/outpost/resource/_form_fields.html.erb +9 -0
  59. data/app/views/outpost/resource/edit.html.erb +44 -0
  60. data/app/views/outpost/resource/index.html.erb +22 -0
  61. data/app/views/outpost/resource/new.html.erb +21 -0
  62. data/app/views/outpost/resource/search.html.erb +1 -0
  63. data/app/views/outpost/resource/show.html.erb +1 -0
  64. data/app/views/outpost/sessions/new.html.erb +16 -0
  65. data/app/views/outpost/shared/_add_link.html.erb +1 -0
  66. data/app/views/outpost/shared/_breadcrumbs.html.erb +15 -0
  67. data/app/views/outpost/shared/_cancel_link.html.erb +1 -0
  68. data/app/views/outpost/shared/_columns.html.erb +5 -0
  69. data/app/views/outpost/shared/_filters.html.erb +16 -0
  70. data/app/views/outpost/shared/_flash_messages.html.erb +6 -0
  71. data/app/views/outpost/shared/_form_block.html.erb +18 -0
  72. data/app/views/outpost/shared/_form_nav.html.erb +12 -0
  73. data/app/views/outpost/shared/_headers.html.erb +16 -0
  74. data/app/views/outpost/shared/_index_header.html.erb +4 -0
  75. data/app/views/outpost/shared/_list_table.html.erb +7 -0
  76. data/app/views/outpost/shared/_modal.html.erb +16 -0
  77. data/app/views/outpost/shared/_navigation.html.erb +31 -0
  78. data/app/views/outpost/shared/_notice.html.erb +1 -0
  79. data/app/views/outpost/shared/_pagination.html.erb +2 -0
  80. data/app/views/outpost/shared/_preview_errors.html.erb +9 -0
  81. data/app/views/outpost/shared/_submit_row.html.erb +50 -0
  82. data/config/routes.rb +4 -0
  83. data/lib/action_view/helpers/form_builder.rb +71 -0
  84. data/lib/outpost/breadcrumbs.rb +73 -0
  85. data/lib/outpost/config.rb +63 -0
  86. data/lib/outpost/controller/actions.rb +72 -0
  87. data/lib/outpost/controller/authentication.rb +34 -0
  88. data/lib/outpost/controller/authorization.rb +28 -0
  89. data/lib/outpost/controller/callbacks.rb +14 -0
  90. data/lib/outpost/controller/custom_errors.rb +41 -0
  91. data/lib/outpost/controller/filtering.rb +22 -0
  92. data/lib/outpost/controller/helpers.rb +52 -0
  93. data/lib/outpost/controller/ordering.rb +46 -0
  94. data/lib/outpost/controller/preferences.rb +71 -0
  95. data/lib/outpost/controller.rb +123 -0
  96. data/lib/outpost/engine.rb +10 -0
  97. data/lib/outpost/helpers/naming.rb +22 -0
  98. data/lib/outpost/helpers.rb +6 -0
  99. data/lib/outpost/hook.rb +35 -0
  100. data/lib/outpost/list/base.rb +78 -0
  101. data/lib/outpost/list/column.rb +24 -0
  102. data/lib/outpost/list/filter.rb +37 -0
  103. data/lib/outpost/list.rb +15 -0
  104. data/lib/outpost/model/authentication.rb +34 -0
  105. data/lib/outpost/model/authorization.rb +32 -0
  106. data/lib/outpost/model/identifier.rb +39 -0
  107. data/lib/outpost/model/methods.rb +23 -0
  108. data/lib/outpost/model/naming.rb +63 -0
  109. data/lib/outpost/model/routing.rb +138 -0
  110. data/lib/outpost/model/serializer.rb +27 -0
  111. data/lib/outpost/model.rb +22 -0
  112. data/lib/outpost/test.rb +21 -0
  113. data/lib/outpost/version.rb +3 -0
  114. data/lib/outpost-cms.rb +2 -0
  115. data/lib/outpost.rb +80 -0
  116. data/lib/tasks/outpost_tasks.rake +7 -0
  117. data/spec/controllers/authentication_spec.rb +62 -0
  118. data/spec/controllers/sessions_controller_spec.rb +99 -0
  119. data/spec/factories.rb +31 -0
  120. data/spec/helpers/authorization_helper_spec.rb +47 -0
  121. data/spec/helpers/list_helper_spec.rb +74 -0
  122. data/spec/helpers/outpost_helper_spec.rb +5 -0
  123. data/spec/helpers/render_helper_spec.rb +19 -0
  124. data/spec/helpers/utility_helper_spec.rb +53 -0
  125. data/spec/internal/app/controllers/application_controller.rb +3 -0
  126. data/spec/internal/app/controllers/outpost/people_controller.rb +23 -0
  127. data/spec/internal/app/controllers/outpost/pidgeons_controller.rb +5 -0
  128. data/spec/internal/app/controllers/people_controller.rb +9 -0
  129. data/spec/internal/app/controllers/pidgeons_controller.rb +3 -0
  130. data/spec/internal/app/models/person.rb +10 -0
  131. data/spec/internal/app/models/pidgeon.rb +3 -0
  132. data/spec/internal/app/models/post.rb +4 -0
  133. data/spec/internal/app/models/user.rb +4 -0
  134. data/spec/internal/app/views/people/index.html.erb +7 -0
  135. data/spec/internal/app/views/people/show.html.erb +1 -0
  136. data/spec/internal/config/database.yml +3 -0
  137. data/spec/internal/config/initializers/configuration.rb +3 -0
  138. data/spec/internal/config/initializers/outpost.rb +6 -0
  139. data/spec/internal/config/routes.rb +16 -0
  140. data/spec/internal/db/combustion_test.sqlite +0 -0
  141. data/spec/internal/db/schema.rb +44 -0
  142. data/spec/internal/db/seeds.rb +14 -0
  143. data/spec/internal/log/test.log +59277 -0
  144. data/spec/internal/public/favicon.ico +0 -0
  145. data/spec/lib/breadcrumbs_spec.rb +54 -0
  146. data/spec/lib/config_spec.rb +76 -0
  147. data/spec/lib/controller/actions_spec.rb +5 -0
  148. data/spec/lib/controller/authorization_spec.rb +4 -0
  149. data/spec/lib/controller/callbacks_spec.rb +31 -0
  150. data/spec/lib/controller/helpers_spec.rb +33 -0
  151. data/spec/lib/controller_spec.rb +25 -0
  152. data/spec/lib/helpers/naming_spec.rb +10 -0
  153. data/spec/lib/hook_spec.rb +13 -0
  154. data/spec/lib/list/base_spec.rb +96 -0
  155. data/spec/lib/list/column_spec.rb +46 -0
  156. data/spec/lib/list/filter_spec.rb +44 -0
  157. data/spec/lib/model/authentication_spec.rb +29 -0
  158. data/spec/lib/model/authorization_spec.rb +66 -0
  159. data/spec/lib/model/identifier_spec.rb +51 -0
  160. data/spec/lib/model/methods_spec.rb +8 -0
  161. data/spec/lib/model/naming_spec.rb +55 -0
  162. data/spec/lib/model/routing_spec.rb +166 -0
  163. data/spec/lib/model/serializer_spec.rb +13 -0
  164. data/spec/lib/outpost_spec.rb +34 -0
  165. data/spec/models/permission_spec.rb +10 -0
  166. data/spec/models/user_permission_spec.rb +4 -0
  167. data/spec/spec_helper.rb +22 -0
  168. metadata +411 -0
@@ -0,0 +1,8 @@
1
+ <h3>Server Error.</h3>
2
+
3
+ <pre>
4
+ <%= Time.now %>
5
+ <%= request.url %>
6
+
7
+ <%= error.to_yaml %>
8
+ </pre>
@@ -0,0 +1 @@
1
+ <h2>Dashboard!</h2>
@@ -0,0 +1,11 @@
1
+ <% if f.object.errors[:base].present? %>
2
+ <div class="alert alert-error">
3
+ <ul class="unstyled" style="margin-bottom: 0">
4
+ <% f.object.errors[:base].each do |message| %>
5
+ <li><%= message %></li>
6
+ <% end %>
7
+ </ul>
8
+ </div>
9
+ <% else %>
10
+ <%= f.error_notification %>
11
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= hidden_field_tag :obj_key, f.object.obj_key %>
@@ -0,0 +1,9 @@
1
+ <% fields.each do |field| %>
2
+ <% association = field.gsub(/_id/, "").to_sym %>
3
+ <% reflection = f.object.class.reflect_on_association(association) %>
4
+ <% if reflection && !reflection.options[:polymorphic] %>
5
+ <%= f.association association %>
6
+ <% else %>
7
+ <%= f.input field %>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,44 @@
1
+ <% add_to_page_title "Editing: #{@record.to_title}" %>
2
+
3
+ <%= simple_form_for [:outpost, @record], html: { class: "form-horizontal" } do |f| %>
4
+ <%= render 'errors', f: f %>
5
+ <%= render 'form_fields', record: @record, f: f %>
6
+ <%= render 'extra_fields', f: f %>
7
+ <%= render "/outpost/shared/submit_row", record: @record %>
8
+ <% end %>
9
+
10
+ <% content_for :sidebar do %>
11
+ <ul class="story-status unstyled">
12
+ <li>
13
+ Last Updated: <strong><%= format_date @record.updated_at, time: true %></strong>
14
+ </li>
15
+
16
+ <li>
17
+ <% if @record.respond_to? :status_text %>
18
+ <span class="<%=status_bootstrap_map[@record.status]%>"><%= @record.status_text %></span>
19
+ <% end %>
20
+
21
+ <% if @record.respond_to?(:published_at) && @record.respond_to?(:published?) && @record.published? %>
22
+ on <strong><%= format_date @record.published_at, time: true %></strong>
23
+ <% end %>
24
+
25
+ <% if @record.respond_to?(:publish_alarm) && @record.publish_alarm.present? && @record.publish_alarm.fire_at.present? %>
26
+ Alarm - <strong><%= format_date @record.publish_alarm.fire_at, time: true %></strong>
27
+ <% end %>
28
+ </li>
29
+ </ul>
30
+
31
+ <hr />
32
+
33
+ <div id="fixed-sidebar" data-spy="affix" data-offset-top="140">
34
+ <!-- Be sure to change the data-offset-top attribute on this element if you move it vertically -->
35
+ <%= render "/outpost/shared/form_nav" %>
36
+ </div>
37
+ <% end %>
38
+
39
+
40
+ <% content_for :footer do %>
41
+ <script>
42
+ preview = new outpost.Preview({baseUrl: '<%= @record.admin_show_path %>'});
43
+ </script>
44
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <% add_to_page_title model.to_title.pluralize %>
2
+
3
+ <%= render "/outpost/shared/index_header", model: model %>
4
+
5
+ <%= list_table @records, model do %>
6
+ <thead>
7
+ <tr>
8
+ <%= render "/outpost/shared/headers", list: list %>
9
+ </tr>
10
+ </thead>
11
+ <tbody class="list">
12
+ <% @records.each do |record| %>
13
+ <tr class="<%= model.singular_route_key.dasherize %>">
14
+ <td class="column-manage">
15
+ <%= link_to "Edit", record.admin_edit_path, class: "btn" %>
16
+ </td>
17
+
18
+ <%= render "/outpost/shared/columns", list: list, record: record %>
19
+ </tr>
20
+ <% end %>
21
+ </tbody>
22
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% add_to_page_title "Add #{model.to_title}" %>
2
+
3
+ <%= simple_form_for [:outpost, @record], html: { class: "form-horizontal" } do |f| %>
4
+ <%= render 'errors', f: f %>
5
+ <%= render 'form_fields', record: @record, f: f %>
6
+ <%= render 'extra_fields', f: f %>
7
+ <%= render "/outpost/shared/submit_row", record: @record %>
8
+ <% end %>
9
+
10
+ <% content_for :sidebar do %>
11
+ <div id="fixed-sidebar" data-spy="affix" data-offset-top="30">
12
+ <!-- Be sure to change the data-offset-top attribute on this element if you move it vertically -->
13
+ <%= render "/outpost/shared/form_nav" %>
14
+ </div>
15
+ <% end %>
16
+
17
+ <% content_for :footer do %>
18
+ <script>
19
+ preview = new outpost.Preview({baseUrl: '<%= model.admin_index_path %>'});
20
+ </script>
21
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= render template: '/outpost/resource/index' %>
@@ -0,0 +1 @@
1
+ <h2><%= @record.to_title %></h2>
@@ -0,0 +1,16 @@
1
+ <% add_to_page_title "Login" %>
2
+
3
+ <%= form_tag outpost_sessions_path, id: "login" do %>
4
+ <fieldset>
5
+ <legend>Login</legend>
6
+ <%= label_tag @authentication_attribute %>
7
+ <%= text_field_tag @authentication_attribute, nil, autofocus: "autofocus" %>
8
+
9
+ <%= label_tag "Password" %>
10
+ <%= password_field_tag :password, nil, id: "password" %>
11
+ </fieldset>
12
+
13
+ <div class="form-actions">
14
+ <%= submit_tag "Submit", class: "btn" %>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= link_to content_tag(:i, "", class: "icon-plus-sign icon-white") + " Add #{model.to_title}", model.admin_new_path, class: "btn btn-success pull-right" %>
@@ -0,0 +1,15 @@
1
+ <ul class="breadcrumb">
2
+ <% breadcrumbs.each do |crumb| %>
3
+ <li>
4
+ <% if crumb.link.present? %>
5
+ <%= link_to crumb.title, crumb.link %>
6
+ <% else %>
7
+ <%= crumb.title %>
8
+ <% end %>
9
+
10
+ <% unless crumb == breadcrumbs.last %>
11
+ <span class="divider">/</span>
12
+ <% end %>
13
+ </li>
14
+ <% end %>
15
+ </ul>
@@ -0,0 +1 @@
1
+ <a href="<%=href%>" title="Reset this filter" class="cancel-link"><i class="icon-remove icon-red"></i></a>
@@ -0,0 +1,5 @@
1
+ <% list.columns.each do |attribute, column| %>
2
+ <td data-id="<%=record.id%>" class="<%=column_attribute_class(column.attribute)%> <%=column_type_class(model, column.attribute)%>" data-attribute="<%=column.attribute.parameterize%>"<% if column.quick_edit? %> data-updatable="true"<% end %>>
3
+ <%= render_attribute column, record %>
4
+ </td>
5
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <% if list.filters.present? %>
2
+ <div class="filters pull-left" style="margin-right:40px;">
3
+ <span class="filter label">Filter by:</span>
4
+
5
+ <%= form_tag model.admin_index_path, method: :get, class: "form-inline" do %>
6
+ <% list.filters.each do |attribute, filter| %>
7
+ <%= select_tag attribute,
8
+ options_for_select(filter.collection.call, params[:filter].present? ? params[:filter][attribute] : nil), include_blank: true,
9
+ data: { placeholder: filter.title }, name: "filter[#{attribute}]", class: "input-medium" %>
10
+ <% end %>
11
+
12
+ <%= submit_tag "Go", class: "btn" %>
13
+ <%= render "/outpost/shared/cancel_link", href: url_for(request.parameters.except("filter")) %>
14
+ <% end %>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <% flash.each do |name, msg| %>
2
+ <div class="alert alert-<%= flash_alert_type(name) %>">
3
+ <a class="close" data-dismiss="alert">&times;</a>
4
+ <%= msg.to_s.html_safe %>
5
+ </div>
6
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <% if title.present? %>
2
+ <% id = "form-block-#{title.parameterize}" %>
3
+ <% @sections[id] = title if @sections %>
4
+ <fieldset class="form-block" id="<%=id%>">
5
+ <legend><%= title %></legend>
6
+
7
+ <div class="hidden notification">
8
+ <p class="muted"><i>Click header to show fields</i></p>
9
+ </div>
10
+
11
+ <% else %>
12
+ <fieldset class="form-block">
13
+ <% end %>
14
+
15
+ <div class="fields">
16
+ <%= body %>
17
+ </div>
18
+ </fieldset>
@@ -0,0 +1,12 @@
1
+ <% if @sections.present? %>
2
+ <h5>Jump to Section</h5>
3
+ <div id="form-nav">
4
+ <ul class="nav nav-list">
5
+ <% @sections.each do |id, title| %>
6
+ <li><a href="#<%=id%>"><%= title %></a></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+
11
+ <hr />
12
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <th class="column-manage">Manage</th>
2
+
3
+ <% list.columns.each do |attribute, column| %>
4
+ <% is_sorting = order == column.attribute.to_s %>
5
+
6
+ <th class="<%='header-highlighted' if is_sorting%> <%='header-sortable' if column.sortable?%> <%=column_attribute_class(column.attribute)%> <%=column_type_class(model, column.attribute)%>">
7
+ <% if column.sortable? || is_sorting %>
8
+ <i class="icon <%=sort_mode_icon(is_sorting ? sort_mode : column.default_sort_mode)%>"></i>
9
+
10
+ <%= link_to_if column.sortable?, column.header, request.parameters.merge(order: column.attribute, sort_mode: switch_sort_mode(column, order, sort_mode)), class: "js-sort-link" %>
11
+ <%= render('/outpost/shared/cancel_link', href: url_for(request.parameters.merge(order: "", sort_mode: ""))) if (is_sorting && (order != list.default_order || sort_mode != list.default_sort_mode)) %>
12
+ <% else %>
13
+ <%= column.header %>
14
+ <% end %>
15
+ </th>
16
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <div class="index-header clearfix">
2
+ <%= render "/outpost/shared/filters" %>
3
+ <%= render "/outpost/shared/add_link" %>
4
+ </div>
@@ -0,0 +1,7 @@
1
+ <table class="table table-striped index-list list-<%=model.route_key%>">
2
+ <%= any_to_list? records, message: "No #{model.to_title.pluralize} were found." do %>
3
+ <%= table %>
4
+ <% end %>
5
+ </table>
6
+
7
+ <%= render "/outpost/shared/pagination", records: records %>
@@ -0,0 +1,16 @@
1
+ <a class="btn btn-primary" href="#<%=options[:id]%>" data-toggle="modal"><%= options[:title] %></a>
2
+
3
+ <div id="<%= options[:id] %>" class="modal hide fade" role="dialog">
4
+ <div class="modal-header">
5
+ <button type="button" class="close" data-dismiss="modal">x</button>
6
+ <h3><%= options[:title] %></h3>
7
+ </div>
8
+
9
+ <div class="modal-body">
10
+ <%= body %>
11
+ </div>
12
+
13
+ <div class="modal-footer">
14
+ <button class="btn" data-dismiss="modal">Close</button>
15
+ </div>
16
+ </div>
@@ -0,0 +1,31 @@
1
+ <li class="dropdown">
2
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-align-justify icon-white"></i> Navigation <b class="caret"></b></a>
3
+ <% models = current_user.allowed_resources.sort_by(&:name) %>
4
+ <% per_col = 20 %>
5
+ <% cols = (models.size.to_f / per_col.to_f).ceil %>
6
+
7
+ <ul class="dropdown-menu cms-nav" style="width:<%= cols * 400 + cols * 10 %>px">
8
+ <% models.each_with_index do |model, index| %>
9
+ <% if index % per_col == 0 %>
10
+ <div class="grouper">
11
+ <% end %>
12
+
13
+ <li>
14
+ <a href="<%=model.admin_index_path%>">
15
+ <%= model.name.titleize.pluralize %>
16
+ </a>
17
+
18
+ <div class="btn-links">
19
+ <% if model.respond_to?(:admin_new_path) %>
20
+ <a class="add btn btn-mini" href="<%=model.admin_new_path%>"><i class="icon-plus-sign"></i> Add</a>
21
+ <% end %>
22
+ </div>
23
+ </li>
24
+
25
+ <% if index % per_col == per_col - 1 or model == models.last %>
26
+ </div>
27
+ <% end %>
28
+
29
+ <% end %>
30
+ </ul> <!-- dropdown-menu -->
31
+ </li> <!-- dropdown -->
@@ -0,0 +1 @@
1
+ <div class="alert alert-info"><%= message %></div>
@@ -0,0 +1,2 @@
1
+ <%= paginate records, theme: 'bootstrap', window: 3, left: 1, right: 2 %>
2
+ <strong><%= records.size %> records on this page</strong>
@@ -0,0 +1,9 @@
1
+ <div class="alert alert-error">
2
+ This <%= record.class.to_title %> can't be previewed until the following problems are corrected:
3
+
4
+ <ul style="margin-bottom: 0;">
5
+ <% record.errors.full_messages.each do |message| %>
6
+ <li><%= message %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
@@ -0,0 +1,50 @@
1
+ <!-- This block is part of a form -->
2
+ <div class="form-actions submit-row">
3
+ <div class="container">
4
+ <div class="btn-group dropup pull-left">
5
+ <%= button_tag "Save", name: "commit_action", value: "edit", class: "btn btn-primary btn-large span2" %>
6
+ <button class="btn btn-primary btn-large dropdown-toggle" data-toggle="dropdown">
7
+ <span class="caret"></span>
8
+ </button>
9
+ <ul class="dropdown-menu">
10
+ <li><%= button_tag "Save &amp; Add Another".html_safe, name: "commit_action", value: "new" %></li>
11
+ <li><%= button_tag "Save &amp; Return to List".html_safe, name: "commit_action", value: "index" %></li>
12
+ </ul>
13
+ </div>
14
+
15
+ <div class="pull-right">
16
+ <% if controller.action_methods.include? "preview" %>
17
+ <div class="btn-group dropup" id="preview-submit">
18
+ <a href="#" class="btn btn-info js-preview-btn" data-window-options="width=1200,height=1000">Preview</a>
19
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown">
20
+ <span class="caret"></span>
21
+ </button>
22
+ <ul class="dropdown-menu">
23
+ <li><a href="#" class="js-preview-btn" data-window-options="width=320,height=480">Mobile Portrait (320x480)</a></li>
24
+ <li><a href="#" class="js-preview-btn" data-window-options="width=480,height=320">Mobile Landscape (480x320)</a></li>
25
+ <li><a href="#" class="js-preview-btn" data-window-options="width=768,height=1024">Tablet Portrait (768x1024)</a></li>
26
+ <li><a href="#" class="js-preview-btn" data-window-options="width=1024,height=768">Tablet Landscape (1024x768)</a></li>
27
+ <li><a href="#" class="js-preview-btn" data-window-options="width=960,height=900">Small Desktop (960x900)</a></li>
28
+ </ul>
29
+ </div>
30
+ <% end %>
31
+
32
+ <% if record.persisted? %>
33
+ <%= link_to("View Live", record.public_path, class: "btn btn-success", target: "_blank") if record.public_path.present? %>
34
+ <%= link_to("Delete",
35
+ [:outpost, record],
36
+ class: "btn btn-danger",
37
+ method: :delete,
38
+ data: { confirm: "Click OK to delete this #{model.to_title}.\nClick CANCEL to return to editing." }
39
+ ) %>
40
+ <% end %>
41
+ </div> <!-- pull-right -->
42
+ </div> <!-- container -->
43
+ </div> <!-- form-actions -->
44
+
45
+
46
+ <% content_for :footer do %>
47
+ <script>
48
+ field_manager = new outpost.FieldManager();
49
+ </script>
50
+ <% end %>
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ Rails.application.routes.draw do
2
+ namespace :outpost do
3
+ end
4
+ end
@@ -0,0 +1,71 @@
1
+ ##
2
+ # This just adds a method to the FormBuilder which
3
+ # renders a "section" and passes in a few things:
4
+ #
5
+ # * f (which is the FormBuilder itself)
6
+ # * record (the object that the form builder is for)
7
+ # * extra (a block containing extra stuff to render)
8
+ #
9
+ # The section partial has to exist.
10
+ #
11
+ module ActionView
12
+ module Helpers
13
+ class FormBuilder
14
+ def section(partial, options={}, &block)
15
+ @template.render(
16
+ :partial => "/outpost/shared/sections/#{partial}",
17
+ :locals => {
18
+ :f => self,
19
+ :record => self.object,
20
+ :options => options,
21
+ :extra => block_given? ? @template.capture(&block) : ""
22
+ })
23
+ end
24
+
25
+ #----------------------
26
+
27
+ def render_fields(partial, options={})
28
+ @template.render(
29
+ :partial => "/outpost/shared/fields/#{partial}_fields",
30
+ :locals => {
31
+ :f => self,
32
+ :index => self.object.object_id,
33
+ :options => options
34
+ })
35
+ end
36
+
37
+ #----------------------
38
+
39
+ def link_to_add_fields(association, options={})
40
+ association = association.to_s
41
+ partial = options[:partial] || association.singularize
42
+ title = options[:title] || "Add Another #{association.singularize.titleize}"
43
+
44
+ new_object = self.object.send(association).klass.new
45
+ id = new_object.object_id
46
+
47
+ fields = self.simple_fields_for(association, new_object, child_index: id) do |nf|
48
+ nf.render_fields(partial)
49
+ end
50
+
51
+ @template.link_to(title, "#", class: "js-add-fields",
52
+ data: { id: id, build_target: options[:build_target], fields: fields.gsub("\n", "") })
53
+ end
54
+
55
+ #----------------------
56
+
57
+ def has_many_fields(association)
58
+ partial = association.to_s.singularize
59
+ fields = String.new
60
+
61
+ self.object.send(association).each do |obj|
62
+ fields << self.simple_fields_for(association, obj) do |nf|
63
+ nf.render_fields(partial)
64
+ end
65
+ end
66
+
67
+ fields.html_safe
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,73 @@
1
+ ##
2
+ # Outpost::Breadcrumbs
3
+ #
4
+ # Super-simple breadcrumbs for you and me.
5
+ # Include it into a controller
6
+ #
7
+ # Arguments:
8
+ # Pairs of strings. Title of breadcrumb, Path
9
+ #
10
+ # Usage:
11
+ # In the controller:
12
+ #
13
+ # class PostsController < ApplicationController
14
+ # def new
15
+ # breadcrumb "New", outpost_new_post_path
16
+ # @post = Post.new
17
+ # end
18
+ # end
19
+ #
20
+ # This module then makes the "breadcrumbs" helper
21
+ # available to you (and me), which can be used in
22
+ # your view:
23
+ #
24
+ # <% breadcrumbs.each do |crumb| %>
25
+ # <%= link_to crumb.title, crumb.link %>
26
+ # <% end %>
27
+ #
28
+ # You can also define multiple breadcrumbs at once.
29
+ # Every 2 arguments is a new breadcrumb:
30
+ #
31
+ # breadcrumb "Edit", outpost_edit_post_path(@post.id), @post.title, outpost_post_path(@post)
32
+ #
33
+ # Don't want the crumb to be linked? Just leave the
34
+ # second argument off, or +nil+ if you're defining
35
+ # multiple breadcrumbs:
36
+ #
37
+ # breadcrumb "Edit", nil, @post.title
38
+ #
39
+ module Outpost
40
+ class Breadcrumb
41
+ attr_accessor :title, :link
42
+ end
43
+
44
+ #---------------
45
+
46
+ module Breadcrumbs
47
+ extend ActiveSupport::Concern
48
+
49
+ included do
50
+ attr_reader :breadcrumbs
51
+
52
+ if self < ActionController::Base
53
+ helper_method :breadcrumbs
54
+ end
55
+ end
56
+
57
+ #--------------
58
+ # Use this method to add breadcrumbs.
59
+ # See Outpost::Breadcrumbs
60
+ # for usage.
61
+ def breadcrumb(*args)
62
+ @breadcrumbs ||= []
63
+
64
+ args.each_slice(2).map do |pair|
65
+ crumb = Outpost::Breadcrumb.new
66
+ crumb.title = pair[0]
67
+ crumb.link = pair[1]
68
+
69
+ @breadcrumbs.push crumb
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,63 @@
1
+ ##
2
+ # Outpost::Config
3
+ #
4
+ # Define configuration for Outpost
5
+ module Outpost
6
+ class Config
7
+ DEFAULTS = {
8
+ :title_attributes => [:name, :title],
9
+ :excluded_form_fields => ["id", "created_at", "updated_at"],
10
+ :excluded_list_columns => [],
11
+ :user_class => "User",
12
+ :authentication_attribute => :email,
13
+ :preferences => [:order, :sort_mode]
14
+ }
15
+
16
+ # Pass a block to this method to define the configuration
17
+ # If no block is passed, config will be defaults
18
+ def self.configure
19
+ yield Outpost.config if block_given?
20
+ Outpost.config
21
+ end
22
+
23
+ # An array of models that should show up
24
+ attr_writer :registered_models
25
+ def registered_models
26
+ @registered_models || []
27
+ end
28
+
29
+ attr_writer :preferences
30
+ def preferences
31
+ @preferences || DEFAULTS[:preferences]
32
+ end
33
+
34
+ attr_writer :user_class
35
+ def user_class
36
+ @user_class || DEFAULTS[:user_class]
37
+ end
38
+
39
+ # Which attribute to use to authenticate
40
+ attr_writer :authentication_attribute
41
+ def authentication_attribute
42
+ @authentication_attribute || DEFAULTS[:authentication_attribute]
43
+ end
44
+
45
+ # Which attributes to look at for `to_title`
46
+ attr_writer :title_attributes
47
+ def title_attributes
48
+ (@title_attributes ||= DEFAULTS[:title_attributes]) | [:simple_title]
49
+ end
50
+
51
+ # Ignore these attributes when building a basic form
52
+ attr_writer :excluded_form_fields
53
+ def excluded_form_fields
54
+ (@excluded_form_fields ||= []) | DEFAULTS[:excluded_form_fields]
55
+ end
56
+
57
+ # Ignore these attributes when building a basic list
58
+ attr_writer :excluded_list_columns
59
+ def excluded_list_columns
60
+ (@excluded_list_columns ||= []) | DEFAULTS[:excluded_list_columns]
61
+ end
62
+ end
63
+ end