alchemy-custom-model 2.0.3 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
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