camaleon_cms 2.3.3 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of camaleon_cms might be problematic. Click here for more details.

Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +7 -12
  3. data/app/assets/javascripts/camaleon_cms/admin/_custom_fields.js +1 -2
  4. data/app/assets/javascripts/camaleon_cms/admin/_data.js +1 -0
  5. data/app/assets/javascripts/camaleon_cms/admin/_post.js +1 -1
  6. data/app/assets/javascripts/camaleon_cms/admin/_posttype.js.coffee +21 -0
  7. data/app/assets/javascripts/camaleon_cms/admin/admin-manifest.js +2 -0
  8. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/fr.js +49 -0
  9. data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +11 -6
  10. data/app/controllers/camaleon_cms/admin/appearances/themes_controller.rb +6 -0
  11. data/app/controllers/camaleon_cms/admin/media_controller.rb +3 -0
  12. data/app/controllers/camaleon_cms/admin/users_controller.rb +3 -0
  13. data/app/controllers/camaleon_cms/camaleon_controller.rb +5 -0
  14. data/app/controllers/camaleon_cms/frontend_controller.rb +1 -1
  15. data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +1 -1
  16. data/app/decorators/camaleon_cms/site_decorator.rb +1 -1
  17. data/app/decorators/camaleon_cms/user_decorator.rb +4 -0
  18. data/app/helpers/camaleon_cms/admin/custom_fields_helper.rb +4 -4
  19. data/app/helpers/camaleon_cms/camaleon_helper.rb +5 -0
  20. data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +16 -16
  21. data/app/helpers/camaleon_cms/hooks_helper.rb +10 -4
  22. data/app/helpers/camaleon_cms/plugins_helper.rb +1 -1
  23. data/app/helpers/camaleon_cms/session_helper.rb +9 -4
  24. data/app/helpers/camaleon_cms/short_code_helper.rb +1 -1
  25. data/app/helpers/camaleon_cms/theme_helper.rb +1 -1
  26. data/app/helpers/camaleon_cms/uploader_helper.rb +10 -7
  27. data/app/mailers/camaleon_cms/html_mailer.rb +33 -17
  28. data/app/models/camaleon_cms/ability.rb +2 -2
  29. data/app/models/camaleon_cms/nav_menu.rb +2 -2
  30. data/app/models/camaleon_cms/nav_menu_item.rb +5 -3
  31. data/app/models/camaleon_cms/site.rb +5 -101
  32. data/app/models/camaleon_cms/user.rb +8 -144
  33. data/app/models/camaleon_cms/user_relationship.rb +1 -1
  34. data/app/models/camaleon_cms/user_role.rb +0 -2
  35. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +14 -7
  36. data/app/models/concerns/camaleon_cms/metas.rb +5 -4
  37. data/app/models/concerns/camaleon_cms/site_default_settings.rb +87 -0
  38. data/app/models/concerns/camaleon_cms/user_methods.rb +142 -0
  39. data/app/uploaders/camaleon_cms_aws_uploader.rb +13 -4
  40. data/app/uploaders/camaleon_cms_uploader.rb +3 -1
  41. data/app/views/camaleon_cms/admin/appearances/nav_menus/_custom_menus.html.erb +11 -5
  42. data/app/views/camaleon_cms/admin/appearances/nav_menus/_external_menu.html.erb +8 -0
  43. data/app/views/camaleon_cms/admin/settings/_media_settings.html.erb +4 -0
  44. data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +155 -154
  45. data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +1 -1
  46. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkbox.html.erb +1 -1
  47. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkboxes.html.erb +1 -1
  48. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_posts.html.erb +2 -5
  49. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +1 -1
  50. data/app/views/camaleon_cms/admin/settings/post_types/_form.html.erb +24 -16
  51. data/app/views/camaleon_cms/admin/users/form.html.erb +2 -2
  52. data/app/views/camaleon_cms/default_theme/single.html.erb +1 -1
  53. data/app/views/layouts/camaleon_cms/admin.html.erb +2 -2
  54. data/config/initializers/model_alias.rb +10 -3
  55. data/config/locales/camaleon_cms/admin/en.yml +10 -0
  56. data/config/locales/camaleon_cms/admin/fr.yml +663 -0
  57. data/config/locales/camaleon_cms/common.yml +66 -0
  58. data/config/routes/frontend.rb +1 -1
  59. data/config/system.json +2 -2
  60. data/db/migrate/20150611161134_post_table_into_utf8.rb +6 -5
  61. data/lib/camaleon_cms/engine.rb +3 -0
  62. data/lib/camaleon_cms/version.rb +1 -1
  63. data/lib/ext/string.rb +1 -54
  64. data/lib/plugin_routes.rb +5 -0
  65. data/spec/decorators/post_type_spec.rb +13 -0
  66. data/spec/dummy/README.rdoc +28 -0
  67. data/spec/dummy/Rakefile +6 -0
  68. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  69. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  70. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  71. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  72. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  73. data/spec/dummy/bin/bundle +3 -0
  74. data/spec/dummy/bin/rails +4 -0
  75. data/spec/dummy/bin/rake +4 -0
  76. data/spec/dummy/bin/setup +29 -0
  77. data/spec/dummy/config.ru +4 -0
  78. data/spec/dummy/config/application.rb +26 -0
  79. data/spec/dummy/config/boot.rb +5 -0
  80. data/spec/dummy/config/database.yml +25 -0
  81. data/spec/dummy/config/environment.rb +5 -0
  82. data/spec/dummy/config/environments/development.rb +41 -0
  83. data/spec/dummy/config/environments/production.rb +79 -0
  84. data/spec/dummy/config/environments/test.rb +42 -0
  85. data/spec/dummy/config/initializers/assets.rb +11 -0
  86. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  87. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  88. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  89. data/spec/dummy/config/initializers/inflections.rb +16 -0
  90. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  91. data/spec/dummy/config/initializers/session_store.rb +3 -0
  92. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  93. data/spec/dummy/config/locales/en.yml +23 -0
  94. data/spec/dummy/config/routes.rb +4 -0
  95. data/spec/dummy/config/secrets.yml +22 -0
  96. data/spec/dummy/db/development.sqlite3 +0 -0
  97. data/spec/dummy/db/schema.rb +186 -0
  98. data/spec/dummy/public/404.html +67 -0
  99. data/spec/dummy/public/422.html +67 -0
  100. data/spec/dummy/public/500.html +66 -0
  101. data/spec/dummy/public/favicon.ico +0 -0
  102. data/spec/features/categories_spec.rb +25 -0
  103. data/spec/features/comments_spec.rb +45 -0
  104. data/spec/features/contact_form_spec.rb +53 -0
  105. data/spec/features/content_groups_spec.rb +45 -0
  106. data/spec/features/custom_fields_spec.rb +47 -0
  107. data/spec/features/frontend/pages_spec.rb +5 -0
  108. data/spec/features/languages_spec.rb +27 -0
  109. data/spec/features/media_spec.rb +50 -0
  110. data/spec/features/menus_spec.rb +46 -0
  111. data/spec/features/pages_spec.rb +30 -0
  112. data/spec/features/plugins_spec.rb +29 -0
  113. data/spec/features/posts_spec.rb +36 -0
  114. data/spec/features/session_spec.rb +52 -0
  115. data/spec/features/settings_spec.rb +17 -0
  116. data/spec/features/shortcodes_spec.rb +11 -0
  117. data/spec/features/sites_spec.rb +45 -0
  118. data/spec/features/tags_spec.rb +25 -0
  119. data/spec/features/themes_spec.rb +18 -0
  120. data/spec/features/user_roles_spec.rb +60 -0
  121. data/spec/features/users_spec.rb +79 -0
  122. data/spec/features/widgets_spec.rb +50 -0
  123. data/spec/helpers/email_helper_spec.rb +16 -0
  124. data/spec/mailers/send_mail_spec.rb +37 -0
  125. data/spec/rails_helper.rb +1 -0
  126. data/spec/routing/post_type_routes_spec.rb +12 -0
  127. data/spec/spec_helper.rb +191 -0
  128. data/spec/support/common.rb +113 -0
  129. data/spec/support/wait_for_ajax.rb +36 -0
  130. metadata +326 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4b0b30448fb0ace3c0211759a1cfa907b13e1be
4
- data.tar.gz: 3405faac8eb44d08804b38be753f3f171906c707
3
+ metadata.gz: a1a20fa498412de4a487828a91854cfe77b7a84d
4
+ data.tar.gz: b593e384f3f368dc448d7f277d39434263dcec6f
5
5
  SHA512:
6
- metadata.gz: 19575dfc1efe6398d203e9d69fe65b93bd5a189497396664e78d7f775ae1160651ba9c4de4a7a4d5d3b7b6ae4935c8654c9626656bd9457dd06bc45371e0ea8d
7
- data.tar.gz: b58471054de0c1357569b8797279ec499cd873af0fd421d13b0e940f92f26ac6110285dcd3b497da2bc37d7e1d06298d57b1a4a50fd54e3d50d987b780b9e2d0
6
+ metadata.gz: 34d8cf7a34b944d2330e5c65d622346c506ea1701f378781b3171c5a306b74c3771802b3cc3c19a468a5636db46b8ebf3f3aad2cb0bc6c01148b393b6e306d9a
7
+ data.tar.gz: fa8b8e7054f8b9999e658d03b9f47e19bfcc7da777c2bc12aea4d8b1b8ee6d30ca781e596ef4827f068128868f75ee7d1c052e329d71bd2bd908a548ab558b84
data/Rakefile CHANGED
@@ -14,24 +14,19 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
18
  load 'rails/tasks/engine.rake'
19
19
 
20
-
21
20
  load 'rails/tasks/statistics.rake'
22
21
 
23
-
24
-
25
22
  Bundler::GemHelper.install_tasks
26
23
 
27
- require 'rake/testtask'
24
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
28
25
 
29
- Rake::TestTask.new(:test) do |t|
30
- t.libs << 'lib'
31
- t.libs << 'test'
32
- t.pattern = 'test/**/*_test.rb'
33
- t.verbose = false
34
- end
26
+ require 'rspec/core'
27
+ require 'rspec/core/rake_task'
35
28
 
29
+ desc "Run all specs in spec directory (excluding plugin specs)"
30
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
36
31
 
37
- task default: :test
32
+ task :default => :spec
@@ -61,7 +61,7 @@ function cama_build_custom_field(panel, field_data, values){
61
61
  field.prepend(field_actions);
62
62
  if(field_counter == 0) field.children('.actions').find('.fa-times').remove();
63
63
  }
64
- field.find('input, textarea, select').each(function(){ $(this).attr('name', $(this).attr('name').replace('[]', '['+field_counter+']')) });
64
+ if(!$field.find('.group-input-fields-content').hasClass('cama_skip_cf_rename_multiple')) field.find('input, textarea, select').each(function(){ $(this).attr('name', $(this).attr('name').replace('[]', '['+field_counter+']')) });
65
65
  if(field_data.disabled){
66
66
  field.find('input, textarea, select').prop('readonly', true).filter('select').click(function(){ return false; }).focus(function(){ $(this).blur(); });
67
67
  field.find('.btn').addClass('disabled').unbind().click(function(){ return false; });
@@ -119,7 +119,6 @@ function custom_field_checkboxs_val($field, values) {
119
119
  var selector = values.map(function (value) {
120
120
  return "input[value='" + value + "']"
121
121
  }).join(',');
122
- $field.find('input').prop('checked', false);
123
122
  $field.find(selector).prop('checked', true);
124
123
  }
125
124
  }
@@ -60,6 +60,7 @@ function cama_get_tinymce_settings(settings){
60
60
  },
61
61
  onPostRender: function(editor){}
62
62
  };
63
+ for(var ff in tinymce_global_settings["settings"]) tinymce_global_settings["settings"][ff](settings, def);
63
64
  return $.extend({}, def, settings);
64
65
  }
65
66
 
@@ -242,7 +242,7 @@ function init_post(obj) {
242
242
  if ($(this).valid()) $form.data("submitted", 1);
243
243
  });
244
244
  window.onbeforeunload = function () {
245
- if ($form.data("submitted"))
245
+ if ($form.data("submitted") || $('#form-post').length == 0)
246
246
  return;
247
247
  if ($form.data("hash") != get_hash_form()) {
248
248
  return "You sure to leave the page without saving changes?";
@@ -0,0 +1,21 @@
1
+ window['cama_init_posttype_form'] = ->
2
+ form = $("#post_type_form");
3
+ form.find('.unput_upload').input_upload();
4
+
5
+ # permit hierarchy route only for post types enabled "Manage page hierarchy"
6
+ form.find("[name='meta[has_parent_structure]']").change(->
7
+ item = form.find("#meta_contents_route_format_hierarchy_post");
8
+ item.parent().siblings().find("input").prop("disabled", $(this).is(":checked"))
9
+ if($(this).is(":checked"))
10
+ item.prop("checked", true).prop("disabled", false)
11
+ else
12
+ item.prop("disabled", true)
13
+ ).trigger("change")
14
+
15
+ form.find('[name="meta[has_picture]"]').change(->
16
+ items = form.find('.picture_settings input')
17
+ if($(this).is(":checked"))
18
+ items.prop("disabled", false)
19
+ else
20
+ items.prop("disabled", true)
21
+ ).trigger("change")
@@ -49,3 +49,5 @@
49
49
  // post
50
50
  //= require ./_jquery.tagsinput.min
51
51
  //= require ./_post
52
+
53
+ //= require ./_posttype
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Translated default messages for the jQuery validation plugin.
3
+ * Locale: FR (French; français)
4
+ */
5
+ $.extend( $.validator.messages, {
6
+ required: "Ce champ est obligatoire.",
7
+ remote: "Veuillez corriger ce champ.",
8
+ email: "Veuillez fournir une adresse électronique valide.",
9
+ url: "Veuillez fournir une adresse URL valide.",
10
+ date: "Veuillez fournir une date valide.",
11
+ dateISO: "Veuillez fournir une date valide (ISO).",
12
+ number: "Veuillez fournir un numéro valide.",
13
+ digits: "Veuillez fournir seulement des chiffres.",
14
+ creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
15
+ equalTo: "Veuillez fournir encore la même valeur.",
16
+ extension: "Veuillez fournir une valeur avec une extension valide.",
17
+ maxlength: $.validator.format( "Veuillez fournir au plus {0} caractères." ),
18
+ minlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
19
+ rangelength: $.validator.format( "Veuillez fournir une valeur qui contient entre {0} et {1} caractères." ),
20
+ range: $.validator.format( "Veuillez fournir une valeur entre {0} et {1}." ),
21
+ max: $.validator.format( "Veuillez fournir une valeur inférieure ou égale à {0}." ),
22
+ min: $.validator.format( "Veuillez fournir une valeur supérieure ou égale à {0}." ),
23
+ maxWords: $.validator.format( "Veuillez fournir au plus {0} mots." ),
24
+ minWords: $.validator.format( "Veuillez fournir au moins {0} mots." ),
25
+ rangeWords: $.validator.format( "Veuillez fournir entre {0} et {1} mots." ),
26
+ letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
27
+ alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
28
+ lettersonly: "Veuillez fournir seulement des lettres.",
29
+ nowhitespace: "Veuillez ne pas inscrire d'espaces blancs.",
30
+ ziprange: "Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",
31
+ integer: "Veuillez fournir un nombre non décimal qui est positif ou négatif.",
32
+ vinUS: "Veuillez fournir un numéro d'identification du véhicule (VIN).",
33
+ dateITA: "Veuillez fournir une date valide.",
34
+ time: "Veuillez fournir une heure valide entre 00:00 et 23:59.",
35
+ phoneUS: "Veuillez fournir un numéro de téléphone valide.",
36
+ phoneUK: "Veuillez fournir un numéro de téléphone valide.",
37
+ mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
38
+ strippedminlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
39
+ email2: "Veuillez fournir une adresse électronique valide.",
40
+ url2: "Veuillez fournir une adresse URL valide.",
41
+ creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
42
+ ipv4: "Veuillez fournir une adresse IP v4 valide.",
43
+ ipv6: "Veuillez fournir une adresse IP v6 valide.",
44
+ require_from_group: "Veuillez fournir au moins {0} de ces champs.",
45
+ nifES: "Veuillez fournir un numéro NIF valide.",
46
+ nieES: "Veuillez fournir un numéro NIE valide.",
47
+ cifES: "Veuillez fournir un numéro CIF valide.",
48
+ postalCodeCA: "Veuillez fournir un code postal valide."
49
+ } );
@@ -53,7 +53,7 @@ class CamaleonCms::Admin::Appearances::NavMenusController < CamaleonCms::AdminCo
53
53
 
54
54
  def save_custom_settings
55
55
  @nav_menu_item = current_site.nav_menu_items.find(params[:id])
56
- @nav_menu_item.set_field_values(params[:field_options])
56
+ @nav_menu_item.set_field_values(params.require(:field_options).permit!)
57
57
  render nothing: true
58
58
  end
59
59
 
@@ -66,8 +66,8 @@ class CamaleonCms::Admin::Appearances::NavMenusController < CamaleonCms::AdminCo
66
66
  def update_menu_item
67
67
  @nav_menu = current_site.nav_menus.find(params[:nav_menu_id])
68
68
  item = current_site.nav_menu_items.find(params[:id])
69
- item.update_menu_item({label: params[:external_label], link: params[:external_url]})
70
- item.set_options(params[:options]) if params[:options].present?
69
+ item.update_menu_item(parse_external_menu(params))
70
+ item.set_options(params.require(:options).permit!) if params[:options].present?
71
71
  render partial: 'menu_items', locals: {items: [item], nav_menu: @nav_menu}
72
72
  end
73
73
 
@@ -94,8 +94,8 @@ class CamaleonCms::Admin::Appearances::NavMenusController < CamaleonCms::AdminCo
94
94
  items = []
95
95
  @nav_menu = current_site.nav_menus.find(params[:nav_menu_id])
96
96
  if params[:external].present?
97
- item = @nav_menu.append_menu_item({label: params[:external][:external_label], link: params[:external][:external_url], type: "external"})
98
- item.set_options(params[:external][:options]) if params[:external][:options].present?
97
+ item = @nav_menu.append_menu_item(parse_external_menu(params[:external]))
98
+ item.set_options(params[:external].require(:options).permit!) if params[:external][:options].present?
99
99
  items << item
100
100
  end
101
101
 
@@ -145,6 +145,11 @@ class CamaleonCms::Admin::Appearances::NavMenusController < CamaleonCms::AdminCo
145
145
  helper_method :parse_menu_item
146
146
 
147
147
  def check_menu_permission
148
- authorize! :manage, :menu
148
+ authorize! :manage, :nav_menu
149
+ end
150
+
151
+ # return params to be saved for external menu
152
+ def parse_external_menu(_params)
153
+ {label: _params[:external_label], link: _params[:external_url], type: "external", target: _params[:target]}
149
154
  end
150
155
  end
@@ -1,4 +1,5 @@
1
1
  class CamaleonCms::Admin::Appearances::ThemesController < CamaleonCms::AdminController
2
+ before_action :check_theme_permission
2
3
  # list themes or update a theme status
3
4
  add_breadcrumb I18n.t("camaleon_cms.admin.sidebar.appearance")
4
5
  def index
@@ -20,4 +21,9 @@ class CamaleonCms::Admin::Appearances::ThemesController < CamaleonCms::AdminCont
20
21
  def preview
21
22
  render layout: false
22
23
  end
24
+
25
+ private
26
+ def check_theme_permission
27
+ authorize! :manage, :themes
28
+ end
23
29
  end
@@ -31,6 +31,9 @@ class CamaleonCms::Admin::MediaController < CamaleonCms::AdminController
31
31
 
32
32
  # render media for modal content
33
33
  def ajax
34
+ if current_site.get_option('file_actions_in_modals') == 'yes'
35
+ @show_file_actions = true
36
+ end
34
37
  @tree = cama_uploader.search(params[:search]) if params[:search].present?
35
38
  if params[:partial].present?
36
39
  render partial: "files_list", locals: { files: @tree[:files], folders: @tree[:folders] }
@@ -26,11 +26,13 @@ class CamaleonCms::Admin::UsersController < CamaleonCms::AdminController
26
26
  end
27
27
 
28
28
  def update
29
+ r={user: @user}; hooks_run('user_update', r)
29
30
  if @user.update(params.require(:user).permit!)
30
31
  @user.set_metas(params[:meta]) if params[:meta].present?
31
32
  @user.set_field_values(params[:field_options])
32
33
  r = {user: @user, message: t('camaleon_cms.admin.users.message.updated'), params: params}; hooks_run('user_after_edited', r)
33
34
  flash[:notice] = r[:message]
35
+ r={user: @user}; hooks_run('user_updated', r)
34
36
  if cama_current_user.id == @user.id
35
37
  redirect_to action: :profile_edit
36
38
  else
@@ -65,6 +67,7 @@ class CamaleonCms::Admin::UsersController < CamaleonCms::AdminController
65
67
  def create
66
68
  user_data = params.require(:user).permit!
67
69
  @user = current_site.users.new(user_data)
70
+ r={user: @user}; hooks_run('user_create', r)
68
71
  if @user.save
69
72
  @user.set_metas(params[:meta]) if params[:meta].present?
70
73
  @user.set_field_values(params[:field_options])
@@ -28,6 +28,7 @@ class CamaleonCms::CamaleonController < ApplicationController
28
28
  # For APIs, you may want to use :null_session instead.
29
29
  protect_from_forgery with: :exception
30
30
  layout Proc.new { |controller| controller.request.xhr? ? false : 'default' }
31
+ helper_method :current_user
31
32
 
32
33
  # show page error
33
34
  def render_error(status = 404, exception = nil, message = "")
@@ -109,4 +110,8 @@ class CamaleonCms::CamaleonController < ApplicationController
109
110
  end
110
111
  end
111
112
  end
113
+
114
+ def current_user
115
+ cama_current_user
116
+ end
112
117
  end
@@ -2,7 +2,7 @@ class CamaleonCms::FrontendController < CamaleonCms::CamaleonController
2
2
  before_action :init_frontent
3
3
  include CamaleonCms::FrontendConcern
4
4
  include CamaleonCms::Frontend::ApplicationHelper
5
- layout Proc.new { |controller| params[:cama_ajax_request].present? ? "cama_ajax" : 'index' }
5
+ layout Proc.new { |controller| args = {layout: (params[:cama_ajax_request].present? ? "cama_ajax" : 'index'), controller: controller}; hooks_run("front_default_layout", args); args[:layout] }
6
6
  before_action :before_hooks
7
7
  after_action :after_hooks
8
8
  # rescue_from ActiveRecord::RecordNotFound, with: :page_not_found
@@ -28,7 +28,7 @@ module CamaleonCms::FrontendConcern extend ActiveSupport::Concern
28
28
  # save comment from a post
29
29
  def save_comment
30
30
  @post = current_site.posts.find_by_id(params[:post_id]).decorate
31
- user = current_user
31
+ user = cama_current_user
32
32
  comment_data = {}
33
33
  if !user.present? && current_site.get_option('permit_anonimos_comment', false)
34
34
  user = current_site.get_anonymous_user
@@ -187,7 +187,7 @@ class CamaleonCms::SiteDecorator < CamaleonCms::TermTaxonomyDecorator
187
187
 
188
188
  # check if current user can manage sites
189
189
  def manage_sites?
190
- self.main_site? && h.current_user.admin?
190
+ self.main_site? && h.cama_current_user.admin?
191
191
  end
192
192
 
193
193
  # return the text status of current site
@@ -49,6 +49,10 @@ class CamaleonCms::UserDecorator < CamaleonCms::ApplicationDecorator
49
49
  h.current_site.posts.where(user_id: object.id)
50
50
  end
51
51
 
52
+ def self.object_class_name
53
+ 'CamaleonCms::User'
54
+ end
55
+
52
56
  private
53
57
 
54
58
  def avatar_exists?
@@ -195,14 +195,14 @@ module CamaleonCms::Admin::CustomFieldsHelper
195
195
  {
196
196
  type: 'text_box',
197
197
  key: 'dimension',
198
- label: t('camaleon_cms.admin.custom_field.fields.image_dimension', default: 'Dimension'),
199
- description: t('camaleon_cms.admin.custom_field.fields.image_dimension_descr', default: 'Crop the image with indicated dimension (widthxheight), sample: 400x300 <br>Possible values: 400x300 | 400x | x300 | ?400x?500 | ?1400x (? => maximum, empty => auto)'),
198
+ label: cama_t('camaleon_cms.admin.custom_field.fields.image_dimension'),
199
+ description: cama_t('camaleon_cms.admin.custom_field.fields.image_dimension_descr'),
200
200
  },
201
201
  {
202
202
  type: 'text_box',
203
203
  key: 'versions',
204
- label: t('camaleon_cms.admin.custom_field.fields.image_versions_descr', default: 'Versions'),
205
- description: t('camaleon_cms.admin.custom_field.fields.image_versions_descr', default: 'Create addtional multiple versions of the image uploaded, sample: \'300x300,505x350\' ==> Will create two extra images with these dimensions')
204
+ label: cama_t('camaleon_cms.admin.custom_field.fields.image_versions'),
205
+ description: cama_t('camaleon_cms.admin.custom_field.fields.image_versions_descr')
206
206
  }
207
207
  ]
208
208
  }
@@ -74,4 +74,9 @@ module CamaleonCms::CamaleonHelper
74
74
  @_cama_timer = Time.current
75
75
  end
76
76
 
77
+ # return normal translation with default value with translation of english
78
+ def cama_t(key, args = {})
79
+ args[:default] = I18n.t(key, args.dup.merge(locale: :en)) unless args[:default].present?
80
+ I18n.t(key, args)
81
+ end
77
82
  end
@@ -90,7 +90,7 @@ module CamaleonCms::Frontend::NavMenuHelper
90
90
  parent_current = true if _is_current || current_children
91
91
 
92
92
  html += "<#{_args[:item_container]} #{r[:item_container_attrs]} class='#{_args[:item_class]} #{_args[:item_class_parent] if has_children} #{"#{_args[:item_current]}" if _is_current} #{"current-menu-ancestor" if current_children }'>#{_args[:link_before]}
93
- <a #{r[:link_attrs]} href='#{data_nav_item[:link]}' class='#{args[:link_current] if _is_current} #{_args[:link_class_parent] if has_children} #{_args[:link_class]}' #{"data-toggle='dropdown'" if has_children } >#{_args[:before]}#{data_nav_item[:name]}#{_args[:after]}</a> #{_args[:link_after]}
93
+ <a #{r[:link_attrs]} #{" target='#{nav_menu_item.target}'" if nav_menu_item.target.present?} href='#{data_nav_item[:link]}' class='#{args[:link_current] if _is_current} #{_args[:link_class_parent] if has_children} #{_args[:link_class]}' #{"data-toggle='dropdown'" if has_children } >#{_args[:before]}#{data_nav_item[:name]}#{_args[:after]}</a> #{_args[:link_after]}
94
94
  #{ html_children }
95
95
  </#{_args[:item_container]}>"
96
96
  index += 1
@@ -110,7 +110,7 @@ module CamaleonCms::Frontend::NavMenuHelper
110
110
  # internal_level: ingnore (managed by internal recursion)
111
111
  def cama_menu_parse_items(items, max_levels=-1, internal_level=0)
112
112
  res, is_current_parent, levels = [], false, [0]
113
- items.each_with_index do |nav_menu_item, index|
113
+ items.reorder(:term_order).each_with_index do |nav_menu_item, index|
114
114
  data_nav_item = _get_link_nav_menu(nav_menu_item)
115
115
  next if data_nav_item == false
116
116
  _is_current = data_nav_item[:current] || site_current_path == data_nav_item[:link] || site_current_path == data_nav_item[:link].sub(".html", "")
@@ -129,7 +129,7 @@ module CamaleonCms::Frontend::NavMenuHelper
129
129
  }.merge(data_nav_item.except(:current, :name, :link))
130
130
 
131
131
  if has_children
132
- r[:children], _is_current_parent, r[:levels] = cama_menu_parse_items(nav_menu_item.children.reorder(:term_order), max_levels, internal_level + 1)
132
+ r[:children], _is_current_parent, r[:levels] = cama_menu_parse_items(nav_menu_item.children, max_levels, internal_level + 1)
133
133
  if _is_current_parent
134
134
  is_current_parent = true
135
135
  r[:current_parent] = true
@@ -176,13 +176,12 @@ module CamaleonCms::Frontend::NavMenuHelper
176
176
 
177
177
  private
178
178
  def _get_link_nav_menu(nav_menu_item)
179
- type_menu = nav_menu_item.kind
179
+ type_menu, r = nav_menu_item.kind, false
180
180
  begin
181
181
  case type_menu
182
182
  when 'post'
183
183
  post = CamaleonCms::Post.find(nav_menu_item.url).decorate
184
- return false unless post.can_visit?
185
- r = {link: post.the_url(as_path: true), name: post.the_title, type_menu: type_menu, current: @cama_visited_post.present? && @cama_visited_post.id == post.id}
184
+ r = {link: post.the_url(as_path: true), name: post.the_title, type_menu: type_menu, current: @cama_visited_post.present? && @cama_visited_post.id == post.id} if post.can_visit?
186
185
  when 'category'
187
186
  category = CamaleonCms::Category.find(nav_menu_item.url).decorate
188
187
  r = {link: category.the_url(as_path: true), name: category.the_title, type_menu: type_menu, current: @cama_visited_category.present? && @cama_visited_category.id == category.id}
@@ -197,25 +196,26 @@ module CamaleonCms::Frontend::NavMenuHelper
197
196
  r[:link] = cama_root_path if r[:link] == "root_url"
198
197
  r[:link] = site_current_path if site_current_path == "#{current_site.the_path}#{r[:link]}"
199
198
  r[:current] = r[:link] == site_current_url || r[:link] == site_current_path
199
+
200
200
  # permit to customize or mark as current menu
201
201
  # _args: (HASH) {menu_item: Model Menu Item, parsed_menu: Parsed Menu }
202
202
  # Sample parsed_menu: {link: "url of the link", name: "Text of the menu", type_menu: 'external', current: Boolean (true => is current menu, false => not current menu item)}
203
203
  _args = {menu_item: nav_menu_item, parsed_menu: r}; hooks_run("on_external_menu", _args)
204
204
  r = _args[:parsed_menu]
205
- return false if _args[:parsed_menu] == false
206
-
207
- else
208
- return false
209
205
  end
210
206
  rescue => e
211
207
  puts "-------------------------- menu item error: #{e.message}"
212
- return false
213
208
  end
214
209
 
215
- # permit to mark as a current menu custom paths
216
- # sample: @cama_current_menu_path = '/my_section'
217
- # sample2: @cama_current_menu_path = ['/my_section', '/mi_seccion'] # multi language support
218
- r[:current] = true if @cama_current_menu_path.present? && !r[:current] && (@cama_current_menu_path.is_a?(String) ? @cama_current_menu_path == r[:link] : @cama_current_menu_path.include?(r[:link]))
219
- r
210
+ if r != false
211
+ # permit to mark as a current menu custom paths
212
+ # sample: @cama_current_menu_path = '/my_section'
213
+ # sample2: @cama_current_menu_path = ['/my_section', '/mi_seccion'] # multi language support
214
+ r[:current] = true if @cama_current_menu_path.present? && !r[:current] && (@cama_current_menu_path.is_a?(String) ? @cama_current_menu_path == r[:link] : @cama_current_menu_path.include?(r[:link]))
215
+ end
216
+
217
+ # permit to customize data of parsed menu item or skip menu item by assigning false into :parsed_menu
218
+ _args = {menu_item: nav_menu_item, parsed_menu: r}; hooks_run("on_render_front_menu_item", _args)
219
+ _args[:parsed_menu]
220
220
  end
221
221
  end
@@ -31,12 +31,18 @@ module CamaleonCms::HooksHelper
31
31
  plugin["hooks"][hook_key].each do |hook|
32
32
  next if @_hooks_skip.present? && @_hooks_skip.include?(hook)
33
33
  begin
34
- send(hook, params) unless params.nil?
35
- send(hook) if params.nil?
34
+ if params.nil?
35
+ send(hook)
36
+ else
37
+ send(hook, params)
38
+ end
36
39
  rescue
37
40
  plugin_load_helpers(plugin)
38
- send(hook, params) unless params.nil?
39
- send(hook) if params.nil?
41
+ if params.nil?
42
+ send(hook)
43
+ else
44
+ send(hook, params)
45
+ end
40
46
  end
41
47
  end
42
48
  end