outpost-cms 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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