alchemy-custom-model 2.1.2 → 3.1.0

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.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/alchemy-custom-model/alchemy_custom_model_select.js +62 -0
  3. data/app/assets/javascripts/alchemy-custom-model/common_init.js +17 -14
  4. data/app/assets/javascripts/alchemy-custom-model/el_finder.js.coffee.erb +31 -0
  5. data/app/assets/javascripts/alchemy-custom-model/manifest.js +5 -0
  6. data/app/assets/javascripts/backend/date_picker.js +24 -0
  7. data/app/assets/javascripts/backend/fix_more_image_in_element.js.coffee +10 -0
  8. data/app/assets/javascripts/backend/override_alchemy_selectbox.js +8 -0
  9. data/app/assets/stylesheets/alchemy-custom-model/custom_elfinder.css.scss +20 -2
  10. data/app/assets/stylesheets/alchemy-custom-model/custom_style.css.scss +95 -0
  11. data/app/controllers/alchemy/custom/model/admin/base_controller.rb +16 -14
  12. data/app/controllers/alchemy/custom/model/admin/base_with_globalize_controller.rb +38 -0
  13. data/app/controllers/concerns/alchemy/admin/nodes_controller_dec.rb +55 -0
  14. data/app/helpers/alchemy/custom/model/admin/base_helper.rb +51 -3
  15. data/app/helpers/alchemy/custom/model/custom_model_helper.rb +26 -13
  16. data/app/helpers/alchemy/pages_helper_decorator.rb +38 -0
  17. data/app/models/concerns/alchemy/node_dec.rb +45 -0
  18. data/app/views/alchemy/admin/nodes/_form.html.erb +126 -0
  19. data/app/views/alchemy/admin/nodes/custom_models.json.jbuilder +10 -0
  20. data/app/views/alchemy/admin/nodes/custom_models_methods.json.jbuilder +10 -0
  21. data/app/views/alchemy/admin/pictures/_custom_model_info.html.erb +27 -0
  22. data/app/views/alchemy/admin/pictures/_infos.html.erb +65 -0
  23. data/app/views/alchemy/custom/model/admin/base/_gallery_item.html.erb +7 -2
  24. data/app/views/alchemy/custom/model/admin/base/_search_panel.html.erb +16 -0
  25. data/app/views/alchemy/custom/model/admin/base/_seo.html.erb +5 -5
  26. data/app/views/alchemy/custom/model/admin/base/_show_object.html.erb +30 -0
  27. data/app/views/alchemy/custom/model/admin/base/_show_objects.html.erb +48 -0
  28. data/app/views/alchemy/custom/model/admin/base/_title.html.erb +1 -1
  29. data/app/views/alchemy/custom/model/admin/base/edit.html.erb +2 -2
  30. data/app/views/alchemy/custom/model/admin/base/index.html.erb +6 -5
  31. data/app/views/alchemy/custom/model/admin/base/new.html.erb +2 -2
  32. data/app/views/alchemy/custom/model/admin/base/show.html.erb +5 -48
  33. data/app/views/alchemy/pages/sitemap.xml.erb +16 -0
  34. data/config/locales/it.yml +6 -0
  35. data/config/routes.rb +16 -0
  36. data/db/migrate/20200424184007_add_fields_to_node.rb +8 -0
  37. data/lib/alchemy/custom/model.rb +58 -0
  38. data/lib/alchemy/custom/model/el_finder/paths/active_record_reference.rb +9 -0
  39. data/lib/alchemy/custom/model/engine.rb +7 -1
  40. data/lib/alchemy/custom/model/globalize_model_decoration.rb +26 -0
  41. data/lib/alchemy/custom/model/menu_methods.rb +16 -0
  42. data/lib/alchemy/custom/model/model_decoration.rb +3 -0
  43. data/lib/alchemy/custom/model/model_utils_methods.rb +28 -0
  44. data/lib/alchemy/custom/model/pages_controller_dec.rb +38 -25
  45. data/lib/alchemy/custom/model/picture_used_by.rb +51 -0
  46. data/lib/alchemy/custom/model/sitemap_methods.rb +18 -0
  47. data/lib/alchemy/custom/model/slug_optimizer.rb +23 -0
  48. data/lib/alchemy/custom/model/version.rb +1 -1
  49. data/lib/tasks/alchemy_custom_model_tasks.rake +3 -0
  50. data/vendor/assets/javascripts/flatpickr/i10n/it.js +71 -0
  51. metadata +66 -9
  52. data/lib/alchemy-custom-model.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 18dbecf67db40ed24197196da81d783276e051fd
4
- data.tar.gz: e621f92260133cd31d1636c4b5a2ae4e4d173e78
2
+ SHA256:
3
+ metadata.gz: 2317c60439cb8da60f62ae80809fd4b70993e0bf7f9a8102a821c8163f75ec51
4
+ data.tar.gz: 2e2fc95122b44aa40c849985a98a5306597e680310a2aa6fe3ea4dfa5750ce25
5
5
  SHA512:
6
- metadata.gz: f555a7ffc0e4e0eb68cc1b8b79e6b60ad7f60f29490c505d3270b4d99b625da384b775027d6ab317b0ba9c39410740d51f190c4a08e1967bfdb50c061f0a92b1
7
- data.tar.gz: 8a0779d78372fb4c2f39a5123572ca752b22085e4309545399ba9a51fcc07e9bbbd1be87cfefd3d37f3b609c8c3202457cf90cdd8c3eb4976eaf2abcbfe66bb0
6
+ metadata.gz: 89cec5b88d99fb5db9f0ddbb7fc918c52d5889d747e76699af0cc623817aa800d3e9f0d650f2e1446eeab99f305421f24161b4349eba4643c4f8a4ce7aa40bfa
7
+ data.tar.gz: a95507e567669799eae556bea29d30952580359d83ffa83e799723aa464b3edb1684390f2dfe316b208347da05fb4de41a1dd9480111ca928d63265c18b4e244
@@ -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
- $(".datepicker-time").datetimepicker({
11
- format:'H:i',
12
- timepicker: true,
13
- datepicker: false,
14
- step: 15
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
@@ -0,0 +1,8 @@
1
+ $(document).ready(function(){
2
+
3
+ $("select.alchemy_selectbox").select2({
4
+ minimumResultsForSearch: 7,
5
+ dropdownAutoWidth: true,
6
+ allowClear: true
7
+ });
8
+ })
@@ -13,9 +13,26 @@
13
13
  display: block;
14
14
  float: left;
15
15
  margin: 6px;
16
- width: 100px;
17
- height: 100px;
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
  }
@@ -276,3 +276,98 @@
276
276
 
277
277
  }
278
278
 
279
+
280
+ .alchemy-dialog {
281
+ max-width: 1080px !important;
282
+ width: 100% !important;
283
+
284
+ .attribute_row {
285
+ margin: 10px 0px;
286
+ display: flex;
287
+
288
+ .labelfield {
289
+ font-size: 15px;
290
+ font-weight: bold;
291
+ text-transform: uppercase;
292
+ display: inline-block;
293
+ width: 200px;
294
+ overflow: hidden;
295
+ }
296
+
297
+ .valuefield {
298
+ font-size: 15px;
299
+ display: inline-block;
300
+ width: calc(100% - 200px);
301
+ overflow: hidden;
302
+ }
303
+
304
+ }
305
+ }
306
+
307
+
308
+ .search_panel {
309
+ background-color: #e9cfb7;
310
+ color:#000;
311
+ padding: 5px;
312
+ .row {
313
+ width: 100%;
314
+ height: auto;
315
+ display: flex;
316
+ }
317
+ .title {
318
+ color:#204166;
319
+ background-color: #eca96e;
320
+ font-weight: bolder;
321
+ width: 100;
322
+ display: block;
323
+ text-align: center;
324
+ height: 30px;
325
+ .title_label {
326
+ float:left;
327
+ margin-top:5px;
328
+ padding-left: 5px;
329
+ }
330
+ .button_toggle {
331
+ float:right;
332
+ margin-top:5px;
333
+ padding-right: 5px;
334
+ }
335
+ }
336
+ .search_fields_group div.input {
337
+ width: 30%;
338
+ float: left;
339
+ padding: 0 15px;
340
+ margin: 2px 0;
341
+ }
342
+ .action_buttons {
343
+ padding-top: 3px;
344
+ }
345
+ }
346
+
347
+
348
+ .show_page {
349
+ max-width: 1080px !important;
350
+ width: 100% !important;
351
+
352
+ .attribute_row {
353
+ margin: 10px 0px;
354
+ display: flex;
355
+
356
+ .labelfield {
357
+ font-size: 15px;
358
+ font-weight: bold;
359
+ text-transform: uppercase;
360
+ display: inline-block;
361
+ width: 200px;
362
+ overflow: hidden;
363
+ }
364
+
365
+ .valuefield {
366
+ font-size: 15px;
367
+ display: inline-block;
368
+ width: calc(100% - 200px);
369
+ overflow: hidden;
370
+ }
371
+
372
+ }
373
+ }
@@ -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) ||
@@ -61,16 +62,19 @@ module Alchemy::Custom::Model
61
62
  end
62
63
 
63
64
  def show
64
- if @obj.respond_to? self.class.method_for_show
65
- @objects = @obj.send(self.class.method_for_show.to_sym)
66
- @objects = @objects.accessible_by(current_ability)
67
- @objects = @objects.page(params[:page]).
68
- per(params[:per_page] ||
69
- (base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
70
- 25)
71
- instance_variable_set "@#{self.class.method_for_show.to_s.underscore.downcase.pluralize}", @objects
72
- else
73
- @objects = base_class.none
65
+ unless self.class.method_for_show.nil?
66
+ if @obj.respond_to? self.class.method_for_show
67
+ @objects = @obj.send(self.class.method_for_show.to_sym)
68
+ @objects = @objects.accessible_by(current_ability)
69
+ @total_objects = @objects
70
+ @objects = @objects.page(params[:page]).
71
+ per(params[:per_page] ||
72
+ (base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
73
+ 25)
74
+ instance_variable_set "@#{self.class.method_for_show.to_s.underscore.downcase.pluralize}", @objects
75
+ else
76
+ @objects = base_class.none
77
+ end
74
78
  end
75
79
  end
76
80
 
@@ -79,10 +83,8 @@ module Alchemy::Custom::Model
79
83
  @query = base_class.ransack(params[:q])
80
84
  @objects = @query.result(distinct: true)
81
85
  @objects = @objects.accessible_by(current_ability)
82
- @objects = @objects.page(params[:page]).
83
- per(params[:per_page] ||
84
- (base_class::DEFAULT_PER_PAGE if base_class.const_defined? :DEFAULT_PER_PAGE) ||
85
- 25)
86
+ @total_objects = @objects
87
+
86
88
 
87
89
 
88
90
  send_data generate_csv, filename: "export_member.csv", disposition: :attachment, type: "text/csv"
@@ -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