outpost-cms 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +295 -0
- data/Rakefile +26 -0
- data/app/assets/images/glyphicons-halflings-red.png +0 -0
- data/app/assets/javascripts/outpost/application.js +1 -0
- data/app/assets/javascripts/outpost/auto_slug_field.js.coffee +53 -0
- data/app/assets/javascripts/outpost/base.js.coffee +1 -0
- data/app/assets/javascripts/outpost/date_time_input.js.coffee +108 -0
- data/app/assets/javascripts/outpost/field_counter.js.coffee +93 -0
- data/app/assets/javascripts/outpost/field_manager.js.coffee +37 -0
- data/app/assets/javascripts/outpost/global_plugins.js.coffee +87 -0
- data/app/assets/javascripts/outpost/index_manager.js.coffee +88 -0
- data/app/assets/javascripts/outpost/notification.js.coffee +46 -0
- data/app/assets/javascripts/outpost/preview.js.coffee +60 -0
- data/app/assets/javascripts/outpost/templates/date_field.jst.eco +3 -0
- data/app/assets/javascripts/outpost/templates/loading.jst.eco +11 -0
- data/app/assets/javascripts/outpost/templates/slug_generate_button.jst.eco +1 -0
- data/app/assets/javascripts/outpost/templates/time_field.jst.eco +3 -0
- data/app/assets/javascripts/outpost/templates.js +1 -0
- data/app/assets/javascripts/outpost.js +32 -0
- data/app/assets/stylesheets/outpost/_base.css.scss +127 -0
- data/app/assets/stylesheets/outpost/_edit.css.scss +13 -0
- data/app/assets/stylesheets/outpost/_forms.css.scss +116 -0
- data/app/assets/stylesheets/outpost/_index.css.scss +68 -0
- data/app/assets/stylesheets/outpost/_utility.css.scss +16 -0
- data/app/assets/stylesheets/outpost/application.css.scss +1 -0
- data/app/assets/stylesheets/outpost/bootstrap/bootstrap.css.scss +49 -0
- data/app/assets/stylesheets/outpost/bootstrap/datepicker.css.scss +301 -0
- data/app/assets/stylesheets/outpost.css.scss +14 -0
- data/app/controllers/outpost/application_controller.rb +40 -0
- data/app/controllers/outpost/base_controller.rb +3 -0
- data/app/controllers/outpost/errors_controller.rb +9 -0
- data/app/controllers/outpost/home_controller.rb +2 -0
- data/app/controllers/outpost/resource_controller.rb +12 -0
- data/app/controllers/outpost/sessions_controller.rb +36 -0
- data/app/helpers/authorization_helper.rb +44 -0
- data/app/helpers/list_helper.rb +243 -0
- data/app/helpers/outpost_helper.rb +49 -0
- data/app/helpers/render_helper.rb +41 -0
- data/app/helpers/utility_helper.rb +136 -0
- data/app/inputs/date_time_input.rb +12 -0
- data/app/models/permission.rb +18 -0
- data/app/models/user_permission.rb +4 -0
- data/app/views/kaminari/bootstrap/_first_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_gap.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_last_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_next_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_paginator.html.erb +17 -0
- data/app/views/kaminari/bootstrap/_prev_page.html.erb +3 -0
- data/app/views/layouts/outpost/application.html.erb +101 -0
- data/app/views/layouts/outpost/minimal.html.erb +26 -0
- data/app/views/outpost/errors/error_404.html.erb +1 -0
- data/app/views/outpost/errors/error_500.html.erb +8 -0
- data/app/views/outpost/home/dashboard.html.erb +1 -0
- data/app/views/outpost/resource/_errors.html.erb +11 -0
- data/app/views/outpost/resource/_extra_fields.html.erb +1 -0
- data/app/views/outpost/resource/_form_fields.html.erb +9 -0
- data/app/views/outpost/resource/edit.html.erb +44 -0
- data/app/views/outpost/resource/index.html.erb +22 -0
- data/app/views/outpost/resource/new.html.erb +21 -0
- data/app/views/outpost/resource/search.html.erb +1 -0
- data/app/views/outpost/resource/show.html.erb +1 -0
- data/app/views/outpost/sessions/new.html.erb +16 -0
- data/app/views/outpost/shared/_add_link.html.erb +1 -0
- data/app/views/outpost/shared/_breadcrumbs.html.erb +15 -0
- data/app/views/outpost/shared/_cancel_link.html.erb +1 -0
- data/app/views/outpost/shared/_columns.html.erb +5 -0
- data/app/views/outpost/shared/_filters.html.erb +16 -0
- data/app/views/outpost/shared/_flash_messages.html.erb +6 -0
- data/app/views/outpost/shared/_form_block.html.erb +18 -0
- data/app/views/outpost/shared/_form_nav.html.erb +12 -0
- data/app/views/outpost/shared/_headers.html.erb +16 -0
- data/app/views/outpost/shared/_index_header.html.erb +4 -0
- data/app/views/outpost/shared/_list_table.html.erb +7 -0
- data/app/views/outpost/shared/_modal.html.erb +16 -0
- data/app/views/outpost/shared/_navigation.html.erb +31 -0
- data/app/views/outpost/shared/_notice.html.erb +1 -0
- data/app/views/outpost/shared/_pagination.html.erb +2 -0
- data/app/views/outpost/shared/_preview_errors.html.erb +9 -0
- data/app/views/outpost/shared/_submit_row.html.erb +50 -0
- data/config/routes.rb +4 -0
- data/lib/action_view/helpers/form_builder.rb +71 -0
- data/lib/outpost/breadcrumbs.rb +73 -0
- data/lib/outpost/config.rb +63 -0
- data/lib/outpost/controller/actions.rb +72 -0
- data/lib/outpost/controller/authentication.rb +34 -0
- data/lib/outpost/controller/authorization.rb +28 -0
- data/lib/outpost/controller/callbacks.rb +14 -0
- data/lib/outpost/controller/custom_errors.rb +41 -0
- data/lib/outpost/controller/filtering.rb +22 -0
- data/lib/outpost/controller/helpers.rb +52 -0
- data/lib/outpost/controller/ordering.rb +46 -0
- data/lib/outpost/controller/preferences.rb +71 -0
- data/lib/outpost/controller.rb +123 -0
- data/lib/outpost/engine.rb +10 -0
- data/lib/outpost/helpers/naming.rb +22 -0
- data/lib/outpost/helpers.rb +6 -0
- data/lib/outpost/hook.rb +35 -0
- data/lib/outpost/list/base.rb +78 -0
- data/lib/outpost/list/column.rb +24 -0
- data/lib/outpost/list/filter.rb +37 -0
- data/lib/outpost/list.rb +15 -0
- data/lib/outpost/model/authentication.rb +34 -0
- data/lib/outpost/model/authorization.rb +32 -0
- data/lib/outpost/model/identifier.rb +39 -0
- data/lib/outpost/model/methods.rb +23 -0
- data/lib/outpost/model/naming.rb +63 -0
- data/lib/outpost/model/routing.rb +138 -0
- data/lib/outpost/model/serializer.rb +27 -0
- data/lib/outpost/model.rb +22 -0
- data/lib/outpost/test.rb +21 -0
- data/lib/outpost/version.rb +3 -0
- data/lib/outpost-cms.rb +2 -0
- data/lib/outpost.rb +80 -0
- data/lib/tasks/outpost_tasks.rake +7 -0
- data/spec/controllers/authentication_spec.rb +62 -0
- data/spec/controllers/sessions_controller_spec.rb +99 -0
- data/spec/factories.rb +31 -0
- data/spec/helpers/authorization_helper_spec.rb +47 -0
- data/spec/helpers/list_helper_spec.rb +74 -0
- data/spec/helpers/outpost_helper_spec.rb +5 -0
- data/spec/helpers/render_helper_spec.rb +19 -0
- data/spec/helpers/utility_helper_spec.rb +53 -0
- data/spec/internal/app/controllers/application_controller.rb +3 -0
- data/spec/internal/app/controllers/outpost/people_controller.rb +23 -0
- data/spec/internal/app/controllers/outpost/pidgeons_controller.rb +5 -0
- data/spec/internal/app/controllers/people_controller.rb +9 -0
- data/spec/internal/app/controllers/pidgeons_controller.rb +3 -0
- data/spec/internal/app/models/person.rb +10 -0
- data/spec/internal/app/models/pidgeon.rb +3 -0
- data/spec/internal/app/models/post.rb +4 -0
- data/spec/internal/app/models/user.rb +4 -0
- data/spec/internal/app/views/people/index.html.erb +7 -0
- data/spec/internal/app/views/people/show.html.erb +1 -0
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/initializers/configuration.rb +3 -0
- data/spec/internal/config/initializers/outpost.rb +6 -0
- data/spec/internal/config/routes.rb +16 -0
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/db/schema.rb +44 -0
- data/spec/internal/db/seeds.rb +14 -0
- data/spec/internal/log/test.log +59277 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/lib/breadcrumbs_spec.rb +54 -0
- data/spec/lib/config_spec.rb +76 -0
- data/spec/lib/controller/actions_spec.rb +5 -0
- data/spec/lib/controller/authorization_spec.rb +4 -0
- data/spec/lib/controller/callbacks_spec.rb +31 -0
- data/spec/lib/controller/helpers_spec.rb +33 -0
- data/spec/lib/controller_spec.rb +25 -0
- data/spec/lib/helpers/naming_spec.rb +10 -0
- data/spec/lib/hook_spec.rb +13 -0
- data/spec/lib/list/base_spec.rb +96 -0
- data/spec/lib/list/column_spec.rb +46 -0
- data/spec/lib/list/filter_spec.rb +44 -0
- data/spec/lib/model/authentication_spec.rb +29 -0
- data/spec/lib/model/authorization_spec.rb +66 -0
- data/spec/lib/model/identifier_spec.rb +51 -0
- data/spec/lib/model/methods_spec.rb +8 -0
- data/spec/lib/model/naming_spec.rb +55 -0
- data/spec/lib/model/routing_spec.rb +166 -0
- data/spec/lib/model/serializer_spec.rb +13 -0
- data/spec/lib/outpost_spec.rb +34 -0
- data/spec/models/permission_spec.rb +10 -0
- data/spec/models/user_permission_spec.rb +4 -0
- data/spec/spec_helper.rb +22 -0
- metadata +411 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
##
|
2
|
+
# Outpost::Controller::Actions
|
3
|
+
#
|
4
|
+
# This provides basic CRUD actions for you to include into any
|
5
|
+
# controller that you want to behave like a resource management
|
6
|
+
# area.
|
7
|
+
module Outpost
|
8
|
+
module Controller
|
9
|
+
module Actions
|
10
|
+
def index
|
11
|
+
respond_with :outpost, @records
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
breadcrumb "New"
|
16
|
+
@record = model.new
|
17
|
+
respond_with :outpost, @record
|
18
|
+
end
|
19
|
+
|
20
|
+
def show
|
21
|
+
redirect_to @record.admin_edit_path
|
22
|
+
end
|
23
|
+
|
24
|
+
def edit
|
25
|
+
breadcrumb "Edit", nil, @record.to_title
|
26
|
+
respond_with :outpost, @record
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
@record = model.new(form_params)
|
31
|
+
|
32
|
+
if @record.save
|
33
|
+
notice "Saved #{@record.simple_title}"
|
34
|
+
respond_with :outpost, @record, location: requested_location
|
35
|
+
else
|
36
|
+
breadcrumb "New"
|
37
|
+
render :new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def update
|
42
|
+
if @record.update_attributes(form_params)
|
43
|
+
notice "Saved #{@record.simple_title}"
|
44
|
+
respond_with :outpost, @record, location: requested_location
|
45
|
+
else
|
46
|
+
breadcrumb "Edit", nil, @record.to_title
|
47
|
+
render :edit
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def destroy
|
52
|
+
@record.destroy
|
53
|
+
notice "Deleted #{@record.simple_title}"
|
54
|
+
respond_with :outpost, @record
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def form_params
|
60
|
+
params[model.singular_route_key]
|
61
|
+
end
|
62
|
+
|
63
|
+
def requested_location
|
64
|
+
case params[:commit_action]
|
65
|
+
when "edit" then @record.admin_edit_path
|
66
|
+
when "new" then model.admin_new_path
|
67
|
+
else model.admin_index_path
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end # Actions
|
71
|
+
end # Controller
|
72
|
+
end # Outpost
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module Authentication
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
before_filter :require_login
|
8
|
+
helper_method :current_user
|
9
|
+
end
|
10
|
+
|
11
|
+
# Public: The currently logged-in user.
|
12
|
+
#
|
13
|
+
# Returns Outpost.user_class instance.
|
14
|
+
def current_user
|
15
|
+
begin
|
16
|
+
@current_user ||= Outpost.user_class.where(can_login: true).find(session[:user_id])
|
17
|
+
rescue ActiveRecord::RecordNotFound
|
18
|
+
session[:user_id] = nil
|
19
|
+
@current_user = nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Private: Callback to require login.
|
24
|
+
#
|
25
|
+
# Returns nothing.
|
26
|
+
def require_login
|
27
|
+
if !current_user
|
28
|
+
session[:return_to] = request.fullpath
|
29
|
+
redirect_to outpost_login_path and return false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end # Authentication
|
33
|
+
end # Controller
|
34
|
+
end # Outpost
|
@@ -0,0 +1,28 @@
|
|
1
|
+
##
|
2
|
+
# Authorization
|
3
|
+
#
|
4
|
+
# Basic authorization methods for controllers
|
5
|
+
module Outpost
|
6
|
+
module Controller
|
7
|
+
module Authorization
|
8
|
+
# Make sure the user can authorize the current resource
|
9
|
+
def authorize(resource)
|
10
|
+
if !current_user.can_manage?(resource)
|
11
|
+
handle_unauthorized(resource)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Use this for before_filter. Should be overridden for custom behavor.
|
16
|
+
def authorize_resource
|
17
|
+
authorize(self.class.model)
|
18
|
+
end
|
19
|
+
|
20
|
+
# What to do when a user doesn't have proper permissions
|
21
|
+
def handle_unauthorized(resource)
|
22
|
+
redirect_to outpost_root_path,
|
23
|
+
alert: "You don't have permission to manage #{resource.to_title.pluralize}"
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
end # Authorization
|
27
|
+
end # Controller
|
28
|
+
end # Outpost
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module Callbacks
|
4
|
+
def get_record
|
5
|
+
@record = model.find(params[:id])
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_records
|
9
|
+
@records = model.order("#{model.table_name}.#{order} #{sort_mode}")
|
10
|
+
.page(params[:page]).per(self.list.per_page)
|
11
|
+
end
|
12
|
+
end # Callbacks
|
13
|
+
end # Controller
|
14
|
+
end # Outpost
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module CustomErrors
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
NOT_FOUND_ERROR_CLASSES = [
|
7
|
+
ActionController::RoutingError,
|
8
|
+
ActionController::UnknownController,
|
9
|
+
AbstractController::ActionNotFound,
|
10
|
+
ActiveRecord::RecordNotFound
|
11
|
+
]
|
12
|
+
|
13
|
+
if defined?(ActionController::UnknownFormat)
|
14
|
+
NOT_FOUND_ERROR_CLASSES << ActionController::UnknownFormat
|
15
|
+
end
|
16
|
+
|
17
|
+
included do
|
18
|
+
rescue_from StandardError, with: ->(e) { render_error(500, e) and return false }
|
19
|
+
rescue_from *NOT_FOUND_ERROR_CLASSES, with: ->(e) { render_error(404, e) and return false }
|
20
|
+
end
|
21
|
+
|
22
|
+
#----------------------
|
23
|
+
|
24
|
+
def render_error(status, e=StandardError)
|
25
|
+
response.status = status
|
26
|
+
|
27
|
+
if Rails.application.config.consider_all_requests_local
|
28
|
+
raise e
|
29
|
+
else
|
30
|
+
respond_to do |format|
|
31
|
+
format.html { render template: "/errors/error_#{status}", layout: "application", status: status, locals: { error: e } }
|
32
|
+
format.xml { render xml: { error: response.message, code: status }, status: status }
|
33
|
+
format.json { render json: { error: response.message, code: status }, status: status }
|
34
|
+
format.text { render text: "#{status} - #{response.message}", status: status}
|
35
|
+
format.any { head status }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end # CustomErrors
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module Filtering
|
4
|
+
private
|
5
|
+
|
6
|
+
def filter_records
|
7
|
+
if params[:filter].is_a? Hash
|
8
|
+
params[:filter].each do |attribute, value|
|
9
|
+
next if value.blank?
|
10
|
+
scope = "filtered_by_#{attribute}"
|
11
|
+
|
12
|
+
if @records.klass.respond_to? scope
|
13
|
+
@records = @records.send(scope, value)
|
14
|
+
else
|
15
|
+
@records = @records.where(attribute => value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
##
|
2
|
+
# Outpost::Controller::Helpers
|
3
|
+
module Outpost
|
4
|
+
module Controller
|
5
|
+
module Helpers
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include Outpost::Controller::Ordering
|
8
|
+
|
9
|
+
included do
|
10
|
+
helper_method :sort_mode, :order
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: The order that the records are currently sorted by.
|
14
|
+
# This gets passed directly to ActiveRecord, so it should be
|
15
|
+
# a valid database order.
|
16
|
+
#
|
17
|
+
# Returns String of the order.
|
18
|
+
def order
|
19
|
+
@order ||= set_order
|
20
|
+
end
|
21
|
+
|
22
|
+
# Public: The sort mode that the records are currently sorted by.
|
23
|
+
# This gets passed directory to ActiveRecord, so it should be
|
24
|
+
# a valid database sort mode.
|
25
|
+
#
|
26
|
+
# Examples
|
27
|
+
#
|
28
|
+
# sort_mode
|
29
|
+
# # => "asc"
|
30
|
+
#
|
31
|
+
# Returns String of the sort mode.
|
32
|
+
def sort_mode
|
33
|
+
@sort_mode ||= set_sort_mode
|
34
|
+
end
|
35
|
+
|
36
|
+
# Public: Set the flash[:notice] message, only for HTML requests.
|
37
|
+
#
|
38
|
+
# message - (String) The message to add to the flash.
|
39
|
+
#
|
40
|
+
# Examples
|
41
|
+
#
|
42
|
+
# notice("Success")
|
43
|
+
# flash[:notice]
|
44
|
+
# # => "Success"
|
45
|
+
#
|
46
|
+
# Returns nothing.
|
47
|
+
def notice(message)
|
48
|
+
flash[:notice] = message if request.format.html?
|
49
|
+
end
|
50
|
+
end # Helpers
|
51
|
+
end # Controller
|
52
|
+
end # Outpost
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module Ordering
|
4
|
+
private
|
5
|
+
|
6
|
+
# Set which attribute is doing the sorting
|
7
|
+
#
|
8
|
+
# If params[:order] is present, then set the
|
9
|
+
# preference to that and return it.
|
10
|
+
#
|
11
|
+
# If not present, but preferred order is,
|
12
|
+
# then use the preferred order.
|
13
|
+
#
|
14
|
+
# Otherwise use the list order.
|
15
|
+
def set_order
|
16
|
+
key = "#{model.content_key}_order"
|
17
|
+
preferred_order = preference(key)
|
18
|
+
|
19
|
+
@order = if params[:order].present?
|
20
|
+
set_preference(key, params[:order])
|
21
|
+
elsif preferred_order.present?
|
22
|
+
preferred_order
|
23
|
+
else
|
24
|
+
list.default_order
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Set the sort mode
|
29
|
+
#
|
30
|
+
# It will either be the requested sort mode, or if not available,
|
31
|
+
# then the table's default sort mode.
|
32
|
+
def set_sort_mode
|
33
|
+
key = "#{model.content_key}_sort_mode"
|
34
|
+
preferred_sort_mode = preference(key)
|
35
|
+
|
36
|
+
@sort_mode = if %w{ asc desc }.include?(params[:sort_mode])
|
37
|
+
set_preference(key, params[:sort_mode])
|
38
|
+
elsif preferred_sort_mode.present?
|
39
|
+
preferred_sort_mode
|
40
|
+
else
|
41
|
+
list.default_sort_mode
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Outpost
|
2
|
+
module Controller
|
3
|
+
module Preferences
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
helper_method :preference
|
8
|
+
end
|
9
|
+
|
10
|
+
# Public: Getter for preference.
|
11
|
+
# Preferences are stored in the browser's session on a per-resource
|
12
|
+
# basis.
|
13
|
+
#
|
14
|
+
# key - (String) The key for the preference.
|
15
|
+
#
|
16
|
+
# Examples
|
17
|
+
#
|
18
|
+
# preference("posts_order")
|
19
|
+
# # => "updated_at"
|
20
|
+
#
|
21
|
+
# Returns String of the requested preference.
|
22
|
+
def preference(key)
|
23
|
+
session["preference_#{key}"]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Public: Writer for preference.
|
27
|
+
#
|
28
|
+
# key - (String) The key to write to.
|
29
|
+
# value - (String) The value of the preference.
|
30
|
+
#
|
31
|
+
# Examples
|
32
|
+
#
|
33
|
+
# set_preference("posts_order", "updated_at")
|
34
|
+
# preference("posts_order")
|
35
|
+
# # => "updated_at"
|
36
|
+
#
|
37
|
+
# Returns nothing.
|
38
|
+
def set_preference(key, value)
|
39
|
+
session["preference_#{key}"] = value
|
40
|
+
end
|
41
|
+
|
42
|
+
# Public: Unset a preference.
|
43
|
+
#
|
44
|
+
# key - (String) The key to delete from preferences.
|
45
|
+
#
|
46
|
+
# Examples
|
47
|
+
#
|
48
|
+
# unset_preference("posts_order")
|
49
|
+
# preference("posts_order")
|
50
|
+
# # => nil
|
51
|
+
#
|
52
|
+
# Returns nothing.
|
53
|
+
def unset_preference(key)
|
54
|
+
set_preference(key, nil)
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def remove_preferences
|
61
|
+
Outpost.config.preferences.each do |preference|
|
62
|
+
key = "#{model.content_key}_#{preference}"
|
63
|
+
|
64
|
+
if params[preference] == "" && preference(key).present?
|
65
|
+
unset_preference(key)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
##
|
2
|
+
# Outpost::Controller
|
3
|
+
module Outpost
|
4
|
+
module Controller
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
autoload :Actions
|
9
|
+
autoload :Callbacks
|
10
|
+
autoload :Helpers
|
11
|
+
autoload :Ordering
|
12
|
+
autoload :Filtering
|
13
|
+
autoload :Preferences
|
14
|
+
autoload :Authentication
|
15
|
+
autoload :Authorization
|
16
|
+
autoload :CustomErrors
|
17
|
+
|
18
|
+
included do
|
19
|
+
helper_method :list, :model, :fields
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Public: Proxy to the controller's model.
|
24
|
+
def model
|
25
|
+
self.class.model
|
26
|
+
end
|
27
|
+
|
28
|
+
# Public: Proxy to the controller's list.
|
29
|
+
def list
|
30
|
+
self.class.list
|
31
|
+
end
|
32
|
+
|
33
|
+
# Public: Proxy to the controller's fields.
|
34
|
+
def fields
|
35
|
+
self.class.fields
|
36
|
+
end
|
37
|
+
|
38
|
+
module ClassMethods
|
39
|
+
attr_accessor :model
|
40
|
+
attr_writer :fields
|
41
|
+
|
42
|
+
# Public: The fields for a form.
|
43
|
+
#
|
44
|
+
# If no fields have been defined, then the default fields will be used.
|
45
|
+
# Using the default fields will also set the permitted params to those
|
46
|
+
# fields.
|
47
|
+
#
|
48
|
+
# Returns Array of fields.
|
49
|
+
def fields
|
50
|
+
@fields ||= begin
|
51
|
+
default_fields
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Public: The list for this controller.
|
56
|
+
#
|
57
|
+
# If no list has been defined yet, this method will
|
58
|
+
# also define the list with the class's default columns.
|
59
|
+
#
|
60
|
+
# Returns the list.
|
61
|
+
def list
|
62
|
+
@list ||= define_list do |l|
|
63
|
+
l.default_columns.each do |attribute|
|
64
|
+
l.column attribute
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Public: Define the list for this controller.
|
70
|
+
#
|
71
|
+
# block - A block to define the list. See List::Base for more.
|
72
|
+
#
|
73
|
+
# Examples
|
74
|
+
#
|
75
|
+
# define_list do |l|
|
76
|
+
# l.per_page = 50
|
77
|
+
# l.column :name
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# Returns nothing.
|
81
|
+
def define_list(&block)
|
82
|
+
@list = List::Base.new(model, &block)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Public: Declare a controller as being a controller for Outpost.
|
86
|
+
#
|
87
|
+
# model - (constant) The model for this controller.
|
88
|
+
#
|
89
|
+
# Examples
|
90
|
+
#
|
91
|
+
# class Admin::NewsStoriesController < Admin::ResourceController
|
92
|
+
# outpost_controller model: NewsStory
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
def outpost_controller(attributes={})
|
96
|
+
@model = attributes[:model] || find_model
|
97
|
+
|
98
|
+
include Outpost::Controller::Helpers
|
99
|
+
include Outpost::Controller::Callbacks
|
100
|
+
include Outpost::Controller::Actions
|
101
|
+
include Outpost::Controller::Ordering
|
102
|
+
include Outpost::Controller::Filtering
|
103
|
+
include Outpost::Controller::Preferences
|
104
|
+
|
105
|
+
before_filter :get_record, only: [:show, :edit, :update, :destroy]
|
106
|
+
before_filter :get_records, only: [:index]
|
107
|
+
before_filter :authorize_resource
|
108
|
+
before_filter :filter_records, only: [:index]
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def default_fields
|
115
|
+
model.column_names - Outpost.config.excluded_form_fields
|
116
|
+
end
|
117
|
+
|
118
|
+
def find_model
|
119
|
+
self.name.demodulize.underscore.split("_")[0...-1].join("_").classify.constantize
|
120
|
+
end
|
121
|
+
end # ClassMethods
|
122
|
+
end # Controller
|
123
|
+
end # Outpost
|
@@ -0,0 +1,22 @@
|
|
1
|
+
##
|
2
|
+
# Naming
|
3
|
+
#
|
4
|
+
# Some naming helpers.
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# Outpost::Helpers::Naming.to_class("outpost/news_stories")
|
9
|
+
module Outpost
|
10
|
+
module Helpers
|
11
|
+
module Naming
|
12
|
+
extend self
|
13
|
+
|
14
|
+
# These helpers expect a controller param,
|
15
|
+
# such as 'outpost/news_stories'
|
16
|
+
# "outpost/news_stories" => NewsStory
|
17
|
+
def to_class(controller)
|
18
|
+
controller.singularize.camelize.demodulize.constantize
|
19
|
+
end
|
20
|
+
end # Naming
|
21
|
+
end # Helpers
|
22
|
+
end # Outpost
|
data/lib/outpost/hook.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
##
|
2
|
+
# Outpost::Hook
|
3
|
+
#
|
4
|
+
# Hook into Newsroom.js
|
5
|
+
module Outpost
|
6
|
+
class Hook
|
7
|
+
attr_accessor :data, :path
|
8
|
+
|
9
|
+
def initialize(options={})
|
10
|
+
@path = options[:path]
|
11
|
+
@data = options[:data] || { touch: true }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Publish the message
|
15
|
+
def publish
|
16
|
+
response = connection.post do |request|
|
17
|
+
request.url @path
|
18
|
+
request.params = @data
|
19
|
+
end
|
20
|
+
|
21
|
+
response
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def connection
|
27
|
+
@connection ||= begin
|
28
|
+
Faraday.new(url: Rails.application.config.node.server) do |conn|
|
29
|
+
conn.response :json
|
30
|
+
conn.adapter Faraday.default_adapter
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end # Hook
|
35
|
+
end # Outpost
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Outpost
|
2
|
+
module List
|
3
|
+
class Base
|
4
|
+
def initialize(model, &block)
|
5
|
+
@model = model
|
6
|
+
@columns = ActiveSupport::HashWithIndifferentAccess.new
|
7
|
+
@filters = ActiveSupport::HashWithIndifferentAccess.new
|
8
|
+
@fields = []
|
9
|
+
|
10
|
+
yield self if block_given?
|
11
|
+
|
12
|
+
@default_order ||= List::DEFAULT_ORDER
|
13
|
+
@default_sort_mode ||= List::DEFAULT_SORT_MODE
|
14
|
+
@per_page ||= List::DEFAULT_PER_PAGE
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :default_order, :default_sort_mode
|
18
|
+
attr_reader :columns, :fields, :filters, :per_page, :model
|
19
|
+
|
20
|
+
# Public: Set the per_page for pagination.
|
21
|
+
#
|
22
|
+
# val - (Integer) The value to send to pagination. Also accepts :all,
|
23
|
+
# which passes `nil` to pagination and therefore will not
|
24
|
+
# paginate.
|
25
|
+
#
|
26
|
+
# Returns nothing.
|
27
|
+
def per_page=(val)
|
28
|
+
@per_page = val.to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
# Public: Add a column to the list.
|
32
|
+
#
|
33
|
+
# attribute - (String) The attribute that this column represents.
|
34
|
+
# options - (Hash) A hash of options. Gets passed directly to
|
35
|
+
# List::Column (default: {}).
|
36
|
+
# * header - (String) The title of the column, displayed in
|
37
|
+
# the table header
|
38
|
+
# (default: self.attribute.titleize).
|
39
|
+
# * display - (Symbol or Proc) How to display this attribute.
|
40
|
+
# * If symbol, should be the name of a method in
|
41
|
+
# AdminListHelper
|
42
|
+
# * If Proc, gets run as an instance of the class.
|
43
|
+
# * See AdminListHelper for more info.
|
44
|
+
#
|
45
|
+
# Examples
|
46
|
+
#
|
47
|
+
# define_list do
|
48
|
+
# column :name, header: "Full Name", display: :display_full_name
|
49
|
+
# column :user, header: "Associated User", display: proc { self.user.name }
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# Returns nothing.
|
53
|
+
def column(attribute, options={})
|
54
|
+
column = Column.new(attribute, self, options)
|
55
|
+
@columns[attribute] = column
|
56
|
+
end
|
57
|
+
|
58
|
+
# Public: Define a filter for the list.
|
59
|
+
#
|
60
|
+
# attribute - (String) The attribute on which to filter.
|
61
|
+
# options - (Hash) A hash of options that gets passed into Filter.new
|
62
|
+
# (default: {}).
|
63
|
+
#
|
64
|
+
# Returns nothing.
|
65
|
+
def filter(attribute, options={})
|
66
|
+
filter = Filter.new(attribute, self, options)
|
67
|
+
@filters[attribute] = filter
|
68
|
+
end
|
69
|
+
|
70
|
+
# Private: Default columns for this list
|
71
|
+
#
|
72
|
+
# Returns Array of default columns.
|
73
|
+
def default_columns
|
74
|
+
@model.column_names - Outpost.config.excluded_list_columns
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Outpost
|
2
|
+
module List
|
3
|
+
class Column
|
4
|
+
attr_accessor :attribute, :display, :position, :list, :quick_edit,
|
5
|
+
:sortable, :default_sort_mode, :_display_helper, :header
|
6
|
+
|
7
|
+
alias_method :quick_edit?, :quick_edit
|
8
|
+
alias_method :sortable?, :sortable
|
9
|
+
|
10
|
+
def initialize(attribute, list, attributes={})
|
11
|
+
@attribute = attribute.to_s
|
12
|
+
@list = list
|
13
|
+
@position = @list.columns.size
|
14
|
+
|
15
|
+
@header = attributes[:header] || @attribute.titleize
|
16
|
+
@display = attributes[:display]
|
17
|
+
@quick_edit = !!attributes[:quick_edit]
|
18
|
+
@sortable = !!attributes[:sortable]
|
19
|
+
|
20
|
+
@default_sort_mode = attributes[:default_sort_mode] || List::DEFAULT_SORT_MODE
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|