alchemy-custom-model 2.0.2 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/assets/javascripts/alchemy-custom-model/alchemy_custom_model_select.js +62 -0
- data/app/assets/javascripts/alchemy-custom-model/common_init.js +17 -14
- data/app/assets/javascripts/alchemy-custom-model/el_finder.js.coffee.erb +31 -0
- data/app/assets/javascripts/alchemy-custom-model/manifest.js +5 -0
- data/app/assets/javascripts/alchemy-custom-model/total_page_elfinder.js.coffee +1 -1
- data/app/assets/javascripts/backend/date_picker.js +24 -0
- data/app/assets/javascripts/backend/fix_more_image_in_element.js.coffee +10 -0
- data/app/assets/javascripts/backend/override_alchemy_selectbox.js +8 -0
- data/app/assets/stylesheets/alchemy-custom-model/custom_elfinder.css.scss +20 -2
- data/app/controllers/alchemy/custom/model/admin/base_controller.rb +49 -0
- data/app/controllers/alchemy/custom/model/admin/base_with_globalize_controller.rb +38 -0
- data/app/controllers/concerns/alchemy/admin/nodes_controller_dec.rb +55 -0
- data/app/helpers/alchemy/custom/model/admin/base_helper.rb +5 -2
- data/app/helpers/alchemy/pages_helper_decorator.rb +38 -0
- data/app/models/concerns/alchemy/node_dec.rb +45 -0
- data/app/views/alchemy/admin/nodes/_form.html.erb +126 -0
- data/app/views/alchemy/admin/nodes/custom_models.json.jbuilder +10 -0
- data/app/views/alchemy/admin/nodes/custom_models_methods.json.jbuilder +10 -0
- data/app/views/alchemy/admin/pictures/_custom_model_info.html.erb +27 -0
- data/app/views/alchemy/admin/pictures/_infos.html.erb +65 -0
- data/app/views/alchemy/custom/model/admin/base/_gallery_item.html.erb +7 -2
- data/app/views/alchemy/custom/model/admin/base/_seo.html.erb +5 -5
- data/app/views/alchemy/custom/model/admin/base/_title.html.erb +1 -1
- data/app/views/alchemy/custom/model/admin/base/edit.html.erb +2 -2
- data/app/views/alchemy/custom/model/admin/base/index.html.erb +23 -2
- data/app/views/alchemy/custom/model/admin/base/new.html.erb +2 -2
- data/app/views/alchemy/custom/model/admin/base/show.html.erb +2 -2
- data/config/locales/it.yml +6 -0
- data/config/routes.rb +16 -0
- data/db/migrate/20200424184007_add_fields_to_node.rb +8 -0
- data/lib/{alchemy-custom-model.rb → alchemy/custom/model.rb} +20 -0
- data/lib/alchemy/custom/model/engine.rb +7 -1
- data/lib/alchemy/custom/model/globalize_model_decoration.rb +25 -0
- data/lib/alchemy/custom/model/menu_methods.rb +16 -0
- data/lib/alchemy/custom/model/model_decoration.rb +2 -0
- data/lib/alchemy/custom/model/model_utils_methods.rb +28 -0
- data/lib/alchemy/custom/model/order.rb +1 -1
- data/lib/alchemy/custom/model/picture_used_by.rb +51 -0
- data/lib/alchemy/custom/model/slug_optimizer.rb +23 -0
- data/lib/alchemy/custom/model/version.rb +1 -1
- data/lib/tasks/alchemy_custom_model_tasks.rake +3 -0
- data/vendor/assets/javascripts/flatpickr/i10n/it.js +71 -0
- metadata +53 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1a2697b7c047652bd81eff2eea2f6ce536f17b636ee6e200fa0d79de57183544
|
4
|
+
data.tar.gz: b6463926d7a0e7dec5a118fe74fc71a92293a46eba4bec350f3f5ca454c1ad6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5252ad81308db97abf919cc87dc6e7c70031f4f8a4ece43aa8776458bc39723d1dfafce7dcb92a0d15b8bbc7bd81ec553f691e5f052a2ab5bc33fbff30c1e8f
|
7
|
+
data.tar.gz: f818915cbacb6cc271954c4aa5f57cae5bf67ff56cce88c2c997eb057e6cf8f13ce30ac7d6332f9f5b42da1b23810574b0bfa1e8c25d49362d02eefbbfbb34a4
|
@@ -0,0 +1,62 @@
|
|
1
|
+
$.fn.alchemyCustomModelSelect = function(options) {
|
2
|
+
|
3
|
+
return this.select2({
|
4
|
+
placeholder: options.placeholder,
|
5
|
+
allowClear: true,
|
6
|
+
initSelection: function(element, callback) {
|
7
|
+
console.log("pippo")
|
8
|
+
var id = $(element).val();
|
9
|
+
console.log(id)
|
10
|
+
if (id !== "") {
|
11
|
+
var q = {}
|
12
|
+
if (options.query_params){
|
13
|
+
q = options.query_params()
|
14
|
+
}
|
15
|
+
$.ajax(options.url, {
|
16
|
+
dataType: "json",
|
17
|
+
data: {
|
18
|
+
id: id,
|
19
|
+
q: q,
|
20
|
+
per_page: 3000
|
21
|
+
}
|
22
|
+
}).done(function(data) {
|
23
|
+
var el = null
|
24
|
+
$.each(data.results, function(index,element){
|
25
|
+
if (element.text == id){
|
26
|
+
|
27
|
+
el = element
|
28
|
+
}
|
29
|
+
})
|
30
|
+
callback(el);
|
31
|
+
});
|
32
|
+
}
|
33
|
+
},
|
34
|
+
ajax: {
|
35
|
+
url: options.url,
|
36
|
+
datatype: 'json',
|
37
|
+
quietMillis: 300,
|
38
|
+
data: function (term, page) {
|
39
|
+
var extend_query_params = {}
|
40
|
+
if (options.query_params) {
|
41
|
+
|
42
|
+
extend_query_params = options.query_params(term,page)
|
43
|
+
|
44
|
+
}
|
45
|
+
return {
|
46
|
+
q: $.extend({
|
47
|
+
name: term
|
48
|
+
}, extend_query_params),
|
49
|
+
page: page
|
50
|
+
}
|
51
|
+
},
|
52
|
+
results: function (data) {
|
53
|
+
var meta = data.meta
|
54
|
+
return {
|
55
|
+
results: data.results,
|
56
|
+
more: meta.page * meta.per_page < meta.total_count
|
57
|
+
}
|
58
|
+
}
|
59
|
+
},
|
60
|
+
|
61
|
+
})
|
62
|
+
}
|
@@ -1,16 +1,19 @@
|
|
1
|
-
$(document).on("'page:change turbolinks:load", function(){
|
2
|
-
$(".datepicker-date").datetimepicker({
|
3
|
-
scrollInput: false,
|
4
|
-
format: "d/m/Y",
|
5
|
-
timepicker: false,
|
6
|
-
datepicker: true,
|
7
|
-
dayOfWeekStart: 0
|
8
|
-
})
|
1
|
+
$(document).on("'page:change turbolinks:load", function () {
|
9
2
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
3
|
+
if ($.isFunction("datetimepicker")) {
|
4
|
+
$(".datepicker-date").datetimepicker({
|
5
|
+
scrollInput: false,
|
6
|
+
format: "d/m/Y",
|
7
|
+
timepicker: false,
|
8
|
+
datepicker: true,
|
9
|
+
dayOfWeekStart: 0
|
10
|
+
})
|
11
|
+
|
12
|
+
$(".datepicker-time").datetimepicker({
|
13
|
+
format: 'H:i',
|
14
|
+
timepicker: true,
|
15
|
+
datepicker: false,
|
16
|
+
step: 15
|
17
|
+
})
|
18
|
+
}
|
16
19
|
});
|
@@ -196,8 +196,26 @@ class ElFinderDialog
|
|
196
196
|
$.ajax
|
197
197
|
url: @opts.target_upgrader
|
198
198
|
success: (data)=>
|
199
|
+
|
200
|
+
imgs_gallery = $(@opts.target).find(".gallery_item_blk")
|
201
|
+
imgs_destroyed_ids = []
|
202
|
+
$.each imgs_gallery, (index,element) ->
|
203
|
+
destroyed_input = $(element).find(".gallery_item_destroy_input")[0]
|
204
|
+
if($(destroyed_input).val()== "true")
|
205
|
+
imgs_destroyed_ids.push($(element).data("id"))
|
206
|
+
|
199
207
|
elemento_gallery = $(data).find(@opts.target)
|
200
208
|
$(@opts.target).html($(elemento_gallery).html())
|
209
|
+
target = @opts.target
|
210
|
+
gal_el = null
|
211
|
+
$.each imgs_destroyed_ids, (index,id) ->
|
212
|
+
el_to_hide = $(target).find(".gallery_item_blk[data-id='#{id}']")
|
213
|
+
input_destroy = $(el_to_hide).find(".gallery_item_destroy_input")[0]
|
214
|
+
$(el_to_hide).hide()
|
215
|
+
$(input_destroy).val(true)
|
216
|
+
|
217
|
+
# #elemento_gallery = $(data).find(@opts.target)
|
218
|
+
# $(@opts.target).html($(gal_el).html())
|
201
219
|
|
202
220
|
|
203
221
|
open: ->
|
@@ -234,6 +252,19 @@ $(document).on 'click', '.clear_selection', (e)->
|
|
234
252
|
$(opts.clearfieldIcon).attr('class','')
|
235
253
|
|
236
254
|
|
255
|
+
$(document).on 'click', '.elfinder_picture_gallery .gallery_item_blk .destroy', (e)->
|
256
|
+
img_container = $(this).parents(".gallery_item_blk")[0]
|
257
|
+
input_destroy = $(img_container).find(".gallery_item_destroy_input")[0]
|
258
|
+
$(input_destroy).val(true)
|
259
|
+
$(img_container).hide()
|
260
|
+
|
261
|
+
$(document).on 'page:change turbolinks:load', ->
|
262
|
+
$(".elfinder_picture_gallery .gallery_item_blk").each (index,element) ->
|
263
|
+
input_destroy = $(element).find(".gallery_item_destroy_input")[0]
|
264
|
+
img_container = $(element)
|
265
|
+
if($(input_destroy).val() == "true")
|
266
|
+
$(img_container).hide()
|
267
|
+
$(input_destroy).val(true)
|
237
268
|
|
238
269
|
|
239
270
|
|
@@ -22,3 +22,8 @@
|
|
22
22
|
//= require "./total_page_elfinder"
|
23
23
|
//= require "./sortable"
|
24
24
|
//= require "./common_init"
|
25
|
+
//= require "./alchemy_custom_model_select"
|
26
|
+
//= require "flatpickr/i10n/it"
|
27
|
+
//= require "../backend/date_picker"
|
28
|
+
//= require "../backend/fix_more_image_in_element"
|
29
|
+
//= require "../backend/override_alchemy_selectbox"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$(document).on("page:change turbolinks:load",function(){
|
2
|
+
|
3
|
+
$("input[data-alchemy-datepicker-type]").each(function(index,element){
|
4
|
+
var type = $(this).data('alchemy-datepicker-type');
|
5
|
+
var options = {
|
6
|
+
locale: Alchemy.locale.slice(0, 2),
|
7
|
+
altInput: true,
|
8
|
+
altFormat: Alchemy.t("formats."+type),
|
9
|
+
altInputClass: "",
|
10
|
+
enableTime: /time/.test(type),
|
11
|
+
noCalendar: type == "time",
|
12
|
+
time_24hr: Alchemy.t("formats.time_24hr"),
|
13
|
+
|
14
|
+
};
|
15
|
+
|
16
|
+
$(this).flatpickr(options);
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
})
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
});
|
@@ -0,0 +1,10 @@
|
|
1
|
+
$.extend Alchemy,
|
2
|
+
removePicture: (selector) ->
|
3
|
+
$form_field = $(selector)
|
4
|
+
$element = $form_field.closest(".element-editor")
|
5
|
+
$content = $form_field.closest(".content_editor")
|
6
|
+
if $form_field[0]
|
7
|
+
$form_field.val ""
|
8
|
+
$content.find(".thumbnail_background").html('<i class="icon far fa-image fa-fw"/>')
|
9
|
+
Alchemy.setElementDirty $element
|
10
|
+
false
|
@@ -13,9 +13,26 @@
|
|
13
13
|
display: block;
|
14
14
|
float: left;
|
15
15
|
margin: 6px;
|
16
|
-
width:
|
17
|
-
height:
|
16
|
+
width: 140px;
|
17
|
+
height: 140px;
|
18
18
|
overflow: hidden;
|
19
|
+
position: relative;
|
20
|
+
|
21
|
+
.command_area {
|
22
|
+
position: absolute;
|
23
|
+
left: 0;
|
24
|
+
bottom: 0;
|
25
|
+
z-index: 0;
|
26
|
+
width: 100%;
|
27
|
+
padding: 4px 2px;
|
28
|
+
background-color: #f0f0f0;
|
29
|
+
.destroy {
|
30
|
+
float: right;
|
31
|
+
color: rgba(51, 59, 81, 0.8);
|
32
|
+
cursor: pointer
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
19
36
|
|
20
37
|
.open_el_finder {
|
21
38
|
width: 98%;
|
@@ -28,6 +45,7 @@
|
|
28
45
|
i.fa-images {
|
29
46
|
font-size: 50px;
|
30
47
|
margin-top: 20px;
|
48
|
+
line-height: 90px;
|
31
49
|
}
|
32
50
|
}
|
33
51
|
}
|
@@ -20,6 +20,7 @@ module Alchemy::Custom::Model
|
|
20
20
|
@query = base_class.ransack(params[:q])
|
21
21
|
@objects = @query.result(distinct: true)
|
22
22
|
@objects = @objects.accessible_by(current_ability).only_current_language
|
23
|
+
@total_objects = @objects
|
23
24
|
@objects = @objects.page(params[:page]).
|
24
25
|
per(params[:per_page] ||
|
25
26
|
(base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
|
@@ -64,6 +65,7 @@ module Alchemy::Custom::Model
|
|
64
65
|
if @obj.respond_to? self.class.method_for_show
|
65
66
|
@objects = @obj.send(self.class.method_for_show.to_sym)
|
66
67
|
@objects = @objects.accessible_by(current_ability)
|
68
|
+
@total_objects = @objects
|
67
69
|
@objects = @objects.page(params[:page]).
|
68
70
|
per(params[:per_page] ||
|
69
71
|
(base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
|
@@ -74,6 +76,27 @@ module Alchemy::Custom::Model
|
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
79
|
+
def export_csv
|
80
|
+
|
81
|
+
@query = base_class.ransack(params[:q])
|
82
|
+
@objects = @query.result(distinct: true)
|
83
|
+
@objects = @objects.accessible_by(current_ability)
|
84
|
+
@total_objects = @objects
|
85
|
+
@objects = @objects.page(params[:page]).
|
86
|
+
per(params[:per_page] ||
|
87
|
+
(base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
|
88
|
+
25)
|
89
|
+
|
90
|
+
|
91
|
+
send_data generate_csv, filename: "export_member.csv", disposition: :attachment, type: "text/csv"
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
def export_csv_full
|
96
|
+
@objects = base_class.all.accessible_by(current_ability)
|
97
|
+
send_data generate_csv, filename: "export_member.csv", disposition: :attachment, type: "text/csv"
|
98
|
+
end
|
99
|
+
|
77
100
|
|
78
101
|
class << self
|
79
102
|
|
@@ -202,6 +225,32 @@ module Alchemy::Custom::Model
|
|
202
225
|
end
|
203
226
|
|
204
227
|
|
228
|
+
def generate_csv
|
229
|
+
header_csv = self.columns_csv.collect {|attr| base_class.human_attribute_name(attr)}
|
230
|
+
|
231
|
+
CSV.generate(headers: true) do |csv|
|
232
|
+
csv << header_csv
|
233
|
+
@objects.each do |member|
|
234
|
+
csv_row = self.columns_csv.collect do |attr|
|
235
|
+
render_csv_field member, attr
|
236
|
+
end
|
237
|
+
csv << csv_row
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
|
243
|
+
protected
|
244
|
+
|
245
|
+
def columns_csv
|
246
|
+
table_columns
|
247
|
+
end
|
248
|
+
|
249
|
+
def render_csv_field obj, attr
|
250
|
+
obj.send attr
|
251
|
+
end
|
252
|
+
|
253
|
+
|
205
254
|
|
206
255
|
end
|
207
256
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Custom
|
3
|
+
module Model
|
4
|
+
module Admin
|
5
|
+
class BaseWithGlobalizeController < ::Alchemy::Custom::Model::Admin::BaseController
|
6
|
+
|
7
|
+
|
8
|
+
around_action :switch_globalize_locale
|
9
|
+
before_action :load_object, except: :index
|
10
|
+
|
11
|
+
|
12
|
+
def index
|
13
|
+
@query = base_class.ransack(params[:q])
|
14
|
+
@objects = @query.result(distinct: true)
|
15
|
+
@objects = @objects.accessible_by(current_ability)
|
16
|
+
@total_objects = @objects
|
17
|
+
@objects = @objects.page(params[:page]).
|
18
|
+
per(params[:per_page] ||
|
19
|
+
(base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
|
20
|
+
25)
|
21
|
+
instance_variable_set "@#{base_class.name.demodulize.underscore.downcase.pluralize}", @objects
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def switch_globalize_locale(&action)
|
29
|
+
locale = Alchemy::Language.current.language_code.to_sym
|
30
|
+
Globalize.with_locale(locale, &action)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Admin
|
3
|
+
module NodesControllerDec
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
|
8
|
+
def custom_models
|
9
|
+
@custom_model_klasses = Alchemy::Custom::Model.allowed_custom_models_for_menu
|
10
|
+
if params[:q] and params[:q][:name]
|
11
|
+
@custom_model_klasses = @custom_model_klasses.select { |el| el.match /#{params[:q][:name]}/i }
|
12
|
+
end
|
13
|
+
@custom_model_klasses = Kaminari.paginate_array(@custom_model_klasses).page(params[:page]).per(params[:per_page] || 10)
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def custom_models_methods
|
18
|
+
@custom_model_klasses = Alchemy::Custom::Model.allowed_custom_models_for_menu
|
19
|
+
@custom_model_methods = []
|
20
|
+
if params[:q] and params[:q][:custom_model_klass]
|
21
|
+
klass = Alchemy::Custom::Model.allowed_custom_models_for_menu.select { |el| el == params[:q][:custom_model_klass] }.first
|
22
|
+
if !klass.nil? and klass.safe_constantize
|
23
|
+
klass = klass.constantize
|
24
|
+
if klass.respond_to? :menu_generator_methods
|
25
|
+
@custom_model_methods = klass.menu_generator_methods
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@custom_model_methods = Kaminari.paginate_array(@custom_model_methods).page(params[:page]).per(params[:per_page] || 10)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def resource_params
|
36
|
+
params.require(:node).permit(
|
37
|
+
:site_id,
|
38
|
+
:parent_id,
|
39
|
+
:language_id,
|
40
|
+
:page_id,
|
41
|
+
:name,
|
42
|
+
:url,
|
43
|
+
:title,
|
44
|
+
:nofollow,
|
45
|
+
:external,
|
46
|
+
:custom_model_klass,
|
47
|
+
:custom_model_method
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -221,9 +221,12 @@ module Alchemy::Custom::Model::Admin::BaseHelper
|
|
221
221
|
component_id = SecureRandom.hex(10)
|
222
222
|
|
223
223
|
bf << form.fields_for(field) do |join_record_form|
|
224
|
-
render(layout: 'gallery_item', locals: {picture: join_record_form.object.picture}) do
|
224
|
+
render(layout: 'gallery_item', locals: {picture: join_record_form.object.picture, jr_id: join_record_form.object.id}) do
|
225
|
+
sb = ActiveSupport::SafeBuffer.new
|
225
226
|
|
226
|
-
join_record_form.hidden_field
|
227
|
+
sb << join_record_form.hidden_field(:position, class: 'gallery_position_counter')
|
228
|
+
sb << join_record_form.hidden_field(:_destroy, class: 'gallery_item_destroy_input')
|
229
|
+
sb
|
227
230
|
|
228
231
|
end
|
229
232
|
end
|