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.
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