hancock_cms 2.0.0.2 → 2.0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +4 -0
- data/app/assets/images/{devices → hancock/devise}/login-bg.jpg +0 -0
- data/app/assets/images/{rails-admin → hancock/rails_admin}/hancock_logo.svg +0 -0
- data/app/assets/javascripts/hancock/cms.coffee +1 -1
- data/app/assets/javascripts/hancock/rails_admin/cms.ui.coffee +11 -37
- data/app/assets/javascripts/hancock/rails_admin/en_ru_switcher.coffee +90 -0
- data/app/assets/javascripts/hancock/rails_admin/enum_with_custom.coffee +42 -0
- data/app/assets/javascripts/hancock/rails_admin/form_controls_fixed.coffee +44 -0
- data/app/assets/javascripts/hancock/rails_admin/leftside_hider.coffee +106 -0
- data/app/assets/javascripts/hancock/rails_admin/multiselect.coffee +8 -0
- data/app/assets/javascripts/hancock/rails_admin/navigation_dropdown.coffee +25 -0
- data/app/assets/javascripts/hancock/rails_admin/navigation_filter.coffee +108 -0
- data/app/assets/javascripts/hancock/rails_admin/navigation_scroll.coffee +12 -0
- data/app/assets/javascripts/hancock/rails_admin/plugins.coffee.erb +16 -0
- data/app/assets/javascripts/jquery.placeholder.js +3 -2
- data/app/assets/javascripts/rails_admin/custom/ui.coffee +1 -0
- data/app/assets/stylesheets/hancock/cms/devise.sass +4 -1
- data/app/assets/stylesheets/hancock/rails_admin/cms.theming.sass +354 -147
- data/app/assets/stylesheets/hancock/rails_admin/fieldsets.sass +198 -0
- data/app/assets/stylesheets/hancock/rails_admin/plugins.sass.erb +6 -0
- data/app/assets/stylesheets/rails_admin/custom/theming.sass +1 -1
- data/app/controllers/concerns/hancock/decorators/home.rb +1 -1
- data/app/controllers/concerns/hancock/errors.rb +5 -7
- data/app/controllers/hancock/registrations_controller.rb +2 -7
- data/app/controllers/hancock/sessions_controller.rb +3 -7
- data/app/helpers/hancock/powered_helper.rb +3 -3
- data/app/helpers/hancock/settings_helper.rb +44 -0
- data/app/helpers/rails_admin/application/hancock_helper.rb +19 -0
- data/app/helpers/rails_admin/hancock/form_builder.rb +44 -0
- data/app/helpers/rails_admin/main/hancock_helper.rb +51 -0
- data/app/models/concerns/hancock/boolean_field.rb +7 -2
- data/app/models/concerns/hancock/decorators/embedded_element.rb +1 -9
- data/app/models/concerns/hancock/enableable.rb +1 -0
- data/app/models/concerns/hancock/hash_field.rb +9 -8
- data/app/models/concerns/hancock/html_field.rb +6 -3
- data/app/models/concerns/hancock/insertion_field.rb +115 -0
- data/app/models/concerns/hancock/mappable.rb +1 -0
- data/app/models/concerns/hancock/master_collection.rb +31 -0
- data/app/models/concerns/hancock/model_localizeable.rb +4 -1
- data/app/models/concerns/hancock/rails_admin_patch.rb +22 -3
- data/app/models/concerns/hancock/sort_field.rb +26 -3
- data/app/models/concerns/hancock/sortable.rb +3 -0
- data/app/models/concerns/hancock/user_defined.rb +53 -0
- data/app/views/blocks/_footer.html.slim +1 -1
- data/app/views/devise/passwords/edit.html.slim +0 -2
- data/app/views/devise/passwords/new.html.slim +0 -2
- data/app/views/devise/registrations/edit.html.slim +0 -2
- data/app/views/devise/registrations/new.html.slim +0 -2
- data/app/views/devise/sessions/new.html.slim +0 -2
- data/app/views/hancock/home/index.html.slim +4 -1
- data/app/views/layouts/application.html.slim +1 -11
- data/app/views/layouts/hancock/_assets.html.slim +15 -0
- data/app/views/layouts/hancock/devise/confirmations.html.slim +7 -4
- data/app/views/layouts/hancock/devise/passwords.html.slim +7 -4
- data/app/views/layouts/hancock/devise/registrations.html.slim +7 -4
- data/app/views/layouts/hancock/devise/sessions.html.slim +7 -4
- data/app/views/layouts/hancock/devise/unlocks.html.slim +7 -4
- data/app/views/layouts/rails_admin/_footer.html.slim +2 -2
- data/app/views/layouts/rails_admin/_footer_navigation.html.slim +20 -4
- data/app/views/layouts/rails_admin/_navigation.html.slim +13 -47
- data/app/views/layouts/rails_admin/_secondary_navigation.html.slim +5 -12
- data/app/views/layouts/rails_admin/_sidebar_navigation.html.slim +2 -0
- data/app/views/layouts/rails_admin/_sidebar_navigation_filter.html.slim +3 -0
- data/app/views/layouts/rails_admin/application.html.haml +3 -38
- data/app/views/rails_admin/main/_enum_for_settings_kinds.html.slim +24 -0
- data/app/views/rails_admin/main/_form_hancock_enum.html.slim +18 -0
- data/app/views/rails_admin/main/_form_hancock_enum_with_custom.slim +20 -0
- data/app/views/rails_admin/main/_hancock_html.html.slim +2 -2
- data/app/views/rails_admin/main/_hancock_html_ml.html.slim +31 -34
- data/app/views/rails_admin/main/edit.html.haml +18 -0
- data/app/views/rails_admin/main/new.html.haml +17 -0
- data/app/views/shared/_admin_link.html.slim +4 -2
- data/config/initializers/nested_set_patch.rb +76 -73
- data/config/initializers/rails_admin_mongoid_patch.rb +27 -0
- data/config/initializers/sprockets_patch.rb +159 -0
- data/config/locales/en.hancock.yml +1 -0
- data/config/locales/ru.devise.yml +22 -18
- data/config/locales/ru.hancock.yml +5 -5
- data/config/locales/ru.rails_admin.yml +3 -0
- data/hancock_cms.gemspec +7 -2
- data/lib/filename_to_slug.rb +0 -20
- data/lib/generators/hancock/cms/ability_generator.rb +1 -0
- data/lib/generators/hancock/cms/admin_generator.rb +1 -0
- data/lib/generators/hancock/cms/application_generator.rb +1 -0
- data/lib/generators/hancock/cms/assets_generator.rb +1 -0
- data/lib/generators/hancock/cms/layout_generator.rb +1 -0
- data/lib/generators/hancock/cms/model_generator.rb +1 -0
- data/lib/generators/hancock/cms/models/templates/embedded_element.erb +2 -2
- data/lib/generators/hancock/cms/rack_generator.rb +1 -0
- data/lib/generators/hancock/cms/raven_generator.rb +13 -0
- data/lib/generators/hancock/cms/robots_generator.rb +1 -0
- data/lib/generators/hancock/cms/scripts_generator.rb +1 -0
- data/lib/generators/hancock/cms/setup_generator.rb +146 -33
- data/lib/generators/hancock/cms/templates/Gemfile.erb +4 -5
- data/lib/generators/hancock/cms/templates/ability.erb +1 -1
- data/lib/generators/hancock/cms/templates/admin.erb +12 -4
- data/lib/generators/hancock/cms/templates/hancock_cms.erb +6 -3
- data/lib/generators/hancock/cms/templates/model.erb +5 -6
- data/lib/generators/hancock/cms/templates/raven.erb +13 -0
- data/lib/generators/hancock/cms/templates/robots.txt.erb +6 -2
- data/lib/generators/hancock/cms/templates/scripts/db_dump.sh.erb +1 -1
- data/lib/generators/hancock/cms/unicorn_god_generator.rb +1 -0
- data/lib/generators/hancock/cms/utils.rb +2 -0
- data/lib/hancock/admin.rb +153 -21
- data/lib/hancock/admin/embedded_element.rb +7 -2
- data/lib/hancock/configuration.rb +49 -4
- data/lib/hancock/controller.rb +1 -1
- data/lib/hancock/engine.rb +32 -36
- data/lib/hancock/model.rb +10 -0
- data/lib/hancock/models/embedded_element.rb +2 -0
- data/lib/hancock/models/mongoid/embedded_element.rb +17 -0
- data/lib/hancock/plugin_configuration.rb +1 -1
- data/lib/hancock/rails_admin_ext/config.rb +21 -4
- data/lib/hancock/rails_admin_ext/hancock_array.rb +19 -0
- data/lib/hancock/rails_admin_ext/hancock_enum.rb +33 -0
- data/lib/hancock/rails_admin_ext/hancock_enum_with_custom.rb +34 -0
- data/lib/hancock/rails_admin_ext/hancock_hash.rb +8 -1
- data/lib/hancock/rails_admin_ext/hancock_html.rb +17 -2
- data/lib/hancock/rails_admin_ext/hancock_multiselect.rb +1 -5
- data/lib/hancock/rails_admin_ext/hancock_slugs.rb +2 -6
- data/lib/hancock/rails_admin_ext/patches/field_patch.rb +2 -1
- data/lib/hancock/rails_admin_ext/patches/fieldset_patch.rb +14 -0
- data/lib/hancock/rails_admin_ext/patches/group_patch.rb +9 -0
- data/lib/hancock/rails_admin_ext/patches/hancock_cms_group.rb +2 -0
- data/lib/hancock/rails_admin_ext/patches/has_fields.rb +27 -0
- data/lib/hancock/rails_admin_ext/patches/navigation_patch.rb +25 -0
- data/lib/hancock/rails_admin_settings_patch.rb +219 -0
- data/lib/hancock/version.rb +1 -1
- data/lib/hancock_cms.rb +12 -9
- data/lib/manual_slug/active_record.rb +8 -8
- data/lib/manual_slug/mongoid.rb +6 -1
- data/lib/rails_admin/custom_show_in_app.rb +21 -32
- data/template.rb +19 -20
- metadata +104 -12
- data/app/controllers/concerns/hancock/no_cache.rb +0 -12
- data/app/models/concerns/hancock/cacheable.rb +0 -51
@@ -18,7 +18,9 @@
|
|
18
18
|
= render "layouts/rails_admin/navigation"
|
19
19
|
|
20
20
|
.admin-menubar.admin-menubar-fixed.admin-menubar-dark
|
21
|
-
.
|
21
|
+
.navigation-filter
|
22
|
+
= render "layouts/rails_admin/sidebar_navigation_filter"
|
23
|
+
.toolbar.custom_scroll
|
22
24
|
= render "layouts/rails_admin/sidebar_navigation"
|
23
25
|
.admin-menubar-footer
|
24
26
|
= render "layouts/rails_admin/footer_navigation"
|
@@ -29,40 +31,3 @@
|
|
29
31
|
|
30
32
|
%footer.admin-footer
|
31
33
|
= render "layouts/rails_admin/footer"
|
32
|
-
|
33
|
-
-#%nav.navbar-hancock.navbar-fixed
|
34
|
-
-# = render "layouts/rails_admin/navigation"
|
35
|
-
-#
|
36
|
-
-#%main.root
|
37
|
-
-# .sidebar.fixed-sidebar
|
38
|
-
-# .sidebar-backdrop
|
39
|
-
-# .toolbar
|
40
|
-
-# = render "layouts/rails_admin/sidebar_navigation"
|
41
|
-
-#
|
42
|
-
-# .content-wrapper
|
43
|
-
-# .content{:'data-pjax-container' => true}= render template: 'layouts/rails_admin/pjax'
|
44
|
-
-#
|
45
|
-
-#%footer.footer
|
46
|
-
-# = render "layouts/rails_admin/footer"
|
47
|
-
|
48
|
-
-#%body.rails_admin
|
49
|
-
-# #loading.label.label-warning{style: 'display:none; position:fixed; right:20px; bottom:20px; z-index:100000'}= t('admin.loading')
|
50
|
-
-# %nav.navbar.navbar-default.navbar-fixed-top
|
51
|
-
-# = render "layouts/rails_admin/navigation"
|
52
|
-
-#
|
53
|
-
-# .menu-bar
|
54
|
-
-# = render "layouts/rails_admin/sidebar_navigation"
|
55
|
-
-#
|
56
|
-
-# .page-content
|
57
|
-
-# .content{:'data-pjax-container' => true}= render template: 'layouts/rails_admin/pjax'
|
58
|
-
-#
|
59
|
-
-#
|
60
|
-
-#
|
61
|
-
-# #status-bar
|
62
|
-
|
63
|
-
-#.container-fluid
|
64
|
-
-# .row
|
65
|
-
-# .col-sm-3.col-md-2.sidebar-nav.hancock-nav
|
66
|
-
-# = render "layouts/rails_admin/sidebar_navigation"
|
67
|
-
-# .col-sm-9.col-sm-offset-3.col-md-10.col-md-offset-2.sidebar-content
|
68
|
-
-# .content{:'data-pjax-container' => true}= render template: 'layouts/rails_admin/pjax'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.form-control-static
|
2
|
+
span= field.form_value
|
3
|
+
span= " "
|
4
|
+
span= " "
|
5
|
+
span= " "
|
6
|
+
span= link_to '(изменить)', "#", onclick: "var _p = $(this).closest('.form-control-static'); _p.siblings('.hancock_enum').removeClass('hidden'); _p.remove(); return false;", style: 'color: grey;', onmouseover: 'this.style.color = "darkgrey";', onmouseout: 'this.style.color = "grey";'
|
7
|
+
- unless field.multiple?
|
8
|
+
= form.select field.method_name, field.enum, { include_blank: true }.reverse_merge({ selected: field.form_value }), field.html_attributes.reverse_merge({ data: { enumeration: true }, placeholder: t('admin.misc.search'), class: 'hancock_enum hidden'})
|
9
|
+
- else
|
10
|
+
ruby:
|
11
|
+
js_data = {
|
12
|
+
xhr: false,
|
13
|
+
sortable: false,
|
14
|
+
cacheAll: true,
|
15
|
+
regional: {
|
16
|
+
chooseAll: t("admin.misc.chose_all"),
|
17
|
+
chosen: t("admin.misc.chosen", name: config.label_plural),
|
18
|
+
clearAll: t("admin.misc.clear_all"),
|
19
|
+
search: t("admin.misc.search"),
|
20
|
+
up: t("admin.misc.up"),
|
21
|
+
down: t("admin.misc.down")
|
22
|
+
}
|
23
|
+
}
|
24
|
+
= form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json }, multiple: true, class: 'hancock_enum hidden'})
|
@@ -0,0 +1,18 @@
|
|
1
|
+
- unless field.multiple?
|
2
|
+
= form.select field.method_name, field.enum, { include_blank: true }.reverse_merge({ selected: field.form_value }), field.html_attributes.reverse_merge({ data: { enumeration: true }, placeholder: t('admin.misc.search'), class: 'hancock_enum'})
|
3
|
+
- else
|
4
|
+
ruby:
|
5
|
+
js_data = {
|
6
|
+
xhr: false,
|
7
|
+
sortable: false,
|
8
|
+
cacheAll: true,
|
9
|
+
regional: {
|
10
|
+
chooseAll: t("admin.misc.chose_all"),
|
11
|
+
chosen: t("admin.misc.chosen", name: config.label_plural),
|
12
|
+
clearAll: t("admin.misc.clear_all"),
|
13
|
+
search: t("admin.misc.search"),
|
14
|
+
up: t("admin.misc.up"),
|
15
|
+
down: t("admin.misc.down")
|
16
|
+
}
|
17
|
+
}
|
18
|
+
= form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json }, multiple: true, class: 'hancock_enum'})
|
@@ -0,0 +1,20 @@
|
|
1
|
+
- unless field.multiple?
|
2
|
+
/ = form.select field.method_name, field.enum, { include_blank: true }.reverse_merge({ selected: field.form_value }), field.html_attributes.reverse_merge({ data: { enumeration: true }, placeholder: t('admin.misc.search'), class: 'hancock_enum'})
|
3
|
+
= form.select field.method_name, field.selection, { include_blank: true }.reverse_merge({ selected: field.form_value }), field.html_attributes.reverse_merge({ data: { enumeration: true }, placeholder: t('admin.misc.search_or_add_yours'), class: 'hancock_enum'})
|
4
|
+
- else
|
5
|
+
ruby:
|
6
|
+
js_data = {
|
7
|
+
xhr: false,
|
8
|
+
sortable: false,
|
9
|
+
cacheAll: true,
|
10
|
+
regional: {
|
11
|
+
chooseAll: t("admin.misc.chose_all"),
|
12
|
+
chosen: t("admin.misc.chosen", name: config.label_plural),
|
13
|
+
clearAll: t("admin.misc.clear_all"),
|
14
|
+
search: t("admin.misc.search_or_add_yours"),
|
15
|
+
up: t("admin.misc.up"),
|
16
|
+
down: t("admin.misc.down")
|
17
|
+
}
|
18
|
+
}
|
19
|
+
/ = form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json }, multiple: true, class: 'hancock_enum'})
|
20
|
+
= form.select field.method_name, field.selection, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { filteringmultiselect: true, options: js_data.to_json, unique: field.unique }, multiple: true, class: 'hancock_enum'})
|
@@ -1,9 +1,9 @@
|
|
1
1
|
ruby:
|
2
2
|
js_data = {
|
3
|
-
jspath: field.location ? field.location : field.base_location + "ckeditor.js",
|
3
|
+
jspath: asset_path(field.location ? field.location : field.base_location + "ckeditor.js"),
|
4
4
|
base_location: field.base_location,
|
5
5
|
options: {
|
6
|
-
customConfig: field.config_js ? field.config_js : field.base_location + "config.js"
|
6
|
+
customConfig: asset_path(field.config_js ? field.config_js : field.base_location + "config.js")
|
7
7
|
}
|
8
8
|
}
|
9
9
|
_html_attributes = field.html_attributes.reverse_merge(data: { richtext: 'ckeditor', options: js_data.to_json, value: field.form_value[:html] })
|
@@ -6,40 +6,37 @@ ul.nav.nav-tabs
|
|
6
6
|
.tab-content
|
7
7
|
/ = form.fields_for field.translations_field do |localized_field|
|
8
8
|
- I18n.available_locales.each do |locale|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
9
|
+
- _class = "#{[( 'active' if locale == I18n.locale ), uuid].join(" ")}"
|
10
|
+
.fields.tab-pane(style='padding:5px; margin: 0;' id="#{locale}_#{uuid}" class="#{_class}")
|
11
|
+
= form.fields_for field.html_translations_field do |html_localized_field|
|
12
|
+
ruby:
|
13
|
+
js_data = {
|
14
|
+
jspath: asset_path(field.location ? field.location : field.base_location + "ckeditor.js"),
|
15
|
+
base_location: field.base_location,
|
16
|
+
options: {
|
17
|
+
customConfig: asset_path(field.config_js ? field.config_js : field.base_location + "config.js")
|
18
|
+
}
|
19
|
+
}
|
20
|
+
_html_attributes = field.html_attributes.reverse_merge(data: {
|
21
|
+
richtext: 'ckeditor',
|
22
|
+
options: js_data.to_json
|
23
|
+
})
|
24
|
+
_html_attributes[:value] = field.form_value[:html] ? field.form_value[:html][locale] : ""
|
25
|
+
= html_localized_field.send :text_area, locale , _html_attributes
|
26
|
+
|
27
|
+
= form.fields_for field.clear_translations_field do |clear_localized_field|
|
28
|
+
label{style='display: block;'}
|
29
|
+
ruby:
|
30
|
+
_value = field.form_value[:clear] ? field.form_value[:clear][locale] : true
|
31
|
+
_hash = {
|
32
|
+
value: _value,
|
33
|
+
checked: _value.in?([true, '1']),
|
34
|
+
required: false,
|
35
|
+
class: "form-control"
|
36
|
+
}
|
37
|
+
_html_attributes = field.html_attributes.reverse_merge(_hash)
|
38
|
+
span{style='float: left'}= clear_localized_field.send field.boolean_view_helper, locale , _html_attributes
|
39
|
+
div{style='margin-left: 35px; line-height: 40px;'} Убирать теги
|
43
40
|
|
44
41
|
javascript:
|
45
42
|
var #{field.name}#{field.object_id} = (new Date().getTime()) + Math.floor(Math.random()*100000);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
:ruby
|
2
|
+
opts = {
|
3
|
+
builder: (defined?(RailsAdmin::Hancock::FormBuilder) ? RailsAdmin::Hancock::FormBuilder : RailsAdmin::FormBuilder),
|
4
|
+
url: edit_path(@abstract_model, @object.id),
|
5
|
+
as: @abstract_model.param_key,
|
6
|
+
html: {
|
7
|
+
method: "put",
|
8
|
+
multipart: true,
|
9
|
+
class: "form-horizontal denser",
|
10
|
+
data: {
|
11
|
+
title: @page_name
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
= rails_admin_form_for @object, opts do |form|
|
16
|
+
= form.generate action: :update
|
17
|
+
/ = hancock_rails_admin_form_for @object, opts do |form|
|
18
|
+
/ = form.generate action: :update
|
@@ -0,0 +1,17 @@
|
|
1
|
+
:ruby
|
2
|
+
opts = {
|
3
|
+
builder: (defined?(RailsAdmin::Hancock::FormBuilder) ? RailsAdmin::Hancock::FormBuilder : RailsAdmin::FormBuilder),
|
4
|
+
url: new_path(model_name: @abstract_model.to_param),
|
5
|
+
as: @abstract_model.param_key,
|
6
|
+
html: {
|
7
|
+
multipart: true,
|
8
|
+
class: "form-horizontal denser",
|
9
|
+
data: {
|
10
|
+
title: @page_name
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
= rails_admin_form_for @object, opts do |form|
|
15
|
+
= form.generate action: :create
|
16
|
+
/ = hancock_rails_admin_form_for @object, opts do |form|
|
17
|
+
/ = form.generate action: :create
|
@@ -1,3 +1,5 @@
|
|
1
1
|
- if user_signed_in? && respond_to?(:can?) && can?(:access, :rails_admin) && can?(:edit, obj)
|
2
|
-
|
3
|
-
|
2
|
+
- cache obj do
|
3
|
+
.admin_button
|
4
|
+
.admin_link
|
5
|
+
= link_to t('hancock.edit'), rails_admin.edit_path(obj.class.model_name.i18n_key.to_s.gsub('/', '~'), obj.id), 'data-no-turbolink' => true
|
@@ -1,89 +1,92 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
if defined?(Mongoid)
|
2
|
+
# Patch for glebtv-mongoid_nested_set and rails5 (belongs_to is required)
|
3
|
+
require 'glebtv-mongoid_nested_set'
|
3
4
|
|
4
|
-
module Mongoid::Acts::NestedSet
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
5
|
+
module Mongoid::Acts::NestedSet
|
6
|
+
module Base
|
7
|
+
# Configuration options are:
|
8
|
+
#
|
9
|
+
# * +:parent_field+ - field name to use for keeping the parent id (default: parent_id)
|
10
|
+
# * +:left_field+ - field name for left boundary data, default 'lft'
|
11
|
+
# * +:right_field+ - field name for right boundary data, default 'rgt'
|
12
|
+
# * +:outline_number_field+ - field name for the number field, default nil. If set,
|
13
|
+
# the value will be used as a field name to keep track of each node's
|
14
|
+
# "outline number" (e.g. 1.2.5).
|
15
|
+
# * +:scope+ - restricts what is to be considered a list. Given a symbol, it'll attach
|
16
|
+
# "_id" (if it hasn't been already) and use that as the foreign key restriction. You
|
17
|
+
# can also pass an array to scope by multiple attributes
|
18
|
+
# * +:dependent+ - behavior for cascading destroy. If set to :destroy, all the child
|
19
|
+
# objects are destroyed alongside this object by calling their destroy method. If set
|
20
|
+
# to :delete_all (default), all the child objects are deleted without calling their
|
21
|
+
# destroy method.
|
22
|
+
# * +:klass+ - class to use for queries (defaults to self)
|
23
|
+
#
|
24
|
+
# See Mongoid::Acts::NestedSet::ClassMethods for a list of class methods and
|
25
|
+
# Mongoid::Acts::NestedSet::InstanceMethods for a list of instance methods added to
|
26
|
+
# acts_as_nested_set models
|
27
|
+
def acts_as_nested_set(options = {})
|
28
|
+
options = {
|
29
|
+
:parent_field => 'parent_id',
|
30
|
+
:left_field => 'lft',
|
31
|
+
:right_field => 'rgt',
|
32
|
+
:outline_number_field => nil,
|
33
|
+
:dependent => :delete_all, # or :destroy
|
34
|
+
:klass => self,
|
35
|
+
}.merge(options)
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
if options[:scope].is_a?(Symbol) && options[:scope].to_s !~ /_id$/
|
38
|
+
options[:scope] = "#{options[:scope]}_id".intern
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
41
|
+
class_attribute :acts_as_nested_set_options, :instance_writer => false
|
42
|
+
self.acts_as_nested_set_options = options
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
unless self.is_a?(Document::ClassMethods)
|
45
|
+
include Document
|
46
|
+
include OutlineNumber if outline_number_field_name
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
field left_field_name, :type => Integer
|
49
|
+
field right_field_name, :type => Integer
|
50
|
+
field outline_number_field_name, :type => String if outline_number_field_name
|
51
|
+
field :depth, :type => Integer
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
has_many :children, :class_name => self.name, :foreign_key => parent_field_name, :inverse_of => :parent, :order => left_field_name.to_sym.asc
|
54
|
+
# was
|
55
|
+
# belongs_to :parent, :class_name => self.name, :foreign_key => parent_field_name
|
56
|
+
# became
|
57
|
+
belongs_to :parent, :class_name => self.name, :foreign_key => parent_field_name, required: false
|
57
58
|
|
58
|
-
|
59
|
+
attr_accessor :skip_before_destroy
|
59
60
|
|
60
|
-
|
61
|
+
define_callbacks :move, :terminator => callback_terminator
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
before_create :set_default_left_and_right
|
64
|
+
before_save :store_new_parent
|
65
|
+
after_save :move_to_new_parent
|
66
|
+
before_destroy :destroy_descendants
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
68
|
+
# no assignment to structure fields
|
69
|
+
[left_field_name, right_field_name].each do |field|
|
70
|
+
module_eval <<-"end_eval", __FILE__, __LINE__
|
71
|
+
def #{field}=(x)
|
72
|
+
raise NameError, "Unauthorized assignment to #{field}: it's an internal field handled by acts_as_nested_set code, use move_to_* methods instead.", "#{field}"
|
73
|
+
end
|
74
|
+
end_eval
|
75
|
+
end
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
77
|
+
scope :roots, lambda {
|
78
|
+
where(parent_field_name => nil).asc(left_field_name)
|
79
|
+
}
|
80
|
+
scope :leaves, lambda {
|
81
|
+
where("this.#{quoted_right_field_name} - this.#{quoted_left_field_name} == 1").asc(left_field_name)
|
82
|
+
}
|
83
|
+
scope :with_depth, lambda { |level|
|
84
|
+
where(:depth => level).asc(left_field_name)
|
85
|
+
}
|
85
86
|
|
87
|
+
end
|
86
88
|
end
|
87
89
|
end
|
88
90
|
end
|
91
|
+
|
89
92
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails_admin/adapters/mongoid'
|
2
|
+
module RailsAdmin
|
3
|
+
module Adapters
|
4
|
+
module Mongoid
|
5
|
+
|
6
|
+
def sort_by(options, scope)
|
7
|
+
return scope unless options[:sort]
|
8
|
+
|
9
|
+
case options[:sort]
|
10
|
+
when String
|
11
|
+
field_name, collection_name = options[:sort].split('.').reverse
|
12
|
+
# if collection_name && collection_name != table_name
|
13
|
+
# raise('sorting by associated model column is not supported in Non-Relational databases')
|
14
|
+
# end
|
15
|
+
when Symbol
|
16
|
+
field_name = options[:sort].to_s
|
17
|
+
end
|
18
|
+
if options[:sort_reverse]
|
19
|
+
scope.asc field_name
|
20
|
+
else
|
21
|
+
scope.desc field_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|