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.
- 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
|