alchemy-custom-model 2.0.2 → 2.2.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 (44) 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/controllers/alchemy/custom/model/admin/base_controller.rb +49 -0
  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 +5 -2
  15. data/app/helpers/alchemy/pages_helper_decorator.rb +38 -0
  16. data/app/models/concerns/alchemy/node_dec.rb +45 -0
  17. data/app/views/alchemy/admin/nodes/_form.html.erb +126 -0
  18. data/app/views/alchemy/admin/nodes/custom_models.json.jbuilder +10 -0
  19. data/app/views/alchemy/admin/nodes/custom_models_methods.json.jbuilder +10 -0
  20. data/app/views/alchemy/admin/pictures/_custom_model_info.html.erb +27 -0
  21. data/app/views/alchemy/admin/pictures/_infos.html.erb +65 -0
  22. data/app/views/alchemy/custom/model/admin/base/_gallery_item.html.erb +7 -2
  23. data/app/views/alchemy/custom/model/admin/base/_seo.html.erb +5 -5
  24. data/app/views/alchemy/custom/model/admin/base/_title.html.erb +1 -1
  25. data/app/views/alchemy/custom/model/admin/base/edit.html.erb +2 -2
  26. data/app/views/alchemy/custom/model/admin/base/index.html.erb +23 -2
  27. data/app/views/alchemy/custom/model/admin/base/new.html.erb +2 -2
  28. data/app/views/alchemy/custom/model/admin/base/show.html.erb +2 -2
  29. data/config/locales/it.yml +6 -0
  30. data/config/routes.rb +16 -0
  31. data/db/migrate/20200424184007_add_fields_to_node.rb +8 -0
  32. data/lib/{alchemy-custom-model.rb → alchemy/custom/model.rb} +20 -0
  33. data/lib/alchemy/custom/model/engine.rb +7 -1
  34. data/lib/alchemy/custom/model/globalize_model_decoration.rb +25 -0
  35. data/lib/alchemy/custom/model/menu_methods.rb +16 -0
  36. data/lib/alchemy/custom/model/model_decoration.rb +2 -0
  37. data/lib/alchemy/custom/model/model_utils_methods.rb +28 -0
  38. data/lib/alchemy/custom/model/order.rb +1 -1
  39. data/lib/alchemy/custom/model/picture_used_by.rb +51 -0
  40. data/lib/alchemy/custom/model/slug_optimizer.rb +23 -0
  41. data/lib/alchemy/custom/model/version.rb +1 -1
  42. data/lib/tasks/alchemy_custom_model_tasks.rake +3 -0
  43. data/vendor/assets/javascripts/flatpickr/i10n/it.js +71 -0
  44. metadata +53 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8ed0ee1023ebbe7aa4406999e824b2cf0b23bc8e
4
- data.tar.gz: 7d245b0a99f8ed1de3ecc347d03f7eeb79da2400
2
+ SHA256:
3
+ metadata.gz: 1a2697b7c047652bd81eff2eea2f6ce536f17b636ee6e200fa0d79de57183544
4
+ data.tar.gz: b6463926d7a0e7dec5a118fe74fc71a92293a46eba4bec350f3f5ca454c1ad6e
5
5
  SHA512:
6
- metadata.gz: a174324f0a85e471597c66fd1602281cdd067915c897aed4b9815a73ee2012aaa4e4474960e3cc2bbd7da159925c567cb2bf4e80e24eb493f10bf16d5d5726da
7
- data.tar.gz: 01fdb0b4e39999267464b77248c9cb81cef4e774165515323de6d62f797d16cf123007d44421f134cf9e0655725698270ccefe45efc5b9715c106244f74f42bb
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
- $(".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
  }
@@ -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 :position, class: 'gallery_position_counter'
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