alchemy-custom-model 2.0.3 → 2.2.1

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/alchemy-custom-model/total_page_elfinder.js.coffee +1 -1
  7. data/app/assets/javascripts/backend/date_picker.js +24 -0
  8. data/app/assets/javascripts/backend/fix_more_image_in_element.js.coffee +10 -0
  9. data/app/assets/javascripts/backend/override_alchemy_selectbox.js +8 -0
  10. data/app/assets/stylesheets/alchemy-custom-model/custom_elfinder.css.scss +20 -2
  11. data/app/assets/stylesheets/alchemy-custom-model/custom_style.css.scss +95 -0
  12. data/app/controllers/alchemy/custom/model/admin/base_controller.rb +58 -10
  13. data/app/controllers/alchemy/custom/model/admin/base_with_globalize_controller.rb +38 -0
  14. data/app/controllers/concerns/alchemy/admin/nodes_controller_dec.rb +55 -0
  15. data/app/helpers/alchemy/custom/model/admin/base_helper.rb +50 -2
  16. data/app/helpers/alchemy/custom/model/custom_model_helper.rb +26 -13
  17. data/app/helpers/alchemy/pages_helper_decorator.rb +38 -0
  18. data/app/models/concerns/alchemy/node_dec.rb +45 -0
  19. data/app/views/alchemy/admin/nodes/_form.html.erb +126 -0
  20. data/app/views/alchemy/admin/nodes/custom_models.json.jbuilder +10 -0
  21. data/app/views/alchemy/admin/nodes/custom_models_methods.json.jbuilder +10 -0
  22. data/app/views/alchemy/admin/pictures/_custom_model_info.html.erb +27 -0
  23. data/app/views/alchemy/admin/pictures/_infos.html.erb +65 -0
  24. data/app/views/alchemy/custom/model/admin/base/_gallery_item.html.erb +7 -2
  25. data/app/views/alchemy/custom/model/admin/base/_search_panel.html.erb +16 -0
  26. data/app/views/alchemy/custom/model/admin/base/_seo.html.erb +5 -5
  27. data/app/views/alchemy/custom/model/admin/base/_show_object.html.erb +30 -0
  28. data/app/views/alchemy/custom/model/admin/base/_show_objects.html.erb +48 -0
  29. data/app/views/alchemy/custom/model/admin/base/_title.html.erb +1 -1
  30. data/app/views/alchemy/custom/model/admin/base/edit.html.erb +2 -2
  31. data/app/views/alchemy/custom/model/admin/base/index.html.erb +24 -2
  32. data/app/views/alchemy/custom/model/admin/base/new.html.erb +2 -2
  33. data/app/views/alchemy/custom/model/admin/base/show.html.erb +5 -48
  34. data/app/views/alchemy/pages/sitemap.xml.erb +16 -0
  35. data/config/locales/it.yml +6 -0
  36. data/config/routes.rb +16 -0
  37. data/db/migrate/20200424184007_add_fields_to_node.rb +8 -0
  38. data/lib/alchemy/custom/model.rb +58 -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 +58 -7
  52. data/lib/alchemy-custom-model.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7f3832f97edc764e3769b6b9dc1349be21942441
4
- data.tar.gz: 997a6c358b5ad2ed9f468d218ec6637b6a48610a
2
+ SHA256:
3
+ metadata.gz: 350f7cabcafa4b2c45d4a22ba2ee23c2bd58c719f622cc1619cba29d8934bb2f
4
+ data.tar.gz: 9f43ce7df02880061330222c666ac4eac99e301a3dbd2494cc6232f40167e644
5
5
  SHA512:
6
- metadata.gz: d2e592be9326fc6425133241ebb5747ff567b98549cc28571a045a85b990fc645789ea0ffbd6f27f85e6eb815e6b730eb6f2305cb753e18e3e962dff4d39a0ee
7
- data.tar.gz: 87d9d1d0b94725b0af4b2aad1aae6677422b60f453e5f24be8dbd76b989b198cbce5f8cfae516d51153fc1fd17b3d19612ac02e0c0617196f697f96ce2716d58
6
+ metadata.gz: 58992f001577a2b87264e88e2e7c15f6c03bd9a7c112b100f1acf054a4355fe1d18c6e142742de7a995bfa742d68661f052571b43c6e0fec0cb6f45418aa9595
7
+ data.tar.gz: e218a09bc0dec11be4747c658622e583593b086486490e3bf34cfcab8652f95915d122325e861a48c09cde9e61686f69b499471b92d3a2dfe72a29aec7a15f03
@@ -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"
@@ -1,5 +1,5 @@
1
1
  $ ->
2
- if($('#elfinder').size()>0)
2
+ if($('#elfinder').length>0)
3
3
  datas = $('#elfinder').data()
4
4
 
5
5
  elf = new ElFinderConfigurator(
@@ -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,19 +62,40 @@ 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
 
81
+ def export_csv
82
+
83
+ @query = base_class.ransack(params[:q])
84
+ @objects = @query.result(distinct: true)
85
+ @objects = @objects.accessible_by(current_ability)
86
+ @total_objects = @objects
87
+
88
+
89
+
90
+ send_data generate_csv, filename: "export_member.csv", disposition: :attachment, type: "text/csv"
91
+
92
+ end
93
+
94
+ def export_csv_full
95
+ @objects = base_class.all.accessible_by(current_ability)
96
+ send_data generate_csv, filename: "export_member.csv", disposition: :attachment, type: "text/csv"
97
+ end
98
+
77
99
 
78
100
  class << self
79
101
 
@@ -202,6 +224,32 @@ module Alchemy::Custom::Model
202
224
  end
203
225
 
204
226
 
227
+ def generate_csv
228
+ header_csv = self.columns_csv.collect {|attr| base_class.human_attribute_name(attr)}
229
+
230
+ CSV.generate(headers: true) do |csv|
231
+ csv << header_csv
232
+ @objects.each do |member|
233
+ csv_row = self.columns_csv.collect do |attr|
234
+ render_csv_field member, attr
235
+ end
236
+ csv << csv_row
237
+ end
238
+ end
239
+ end
240
+
241
+
242
+ protected
243
+
244
+ def columns_csv
245
+ table_columns
246
+ end
247
+
248
+ def render_csv_field obj, attr
249
+ obj.send attr
250
+ end
251
+
252
+
205
253
 
206
254
  end
207
255
  end