rails_admin_cms 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +36 -0
- data/Rakefile +26 -0
- data/app/assets/javascripts/rails_admin_cms/all.js.coffee +2 -0
- data/app/assets/javascripts/rails_admin_cms/cms.js.coffee +18 -0
- data/app/assets/javascripts/rails_admin_cms/cms/flashes.js.coffee +2 -0
- data/app/assets/javascripts/rails_admin_cms/cms/with_scope/forms.js.coffee +4 -0
- data/app/assets/javascripts/rails_admin_cms/cms/with_scope/viewables.js.coffee +14 -0
- data/app/assets/stylesheets/rails_admin_cms/all.css.sass +0 -0
- data/app/controllers/cms/attachments_controller.rb +20 -0
- data/app/controllers/cms/files_controller.rb +19 -0
- data/app/controllers/cms/forms_controller.rb +89 -0
- data/app/controllers/cms/pages_controller.rb +13 -0
- data/app/controllers/cms/viewables_controller.rb +49 -0
- data/app/controllers/concerns/cms/editing.rb +21 -0
- data/app/controllers/concerns/cms/localize.rb +15 -0
- data/app/helpers/cms/cache_helper.rb +26 -0
- data/app/helpers/cms/form_helper.rb +67 -0
- data/app/helpers/cms/locale_helper.rb +34 -0
- data/app/helpers/cms/view_helper.rb +37 -0
- data/app/helpers/cms/viewable_helper.rb +155 -0
- data/app/helpers/rails_admin/form_builder_decorator.rb +11 -0
- data/app/helpers/rails_admin/navigation_helper.rb +77 -0
- data/app/mailers/cms/forms_mailer.rb +48 -0
- data/app/models/admin/form/email.rb +41 -0
- data/app/models/admin/form/field.rb +25 -0
- data/app/models/admin/form/row.rb +36 -0
- data/app/models/admin/form/static/object.rb +15 -0
- data/app/models/admin/form/structure.rb +18 -0
- data/app/models/admin/setting.rb +21 -0
- data/app/models/admin/unique_key.rb +15 -0
- data/app/models/admin/viewable/block.rb +25 -0
- data/app/models/admin/viewable/form.rb +36 -0
- data/app/models/admin/viewable/image.rb +18 -0
- data/app/models/admin/viewable/link.rb +21 -0
- data/app/models/admin/viewable/page.rb +27 -0
- data/app/models/admin/viewable/select.rb +15 -0
- data/app/models/admin/viewable/text.rb +16 -0
- data/app/models/callbacks/form/field_after_create.rb +16 -0
- data/app/models/callbacks/form/field_after_destroy.rb +16 -0
- data/app/models/callbacks/form/field_before_update.rb +29 -0
- data/app/models/callbacks/restrictor.rb +30 -0
- data/app/models/callbacks/unique_key_before_update.rb +46 -0
- data/app/models/callbacks/viewable_after_destroy.rb +27 -0
- data/app/models/callbacks/viewable_before_update.rb +15 -0
- data/app/models/form.rb +43 -0
- data/app/models/form/email.rb +21 -0
- data/app/models/form/field.rb +75 -0
- data/app/models/form/row.rb +30 -0
- data/app/models/form/static.rb +17 -0
- data/app/models/form/static/attachment.rb +62 -0
- data/app/models/form/static/base.rb +10 -0
- data/app/models/form/static/email.rb +23 -0
- data/app/models/form/static/object.rb +12 -0
- data/app/models/form/structure.rb +90 -0
- data/app/models/setting.rb +85 -0
- data/app/models/unique_key.rb +62 -0
- data/app/models/viewable.rb +93 -0
- data/app/models/viewable/block.rb +39 -0
- data/app/models/viewable/field/url.rb +45 -0
- data/app/models/viewable/field/uuid.rb +61 -0
- data/app/models/viewable/form.rb +67 -0
- data/app/models/viewable/image.rb +6 -0
- data/app/models/viewable/link.rb +10 -0
- data/app/models/viewable/page.rb +24 -0
- data/app/models/viewable/select.rb +6 -0
- data/app/models/viewable/text.rb +6 -0
- data/app/presenters/base_list_presenter.rb +42 -0
- data/app/presenters/base_presenter.rb +17 -0
- data/app/presenters/viewable/block_presenter.rb +10 -0
- data/app/presenters/viewable/form_presenter.rb +15 -0
- data/app/presenters/viewable/image_presenter.rb +11 -0
- data/app/presenters/viewable/link_list_presenter.rb +44 -0
- data/app/presenters/viewable/link_presenter.rb +64 -0
- data/app/presenters/viewable/page_presenter.rb +4 -0
- data/app/presenters/viewable/select_list_presenter.rb +7 -0
- data/app/presenters/viewable/select_presenter.rb +15 -0
- data/app/presenters/viewable/text_presenter.rb +11 -0
- data/app/presenters/viewable/view_presenter.rb +38 -0
- data/app/presenters/viewable_list_presenter.rb +54 -0
- data/app/presenters/viewable_presenter.rb +27 -0
- data/app/views/cms/forms/create.js.erb +3 -0
- data/app/views/cms/shared/_flash_messages.js.erb +2 -0
- data/app/views/cms/viewables/update.js.erb +1 -0
- data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +10 -0
- data/config/initializers/assets.rb +6 -0
- data/config/initializers/route_translator.rb +3 -0
- data/config/locales/cms.en.yml +32 -0
- data/config/locales/cms.fr.yml +32 -0
- data/config/locales/flash.en.yml +43 -0
- data/config/locales/flash.fr.yml +43 -0
- data/config/locales/routes.en.yml +3 -0
- data/config/locales/routes.fr.yml +3 -0
- data/config/routes.rb +36 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20151226023652_create_unique_key.rb +19 -0
- data/db/migrate/20151226054335_create_viewable_link.rb +14 -0
- data/db/migrate/20151227064933_create_viewable_text.rb +10 -0
- data/db/migrate/20151227072412_create_rich_rich_images.rich.rb +18 -0
- data/db/migrate/20151227072413_add_uri_cache_to_rich_image.rich.rb +6 -0
- data/db/migrate/20151227072414_refactor_image_to_file.rich.rb +13 -0
- data/db/migrate/20151228231201_create_viewable_image.rb +10 -0
- data/db/migrate/20151230050603_create_setting.rb +13 -0
- data/db/migrate/20151230072904_add_cms_mail_from_and_bcc_settings.rb +14 -0
- data/db/migrate/20151230085947_create_viewable_select.rb +10 -0
- data/db/migrate/20151231054310_create_viewable_block.rb +9 -0
- data/db/migrate/20151231102148_create_viewable_page.rb +13 -0
- data/db/migrate/20160101124428_create_viewable_form.rb +15 -0
- data/db/migrate/20160101140244_create_form_structure.rb +9 -0
- data/db/migrate/20160101141844_create_form_row.rb +13 -0
- data/db/migrate/20160102010317_create_form_field.rb +17 -0
- data/db/migrate/20160103120544_create_form_email.rb +18 -0
- data/lib/generators/cms/install/USAGE +8 -0
- data/lib/generators/cms/install/install_generator.rb +14 -0
- data/lib/generators/cms/install/templates/Gemfile +47 -0
- data/lib/generators/cms/install/templates/app/assets/javascripts/application.js +19 -0
- data/lib/generators/cms/install/templates/app/assets/stylesheets/application.css +17 -0
- data/lib/generators/cms/install/templates/app/controllers/application_controller.rb +9 -0
- data/lib/generators/cms/install/templates/app/controllers/cms/authenticate.rb +34 -0
- data/lib/generators/cms/install/templates/app/models/form/contact.rb +20 -0
- data/lib/generators/cms/install/templates/app/views/cms/blocks/_example.html.erb +13 -0
- data/lib/generators/cms/install/templates/app/views/cms/forms/contact/_form.html.erb +30 -0
- data/lib/generators/cms/install/templates/app/views/cms/forms/contact/new.html.erb +19 -0
- data/lib/generators/cms/install/templates/app/views/cms/forms_mailer/contact.html.erb +6 -0
- data/lib/generators/cms/install/templates/app/views/cms/forms_mailer/contact.text.erb +6 -0
- data/lib/generators/cms/install/templates/app/views/cms/pages/page.html.erb +29 -0
- data/lib/generators/cms/install/templates/app/views/layouts/application.html.erb +23 -0
- data/lib/generators/cms/install/templates/config/application.rb +36 -0
- data/lib/generators/cms/install/templates/config/initializers/rails_admin.rb +97 -0
- data/lib/generators/cms/install/templates/config/initializers/rich.rb +142 -0
- data/lib/generators/cms/install/templates/config/initializers/simple_form.rb +165 -0
- data/lib/generators/cms/install/templates/config/initializers/simple_form_bootstrap.rb +149 -0
- data/lib/generators/cms/install/templates/config/locales/routes.en.yml +4 -0
- data/lib/generators/cms/install/templates/config/locales/simple_form.en.yml +31 -0
- data/lib/generators/cms/install/templates/config/routes.rb +61 -0
- data/lib/generators/cms/install/templates/vendor/assets/javascripts/rails_admin/custom/ui.js.coffee +1 -0
- data/lib/generators/cms/install/templates/vendor/assets/stylesheets/rails_admin/custom/mixins.sass +0 -0
- data/lib/generators/cms/install/templates/vendor/assets/stylesheets/rails_admin/custom/theming.sass +1 -0
- data/lib/generators/cms/install/templates/vendor/assets/stylesheets/rails_admin/custom/variables.sass +0 -0
- data/lib/generators/cms/install/templates/vendor/assets/stylesheets/rich/editor.css +20 -0
- data/lib/rails_admin_cms.rb +28 -0
- data/lib/rails_admin_cms/config.rb +45 -0
- data/lib/rails_admin_cms/core_ext/boolean.rb +29 -0
- data/lib/rails_admin_cms/engine.rb +11 -0
- data/lib/rails_admin_cms/inflections.rb +4 -0
- data/lib/rails_admin_cms/utils.rb +30 -0
- data/lib/rails_admin_cms/version.rb +3 -0
- data/lib/tasks/rails_admin_cms_tasks.rake +4 -0
- metadata +669 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module CMS
|
2
|
+
module LocaleHelper
|
3
|
+
def cms_locale_selector
|
4
|
+
links = [ link_to(t('cms.locale_selector.language'), '#', class: 'active') ]
|
5
|
+
|
6
|
+
I18n.available_locales.reject{ |l| l == locale }.each do |locale|
|
7
|
+
path = current_url_for(locale)
|
8
|
+
links << link_to(t('cms.locale_selector.language', locale: locale), path)
|
9
|
+
end
|
10
|
+
|
11
|
+
content_tag(:ul) do
|
12
|
+
links.each do |link|
|
13
|
+
concat content_tag(:li, link)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def current_url_for(locale)
|
21
|
+
url = case controller_path
|
22
|
+
when /^cms\/(pages|forms)/
|
23
|
+
if @cms_view
|
24
|
+
@cms_view.other_uuid(locale).try(:url)
|
25
|
+
else
|
26
|
+
main_app.try("#{params[:cms_view_type]}_#{locale}_path")
|
27
|
+
end
|
28
|
+
else
|
29
|
+
url_for(:locale => locale.to_s)
|
30
|
+
end
|
31
|
+
url.presence || main_app.root_path(locale: locale)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module CMS
|
2
|
+
module ViewHelper
|
3
|
+
def cms_body_class(*args)
|
4
|
+
controller_name = controller_path.gsub('/','-')
|
5
|
+
classes = [
|
6
|
+
params[:cms_body_class],
|
7
|
+
controller_name,
|
8
|
+
"#{controller_name}-#{action_name}",
|
9
|
+
I18n.locale,
|
10
|
+
]
|
11
|
+
classes << 'cms-edit-mode' if cms_edit_mode?
|
12
|
+
classes.concat(args) if args.any?
|
13
|
+
classes.compact.join(' ')
|
14
|
+
end
|
15
|
+
|
16
|
+
def cms_flash_messages(*args)
|
17
|
+
content_tag :div, class: 'cms-flash-messages', 'data-cms-flash' => true do
|
18
|
+
flash_messages(*args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def cms_title(default = nil)
|
23
|
+
@cms_page_title || default
|
24
|
+
end
|
25
|
+
|
26
|
+
def cms_meta_data_tags(default = nil)
|
27
|
+
if @cms_page_meta_keywords || @cms_page_meta_description
|
28
|
+
html = tag(:meta, name: 'meta_keywords', content: @cms_page_meta_keywords)
|
29
|
+
html << "\n"
|
30
|
+
html << tag(:meta, name: 'meta_description', content: @cms_page_meta_description)
|
31
|
+
html.html_safe
|
32
|
+
else
|
33
|
+
default
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
module CMS
|
2
|
+
module ViewableHelper
|
3
|
+
def self.define_cms_view_helper(type)
|
4
|
+
define_method "cms_view_#{type}" do |name = 'cms', min = 1, max = nil|
|
5
|
+
name, min, max = adjust_arguments(name, min, max)
|
6
|
+
|
7
|
+
public_send("cms_#{type}", @cms_view.uuid_with(name), min, max)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Viewable::Block.names.each do |type|
|
12
|
+
define_cms_view_helper(type)
|
13
|
+
|
14
|
+
define_method "cms_#{type}" do |name = 'cms', min = 1, max = nil| # max = FLOAT::INFINITY
|
15
|
+
name, min, max = adjust_arguments(name, min, max)
|
16
|
+
|
17
|
+
cms_block("#{type}/#{name}", min, max)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Viewable.names.each do |type|
|
22
|
+
define_cms_view_helper(type)
|
23
|
+
|
24
|
+
define_method "cms_#{type}" do |name = 'cms', min = 1, max = nil| # max = FLOAT::INFINITY
|
25
|
+
name, min, max = adjust_arguments(name, min, max)
|
26
|
+
|
27
|
+
validate_arguments! type, min, max
|
28
|
+
|
29
|
+
name, presenter = adjust_name_or_build_view_presenter type, name
|
30
|
+
|
31
|
+
return presenter if presenter
|
32
|
+
|
33
|
+
presenter_list = (1..min).map do |position|
|
34
|
+
find_or_create_presenter(type, name, position)
|
35
|
+
end
|
36
|
+
|
37
|
+
list_key = cms_list_key(type, name)
|
38
|
+
|
39
|
+
if max.nil?
|
40
|
+
if min == 1
|
41
|
+
return presenter_list.first
|
42
|
+
else
|
43
|
+
return build_list_presenter(presenter_list, list_key, max)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
((min + 1)..max).each do |position|
|
48
|
+
if (presenter = find_presenter(type, name, position))
|
49
|
+
presenter_list << presenter
|
50
|
+
else
|
51
|
+
break
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
build_list_presenter(presenter_list, list_key, max)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def cms_link_to_edit_mode
|
60
|
+
next_mode = cms_edit_mode? ? t('cms.show_mode') : t('cms.edit_mode')
|
61
|
+
|
62
|
+
path = "#{request.path}?#{{ edit_mode: !cms_edit_mode? }.to_query}"
|
63
|
+
|
64
|
+
link_to next_mode, path
|
65
|
+
end
|
66
|
+
|
67
|
+
def cms_list_key(type, name)
|
68
|
+
{
|
69
|
+
viewable_type: "Viewable::#{type.camelize}",
|
70
|
+
view_path: @virtual_path,
|
71
|
+
name: name,
|
72
|
+
locale: locale,
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def adjust_arguments(name, min, max)
|
79
|
+
if !name.is_a?(String) && !name.is_a?(Symbol)
|
80
|
+
max, min = min, name
|
81
|
+
name = 'cms'
|
82
|
+
end
|
83
|
+
[name, min, max]
|
84
|
+
end
|
85
|
+
|
86
|
+
def validate_arguments!(type, min, max)
|
87
|
+
if min == Float::INFINITY
|
88
|
+
raise ArgumentError, "'min' can not be Float::INFINITY"
|
89
|
+
end
|
90
|
+
if max.nil?
|
91
|
+
if min == 0
|
92
|
+
raise ArgumentError, "if 'max' is not defined, 'min' must be greater than 0"
|
93
|
+
end
|
94
|
+
elsif max < 1
|
95
|
+
raise ArgumentError, "'max' must be greater than 0 or nil"
|
96
|
+
end
|
97
|
+
if type == 'block' && @cms_view_partial
|
98
|
+
raise ArgumentError, "can not have cms_block(...) within block partials"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def adjust_name_or_build_view_presenter(type, name)
|
103
|
+
case type
|
104
|
+
when 'page'
|
105
|
+
if @cms_view
|
106
|
+
presenter = Viewable::PagePresenter.new(@cms_view, self)
|
107
|
+
end
|
108
|
+
when 'form'
|
109
|
+
if @cms_view
|
110
|
+
presenter = Viewable::FormPresenter.new(@cms_view, self)
|
111
|
+
end
|
112
|
+
else
|
113
|
+
if @cms_view_partial
|
114
|
+
name = @cms_view_partial.uuid_with(name)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
[name, presenter]
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_presenter(type, name, position)
|
121
|
+
unique_key = to_unique_key(type, name, position)
|
122
|
+
if (viewable = UniqueKey.find_viewable(unique_key))
|
123
|
+
build_presenter(unique_key, viewable)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_or_create_presenter(type, name, position)
|
128
|
+
unique_key = to_unique_key(type, name, position)
|
129
|
+
viewable = UniqueKey.find_or_create_viewable!(unique_key)
|
130
|
+
build_presenter(unique_key, viewable)
|
131
|
+
end
|
132
|
+
|
133
|
+
def build_presenter(unique_key, viewable)
|
134
|
+
presenter_class = "#{unique_key[:viewable_type]}Presenter".safe_constantize
|
135
|
+
if presenter_class
|
136
|
+
presenter_class.new(viewable, self)
|
137
|
+
else
|
138
|
+
ViewablePresenter.new(viewable, self)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def build_list_presenter(viewables, list_key, max)
|
143
|
+
list_presenter_class = "#{list_key[:viewable_type]}ListPresenter".safe_constantize
|
144
|
+
if list_presenter_class
|
145
|
+
list_presenter_class.new(viewables, self, list_key, max)
|
146
|
+
else
|
147
|
+
ViewableListPresenter.new(viewables, self, list_key, max)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def to_unique_key(type, name, position)
|
152
|
+
cms_list_key(type, name).merge(position: position)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module RailsAdmin
|
2
|
+
FormBuilder.class_eval do
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def nested_field_association?(field, nested_in)
|
7
|
+
field.inverse_of.presence && nested_in.presence && field.inverse_of == nested_in.name &&
|
8
|
+
(@template.instance_variable_get(:@model_config).abstract_model == field.abstract_model || field.name == nested_in.inverse_of)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module RailsAdmin
|
2
|
+
module NavigationHelper
|
3
|
+
CMSViewableEdit ||= /viewable~(\w+)\/(\d+)\/edit/
|
4
|
+
CMSPageType ||= /^cms\/pages\/(\w+)$/
|
5
|
+
CMSPageFormType ||= /^cms\/forms\/(\w+)\/new$/
|
6
|
+
CMSFormType ||= /^cms\/forms\/(\w+)\/_form$/
|
7
|
+
CMSPageUUID ||= /^P\[(.+)\]/
|
8
|
+
|
9
|
+
def admin_locale_selector
|
10
|
+
selectors = I18n.available_locales.reject{ |l| l == locale }.map do |locale|
|
11
|
+
if request.path =~ CMSViewableEdit
|
12
|
+
viewable = extract_viewable($1, $2)
|
13
|
+
unique_key = viewable.unique_key_hash(locale)
|
14
|
+
other_id = UniqueKey.find_viewable(unique_key).id
|
15
|
+
|
16
|
+
path = "#{dashboard_path}/viewable~#{$1}/#{other_id}/edit?locale=#{locale}"
|
17
|
+
else
|
18
|
+
path = "#{request.path}?#{ { locale: locale }.to_query }"
|
19
|
+
end
|
20
|
+
[locale, path]
|
21
|
+
end
|
22
|
+
|
23
|
+
selectors.map do |locale, path|
|
24
|
+
content_tag :li do
|
25
|
+
link_to t('cms.locale_selector.language', locale: locale), path
|
26
|
+
end
|
27
|
+
end.join.html_safe
|
28
|
+
end
|
29
|
+
|
30
|
+
def admin_back_home
|
31
|
+
if request.path =~ CMSViewableEdit
|
32
|
+
viewable = extract_viewable($1, $2)
|
33
|
+
view_path, name, type = viewable.slice(:view_path, :unique_key_name, :viewable_type).values
|
34
|
+
|
35
|
+
if type == 'Viewable::Page'
|
36
|
+
path = viewable.url
|
37
|
+
elsif name =~ CMSPageUUID
|
38
|
+
path = Viewable::Page.find_by_uuid($1).url
|
39
|
+
else
|
40
|
+
case view_path
|
41
|
+
when CMSPageType, CMSPageFormType, CMSFormType
|
42
|
+
path = main_app.try "#{$1}_path"
|
43
|
+
when /\/(\w+)\/index$/
|
44
|
+
resources = $1
|
45
|
+
if resources.singularize == resources
|
46
|
+
path = main_app.try "#{resources}_index_path"
|
47
|
+
else
|
48
|
+
path = main_app.try "#{resources}_path"
|
49
|
+
end
|
50
|
+
when /\/\w+\/show$/
|
51
|
+
scopes = view_path.split('/')
|
52
|
+
scopes.pop
|
53
|
+
resource = scopes.pop.singularize
|
54
|
+
namespace = scopes.map(&:camelize).join('::')
|
55
|
+
first_object = "#{namespace}::#{resource.camelize}".constantize.first
|
56
|
+
|
57
|
+
if first_object
|
58
|
+
path = main_app.try "#{resource}_path", first_object
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
path ||= main_app.root_path
|
65
|
+
|
66
|
+
content_tag :li do
|
67
|
+
link_to t('admin.home.name'), path
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def extract_viewable(type, id)
|
74
|
+
@_viewable ||= "Viewable::#{type.camelize}".constantize.find(id)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module CMS
|
2
|
+
class FormsMailer < RailsAdminCMS::Config.parent_mailer
|
3
|
+
def send_email(form)
|
4
|
+
options = {
|
5
|
+
from: form.send_from,
|
6
|
+
to: form.send_to,
|
7
|
+
bcc: Setting[:cms_mail_bcc],
|
8
|
+
subject: form.subject,
|
9
|
+
template_name: form.form_name,
|
10
|
+
}
|
11
|
+
|
12
|
+
if form.has_attachments?
|
13
|
+
options[:content_type] = 'multipart/form-data'
|
14
|
+
form.attachments.each do |name|
|
15
|
+
attachment = form.send(name)
|
16
|
+
next unless attachment.exists?
|
17
|
+
attachments[attachment.original_filename] = File.read(attachment.path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
@form = form
|
22
|
+
mail options
|
23
|
+
|
24
|
+
# https://github.com/rails/rails/issues/2686
|
25
|
+
fix_mixed_attachments
|
26
|
+
end
|
27
|
+
|
28
|
+
def fix_mixed_attachments
|
29
|
+
# do nothing if we have no actual attachments
|
30
|
+
return if @_message.parts.select { |p| p.attachment? && !p.inline? }.none?
|
31
|
+
|
32
|
+
mail = Mail.new
|
33
|
+
|
34
|
+
related = Mail::Part.new
|
35
|
+
related.content_type = @_message.content_type
|
36
|
+
@_message.parts.select { |p| !p.attachment? || p.inline? }.each { |p| related.add_part(p) }
|
37
|
+
mail.add_part related
|
38
|
+
|
39
|
+
mail.header = @_message.header.to_s
|
40
|
+
mail.bcc = @_message.header[:bcc].value # copy bcc manually because it is omitted in header.to_s
|
41
|
+
mail.content_type = nil
|
42
|
+
@_message.parts.select { |p| p.attachment? && !p.inline? }.each { |p| mail.add_part(p) }
|
43
|
+
|
44
|
+
@_message = mail
|
45
|
+
wrap_delivery_behavior!(delivery_method.to_sym)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Admin
|
2
|
+
module Form
|
3
|
+
module Email
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
rails_admin do
|
8
|
+
visible false
|
9
|
+
|
10
|
+
object_label_method do
|
11
|
+
:rails_admin_label
|
12
|
+
end
|
13
|
+
|
14
|
+
edit do
|
15
|
+
toolbar = Rich.editor[:toolbar].deep_dup
|
16
|
+
toolbar.delete_at(-2)
|
17
|
+
|
18
|
+
if RailsAdminCMS::Config.with_email_body?
|
19
|
+
I18n.available_locales.each do |locale|
|
20
|
+
configure :"body_#{locale}", :rich_editor do
|
21
|
+
config(toolbar: toolbar)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
exclude_fields :structure
|
25
|
+
else
|
26
|
+
exclude_fields :structure, *I18n.available_locales.map{ |l| :"body_#{l}" }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def rails_admin_label
|
33
|
+
if with_email?
|
34
|
+
'<i class="icon-ok"></i>'
|
35
|
+
else
|
36
|
+
'<i>-</i>'
|
37
|
+
end.html_safe
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Admin
|
2
|
+
module Form
|
3
|
+
module Field
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
rails_admin do
|
8
|
+
visible false
|
9
|
+
|
10
|
+
object_label_method do
|
11
|
+
:rails_admin_label
|
12
|
+
end
|
13
|
+
|
14
|
+
edit do
|
15
|
+
exclude_fields :structure, :fields
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def rails_admin_label
|
21
|
+
default_label.presence || position
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Admin
|
2
|
+
module Form
|
3
|
+
module Row
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
rails_admin do
|
8
|
+
object_label_method do
|
9
|
+
:id
|
10
|
+
end
|
11
|
+
|
12
|
+
configure :structure do
|
13
|
+
read_only true
|
14
|
+
pretty_value do
|
15
|
+
h = bindings[:view]
|
16
|
+
p = ViewablePresenter.new value, h
|
17
|
+
h.link_to value.name, p.__send__(:edit_path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
edit do
|
22
|
+
exclude_fields :fields, :viewable
|
23
|
+
end
|
24
|
+
|
25
|
+
list do
|
26
|
+
configure :id do
|
27
|
+
sort_reverse false
|
28
|
+
end
|
29
|
+
|
30
|
+
scopes ::Form::Structure.scopes
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|