brainsome_typus 4.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +488 -0
- data/Gemfile +60 -0
- data/Gemfile.lock +205 -0
- data/MIT-LICENSE +20 -0
- data/README.md +94 -0
- data/Rakefile +33 -0
- data/TODO.md +32 -0
- data/app/assets/javascripts/typus/application.js +11 -0
- data/app/assets/javascripts/typus/custom.js +2 -0
- data/app/assets/javascripts/typus/jquery-1.8.3-min.js +2 -0
- data/app/assets/javascripts/typus/jquery.application.js +33 -0
- data/app/assets/stylesheets/typus/application.css +5 -0
- data/app/assets/stylesheets/typus/custom.css +4 -0
- data/app/assets/stylesheets/typus/overrides.css.scss +46 -0
- data/app/controllers/admin/account_controller.rb +47 -0
- data/app/controllers/admin/base_controller.rb +44 -0
- data/app/controllers/admin/dashboard_controller.rb +5 -0
- data/app/controllers/admin/resource_controller.rb +7 -0
- data/app/controllers/admin/resources_controller.rb +256 -0
- data/app/controllers/admin/session_controller.rb +42 -0
- data/app/controllers/concerns/admin/actions.rb +88 -0
- data/app/controllers/concerns/admin/acts_as_list.rb +26 -0
- data/app/controllers/concerns/admin/ancestry.rb +26 -0
- data/app/controllers/concerns/admin/autocomplete.rb +11 -0
- data/app/controllers/concerns/admin/bulk.rb +76 -0
- data/app/controllers/concerns/admin/featured_image.rb +22 -0
- data/app/controllers/concerns/admin/filters.rb +57 -0
- data/app/controllers/concerns/admin/format.rb +48 -0
- data/app/controllers/concerns/admin/headless.rb +23 -0
- data/app/controllers/concerns/admin/hooks.rb +4 -0
- data/app/controllers/concerns/admin/multisite.rb +10 -0
- data/app/controllers/concerns/admin/navigation.rb +26 -0
- data/app/controllers/concerns/admin/trash.rb +65 -0
- data/app/helpers/admin/base_helper.rb +59 -0
- data/app/helpers/admin/resources/data_types/belongs_to_helper.rb +91 -0
- data/app/helpers/admin/resources/data_types/boolean_helper.rb +28 -0
- data/app/helpers/admin/resources/data_types/date_helper.rb +16 -0
- data/app/helpers/admin/resources/data_types/datetime_helper.rb +19 -0
- data/app/helpers/admin/resources/data_types/dragonfly_helper.rb +56 -0
- data/app/helpers/admin/resources/data_types/float_helper.rb +2 -0
- data/app/helpers/admin/resources/data_types/has_and_belongs_to_many_helper.rb +53 -0
- data/app/helpers/admin/resources/data_types/has_many_helper.rb +66 -0
- data/app/helpers/admin/resources/data_types/has_one_helper.rb +36 -0
- data/app/helpers/admin/resources/data_types/integer_helper.rb +10 -0
- data/app/helpers/admin/resources/data_types/paperclip_helper.rb +36 -0
- data/app/helpers/admin/resources/data_types/position_helper.rb +20 -0
- data/app/helpers/admin/resources/data_types/selector_helper.rb +11 -0
- data/app/helpers/admin/resources/data_types/string_helper.rb +32 -0
- data/app/helpers/admin/resources/data_types/text_helper.rb +7 -0
- data/app/helpers/admin/resources/data_types/transversal_helper.rb +8 -0
- data/app/helpers/admin/resources/data_types/tree_helper.rb +26 -0
- data/app/helpers/admin/resources/display_helper.rb +27 -0
- data/app/helpers/admin/resources/filters_helper.rb +28 -0
- data/app/helpers/admin/resources/form_helper.rb +84 -0
- data/app/helpers/admin/resources/list_helper.rb +31 -0
- data/app/helpers/admin/resources/pagination_helper.rb +28 -0
- data/app/helpers/admin/resources/relationships_helper.rb +34 -0
- data/app/helpers/admin/resources/sidebar_helper.rb +40 -0
- data/app/helpers/admin/resources/table_helper.rb +66 -0
- data/app/helpers/admin/resources_helper.rb +25 -0
- data/app/mailers/admin/mailer.rb +20 -0
- data/app/views/admin/account/_form.html.erb +11 -0
- data/app/views/admin/account/forgot_password.html.erb +19 -0
- data/app/views/admin/account/new.html.erb +13 -0
- data/app/views/admin/dashboard/_sidebar.html.erb +14 -0
- data/app/views/admin/dashboard/index.html.erb +6 -0
- data/app/views/admin/dashboard/styles.html.erb +153 -0
- data/app/views/admin/dashboard/widgets/_applications.html.erb +44 -0
- data/app/views/admin/dashboard/widgets/_default.html.erb +46 -0
- data/app/views/admin/dashboard/widgets/_models.html.erb +23 -0
- data/app/views/admin/dashboard/widgets/_models_extended.html.erb +25 -0
- data/app/views/admin/dashboard/widgets/_resources.html.erb +23 -0
- data/app/views/admin/dashboard/widgets/_users.html.erb +23 -0
- data/app/views/admin/mailer/reset_password_instructions.html.erb +7 -0
- data/app/views/admin/mailer/reset_password_instructions.text.erb +7 -0
- data/app/views/admin/resources/_actions.html.erb +23 -0
- data/app/views/admin/resources/_edit.html.erb +0 -0
- data/app/views/admin/resources/_form.html.erb +41 -0
- data/app/views/admin/resources/_form_javascripts.html.erb +0 -0
- data/app/views/admin/resources/_form_modal.html.erb +13 -0
- data/app/views/admin/resources/_index.html.erb +0 -0
- data/app/views/admin/resources/_new.html.erb +0 -0
- data/app/views/admin/resources/_pagination.html.erb +15 -0
- data/app/views/admin/resources/_show.html.erb +0 -0
- data/app/views/admin/resources/edit/_actions.html.erb +7 -0
- data/app/views/admin/resources/edit/_recently_edited.html.erb +8 -0
- data/app/views/admin/resources/edit.html.erb +22 -0
- data/app/views/admin/resources/index.html.erb +81 -0
- data/app/views/admin/resources/new.html.erb +21 -0
- data/app/views/admin/resources/show.html.erb +27 -0
- data/app/views/admin/session/new.html.erb +21 -0
- data/app/views/admin/shared/_head.html.erb +15 -0
- data/app/views/admin/shared/_modals.html.erb +3 -0
- data/app/views/admin/shared/_sidebar_placeholder.html.erb +0 -0
- data/app/views/admin/templates/README.md +5 -0
- data/app/views/admin/templates/_belongs_to.html.erb +13 -0
- data/app/views/admin/templates/_boolean.html.erb +6 -0
- data/app/views/admin/templates/_date.html.erb +6 -0
- data/app/views/admin/templates/_datetime.html.erb +7 -0
- data/app/views/admin/templates/_dragonfly.html.erb +8 -0
- data/app/views/admin/templates/_dragonfly_form_preview.html.erb +23 -0
- data/app/views/admin/templates/_dragonfly_preview.html.erb +12 -0
- data/app/views/admin/templates/_has_and_belongs_to_many.html.erb +21 -0
- data/app/views/admin/templates/_has_many.html.erb +20 -0
- data/app/views/admin/templates/_has_one.html.erb +14 -0
- data/app/views/admin/templates/_paperclip.html.erb +7 -0
- data/app/views/admin/templates/_paperclip_preview.html.erb +3 -0
- data/app/views/admin/templates/_password.html.erb +6 -0
- data/app/views/admin/templates/_position.html.erb +6 -0
- data/app/views/admin/templates/_profile_sidebar.html.erb +4 -0
- data/app/views/admin/templates/_selector.html.erb +6 -0
- data/app/views/admin/templates/_string.html.erb +6 -0
- data/app/views/admin/templates/_string_with_preview.html.erb +11 -0
- data/app/views/admin/templates/_text.html.erb +11 -0
- data/app/views/admin/templates/_text_with_ckeditor.html.erb +24 -0
- data/app/views/admin/templates/_text_with_ckeditor_and_assets.html.erb +38 -0
- data/app/views/admin/templates/_time.html.erb +9 -0
- data/app/views/admin/templates/_tree.html.erb +6 -0
- data/app/views/admin/templates/modals/_belongs_to.html.erb +56 -0
- data/app/views/admin/templates/modals/_dragonfly.html.erb +9 -0
- data/app/views/admin/templates/modals/_has_and_belongs_to_many.html.erb +19 -0
- data/app/views/admin/templates/modals/_has_many.html.erb +53 -0
- data/app/views/helpers/admin/base/_apps.html.erb +38 -0
- data/app/views/helpers/admin/base/_breadcrumbs.html.erb +6 -0
- data/app/views/helpers/admin/base/_flash_message.html.erb +3 -0
- data/app/views/helpers/admin/base/_login_info.html.erb +37 -0
- data/app/views/helpers/admin/dashboard/_resources.html.erb +19 -0
- data/app/views/helpers/admin/resources/_actions.html.erb +18 -0
- data/app/views/helpers/admin/resources/_errors.html.erb +12 -0
- data/app/views/helpers/admin/resources/_filters.html.erb +14 -0
- data/app/views/helpers/admin/resources/_search.html.erb +14 -0
- data/app/views/helpers/admin/resources/_sidebar.html.erb +17 -0
- data/app/views/helpers/admin/resources/_table.html.erb +47 -0
- data/app/views/layouts/admin/base.html.erb +40 -0
- data/app/views/layouts/admin/headless.html.erb +1 -0
- data/app/views/layouts/admin/session.html.erb +44 -0
- data/config/locales/typus.ca.models.yml +17 -0
- data/config/locales/typus.ca.yml +78 -0
- data/config/locales/typus.de.models.yml +17 -0
- data/config/locales/typus.de.yml +98 -0
- data/config/locales/typus.el.models.yml +17 -0
- data/config/locales/typus.el.yml +79 -0
- data/config/locales/typus.es.models.yml +18 -0
- data/config/locales/typus.es.yml +91 -0
- data/config/locales/typus.fr.models.yml +18 -0
- data/config/locales/typus.fr.yml +83 -0
- data/config/locales/typus.hu.models.yml +17 -0
- data/config/locales/typus.hu.yml +77 -0
- data/config/locales/typus.it.models.yml +18 -0
- data/config/locales/typus.it.yml +86 -0
- data/config/locales/typus.locale.models.yml.template +17 -0
- data/config/locales/typus.locale.yml.template +78 -0
- data/config/locales/typus.pt-BR.models.yml +17 -0
- data/config/locales/typus.pt-BR.yml +77 -0
- data/config/locales/typus.pt-PT.models.yml +17 -0
- data/config/locales/typus.pt-PT.yml +85 -0
- data/config/locales/typus.ru.models.yml +17 -0
- data/config/locales/typus.ru.yml +77 -0
- data/config/locales/typus.zh-CN.models.yml +17 -0
- data/config/locales/typus.zh-CN.yml +76 -0
- data/config/routes.rb +46 -0
- data/lib/generators/templates/config/initializers/typus.rb +35 -0
- data/lib/generators/templates/config/initializers/typus_authentication.rb +18 -0
- data/lib/generators/templates/config/initializers/typus_resources.rb +24 -0
- data/lib/generators/templates/config/typus/README +58 -0
- data/lib/generators/templates/config/typus/application.yml +3 -0
- data/lib/generators/templates/config/typus/application_roles.yml +4 -0
- data/lib/generators/templates/config/typus/typus.yml +15 -0
- data/lib/generators/templates/config/typus/typus_roles.yml +4 -0
- data/lib/generators/templates/controller.erb +2 -0
- data/lib/generators/templates/migration.erb +22 -0
- data/lib/generators/templates/view.html.erb +13 -0
- data/lib/generators/typus/config_generator.rb +67 -0
- data/lib/generators/typus/controller_generator.rb +25 -0
- data/lib/generators/typus/initializers_generator.rb +20 -0
- data/lib/generators/typus/migration_generator.rb +94 -0
- data/lib/generators/typus/typus_generator.rb +52 -0
- data/lib/generators/typus/views_generator.rb +19 -0
- data/lib/support/active_record.rb +42 -0
- data/lib/support/fake_user.rb +47 -0
- data/lib/support/hash.rb +12 -0
- data/lib/support/object.rb +9 -0
- data/lib/support/string.rb +40 -0
- data/lib/tasks/typus.rake +11 -0
- data/lib/typus/authentication/base.rb +24 -0
- data/lib/typus/authentication/devise.rb +19 -0
- data/lib/typus/authentication/http_basic.rb +18 -0
- data/lib/typus/authentication/none.rb +15 -0
- data/lib/typus/authentication/none_with_role.rb +15 -0
- data/lib/typus/authentication/session.rb +123 -0
- data/lib/typus/configuration.rb +41 -0
- data/lib/typus/engine.rb +17 -0
- data/lib/typus/i18n.rb +48 -0
- data/lib/typus/orm/active_record/admin_user.rb +84 -0
- data/lib/typus/orm/active_record/class_methods.rb +104 -0
- data/lib/typus/orm/active_record/instance_methods.rb +76 -0
- data/lib/typus/orm/active_record/search.rb +44 -0
- data/lib/typus/orm/active_record.rb +10 -0
- data/lib/typus/orm/base/class_methods.rb +184 -0
- data/lib/typus/orm/base/search.rb +70 -0
- data/lib/typus/regex.rb +11 -0
- data/lib/typus/resources.rb +55 -0
- data/lib/typus/version.rb +10 -0
- data/lib/typus.rb +212 -0
- data/typus.gemspec +32 -0
- data/vendor/assets/adapt/css/1200.css +357 -0
- data/vendor/assets/adapt/css/1200.min.css +1 -0
- data/vendor/assets/adapt/css/1560.css +357 -0
- data/vendor/assets/adapt/css/1560.min.css +1 -0
- data/vendor/assets/adapt/css/720.css +357 -0
- data/vendor/assets/adapt/css/720.min.css +1 -0
- data/vendor/assets/adapt/css/960.css +357 -0
- data/vendor/assets/adapt/css/960.min.css +1 -0
- data/vendor/assets/adapt/css/fluid.css +345 -0
- data/vendor/assets/adapt/css/fluid.min.css +1 -0
- data/vendor/assets/adapt/css/master.css +120 -0
- data/vendor/assets/adapt/css/mobile.css +20 -0
- data/vendor/assets/adapt/css/mobile.min.css +1 -0
- data/vendor/assets/adapt/css/reset.css +202 -0
- data/vendor/assets/adapt/css/text.css +81 -0
- data/vendor/assets/adapt/images/h1.png +0 -0
- data/vendor/assets/adapt/js/adapt.js +135 -0
- data/vendor/assets/adapt/js/adapt.min.js +1 -0
- data/vendor/assets/bootstrap-2.3.2/css/bootstrap-responsive.css +1109 -0
- data/vendor/assets/bootstrap-2.3.2/css/bootstrap-responsive.min.css +9 -0
- data/vendor/assets/bootstrap-2.3.2/css/bootstrap.css +6167 -0
- data/vendor/assets/bootstrap-2.3.2/css/bootstrap.min.css +9 -0
- data/vendor/assets/bootstrap-2.3.2/img/glyphicons-halflings-white.png +0 -0
- data/vendor/assets/bootstrap-2.3.2/img/glyphicons-halflings.png +0 -0
- data/vendor/assets/bootstrap-2.3.2/js/bootstrap.js +2280 -0
- data/vendor/assets/bootstrap-2.3.2/js/bootstrap.min.js +6 -0
- data/vendor/assets/chosen/LICENSE.md +24 -0
- data/vendor/assets/chosen/chosen-sprite.png +0 -0
- data/vendor/assets/chosen/chosen.css +390 -0
- data/vendor/assets/chosen/chosen.jquery.js +902 -0
- data/vendor/assets/formalize/css/formalize.css +395 -0
- data/vendor/assets/formalize/images/button.png +0 -0
- data/vendor/assets/formalize/images/select_arrow.gif +0 -0
- data/vendor/assets/formalize/js/jquery.formalize.min.js +1 -0
- metadata +329 -0
@@ -0,0 +1,256 @@
|
|
1
|
+
class Admin::ResourcesController < Admin::BaseController
|
2
|
+
|
3
|
+
include Admin::Navigation
|
4
|
+
include Admin::Actions
|
5
|
+
include Admin::Filters
|
6
|
+
include Admin::Format
|
7
|
+
include Admin::Headless
|
8
|
+
|
9
|
+
Whitelist = [:edit, :update, :destroy, :toggle]
|
10
|
+
|
11
|
+
before_filter :get_model
|
12
|
+
before_filter :set_context
|
13
|
+
before_filter :get_object, :only => Whitelist + [:show]
|
14
|
+
before_filter :check_resource_ownership, :only => Whitelist
|
15
|
+
before_filter :check_if_user_can_perform_action_on_resources
|
16
|
+
|
17
|
+
def index
|
18
|
+
get_objects
|
19
|
+
|
20
|
+
custom_actions_for(:index).each do |action|
|
21
|
+
prepend_resources_action(action.titleize, {:action => action, :id => nil})
|
22
|
+
end
|
23
|
+
|
24
|
+
respond_to do |format|
|
25
|
+
format.html do
|
26
|
+
set_default_action
|
27
|
+
add_resource_action("Destroy", {:action => "destroy"}, { :data => { :confirm => "#{Typus::I18n.t("Trash")}?" }, :method => 'delete'})
|
28
|
+
get_paginated_data
|
29
|
+
end
|
30
|
+
|
31
|
+
format.csv { generate_csv }
|
32
|
+
format.json { export(:json) }
|
33
|
+
format.xml { export(:xml) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def new
|
38
|
+
@item = @resource.new(item_params_for_new)
|
39
|
+
|
40
|
+
respond_to do |format|
|
41
|
+
format.html
|
42
|
+
format.json { render :json => @item }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def create
|
47
|
+
@item = @resource.new
|
48
|
+
args = [item_params_for_create]
|
49
|
+
args << {as: current_role} if defined?(ProtectedAttributes)
|
50
|
+
@item.assign_attributes(*args)
|
51
|
+
|
52
|
+
set_attributes_on_create
|
53
|
+
|
54
|
+
respond_to do |format|
|
55
|
+
if @item.save
|
56
|
+
format.html { redirect_on_success }
|
57
|
+
format.json { render :json => @item, :status => :created, :location => @item }
|
58
|
+
else
|
59
|
+
format.html { render :action => "new", :status => :unprocessable_entity }
|
60
|
+
format.json { render :json => @item.errors, :status => :unprocessable_entity }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def edit
|
66
|
+
set_default_action
|
67
|
+
add_resource_action("Destroy", {:action => "destroy"}, { :data => { :confirm => "#{Typus::I18n.t("Trash")}?" }, :method => 'delete'})
|
68
|
+
custom_actions_for(:edit).each do |action|
|
69
|
+
prepend_resources_action(action.titleize, {:action => action, :id => @item})
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def show
|
74
|
+
check_resource_ownership if @resource.typus_options_for(:only_user_items)
|
75
|
+
|
76
|
+
if admin_user.can?('edit', @resource)
|
77
|
+
prepend_resources_action("Edit", {:action => 'edit', :id => @item})
|
78
|
+
end
|
79
|
+
|
80
|
+
custom_actions_for(:show).each do |action|
|
81
|
+
prepend_resources_action(action.titleize, {:action => action, :id => @item})
|
82
|
+
end
|
83
|
+
|
84
|
+
respond_to do |format|
|
85
|
+
format.html
|
86
|
+
format.xml { render :xml => @item }
|
87
|
+
format.json { render :json => @item }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def update
|
92
|
+
respond_to do |format|
|
93
|
+
args = [item_params_for_update]
|
94
|
+
args << {as: current_role} if defined?(ProtectedAttributes)
|
95
|
+
if @item.update_attributes(*args)
|
96
|
+
set_attributes_on_update
|
97
|
+
format.html { redirect_on_success }
|
98
|
+
format.json { render :json => @item }
|
99
|
+
else
|
100
|
+
format.html { render :edit, :status => :unprocessable_entity }
|
101
|
+
format.json { render :json => @item.errors, :status => :unprocessable_entity }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def destroy
|
107
|
+
if @item.destroy
|
108
|
+
notice = Typus::I18n.t("%{model} successfully removed.", :model => @resource.model_name.human)
|
109
|
+
else
|
110
|
+
alert = @item.errors.full_messages
|
111
|
+
end
|
112
|
+
redirect_to :back, :notice => notice, :alert => alert
|
113
|
+
end
|
114
|
+
|
115
|
+
def toggle
|
116
|
+
@item.toggle(params[:field])
|
117
|
+
|
118
|
+
respond_to do |format|
|
119
|
+
if @item.save
|
120
|
+
format.html do
|
121
|
+
notice = Typus::I18n.t("%{model} successfully updated.", :model => @resource.model_name.human)
|
122
|
+
redirect_to :back, :notice => notice
|
123
|
+
end
|
124
|
+
format.json { render :json => @item }
|
125
|
+
else
|
126
|
+
format.html { render :edit }
|
127
|
+
format.json { render :json => @item.errors, :status => :unprocessable_entity }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def get_model
|
135
|
+
@resource = resource
|
136
|
+
@object_name = ActiveModel::Naming.singular(@resource)
|
137
|
+
end
|
138
|
+
|
139
|
+
def resource
|
140
|
+
params[:controller].extract_class
|
141
|
+
rescue
|
142
|
+
params[:controller].extract_singular_class
|
143
|
+
end
|
144
|
+
helper_method :resource
|
145
|
+
|
146
|
+
def set_context
|
147
|
+
@resource
|
148
|
+
end
|
149
|
+
helper_method :set_context
|
150
|
+
|
151
|
+
def get_object
|
152
|
+
@item = @resource.find(params[:id])
|
153
|
+
end
|
154
|
+
|
155
|
+
def get_objects
|
156
|
+
set_scope
|
157
|
+
set_wheres
|
158
|
+
set_joins
|
159
|
+
check_resources_ownership if @resource.typus_options_for(:only_user_items)
|
160
|
+
set_order if @resource.respond_to?(:order)
|
161
|
+
set_eager_loading
|
162
|
+
end
|
163
|
+
|
164
|
+
def fields
|
165
|
+
@resource.typus_fields_for(params[:action])
|
166
|
+
end
|
167
|
+
helper_method :fields
|
168
|
+
|
169
|
+
def set_scope
|
170
|
+
return unless params[:scope]
|
171
|
+
|
172
|
+
if @resource.typus_scopes.include?(params[:scope])
|
173
|
+
@resource = @resource.send(params[:scope])
|
174
|
+
else
|
175
|
+
not_allowed("Not allowed! Requested scope not defined on your whitelist.")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def set_wheres
|
180
|
+
@resource.build_conditions(params).each do |condition|
|
181
|
+
@resource = @resource.where(condition)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def set_joins
|
186
|
+
@resource.build_my_joins(params).each do |join|
|
187
|
+
@resource = @resource.joins(join)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def set_order
|
192
|
+
params[:sort_order] ||= "desc"
|
193
|
+
|
194
|
+
if (order = params[:order_by] ? "#{@resource.table_name}.#{params[:order_by]} #{params[:sort_order]}" : @resource.typus_order_by).present?
|
195
|
+
@resource = @resource.reorder(order)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def set_eager_loading
|
200
|
+
if (eager_loading = @resource.reflect_on_all_associations(:belongs_to).reject { |i| i.options[:polymorphic] }.map(&:name)).any?
|
201
|
+
@resource = @resource.includes(eager_loading)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def redirect_on_success
|
206
|
+
path = params.dup.cleanup
|
207
|
+
|
208
|
+
options = if params[:_addanother]
|
209
|
+
{ :action => 'new', :id => nil }
|
210
|
+
elsif params[:_continue]
|
211
|
+
{ :action => 'edit', :id => @item.id }
|
212
|
+
else
|
213
|
+
{ :action => nil, :id => nil }
|
214
|
+
end
|
215
|
+
|
216
|
+
message = params[:action].eql?('create') ? "%{model} successfully created." : "%{model} successfully updated."
|
217
|
+
notice = Typus::I18n.t(message, :model => @resource.model_name.human)
|
218
|
+
|
219
|
+
redirect_to path.merge!(options).compact, :notice => notice
|
220
|
+
end
|
221
|
+
|
222
|
+
def set_default_action
|
223
|
+
default_action = @resource.typus_options_for(:default_action_on_item)
|
224
|
+
action = admin_user.can?('edit', @resource.model_name.to_s) ? default_action : "show"
|
225
|
+
prepend_resource_action(action.titleize, {:action => action})
|
226
|
+
end
|
227
|
+
|
228
|
+
def custom_actions_for(action)
|
229
|
+
return [] if headless_mode?
|
230
|
+
@resource.typus_actions_on(action).reject { |a| admin_user.cannot?(a, @resource.model_name) }
|
231
|
+
end
|
232
|
+
|
233
|
+
def item_params_for_new
|
234
|
+
if params[:resource]
|
235
|
+
params[@object_name] = params.delete(:resource)
|
236
|
+
permit_params!
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def item_params_for_create
|
241
|
+
permit_params!
|
242
|
+
end
|
243
|
+
|
244
|
+
def item_params_for_update
|
245
|
+
if (attr = params[:_nullify])
|
246
|
+
params[@object_name] = { attr => nil }
|
247
|
+
end
|
248
|
+
|
249
|
+
permit_params!
|
250
|
+
end
|
251
|
+
|
252
|
+
def permit_params!
|
253
|
+
params[@object_name].permit!
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Admin::SessionController < Admin::BaseController
|
2
|
+
|
3
|
+
skip_before_filter :reload_config_and_roles, :authenticate
|
4
|
+
|
5
|
+
before_filter :create_an_account?, :only => [:new, :create]
|
6
|
+
|
7
|
+
def new; end
|
8
|
+
|
9
|
+
def create
|
10
|
+
email, password = admin_user_params[:email], admin_user_params[:password]
|
11
|
+
user = user_scope.authenticate(email, password)
|
12
|
+
|
13
|
+
path = if user
|
14
|
+
session[:typus_user_id] = user.id
|
15
|
+
params[:return_to] || admin_dashboard_index_path
|
16
|
+
else
|
17
|
+
new_admin_session_path(:return_to => params[:return_to])
|
18
|
+
end
|
19
|
+
|
20
|
+
redirect_to path
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy
|
24
|
+
deauthenticate
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def create_an_account?
|
30
|
+
redirect_to new_admin_account_path if zero_users
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_locale
|
34
|
+
I18n.locale = Typus::I18n.default_locale
|
35
|
+
end
|
36
|
+
|
37
|
+
def user_scope
|
38
|
+
klass = Typus.user_class
|
39
|
+
klass.respond_to?(:in_domain) ? klass.in_domain(request.host) : klass
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Admin
|
4
|
+
module Actions
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
helper_method :resource_actions
|
10
|
+
helper_method :resources_actions
|
11
|
+
end
|
12
|
+
|
13
|
+
def resource_actions
|
14
|
+
@resource_actions ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def resources_actions
|
18
|
+
@resources_actions ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
##
|
24
|
+
# @resource_actions is used to customize the actions which appear under
|
25
|
+
# each item on the tables. This is really a nice feature because allows
|
26
|
+
# us to enable actions for items without much effort. For example adding
|
27
|
+
# a "Recover from Trash" action:
|
28
|
+
#
|
29
|
+
# def index
|
30
|
+
# add_resource_action('Recover', {:action => 'untrash'}, {:confirm => Typus::I18n.t("Recover %{resource}?", :resource => @resource.model_name.human)})
|
31
|
+
# super
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Additionally you can set a condition to each action passing a Proc as
|
35
|
+
# 4th parameter. If the proc return true the item will be showed and if
|
36
|
+
# return false will be hidden.
|
37
|
+
#
|
38
|
+
# def index
|
39
|
+
# add_resource_action('Recover', {:action => 'untrash'}, {}, Proc.new {|item| item.is_trash? })
|
40
|
+
# super
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
|
44
|
+
def add_resource_action(*args)
|
45
|
+
@resource_actions ||= []
|
46
|
+
@resource_actions << args unless args.empty?
|
47
|
+
end
|
48
|
+
|
49
|
+
def prepend_resource_action(*args)
|
50
|
+
@resource_actions ||= []
|
51
|
+
@resource_actions = @resource_actions.unshift(args) unless args.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def append_resource_action(*args)
|
55
|
+
@resource_actions ||= []
|
56
|
+
@resource_actions = @resource_actions.concat([args]) unless args.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# @resources_actions is used to build a list of custom actions which will
|
61
|
+
# be appended beside "<h2></h2>" all the actions.
|
62
|
+
#
|
63
|
+
# Let's say for example that I want to be able to run the application
|
64
|
+
# without sidebars and headers (headless mode). In this case I need to
|
65
|
+
# somehow add custom actions to the page so I can navigate.
|
66
|
+
#
|
67
|
+
# Instead of having this code here, maybe it's better to duplicate the
|
68
|
+
# actions on the pages. So for example: Admin::PostsController#index will
|
69
|
+
# show a link to add new in the sidebar and beside the "<h2>" header.
|
70
|
+
#
|
71
|
+
|
72
|
+
def add_resources_action(*args)
|
73
|
+
@resources_actions ||= []
|
74
|
+
@resources_actions << args unless args.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
def prepend_resources_action(*args)
|
78
|
+
@resources_actions ||= []
|
79
|
+
@resources_actions = @resources_actions.unshift(args) unless args.empty?
|
80
|
+
end
|
81
|
+
|
82
|
+
def append_resources_action(*args)
|
83
|
+
@resources_actions ||= []
|
84
|
+
@resources_actions = @resources_actions.concat([args]) unless args.empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Module designed to work with `acts_as_list`.
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
4
|
+
|
5
|
+
module Admin
|
6
|
+
module ActsAsList
|
7
|
+
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
before_filter :get_object, :only => [:position]
|
12
|
+
before_filter :check_resource_ownership, :only => [:position]
|
13
|
+
end
|
14
|
+
|
15
|
+
def position
|
16
|
+
if %w(move_to_top move_higher move_lower move_to_bottom).include?(params[:go])
|
17
|
+
@item.send(params[:go])
|
18
|
+
notice = Typus::I18n.t("%{model} successfully updated.", :model => @resource.model_name.human)
|
19
|
+
redirect_to :back, :notice => notice
|
20
|
+
else
|
21
|
+
not_allowed
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Admin
|
2
|
+
module Ancestry
|
3
|
+
|
4
|
+
def index
|
5
|
+
@items = []
|
6
|
+
|
7
|
+
@resource.roots.each do |item|
|
8
|
+
@items << item
|
9
|
+
if item.has_children?
|
10
|
+
item.children.each do |child|
|
11
|
+
@items << child
|
12
|
+
if child.has_children?
|
13
|
+
child.children.each do |child|
|
14
|
+
@items << child
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
set_default_action
|
22
|
+
add_resource_action("Trash", {:action => "destroy"}, {:confirm => "#{Typus::I18n.t("Trash")}?", :method => 'delete'})
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Admin
|
4
|
+
module Bulk
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
helper_method :bulk_actions
|
10
|
+
before_filter :set_bulk_action, :only => [:index]
|
11
|
+
before_filter :set_bulk_action_for_trash, :only => [:trash]
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_bulk_action
|
15
|
+
add_bulk_action("Move to Trash", "bulk_destroy")
|
16
|
+
end
|
17
|
+
private :set_bulk_action
|
18
|
+
|
19
|
+
# This only happens if we try to access the trash, which won't happen
|
20
|
+
# if trash module is not loaded.
|
21
|
+
def set_bulk_action_for_trash
|
22
|
+
add_bulk_action("Restore from Trash", "bulk_restore")
|
23
|
+
end
|
24
|
+
private :set_bulk_action_for_trash
|
25
|
+
|
26
|
+
def bulk
|
27
|
+
if (ids = params[:selected_item_ids]) && (action = params[:batch_action]).present?
|
28
|
+
send(params[:batch_action], ids)
|
29
|
+
else
|
30
|
+
notice = if action.empty?
|
31
|
+
Typus::I18n.t("No bulk action selected.")
|
32
|
+
else
|
33
|
+
Typus::I18n.t("Items must be selected in order to perform actions on them. No items have been changed.")
|
34
|
+
end
|
35
|
+
redirect_to :back, :notice => notice
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def bulk_destroy(ids)
|
40
|
+
ids.each { |id| @resource.destroy(id) }
|
41
|
+
notice = Typus::I18n.t("Successfully deleted #{ids.count} entries.")
|
42
|
+
redirect_to :back, :notice => notice
|
43
|
+
end
|
44
|
+
private :bulk_destroy
|
45
|
+
|
46
|
+
def bulk_restore(ids)
|
47
|
+
ids.each { |id| @resource.deleted.find(id).restore }
|
48
|
+
notice = Typus::I18n.t("Successfully restored #{ids.count} entries.")
|
49
|
+
redirect_to :back, :notice => notice
|
50
|
+
end
|
51
|
+
private :bulk_restore
|
52
|
+
|
53
|
+
def add_bulk_action(*args)
|
54
|
+
bulk_actions
|
55
|
+
@bulk_actions << args unless args.empty?
|
56
|
+
end
|
57
|
+
protected :add_bulk_action
|
58
|
+
|
59
|
+
def prepend_bulk_action(*args)
|
60
|
+
bulk_actions
|
61
|
+
@bulk_actions = @bulk_actions.unshift(args) unless args.empty?
|
62
|
+
end
|
63
|
+
protected :prepend_bulk_action
|
64
|
+
|
65
|
+
def append_bulk_action(*args)
|
66
|
+
bulk_actions
|
67
|
+
@bulk_actions = @bulk_actions.concat([args]) unless args.empty?
|
68
|
+
end
|
69
|
+
protected :append_bulk_action
|
70
|
+
|
71
|
+
def bulk_actions
|
72
|
+
@bulk_actions ||= []
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Admin
|
2
|
+
module FeaturedImage
|
3
|
+
|
4
|
+
def set_featured_image
|
5
|
+
attachment = Attachment.find(params[:id])
|
6
|
+
|
7
|
+
item = params[:resource].constantize.unscoped.find(params[:resource_id])
|
8
|
+
item.set_featured_image(attachment.id)
|
9
|
+
|
10
|
+
options = { :controller => params[:resource].tableize, :action => 'edit', :id => item.id }
|
11
|
+
redirect_to options, :notice => Typus::I18n.t("Featured image set")
|
12
|
+
end
|
13
|
+
|
14
|
+
def remove_featured_image
|
15
|
+
item = @resource.unscoped.find(params[:id])
|
16
|
+
item.try(:remove_featured_image)
|
17
|
+
options = { :action => 'edit', :id => item.id }
|
18
|
+
redirect_to options, :notice => Typus::I18n.t("Featured image removed")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# How to setup a predefined filter?
|
2
|
+
# ---------------------------------
|
3
|
+
#
|
4
|
+
# On your controllers:
|
5
|
+
#
|
6
|
+
# def index
|
7
|
+
# # Added predefined filter takes any argument, but in the views we
|
8
|
+
# # expected the following:
|
9
|
+
# #
|
10
|
+
# # add_predefined_filter(filter_name, action, scope)
|
11
|
+
# #
|
12
|
+
# ...
|
13
|
+
# add_predefined_filter("Trash", "trash", "deleted")
|
14
|
+
# ...
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# On your views:
|
18
|
+
#
|
19
|
+
# <% predefined_filters.each do |filter_name, action, scope| %>
|
20
|
+
# ...
|
21
|
+
# <% end %>
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'active_support/concern'
|
25
|
+
|
26
|
+
module Admin
|
27
|
+
module Filters
|
28
|
+
|
29
|
+
extend ActiveSupport::Concern
|
30
|
+
|
31
|
+
included do
|
32
|
+
helper_method :predefined_filters
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def add_predefined_filter(*args)
|
38
|
+
predefined_filters
|
39
|
+
@predefined_filters << args unless args.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def prepend_predefined_filter(*args)
|
43
|
+
predefined_filters
|
44
|
+
@predefined_filters = @predefined_filters.unshift(args) unless args.empty?
|
45
|
+
end
|
46
|
+
|
47
|
+
def append_predefined_filter(*args)
|
48
|
+
predefined_filters
|
49
|
+
@predefined_filters = @predefined_filters.concat([args]) unless args.empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
def predefined_filters
|
53
|
+
@predefined_filters ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
module Admin
|
4
|
+
module Format
|
5
|
+
|
6
|
+
protected
|
7
|
+
|
8
|
+
def get_paginated_data
|
9
|
+
items_per_page = params[:per_page] || @resource.typus_options_for(:per_page)
|
10
|
+
offset = params[:offset] || 0
|
11
|
+
@items = @resource.limit(items_per_page).offset(offset)
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_csv
|
15
|
+
fields = @resource.typus_fields_for(:csv)
|
16
|
+
|
17
|
+
data = ::CSV.generate do |csv|
|
18
|
+
csv << fields.keys.map { |k| @resource.human_attribute_name(k) }
|
19
|
+
@resource.find_each do |record|
|
20
|
+
csv << fields.map do |key, value|
|
21
|
+
case value
|
22
|
+
when :transversal
|
23
|
+
a, b = key.split(".")
|
24
|
+
record.send(a).send(b)
|
25
|
+
when :belongs_to
|
26
|
+
record.send(key).try(:to_label)
|
27
|
+
else
|
28
|
+
record.send(key)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
send_data data, :filename => "export-#{@resource.to_resource}-#{Time.zone.now.to_s(:number)}.csv"
|
35
|
+
end
|
36
|
+
|
37
|
+
def export(format)
|
38
|
+
fields = @resource.typus_fields_for(format).map(&:first)
|
39
|
+
methods = fields - @resource.column_names
|
40
|
+
except = @resource.column_names - fields
|
41
|
+
|
42
|
+
get_paginated_data
|
43
|
+
|
44
|
+
render format => @items.send("to_#{format}", :methods => methods, :except => except)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Admin
|
4
|
+
module Headless
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
helper_method :headless_mode?
|
10
|
+
layout :headless_layout
|
11
|
+
end
|
12
|
+
|
13
|
+
def headless_layout
|
14
|
+
headless_mode? ? "admin/headless" : "admin/base"
|
15
|
+
end
|
16
|
+
private :headless_layout
|
17
|
+
|
18
|
+
def headless_mode?
|
19
|
+
params[:_popup]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|