rails_admin_sort_embedded 0.0.2

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.
@@ -0,0 +1,71 @@
1
+ #= require rails_admin/jquery.mjs.nestedSortable
2
+
3
+ show_flash = (data)->
4
+ $flash = $('<div>')
5
+ .addClass('nestable-flash alert')
6
+ .append($('<button>').addClass('close').data('dismiss', 'alert').html('&times;'))
7
+ .append($('<span>').addClass('body').html(data))
8
+ $('#rails_admin_nestable').append($flash)
9
+ $flash.fadeIn(200).delay(2000).fadeOut 200, -> $(this).remove()
10
+
11
+ js_tree_toggle = (e)->
12
+ e.preventDefault()
13
+ e.stopPropagation()
14
+ $t = $(this)
15
+ $t.html "<i class=\"fa fa-spinner fa-spin\"></i>"
16
+ $.ajax
17
+ type: "POST"
18
+ url: $t.attr("href")
19
+ data:
20
+ ajax: true
21
+ success: (r) ->
22
+ $t.attr "href", r.href
23
+ $t.attr "class", r.class + ' js-tree-toggle'
24
+ $t.text r.text
25
+ $t.parent().attr "title", r.text
26
+ return
27
+ error: (e) ->
28
+ alert e.responseText
29
+ return
30
+
31
+ init = ->
32
+ $('.rails_admin_sort_embedded').each ->
33
+ $t = $(this)
34
+ tree_config = $t.data('config')
35
+ $t.nestedSortable
36
+ handle: '.dd-handle',
37
+ items: ".dd-item"
38
+ maxLevels: 1 #tree_config["max_depth"]
39
+ placeholder: "dd-placeholder"
40
+ tolerance: 'pointer',
41
+ toleranceElement: '> div',
42
+
43
+ update: (event, ui) ->
44
+
45
+ ids_array = []
46
+ ui.item.closest("ol").find("li").each ->
47
+ ids_array.push $(this).data("id")
48
+
49
+ $.ajax
50
+ type: "POST"
51
+ dataType: "html"
52
+ url: tree_config["update_url"]
53
+ data:
54
+ #item_id: ui.item.data("id")
55
+ embedded_model: tree_config["embedded_model"]
56
+ embedded_field: tree_config["embedded_field"]
57
+ #parent_id: ui.item.parent().parent().data("id")
58
+ #prev_id: ui.item.prev().data("id")
59
+ #next_id: ui.item.next().data("id")
60
+ ids_array: ids_array.join(" ")
61
+
62
+ error: (xhr, status, error) ->
63
+ show_flash('Nested Set: fatal error')
64
+
65
+ success: (data) ->
66
+ show_flash(data)
67
+
68
+ $(document).off('pjax:end.rails_admin_sort_embedded').on('pjax:end.rails_admin_sort_embedded', init)
69
+ $(document).off('ready.rails_admin_sort_embedded').on('ready.rails_admin_sort_embedded', init)
70
+ $(document).on('click', '.js-tree-toggle', js_tree_toggle)
71
+
@@ -0,0 +1,199 @@
1
+ /**
2
+ * jQuery Nestable
3
+ */
4
+
5
+ .dd {
6
+ position: relative;
7
+ display: block;
8
+ margin: 0;
9
+ padding: 0;
10
+ /* max-width: 600px; */
11
+ list-style: none;
12
+ font-size: 13px;
13
+ line-height: 20px;
14
+ }
15
+
16
+ .dd-list, .dd-list ol {
17
+ display: block;
18
+ position: relative;
19
+ margin: 0;
20
+ padding: 0;
21
+ list-style: none;
22
+ }
23
+
24
+ .dd-list ol {
25
+ padding-left: 30px;
26
+ }
27
+
28
+ .dd-item, .dd-placeholder {
29
+ display: block;
30
+ position: relative;
31
+ margin: 0;
32
+ padding: 0;
33
+ min-height: 20px;
34
+ font-size: 13px;
35
+ line-height: 20px;
36
+ }
37
+
38
+ .dd-item .label {
39
+ margin-right: 10px;
40
+ }
41
+
42
+ .dd-item img {
43
+ display: inline-block;
44
+ margin-left: 10px;
45
+ }
46
+
47
+ .dd-item > div {
48
+ // position: relative
49
+ }
50
+
51
+ .dd-handle {
52
+ display: block;
53
+ position: absolute;
54
+ top: 0;
55
+ left: 0;
56
+ bottom: 0;
57
+ width: 30px;
58
+ padding: 5px 10px;
59
+ color: #333;
60
+ text-decoration: none;
61
+ font-weight: bold;
62
+ border: 1px solid #ccc;
63
+ background: #fafafa;
64
+ background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
65
+ background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
66
+ background: linear-gradient(top, #fafafa 0%, #eee 100%);
67
+ -webkit-border-radius: 3px;
68
+ border-radius: 3px;
69
+ box-sizing: border-box;
70
+ -moz-box-sizing: border-box;
71
+ cursor: move;
72
+ }
73
+
74
+ .dd-handle:hover {
75
+ color: #2ea8e5;
76
+ background: #fff;
77
+ }
78
+
79
+ .dd-item {
80
+ margin-top: 5px
81
+ }
82
+
83
+ .dd-placeholder {
84
+ margin: 5px 0;
85
+ padding: 0;
86
+ min-height: 30px;
87
+ background: #f2fbff;
88
+ border: 1px dashed #b6bcbf;
89
+ &.mjs-nestedSortable-error {
90
+ border: 1px solid red;
91
+ }
92
+ }
93
+
94
+ .dd3-content {
95
+ display: block;
96
+ min-height: 30px;
97
+ padding: 5px 10px 5px 40px;
98
+ color: #333;
99
+ text-decoration: none;
100
+ font-weight: bold;
101
+ border: 1px solid #ccc;
102
+ background: #fafafa;
103
+ background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
104
+ background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
105
+ background: linear-gradient(top, #fafafa 0%, #eee 100%);
106
+ -webkit-border-radius: 3px;
107
+ border-radius: 3px;
108
+ box-sizing: border-box;
109
+ -moz-box-sizing: border-box;
110
+ }
111
+
112
+ .dd3-content:hover {
113
+ color: #2ea8e5;
114
+ background: #fff;
115
+ }
116
+
117
+ .dd-dragel > .dd3-item > .dd3-content {
118
+ margin: 0;
119
+ }
120
+
121
+ .dd3-item > button {
122
+ margin-left: 30px;
123
+ }
124
+
125
+ .dd3-handle {
126
+ position: absolute;
127
+ margin: 0;
128
+ left: 0;
129
+ top: 0;
130
+ cursor: pointer;
131
+ width: 30px;
132
+ text-indent: 100px;
133
+ white-space: nowrap;
134
+ overflow: hidden;
135
+ border: 1px solid #aaa;
136
+ background: #ddd;
137
+ background: -webkit-linear-gradient(top, #ddd 0%, #bbb 100%);
138
+ background: -moz-linear-gradient(top, #ddd 0%, #bbb 100%);
139
+ background: linear-gradient(top, #ddd 0%, #bbb 100%);
140
+ border-top-right-radius: 0;
141
+ border-bottom-right-radius: 0;
142
+ }
143
+
144
+ .dd3-handle:before {
145
+ content: '≡';
146
+ display: block;
147
+ position: absolute;
148
+ left: 0;
149
+ top: 3px;
150
+ width: 100%;
151
+ text-align: center;
152
+ text-indent: 0;
153
+ color: #fff;
154
+ font-size: 20px;
155
+ font-weight: normal;
156
+ }
157
+
158
+ .dd3-handle:hover {
159
+ background: #ddd;
160
+ }
161
+
162
+ .dd3-content .links {
163
+ width: auto;
164
+ }
165
+
166
+ .dd3-content ul.inline.actions {
167
+ margin: 0;
168
+ padding: 0;
169
+ list-style: none;
170
+ display: block
171
+ }
172
+
173
+ .dd3-content ul.inline.actions li {
174
+ display: inline-block
175
+ }
176
+
177
+ .dd3-content ul.inline.actions li a {
178
+ width: 14px;
179
+ height: 16px;
180
+ text-decoration: none;
181
+ }
182
+
183
+ .dd3-content ul.inline.actions li a:hover {
184
+ text-decoration: none;
185
+ }
186
+
187
+ #rails_admin_nestable {
188
+ position: relative;
189
+ margin-bottom: 100px;
190
+ }
191
+
192
+ .nestable-flash {
193
+ position: fixed;
194
+ top: 80px;
195
+ width: auto;
196
+ right: 20px;
197
+ display: none;
198
+ min-width: 150px;
199
+ }
@@ -0,0 +1,15 @@
1
+ = stylesheet_link_tag 'rails_admin/rails_admin_sort_embedded'
2
+ = javascript_include_tag 'rails_admin/rails_admin_sort_embedded'
3
+
4
+ .controls
5
+ %ul.nav.nav-tabs
6
+ - sort_embedded_fields.each do |f|
7
+ %li
8
+ = link_to I18n.t("rails_admin.sort_embedded.#{@object.class.name.tableize}.#{f}"), "#sort_embedded_#{f}", title: f, "data-toggle" => "tab"
9
+
10
+ .tab-content
11
+ - sort_embedded_fields.each do |f|
12
+ .tab-pane{id: "sort_embedded_#{f}"}
13
+ .row-fluid
14
+ .span12#rails_admin_nestable
15
+ = rails_admin_sort_embedded @object.send(f).to_a, {embedded_field: f}
@@ -0,0 +1,9 @@
1
+ en:
2
+ admin:
3
+ actions:
4
+ sort_embedded:
5
+ menu: "Sorting for embedded"
6
+ breadcrumb: "Sorting for embedded"
7
+ error: "Error"
8
+ success: "Success"
9
+ title: "Sorting for embedded"
@@ -0,0 +1,9 @@
1
+ es:
2
+ admin:
3
+ actions:
4
+ sort_embedded:
5
+ menu: "Ordenar"
6
+ breadcrumb: "Ordenar"
7
+ error: "Error"
8
+ success: "Éxito"
9
+ title: "Ordenar"
@@ -0,0 +1,9 @@
1
+ ru:
2
+ admin:
3
+ actions:
4
+ sort_embedded:
5
+ menu: "Embed-сортировка"
6
+ breadcrumb: "Embed-сортировка"
7
+ error: "Ошибка"
8
+ success: "Успешно"
9
+ title: "Embed-сортировка"
@@ -0,0 +1,14 @@
1
+ module RailsAdminSortEmbedded
2
+
3
+ end
4
+
5
+ require "rails_admin_sort_embedded/version"
6
+ require 'rails_admin_sort_embedded/engine'
7
+
8
+ require 'rails_admin/config/actions'
9
+ require 'rails_admin/config/model'
10
+
11
+ require 'rails_admin_sort_embedded/configuration'
12
+ require 'rails_admin_sort_embedded/action'
13
+ require 'rails_admin_sort_embedded/model'
14
+ require 'rails_admin_sort_embedded/helper'
@@ -0,0 +1,83 @@
1
+ module RailsAdmin
2
+ module Config
3
+ module Actions
4
+ class SortEmbedded < Base
5
+ RailsAdmin::Config::Actions.register(self)
6
+
7
+ # Is the action acting on the root level (Example: /admin/contact)
8
+ register_instance_option :root? do
9
+ false
10
+ end
11
+
12
+ register_instance_option :collection? do
13
+ false
14
+ end
15
+
16
+ # Is the action on an object scope (Example: /admin/team/1/edit)
17
+ register_instance_option :member? do
18
+ true
19
+ end
20
+
21
+ register_instance_option :route_fragment do
22
+ 'sort_embedded'
23
+ end
24
+
25
+ register_instance_option :controller do
26
+ Proc.new do |klass|
27
+ @sort_conf = ::RailsAdminSortEmbedded::Configuration.new @abstract_model
28
+
29
+ if params['id'].present?
30
+ if request.get?
31
+ # @nodes = list_entries(@model_config, :index, nil, nil).sort { |a,b| a.lft <=> b.lft }
32
+ render action: @action.template_name
33
+
34
+ elsif request.post?
35
+ begin
36
+ ids = params[:ids_array].to_s.split(" ")
37
+ embedded_model = params[:embedded_model].to_s
38
+ embedded_field = params[:embedded_field].to_s
39
+ # item_id = params[:item_id].to_s
40
+ # parent_id = params[:parent_id].to_s
41
+ # prev_id = params[:prev_id].to_s
42
+ # next_id = params[:next_id].to_s
43
+
44
+ if ids.empty?
45
+ return render text: 'Nested set UI error: node ids not defined', status: 500
46
+ end
47
+
48
+ main_obj = @object
49
+ embedded = main_obj.send(embedded_field)
50
+ ids.each_with_index do |id, i|
51
+ embedded.find(id).update(order: i)
52
+ end
53
+
54
+ message = "<strong>#{I18n.t('admin.actions.sort_embedded.success')}!</strong>"
55
+ rescue Exception => e
56
+
57
+
58
+ main_obj = @object
59
+ embedded = main_obj.send(embedded_field).sorted
60
+ ids.each_with_index do |id, i|
61
+ embedded.find(id).update(order: i)
62
+ end
63
+
64
+ message = "<strong>#{I18n.t('admin.actions.sort_embedded.error')}</strong>: #{e}"
65
+ end
66
+
67
+ render text: message
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ register_instance_option :link_icon do
74
+ 'icon-move'
75
+ end
76
+
77
+ register_instance_option :http_methods do
78
+ [:get, :post]
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,21 @@
1
+ module RailsAdminSortEmbedded
2
+ class Configuration
3
+ def initialize(abstract_model)
4
+ @abstract_model = abstract_model
5
+ end
6
+
7
+ def options
8
+ @options ||= {
9
+ fields: [],
10
+ thumbnail_fields: [:image, :cover],
11
+ thumbnail_size: :thumb,
12
+ thumbnail_gem: :paperclip,
13
+ }.merge(config || {})
14
+ end
15
+
16
+ protected
17
+ def config
18
+ ::RailsAdmin::Config.model(@abstract_model.model).sort_embedded || {}
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module RailsAdminSortEmbedded
2
+ class Engine < ::Rails::Engine
3
+
4
+ initializer "RailsAdminSortEmbedded precompile hook", group: :all do |app|
5
+ app.config.assets.precompile += %w(rails_admin/rails_admin_sort_embedded.js rails_admin/rails_admin_sort_embedded.css)
6
+ end
7
+
8
+ initializer 'Include RailsAdminSortEmbedded::Helper' do |app|
9
+ ActionView::Base.send :include, RailsAdminSortEmbedded::Helper
10
+ end
11
+ end
12
+ end