decidim-decidim_awesome 0.11.4 → 0.12.3

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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -6
  3. data/README.md +33 -39
  4. data/Rakefile +12 -0
  5. data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +14 -2
  6. data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +5 -4
  7. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +4 -4
  8. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +1 -1
  9. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal_cell.rb +3 -5
  10. data/app/commands/concerns/decidim/decidim_awesome/system/{register_organization_override.rb → create_organization_override.rb} +1 -1
  11. data/app/commands/concerns/decidim/decidim_awesome/update_account_override.rb +4 -4
  12. data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +1 -1
  13. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +2 -2
  14. data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
  15. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +41 -0
  16. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
  17. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
  18. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -10
  19. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
  20. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
  21. data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
  22. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
  23. data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
  24. data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
  25. data/app/forms/concerns/decidim/decidim_awesome/proposals/{proposal_wizard_create_step_form_override.rb → proposal_form_customizations.rb} +1 -1
  26. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
  27. data/app/forms/concerns/decidim/decidim_awesome/system/organization_form_override.rb +2 -2
  28. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +13 -0
  29. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +1 -1
  30. data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
  31. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
  32. data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
  33. data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
  34. data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
  35. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
  36. data/app/packs/entrypoints/decidim_admin_decidim_awesome_search_form.scss +1 -0
  37. data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
  38. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +10 -6
  39. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
  40. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
  41. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
  42. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
  43. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
  44. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
  45. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
  46. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
  47. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
  48. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
  49. data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
  50. data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
  51. data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
  52. data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
  53. data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
  54. data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
  55. data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
  56. data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
  57. data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
  58. data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
  59. data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
  60. data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
  61. data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
  62. data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
  63. data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
  64. data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
  65. data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
  66. data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
  67. data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
  68. data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
  69. data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
  70. data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
  71. data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
  72. data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
  73. data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
  74. data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
  75. data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
  76. data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
  77. data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
  78. data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
  79. data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
  80. data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
  81. data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
  82. data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
  83. data/app/packs/src/vendor/hashcash.js +83 -0
  84. data/app/packs/src/vendor/sha1.js +143 -0
  85. data/app/packs/src/vendor/stamp.js +50 -0
  86. data/app/packs/stylesheets/decidim/decidim_awesome/admin/admin_accountability.scss +67 -0
  87. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
  88. data/app/permissions/decidim/decidim_awesome/permissions.rb +3 -2
  89. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
  90. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +12 -0
  91. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +5 -4
  92. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
  93. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
  94. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
  95. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
  96. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
  97. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  98. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
  99. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
  100. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
  101. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
  102. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
  103. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +1 -1
  104. data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
  105. data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
  106. data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
  107. data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
  108. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
  109. data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
  110. data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
  111. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
  112. data/app/views/decidim/decidim_awesome/admin/shared/_filters_with_date.html.erb +41 -32
  113. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
  114. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +5 -0
  115. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +1 -1
  116. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
  117. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
  118. data/config/assets.rb +3 -1
  119. data/config/i18n-tasks.yml +1 -0
  120. data/config/locales/ca.yml +69 -30
  121. data/config/locales/cs.yml +68 -29
  122. data/config/locales/de.yml +67 -28
  123. data/config/locales/en.yml +81 -32
  124. data/config/locales/es.yml +68 -29
  125. data/config/locales/eu.yml +31 -31
  126. data/config/locales/fr.yml +82 -31
  127. data/config/locales/ja.yml +31 -31
  128. data/lib/decidim/decidim_awesome/admin_engine.rb +8 -5
  129. data/lib/decidim/decidim_awesome/awesome.rb +49 -27
  130. data/lib/decidim/decidim_awesome/checksums.yml +47 -42
  131. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +2 -2
  132. data/lib/decidim/decidim_awesome/engine.rb +16 -6
  133. data/lib/decidim/decidim_awesome/menu.rb +151 -138
  134. data/lib/decidim/decidim_awesome/test/initializer.rb +4 -1
  135. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor_examples.rb +14 -14
  136. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +2 -4
  137. data/lib/decidim/decidim_awesome/test/shared_examples/custom_fields_examples.rb +8 -8
  138. data/lib/decidim/decidim_awesome/test/shared_examples/custom_styles_examples.rb +6 -6
  139. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +5 -4
  140. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +5 -5
  141. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +16 -9
  142. data/lib/decidim/decidim_awesome/version.rb +2 -2
  143. data/lib/decidim/decidim_awesome.rb +0 -1
  144. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -5
  145. data/package.json +9 -18
  146. metadata +82 -26
  147. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +0 -107
  148. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +0 -26
  149. data/config/rubocop/disabled.yml +0 -11
  150. data/config/rubocop/faker.yml +0 -480
  151. data/config/rubocop/rails.yml +0 -88
  152. data/config/rubocop/rspec.yml +0 -65
  153. data/config/rubocop/ruby.yml +0 -1210
  154. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +0 -39
  155. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +0 -35
  156. /data/{app/middleware/decidim/decidim_awesome → lib/decidim/decidim_awesome/middleware}/current_config.rb +0 -0
@@ -5,6 +5,8 @@ require "deface"
5
5
  require "decidim/core"
6
6
  require "decidim/decidim_awesome/awesome_helpers"
7
7
  require "decidim/decidim_awesome/menu"
8
+ require "decidim/decidim_awesome/middleware/current_config"
9
+ require "active_hashcash" if Decidim::DecidimAwesome.enabled?(:hashcash_signup, :hashcash_login)
8
10
 
9
11
  module Decidim
10
12
  module DecidimAwesome
@@ -17,12 +19,18 @@ module Decidim
17
19
  routes do
18
20
  get :required_authorizations, to: "required_authorizations#index"
19
21
  post :editor_images, to: "editor_images#create"
22
+ get "form_builder_i18n(/:lang)", to: "utils#form_builder_i18n", as: :form_builder_i18n
20
23
  end
21
24
 
22
25
  # Prepare a zone to create overrides
23
26
  # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
24
27
  # overrides
25
28
  config.to_prepare do
29
+ if DecidimAwesome.enabled?(:hashcash_signup, :hashcash_login)
30
+ # Add hashcash to signup and login
31
+ Decidim::Devise::SessionsController.include(Decidim::DecidimAwesome::NeedsHashcash)
32
+ Decidim::Devise::RegistrationsController.include(Decidim::DecidimAwesome::NeedsHashcash)
33
+ end
26
34
  # Include additional helpers globally
27
35
  ActiveSupport.on_load(:action_view) { include Decidim::DecidimAwesome::AwesomeHelpers }
28
36
  # Also for cells
@@ -47,11 +55,11 @@ module Decidim
47
55
  :validate_body_max_caps_percent,
48
56
  :validate_body_max_marks_together,
49
57
  :validate_body_start_with_caps)
50
- Decidim::Proposals::ProposalWizardCreateStepForm.include(Decidim::DecidimAwesome::Proposals::ProposalWizardCreateStepFormOverride)
58
+ Decidim::Proposals::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormCustomizations)
51
59
  end
52
60
 
53
61
  if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields)
54
- Decidim::Proposals::ProposalWizardCreateStepForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormOverride)
62
+ Decidim::Proposals::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormOverride)
55
63
  Decidim::Proposals::Admin::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormOverride)
56
64
  Decidim::Proposals::ProposalPresenter.include(Decidim::DecidimAwesome::Proposals::ProposalPresenterOverride)
57
65
  Decidim::Proposals::CreateProposal.include(Decidim::DecidimAwesome::Proposals::CreateProposalOverride)
@@ -67,7 +75,7 @@ module Decidim
67
75
  Decidim::System::RegisterOrganizationForm.include(Decidim::DecidimAwesome::System::OrganizationFormOverride)
68
76
  Decidim::System::UpdateOrganizationForm.include(Decidim::DecidimAwesome::System::OrganizationFormOverride)
69
77
  Decidim::System::UpdateOrganization.include(Decidim::DecidimAwesome::System::UpdateOrganizationOverride)
70
- Decidim::System::RegisterOrganization.include(Decidim::DecidimAwesome::System::RegisterOrganizationOverride)
78
+ Decidim::System::CreateOrganization.include(Decidim::DecidimAwesome::System::CreateOrganizationOverride)
71
79
  end
72
80
 
73
81
  if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields, :weighted_proposal_voting)
@@ -91,8 +99,8 @@ module Decidim
91
99
  # override user's admin property
92
100
  Decidim::User.include(Decidim::DecidimAwesome::UserOverride) if DecidimAwesome.enabled?(:scoped_admins)
93
101
 
94
- if DecidimAwesome.enabled?(:menu, :content_block_main_menu)
95
- Decidim::ContentBlocks::GlobalMenuCell.include(Decidim::DecidimAwesome::GlobalMenuCellOverride)
102
+ if DecidimAwesome.enabled?(:menu, :mobile_menu, :home_content_block_menu)
103
+ Decidim::ContentBlocks::GlobalMenuCell.include(Decidim::DecidimAwesome::GlobalMenuCellOverride) if DecidimAwesome.enabled?(:home_content_block_menu)
96
104
  Decidim::BreadcrumbHelper.include(Decidim::DecidimAwesome::BreadcrumbHelperOverride)
97
105
  Decidim::MenuPresenter.include(Decidim::DecidimAwesome::MenuPresenterOverride)
98
106
  Decidim::MenuItemPresenter.include(Decidim::DecidimAwesome::MenuItemPresenterOverride)
@@ -229,7 +237,7 @@ module Decidim
229
237
  component.settings(:global) do |settings|
230
238
  DecidimAwesome.hash_append!(
231
239
  settings.attributes,
232
- :can_accumulate_supports_beyond_threshold,
240
+ :can_accumulate_votes_beyond_threshold,
233
241
  :awesome_voting_manifest,
234
242
  Decidim::SettingsManifest::Attribute.new(
235
243
  type: :select,
@@ -290,6 +298,8 @@ module Decidim
290
298
  Decidim.icons.register(name: "spy", icon: "spy-fill", category: "system", description: "", engine: :decidim_awesome)
291
299
  Decidim.icons.register(name: "forbid-line", icon: "forbid-line", category: "system", description: "", engine: :decidim_awesome)
292
300
  Decidim.icons.register(name: "file-settings-line", icon: "file-settings-line", category: "system", description: "", engine: :decidim_awesome)
301
+ Decidim.icons.register(name: "hashtag", icon: "hashtag", category: "system", description: "", engine: :decidim_awesome)
302
+ Decidim.icons.register(name: "smartphone", icon: "smartphone-line", category: "system", description: "", engine: :decidim_awesome)
293
303
  end
294
304
  end
295
305
  end
@@ -4,162 +4,166 @@ module Decidim
4
4
  module DecidimAwesome
5
5
  class Menu
6
6
  class << self
7
- def register_awesome_admin_menu!
8
- Decidim.menu :awesome_admin_menu do |menu|
9
- menu.add_item :editors,
10
- I18n.t("menu.editors", scope: "decidim.decidim_awesome.admin"),
11
- decidim_admin_decidim_awesome.config_path(:editors),
12
- position: 1,
13
- icon_name: "editors-text",
14
- if: menus[:editors]
15
-
16
- menu.add_item :proposals,
17
- I18n.t("menu.proposals", scope: "decidim.decidim_awesome.admin"),
18
- decidim_admin_decidim_awesome.config_path(:proposals),
19
- position: 2,
20
- icon_name: "documents",
21
- if: menus[:proposals]
22
-
23
- menu.add_item :surveys,
24
- I18n.t("menu.surveys", scope: "decidim.decidim_awesome.admin"),
25
- decidim_admin_decidim_awesome.config_path(:surveys),
26
- position: 3,
27
- icon_name: "surveys",
28
- if: menus[:surveys]
29
-
30
- menu.add_item :styles,
31
- I18n.t("menu.styles", scope: "decidim.decidim_awesome.admin"),
32
- decidim_admin_decidim_awesome.config_path(:scoped_styles),
33
- position: 4,
34
- icon_name: "brush",
35
- if: menus[:styles],
36
- submenu: { target_menu: :custom_styles_submenu }
37
-
38
- menu.add_item :custom_fields,
39
- I18n.t("menu.proposal_custom_fields", scope: "decidim.decidim_awesome.admin"),
40
- decidim_admin_decidim_awesome.config_path(menus[:proposal_custom_fields] ? :proposal_custom_fields : :proposal_private_custom_fields),
41
- position: 5,
42
- icon_name: "layers",
43
- active: is_active_link?(decidim_admin_decidim_awesome.config_path(:proposal_custom_fields)) ||
44
- is_active_link?(decidim_admin_decidim_awesome.config_path(:proposal_private_custom_fields)),
45
- if: menus[:custom_fields],
46
- submenu: { target_menu: :custom_fields_submenu }
47
-
48
- menu.add_item :admins,
49
- I18n.t("menu.admins", scope: "decidim.decidim_awesome.admin"),
50
- decidim_admin_decidim_awesome.config_path(:admins),
51
- position: 6,
52
- icon_name: "group-line",
53
- if: menus[:admins]
54
-
55
- menu.add_item :menu_hacks,
56
- I18n.t("menu.menu_hacks", scope: "decidim.decidim_awesome.admin"),
57
- decidim_admin_decidim_awesome.menu_hacks_path(menus[:menu_hacks_menu] ? :menu : :home_content_block_menu),
58
- position: 7,
59
- icon_name: "menu-line",
60
- if: menus[:menu_hacks],
61
- active: is_active_link?(decidim_admin_decidim_awesome.menu_hacks_path(:menu)) ||
62
- is_active_link?(decidim_admin_decidim_awesome.menu_hacks_path(:home_content_block_menu)),
63
- submenu: { target_menu: :menu_hacks_submenu }
64
-
65
- menu.add_item :custom_redirects,
66
- I18n.t("menu.custom_redirects", scope: "decidim.decidim_awesome.admin"),
67
- decidim_admin_decidim_awesome.custom_redirects_path,
68
- position: 8,
69
- icon_name: "external-link-line",
70
- if: menus[:custom_redirects]
71
-
72
- menu.add_item :livechat,
73
- I18n.t("menu.livechat", scope: "decidim.decidim_awesome.admin"),
74
- decidim_admin_decidim_awesome.config_path(:livechat),
75
- position: 9,
76
- icon_name: "chat-1-line",
77
- if: menus[:livechat]
78
-
79
- menu.add_item :verifications,
80
- I18n.t("menu.verifications", scope: "decidim.decidim_awesome.admin"),
81
- decidim_admin_decidim_awesome.config_path(:verifications),
82
- position: 10,
83
- icon_name: "fingerprint-line",
84
- if: menus[:verifications]
85
-
86
- menu.add_item :maintenance,
87
- I18n.t("maintenance", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
88
- decidim_admin_decidim_awesome.maintenance_path(:private_data),
89
- position: 11,
90
- icon_name: "tools-line",
91
- active: is_active_link?(decidim_admin_decidim_awesome.maintenance_path(:private_data)) ||
92
- is_active_link?(decidim_admin_decidim_awesome.checks_maintenance_index_path),
93
- submenu: { target_menu: :maintenance_submenu }
7
+ def register_simple_entry(menu_registry, name, position, icon, options = {})
8
+ return if menus[name].blank?
9
+
10
+ Decidim.menu menu_registry do |menu|
11
+ i18n_key = options[:i18n_key].presence || "menu.#{name}"
12
+ extra = {}.tap do |hash|
13
+ hash[:submenu] = options[:submenu] if options[:submenu].present?
14
+ if options[:active].present?
15
+ hash[:active] = false
16
+ options[:active].each do |active_path|
17
+ hash[:active] ||= is_active_link?(decidim_admin_decidim_awesome.send(active_path[0], *active_path[1..]))
18
+ end
19
+ end
20
+ end
21
+ path = main_path_for(name)
22
+ menu.add_item name,
23
+ I18n.t(i18n_key, scope: "decidim.decidim_awesome.admin"),
24
+ decidim_admin_decidim_awesome.send(path[0], path[1]),
25
+ position:,
26
+ icon_name: icon,
27
+ **extra
94
28
  end
95
29
  end
96
30
 
31
+ def main_path_for(config_var)
32
+ case config_var.to_sym
33
+ when :styles
34
+ [:config_path, [menus[:styles]]]
35
+ when :custom_fields
36
+ [:config_path, [menus[:custom_fields]]]
37
+ when :menu_hacks
38
+ [:menu_hacks_path, [menus[:menu_hacks]]]
39
+ when :custom_redirects
40
+ [:custom_redirects_path, []]
41
+ when :maintenance
42
+ [:checks_path, []]
43
+ else
44
+ [:config_path, [config_var]]
45
+ end
46
+ end
47
+
48
+ def register_awesome_admin_menu!
49
+ register_simple_entry(:awesome_admin_menu, :editors, 1, "editors-text")
50
+ register_simple_entry(:awesome_admin_menu, :proposals, 2, "documents")
51
+ register_simple_entry(:awesome_admin_menu, :surveys, 3, "surveys")
52
+ register_simple_entry(:awesome_admin_menu, :styles, 4, "brush",
53
+ submenu: { target_menu: :custom_styles_submenu },
54
+ active: [[:config_path, :scoped_styles], [:config_path, :scoped_admin_styles]])
55
+
56
+ register_simple_entry(:awesome_admin_menu, :custom_fields, 5, "layers",
57
+ i18n_key: "menu.proposal_custom_fields",
58
+ submenu: { target_menu: :custom_fields_submenu },
59
+ active: [[:config_path, :proposal_custom_fields], [:config_path, :proposal_private_custom_fields]])
60
+
61
+ register_simple_entry(:awesome_admin_menu, :admins, 6, "group-line")
62
+
63
+ register_simple_entry(:awesome_admin_menu, :menu_hacks, 7, "menu-line",
64
+ submenu: { target_menu: :menu_hacks_submenu },
65
+ active: [[:menu_hacks_path, :menu], [:menu_hacks_path, :mobile_menu], [:menu_hacks_path, :home_content_block_menu]])
66
+
67
+ register_simple_entry(:awesome_admin_menu, :custom_redirects, 8, "external-link-line")
68
+ register_simple_entry(:awesome_admin_menu, :livechat, 9, "chat-1-line")
69
+ register_simple_entry(:awesome_admin_menu, :verifications, 10, "fingerprint-line")
70
+
71
+ register_simple_entry(:awesome_admin_menu, :maintenance, 11, "tools-line",
72
+ i18n_key: "menu.maintenance.maintenance",
73
+ submenu: { target_menu: :maintenance_submenu },
74
+ active: [[:private_data_path], [:hashcashes_path], [:checks_path]])
75
+ end
76
+
97
77
  def register_custom_fields_submenu!
98
78
  Decidim.menu :custom_fields_submenu do |menu|
99
- menu.add_item :proposal_custom_fields,
100
- I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.proposal_custom_fields"),
101
- decidim_admin_decidim_awesome.config_path(:proposal_custom_fields),
102
- position: 5.1,
103
- icon_name: "draft-line",
104
- if: menus[:proposal_custom_fields]
105
-
106
- menu.add_item :proposal_private_custom_fields,
107
- I18n.t("proposal_private_custom_fields", scope: "decidim.decidim_awesome.admin.proposal_custom_fields"),
108
- decidim_admin_decidim_awesome.config_path(:proposal_private_custom_fields),
109
- position: 5.2,
110
- icon_name: "spy",
111
- if: menus[:proposal_private_custom_fields]
79
+ if menus[:proposal_custom_fields].present?
80
+ menu.add_item :proposal_custom_fields,
81
+ I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.proposal_custom_fields"),
82
+ decidim_admin_decidim_awesome.config_path(:proposal_custom_fields),
83
+ position: 5.1,
84
+ icon_name: "draft-line"
85
+ end
86
+
87
+ if menus[:proposal_private_custom_fields].present?
88
+ menu.add_item :proposal_private_custom_fields,
89
+ I18n.t("proposal_private_custom_fields", scope: "decidim.decidim_awesome.admin.proposal_custom_fields"),
90
+ decidim_admin_decidim_awesome.config_path(:proposal_private_custom_fields),
91
+ position: 5.2,
92
+ icon_name: "spy"
93
+ end
112
94
  end
113
95
  end
114
96
 
115
97
  def register_custom_styles_submenu!
116
98
  Decidim.menu :custom_styles_submenu do |menu|
117
- menu.add_item :scoped_styles,
118
- I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.scoped_styles"),
119
- decidim_admin_decidim_awesome.config_path(:scoped_styles),
120
- position: 4.1,
121
- icon_name: "computer-line",
122
- if: config_enabled?(:scoped_styles)
123
-
124
- menu.add_item :scoped_admin_styles,
125
- I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.scoped_admin_styles"),
126
- decidim_admin_decidim_awesome.config_path(:scoped_admin_styles),
127
- position: 4.2,
128
- icon_name: "file-settings-line",
129
- if: config_enabled?(:scoped_admin_styles)
99
+ if menus[:scoped_styles].present?
100
+ menu.add_item :scoped_styles,
101
+ I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.scoped_styles"),
102
+ decidim_admin_decidim_awesome.config_path(:scoped_styles),
103
+ position: 4.1,
104
+ icon_name: "computer-line"
105
+ end
106
+
107
+ if menus[:scoped_admin_styles].present?
108
+ menu.add_item :scoped_admin_styles,
109
+ I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.scoped_admin_styles"),
110
+ decidim_admin_decidim_awesome.config_path(:scoped_admin_styles),
111
+ position: 4.2,
112
+ icon_name: "file-settings-line"
113
+ end
130
114
  end
131
115
  end
132
116
 
133
117
  def register_menu_hacks_submenu!
134
118
  Decidim.menu :menu_hacks_submenu do |menu|
135
- menu.add_item :main_menu,
136
- I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.menu_hacks.index"),
137
- decidim_admin_decidim_awesome.menu_hacks_path(:menu),
138
- position: 7.1,
139
- icon_name: "global-line",
140
- if: menus[:menu_hacks_menu]
141
-
142
- menu.add_item :content_block_main_menu,
143
- I18n.t("home_content_block_menu.title", scope: "decidim.decidim_awesome.admin.menu_hacks.index"),
144
- decidim_admin_decidim_awesome.menu_hacks_path(:home_content_block_menu),
145
- position: 7.2,
146
- icon_name: "layout-masonry-line",
147
- if: menus[:menu_hacks_home_content_block_menu]
119
+ if menus[:menu_hacks_menu].present?
120
+ menu.add_item :main_menu,
121
+ I18n.t("menu.title", scope: "decidim.decidim_awesome.admin.menu_hacks.index"),
122
+ decidim_admin_decidim_awesome.menu_hacks_path(:menu),
123
+ position: 7.1,
124
+ icon_name: "global-line"
125
+ end
126
+
127
+ if menus[:menu_hacks_mobile_menu].present?
128
+ menu.add_item :mobile_menu,
129
+ I18n.t("mobile_menu.title", scope: "decidim.decidim_awesome.admin.menu_hacks.index"),
130
+ decidim_admin_decidim_awesome.menu_hacks_path(:mobile_menu),
131
+ position: 7.2,
132
+ icon_name: "smartphone"
133
+ end
134
+
135
+ if menus[:menu_hacks_home_content_block_menu].present?
136
+ menu.add_item :content_block_main_menu,
137
+ I18n.t("home_content_block_menu.title", scope: "decidim.decidim_awesome.admin.menu_hacks.index"),
138
+ decidim_admin_decidim_awesome.menu_hacks_path(:home_content_block_menu),
139
+ position: 7.3,
140
+ icon_name: "layout-masonry-line"
141
+ end
148
142
  end
149
143
  end
150
144
 
151
145
  def register_maintenance_admin_menu!
152
146
  Decidim.menu :maintenance_submenu do |menu|
153
- menu.add_item :private_data,
154
- I18n.t("private_data", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
155
- decidim_admin_decidim_awesome.maintenance_path(:private_data),
156
- position: 10,
157
- icon_name: "spy-line"
147
+ if config_enabled?(:proposal_private_custom_fields)
148
+ menu.add_item :private_data,
149
+ I18n.t("private_data", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
150
+ decidim_admin_decidim_awesome.private_data_path,
151
+ position: 10.1,
152
+ icon_name: "spy-line"
153
+ end
154
+
155
+ if config_enabled?(:hashcash_signup, :hashcash_login)
156
+ menu.add_item :hashcash,
157
+ I18n.t("hashcash", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
158
+ decidim_admin_decidim_awesome.hashcashes_path,
159
+ position: 10.2,
160
+ icon_name: "hashtag"
161
+ end
158
162
 
159
163
  menu.add_item :checks,
160
164
  I18n.t("checks", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
161
- decidim_admin_decidim_awesome.checks_maintenance_index_path,
162
- position: 10,
165
+ decidim_admin_decidim_awesome.checks_path,
166
+ position: 10.3,
163
167
  icon_name: "pulse"
164
168
  end
165
169
  end
@@ -174,23 +178,32 @@ module Decidim
174
178
  :validate_body_min_length, :validate_body_max_caps_percent,
175
179
  :validate_body_max_marks_together, :validate_body_start_with_caps
176
180
  ),
177
- surveys: config_enabled?(:auto_save_forms, :user_timezone),
178
- styles: config_enabled?(:scoped_styles, :scoped_admin_styles),
181
+ surveys: config_enabled?(:auto_save_forms, :user_timezone, :hashcash_signup, :hashcash_login),
182
+ styles: first_enabled(:scoped_styles, :scoped_admin_styles),
179
183
  scoped_styles: config_enabled?(:scoped_styles),
180
184
  scoped_admin_styles: config_enabled?(:scoped_admin_styles),
181
- custom_fields: config_enabled?(:proposal_custom_fields, :proposal_private_custom_fields),
185
+ custom_fields: first_enabled(:proposal_custom_fields, :proposal_private_custom_fields),
182
186
  proposal_custom_fields: config_enabled?(:proposal_custom_fields),
183
187
  proposal_private_custom_fields: config_enabled?(:proposal_private_custom_fields),
184
188
  admins: config_enabled?(:scoped_admins),
185
- menu_hacks: config_enabled?(:menu, :home_content_block_menu),
189
+ menu_hacks: first_enabled(:menu, :mobile_menu, :home_content_block_menu),
186
190
  menu_hacks_menu: config_enabled?(:menu),
191
+ menu_hacks_mobile_menu: config_enabled?(:mobile_menu),
187
192
  menu_hacks_home_content_block_menu: config_enabled?(:home_content_block_menu),
188
193
  custom_redirects: config_enabled?(:custom_redirects),
189
194
  livechat: config_enabled?(:intergram_for_admins, :intergram_for_public),
190
- verifications: config_enabled?(:force_authorization_after_login)
195
+ verifications: config_enabled?(:force_authorization_after_login),
196
+ maintenance: true
191
197
  }
192
198
  end
193
199
 
200
+ def first_enabled(*vars)
201
+ vars.each do |var|
202
+ return var if config_enabled?(var)
203
+ end
204
+ nil
205
+ end
206
+
194
207
  # ensure boolean value
195
208
  def config_enabled?(*vars)
196
209
  DecidimAwesome.enabled?(*vars)
@@ -17,6 +17,7 @@ Decidim::DecidimAwesome.configure do |config|
17
17
  :proposal_custom_fields,
18
18
  :proposal_private_custom_fields,
19
19
  :menu,
20
+ :mobile_menu,
20
21
  :home_content_block_menu,
21
22
  :scoped_admins,
22
23
  :custom_redirects,
@@ -31,7 +32,9 @@ Decidim::DecidimAwesome.configure do |config|
31
32
  :weighted_proposal_voting,
32
33
  :additional_proposal_sortings,
33
34
  :allow_limiting_amendments,
34
- :proposal_private_custom_fields
35
+ :proposal_private_custom_fields,
36
+ :hashcash_signup,
37
+ :hashcash_login
35
38
  ].each do |conf|
36
39
  config.send("#{conf}=", :disabled)
37
40
  end
@@ -5,16 +5,16 @@ shared_examples "edits box label inline" do |test_case, key|
5
5
 
6
6
  it "updates the label when no changes" do
7
7
  link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
8
- expect(page).not_to have_field(class: "awesome-auto-edit")
8
+ expect(page).to have_no_field(class: "awesome-auto-edit")
9
9
  link.click
10
10
  expect(page).to have_field(class: "awesome-auto-edit")
11
11
  find("body").click
12
- expect(page).not_to have_field(class: "awesome-auto-edit")
12
+ expect(page).to have_no_field(class: "awesome-auto-edit")
13
13
  link.click
14
14
  input = find("[data-key=#{key}] input.awesome-auto-edit")
15
15
  input.fill_in with: "A new làbel\n"
16
16
  sleep 1
17
- expect(page).not_to have_field(class: "awesome-auto-edit")
17
+ expect(page).to have_no_field(class: "awesome-auto-edit")
18
18
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
19
19
 
20
20
  click_link_or_button "Update configuration"
@@ -24,14 +24,14 @@ shared_examples "edits box label inline" do |test_case, key|
24
24
  when :fields
25
25
  expect(page).to have_content("Occupation")
26
26
  expect(page).to have_content("Street Sweeper")
27
- expect(page).not_to have_content("Short Bio")
27
+ expect(page).to have_no_content("Short Bio")
28
28
  when :admins
29
- expect(page).not_to have_content(user.name.to_s)
29
+ expect(page).to have_no_content(user.name.to_s)
30
30
  expect(page).to have_content(user2.name.to_s)
31
31
  expect(page).to have_content(user3.name.to_s)
32
32
  end
33
33
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
34
- expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
34
+ expect(page).to have_no_css("span.awesome-auto-edit[data-key=#{key}]")
35
35
  end
36
36
 
37
37
  it "updates the label with previous changes" do
@@ -48,16 +48,16 @@ shared_examples "edits box label inline" do |test_case, key|
48
48
  end
49
49
 
50
50
  link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
51
- expect(page).not_to have_field(class: "awesome-auto-edit")
51
+ expect(page).to have_no_field(class: "awesome-auto-edit")
52
52
  link.click
53
53
  expect(page).to have_field(class: "awesome-auto-edit")
54
54
  find("body").click
55
- expect(page).not_to have_field(class: "awesome-auto-edit")
55
+ expect(page).to have_no_field(class: "awesome-auto-edit")
56
56
  link.click
57
57
  input = find("[data-key=#{key}] input.awesome-auto-edit")
58
58
  input.fill_in with: "A new làbel\n"
59
59
  sleep 1
60
- expect(page).not_to have_field(class: "awesome-auto-edit")
60
+ expect(page).to have_no_field(class: "awesome-auto-edit")
61
61
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
62
62
 
63
63
  click_link_or_button "Update configuration"
@@ -73,21 +73,21 @@ shared_examples "edits box label inline" do |test_case, key|
73
73
  expect(page).to have_content(user3.name.to_s)
74
74
  end
75
75
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
76
- expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
76
+ expect(page).to have_no_css("span.awesome-auto-edit[data-key=#{key}]")
77
77
  end
78
78
 
79
79
  it "updates the label with post changes" do
80
80
  link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
81
- expect(page).not_to have_field(class: "awesome-auto-edit")
81
+ expect(page).to have_no_field(class: "awesome-auto-edit")
82
82
  link.click
83
83
  expect(page).to have_field(class: "awesome-auto-edit")
84
84
  find("body").click
85
- expect(page).not_to have_field(class: "awesome-auto-edit")
85
+ expect(page).to have_no_field(class: "awesome-auto-edit")
86
86
  link.click
87
87
  input = find("[data-key=#{key}] input.awesome-auto-edit")
88
88
  input.fill_in with: "A new làbel\n"
89
89
  sleep 1
90
- expect(page).not_to have_field(class: "awesome-auto-edit")
90
+ expect(page).to have_no_field(class: "awesome-auto-edit")
91
91
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
92
92
 
93
93
  case test_case
@@ -111,6 +111,6 @@ shared_examples "edits box label inline" do |test_case, key|
111
111
  expect(page).to have_content(user3.name.to_s)
112
112
  end
113
113
  expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
114
- expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
114
+ expect(page).to have_no_css("span.awesome-auto-edit[data-key=#{key}]")
115
115
  end
116
116
  end
@@ -5,7 +5,7 @@ shared_examples "javascript config vars" do
5
5
  expect(page.body).to have_content("window.DecidimAwesome")
6
6
  expect(page.body).to have_content("window.DecidimAwesome.version")
7
7
  expect(page.body).to have_content("window.DecidimAwesome.editorUploaderPath")
8
- expect(page.body).to have_content("window.DecidimAwesome.texts")
8
+ expect(page.body).to have_content("window.DecidimAwesome.i18n")
9
9
  end
10
10
  end
11
11
 
@@ -22,14 +22,13 @@ shared_examples "do not have menu link" do |item|
22
22
  let(:prefix) { "config/" }
23
23
  it "do not show the feature link" do
24
24
  within ".sidebar-menu" do
25
- expect(page).not_to have_link(href: "/admin/decidim_awesome/#{prefix}#{item}")
25
+ expect(page).to have_no_link(href: "/admin/decidim_awesome/#{prefix}#{item}")
26
26
  end
27
27
  end
28
28
  end
29
29
 
30
30
  shared_examples "forbids disabled feature without redirect" do
31
31
  render_views
32
- let(:feature) { :menu }
33
32
  let(:features) { [feature] }
34
33
  before do
35
34
  features.each do |feat|
@@ -46,7 +45,6 @@ end
46
45
 
47
46
  shared_examples "forbids disabled feature with redirect" do
48
47
  render_views
49
- let(:feature) { :menu }
50
48
  let(:features) { [feature] }
51
49
  before do
52
50
  features.each do |feat|
@@ -26,7 +26,7 @@ shared_examples "updates a box" do
26
26
  expect(page).to have_content("Full Name")
27
27
  expect(page).to have_content("Occupation")
28
28
  expect(page).to have_content("Street Sweeper")
29
- expect(page).not_to have_content("Short Bio")
29
+ expect(page).to have_no_content("Short Bio")
30
30
 
31
31
  page.execute_script("$('.proposal_custom_fields_container[data-key=\"foo\"] .proposal_custom_fields_editor')[0].FormBuilder.actions.setData(#{data})")
32
32
  click_on "Update configuration"
@@ -34,8 +34,8 @@ shared_examples "updates a box" do
34
34
  sleep 2
35
35
  expect(page).to have_admin_callout("updated successfully")
36
36
  expect(page).to have_content("Full Name")
37
- expect(page).not_to have_content("Occupation")
38
- expect(page).not_to have_content("Street Sweeper")
37
+ expect(page).to have_no_content("Occupation")
38
+ expect(page).to have_no_content("Street Sweeper")
39
39
  expect(page).to have_content("Short Bio")
40
40
  end
41
41
  end
@@ -53,7 +53,7 @@ shared_examples "removes a box" do |name|
53
53
  expect(page).to have_content("Full Name")
54
54
  expect(page).to have_content("Occupation")
55
55
  expect(page).to have_content("Street Sweeper")
56
- expect(page).not_to have_content("Short Bio")
56
+ expect(page).to have_no_content("Short Bio")
57
57
 
58
58
  within ".proposal_custom_fields_container[data-key=\"foo\"]" do
59
59
  accept_confirm { click_on "Remove this \"#{name}\" box" }
@@ -61,10 +61,10 @@ shared_examples "removes a box" do |name|
61
61
 
62
62
  sleep 2
63
63
  expect(page).to have_admin_callout("removed successfully")
64
- expect(page).not_to have_content("Full Name")
64
+ expect(page).to have_no_content("Full Name")
65
65
  expect(page).to have_content("Occupation")
66
66
  expect(page).to have_content("Street Sweeper")
67
- expect(page).not_to have_content("Short Bio")
67
+ expect(page).to have_no_content("Short Bio")
68
68
 
69
69
  expect(Decidim::DecidimAwesome::AwesomeConfig.find_by(organization:, var: "#{var_name}_foo")).not_to be_present
70
70
  expect(Decidim::DecidimAwesome::AwesomeConfig.find_by(organization:, var: "#{var_name}_bar")).to be_present
@@ -121,13 +121,13 @@ shared_examples "removes a constraint" do
121
121
  end
122
122
 
123
123
  within ".proposal_custom_fields_container[data-key=\"bar\"] .constraints-editor" do
124
- expect(page).not_to have_content("Proposals")
124
+ expect(page).to have_no_content("Proposals")
125
125
  end
126
126
 
127
127
  visit decidim_admin_decidim_awesome.config_path("#{var_name}s")
128
128
 
129
129
  within ".proposal_custom_fields_container[data-key=\"bar\"] .constraints-editor" do
130
- expect(page).not_to have_content("Proposals")
130
+ expect(page).to have_no_content("Proposals")
131
131
  end
132
132
 
133
133
  expect(Decidim::DecidimAwesome::AwesomeConfig.find_by(organization:, var: "#{var_name}_bar")).to be_present