decidim-decidim_awesome 0.12.0 → 0.12.4

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 (184) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/README.md +25 -15
  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 +3 -3
  8. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +1 -1
  9. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +39 -5
  10. data/app/commands/decidim/decidim_awesome/admin/create_authorization_group.rb +42 -0
  11. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +10 -14
  12. data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +9 -8
  13. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +3 -8
  14. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +4 -8
  15. data/app/commands/decidim/decidim_awesome/admin/create_scoped_style.rb +3 -7
  16. data/app/commands/decidim/decidim_awesome/admin/destroy_authorization_group.rb +37 -0
  17. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +10 -9
  18. data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +8 -7
  19. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +7 -13
  20. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +7 -10
  21. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +6 -11
  22. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +12 -1
  23. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +11 -11
  24. data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +10 -8
  25. data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
  26. data/app/controllers/concerns/decidim/decidim_awesome/enforce_access_authorizations.rb +49 -0
  27. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +43 -0
  28. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
  29. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
  30. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -4
  31. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
  32. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +2 -0
  33. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
  34. data/app/controllers/decidim/decidim_awesome/admin/force_authorizations_controller.rb +44 -0
  35. data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
  36. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
  37. data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
  38. data/app/controllers/decidim/decidim_awesome/required_authorizations_controller.rb +51 -13
  39. data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
  40. data/app/forms/concerns/decidim/decidim_awesome/proposals/admin/proposal_form_customizations.rb +59 -0
  41. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations.rb +28 -28
  42. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations_base.rb +36 -0
  43. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
  44. data/app/forms/decidim/decidim_awesome/admin/authorization_group_form.rb +66 -0
  45. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +23 -24
  46. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +2 -0
  47. data/app/helpers/concerns/decidim/decidim_awesome/amendments_helper_override.rb +2 -1
  48. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +21 -18
  49. data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
  50. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
  51. data/app/overrides/decidim/assemblies/admin/assemblies/_form/add_visibility_callout.html.erb.deface +3 -0
  52. data/app/overrides/decidim/conferences/admin/conferences/_form/add_visibility_callout.html.erb.deface +3 -0
  53. data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
  54. data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
  55. data/app/overrides/decidim/participatory_processes/admin/participatory_process_groups/_form/add_visibility_callout.html.erb.deface +3 -0
  56. data/app/overrides/decidim/participatory_processes/admin/participatory_processes/_form/add_visibility_callout.html.erb.deface +3 -0
  57. data/app/overrides/decidim/shared/_login_modal/add_hashcash.html.erb.deface +3 -0
  58. data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
  59. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
  60. data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
  61. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +25 -6
  62. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
  63. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
  64. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +0 -1
  65. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
  66. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
  67. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
  68. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
  69. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
  70. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
  71. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
  72. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
  73. data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
  74. data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
  75. data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
  76. data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
  77. data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
  78. data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
  79. data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
  80. data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
  81. data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
  82. data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
  83. data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
  84. data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
  85. data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
  86. data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
  87. data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
  88. data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
  89. data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
  90. data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
  91. data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
  92. data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
  93. data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
  94. data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
  95. data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
  96. data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
  97. data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
  98. data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
  99. data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
  100. data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
  101. data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
  102. data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
  103. data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
  104. data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
  105. data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
  106. data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
  107. data/app/packs/src/vendor/hashcash.js +83 -0
  108. data/app/packs/src/vendor/sha1.js +143 -0
  109. data/app/packs/src/vendor/stamp.js +50 -0
  110. data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +6 -1
  111. data/app/packs/stylesheets/decidim/decidim_awesome/admin/constraints.scss +5 -0
  112. data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +1 -2
  113. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
  114. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
  115. data/app/queries/decidim/decidim_awesome/space_constraint_finder.rb +43 -0
  116. data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb +3 -2
  117. data/app/services/decidim/decidim_awesome/access_authorization_service.rb +79 -0
  118. data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_custom_fields.rb +2 -1
  119. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +4 -4
  120. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
  121. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
  122. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
  123. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
  124. data/app/views/decidim/decidim_awesome/admin/config/_authorization_options_form.html.erb +19 -0
  125. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
  126. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  127. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
  128. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
  129. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
  130. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
  131. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
  132. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +71 -9
  133. data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +5 -4
  134. data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
  135. data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
  136. data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
  137. data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
  138. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
  139. data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
  140. data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
  141. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
  142. data/app/views/decidim/decidim_awesome/admin/shared/_visibility_notice.html.erb +8 -0
  143. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
  144. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +4 -0
  145. data/app/views/decidim/decidim_awesome/required_authorizations/index.html.erb +14 -4
  146. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
  147. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
  148. data/config/assets.rb +1 -0
  149. data/config/i18n-tasks.yml +2 -0
  150. data/config/locales/ca.yml +100 -37
  151. data/config/locales/cs.yml +100 -36
  152. data/config/locales/de.yml +98 -35
  153. data/config/locales/en.yml +117 -44
  154. data/config/locales/es.yml +100 -36
  155. data/config/locales/eu.yml +34 -39
  156. data/config/locales/fr.yml +77 -31
  157. data/config/locales/ja.yml +99 -36
  158. data/config/locales/sv.yml +49 -0
  159. data/lib/decidim/decidim_awesome/admin_engine.rb +9 -5
  160. data/lib/decidim/decidim_awesome/{authorizator.rb → authorizer.rb} +1 -1
  161. data/lib/decidim/decidim_awesome/awesome.rb +34 -24
  162. data/lib/decidim/decidim_awesome/awesome_helpers.rb +14 -5
  163. data/lib/decidim/decidim_awesome/checksums.yml +26 -40
  164. data/lib/decidim/decidim_awesome/config.rb +18 -7
  165. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +1 -1
  166. data/lib/decidim/decidim_awesome/engine.rb +14 -3
  167. data/lib/decidim/decidim_awesome/menu.rb +151 -138
  168. data/lib/decidim/decidim_awesome/middleware/current_config.rb +5 -10
  169. data/lib/decidim/decidim_awesome/test/initializer.rb +5 -2
  170. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +1 -3
  171. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +2 -1
  172. data/lib/decidim/decidim_awesome/test/shared_examples/proposal_form_examples.rb +191 -0
  173. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +15 -4
  174. data/lib/decidim/decidim_awesome/version.rb +1 -1
  175. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -1
  176. data/package.json +7 -8
  177. metadata +86 -13
  178. data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +0 -60
  179. data/app/packs/src/decidim/decidim_awesome/admin/verification_selects.js +0 -21
  180. data/config/rubocop/disabled.yml +0 -11
  181. data/config/rubocop/faker.yml +0 -480
  182. data/config/rubocop/rails.yml +0 -88
  183. data/config/rubocop/rspec.yml +0 -65
  184. data/config/rubocop/ruby.yml +0 -1210
@@ -14,8 +14,9 @@ document.addEventListener("DOMContentLoaded", () => {
14
14
 
15
15
  const key = target.dataset.key;
16
16
  const attribute = target.dataset.var;
17
- const inputField = document.querySelector(`[name="config[${attribute}][${key}]"]`);
18
- const multipleField = document.querySelector(`[name="config[${attribute}][${key}][]"]`);
17
+ const inputFields = document.querySelectorAll(`[name="config[${attribute}][${key}]"]`);
18
+ const multipleFields = document.querySelectorAll(`[name="config[${attribute}][${key}][]"]`);
19
+ const subFields = document.querySelectorAll(`[name^="config[${attribute}[${key}]]"]`);
19
20
  const container = document.querySelector(`.js-box-container[data-key="${key}"]`);
20
21
  const deleteBox = container.querySelector(".awesome-auto-delete");
21
22
 
@@ -32,11 +33,23 @@ document.addEventListener("DOMContentLoaded", () => {
32
33
  const rebuildHtml = (result) => {
33
34
  rebuildLabel(result.key, result.scope);
34
35
  constraints.outerHTML = result.html;
35
- if (inputField) {
36
- inputField.setAttribute("name", `config[${attribute}][${result.key}]`);
36
+ if (inputFields.length > 0) {
37
+ inputFields.forEach((inputField) => {
38
+ inputField.setAttribute("name", `config[${attribute}][${result.key}]`);
39
+ });
37
40
  }
38
- if (multipleField) {
39
- multipleField.setAttribute("name", `config[${attribute}][${result.key}][]`);
41
+ if (multipleFields.length > 0) {
42
+ multipleFields.forEach((multipleField) => {
43
+ multipleField.setAttribute("name", `config[${attribute}][${result.key}][]`);
44
+ });
45
+ }
46
+ if (subFields.length > 0) {
47
+ subFields.forEach((subField) => {
48
+ subField.setAttribute("name", subField.getAttribute("name").replace(
49
+ `config[${attribute}[${key}]]`,
50
+ `config[${attribute}[${result.key}]]`
51
+ ));
52
+ });
40
53
  }
41
54
  container.dataset.key = result.key;
42
55
  container.setAttribute("data-key", result.key);
@@ -56,6 +69,12 @@ document.addEventListener("DOMContentLoaded", () => {
56
69
  if (container) {
57
70
  // reloads dialogs (modals)
58
71
  document.dispatchEvent(new CustomEvent("ajax:loaded", { detail: container }));
72
+ // If editor are created, they will be duplicated by the ajax:loaded event, so we remove them
73
+ document.querySelectorAll(".editor-toolbar").forEach((toolbar) => {
74
+ if (toolbar.nextElementSibling && toolbar.nextElementSibling.classList.contains("editor-toolbar")) {
75
+ toolbar.nextElementSibling.remove();
76
+ }
77
+ });
59
78
  }
60
79
  // Rebuild the manual handling of remote modals
61
80
  document.dispatchEvent(new CustomEvent("ajax:loaded:modals", { detail: [editModal, newModal] }));
@@ -1,5 +1,6 @@
1
1
  import "formBuilder/dist/form-builder.min.js";
2
2
  import "src/decidim/decidim_awesome/forms/rich_text_plugin"
3
+
3
4
  // formBuilder uses jquery-ui-sortable which is a very dirty npm package with no neat source code available, and causes problems with the webpacker configuration of Decidim.
4
5
  // For the moment, we'll remove the sortable functionality with a dummy jQuery plugin until we find another sortable plugin (or keep it disabled for good)
5
6
  jQuery.fn.sortable = () => {}
@@ -10,6 +11,7 @@ $(() => {
10
11
  $(".awesome-edit-config .proposal_custom_fields_editor").each((_idx, el) => {
11
12
  const key = $(el).closest(".proposal_custom_fields_container").data("key");
12
13
  const configVar = $(el).closest(".proposal_custom_fields_container").data("var");
14
+
13
15
  // DOCS: https://formbuilder.online/docs
14
16
  window.CustomFieldsBuilders.push({
15
17
  el: el,
@@ -17,8 +19,8 @@ $(() => {
17
19
  var: configVar,
18
20
  config: {
19
21
  i18n: {
20
- locale: "en-US",
21
- location: "https://cdn.jsdelivr.net/npm/formbuilder-languages@1.1.0/"
22
+ locale: window.DecidimAwesome.currentLocale,
23
+ location: window.DecidimAwesome.formBuilderLangsLocation
22
24
  },
23
25
  formData: $(`input[name="config[${configVar}][${key}]"]`).val(),
24
26
  disableFields: ["button", "file"],
@@ -17,10 +17,13 @@ document.addEventListener("DOMContentLoaded", () => {
17
17
  });
18
18
 
19
19
 
20
- document.body.addEventListener("ajax:complete", (responseText) => {
21
- const response = JSON.parse(responseText.detail[0].response)
20
+ document.body.addEventListener("ajax:error", (responseText) => {
21
+ container.innerHTML = `<div>${responseText.detail[0]}</div>`;
22
+ });
23
+ document.body.addEventListener("ajax:success", (responseText) => {
24
+ // console.log("ajax:success", responseText);
25
+ const response = responseText.detail[0];
22
26
  const button = document.querySelector(`[data-verification-handler="${response.handler}"][data-verification-user-id="${response.userId}"]`);
23
- // console.log("ajax:complete", responseText, "response", response, "button", button);
24
27
  container.innerHTML = response.message;
25
28
 
26
29
  if (response.granted) {
@@ -9,6 +9,5 @@ import "src/decidim/decidim_awesome/admin/form_exit_warn"
9
9
 
10
10
  import "src/decidim/decidim_awesome/proposals/custom_fields"
11
11
  import "src/decidim/decidim_awesome/admin/custom_fields_builder"
12
- import "src/decidim/decidim_awesome/admin/verification_selects"
13
12
 
14
13
  window.DecidimAwesome = window.DecidimAwesome || {};
@@ -58,7 +58,7 @@ export default class ProposalsFetcher extends Fetcher {
58
58
 
59
59
  decorateNode(node) {
60
60
  super.decorateNode(node);
61
- node.authorName = node.author && node.author.name || window.DecidimAwesome.texts.officialAuthor;
61
+ node.authorName = node.author && node.author.name || window.DecidimAwesome.i18n.officialAuthor;
62
62
  node.humanState = window.AwesomeMapProposalTexts[node.state];
63
63
  switch (node.state) {
64
64
  case "accepted":
@@ -16,7 +16,7 @@ export default class Controller {
16
16
  getLabel() {
17
17
  let text = this.component.name;
18
18
  if (!text || this.awesomeMap.config.menu.mergeComponents) {
19
- text = window.DecidimAwesome.texts[this.component.type];
19
+ text = window.DecidimAwesome.i18n[this.component.type];
20
20
  }
21
21
  return `<span class="awesome_map-component" id="awesome_map-component_${this.component.id}" title="0" data-layer="${this.component.type}">${text}</span>`
22
22
  }
@@ -16,7 +16,7 @@ export default class ProposalsController extends Controller {
16
16
  // add control layer for amendments if any
17
17
  if (this.awesomeMap.config.menu.amendments && this.component.amendments && !this.awesomeMap.layers.amendments) {
18
18
  this.awesomeMap.layers.amendments = {
19
- label: `<span class="awesome_map-component" id="awesome_map-amendments_${this.component.id}" title="0" data-layer="amendments">${window.DecidimAwesome.texts.amendments}</span>`,
19
+ label: `<span class="awesome_map-component" id="awesome_map-amendments_${this.component.id}" title="0" data-layer="amendments">${window.DecidimAwesome.i18n.amendments}</span>`,
20
20
  group: new L.FeatureGroup.SubGroup(this.awesomeMap.cluster)
21
21
  }
22
22
  this.awesomeMap.controls.main.addOverlay(this.awesomeMap.layers.amendments.group, this.awesomeMap.layers.amendments.label);
@@ -82,8 +82,8 @@ export default class ControlsUI {
82
82
  addSearchControls() {
83
83
  const section = this.main.getContainer().querySelector(".leaflet-control-layers-list");
84
84
  if (section) {
85
- section.insertAdjacentHTML("beforeend", `<div id="awesome_map-categories-control" class="active"><b class="awesome_map-title-control">${window.DecidimAwesome.texts.categories}</b><div class="categories-container"></div></div>
86
- <div id="awesome_map-hashtags-control"><b class="awesome_map-title-control">${window.DecidimAwesome.texts.hashtags}</b><div class="hashtags-container"></div><a href="#" class="awesome_map-toggle_all_tags">${window.DecidimAwesome.texts.selectDeselectAll}</a></div>`);
85
+ section.insertAdjacentHTML("beforeend", `<div id="awesome_map-categories-control" class="active"><b class="awesome_map-title-control">${window.DecidimAwesome.i18n.categories}</b><div class="categories-container"></div></div>
86
+ <div id="awesome_map-hashtags-control"><b class="awesome_map-title-control">${window.DecidimAwesome.i18n.hashtags}</b><div class="hashtags-container"></div><a href="#" class="awesome_map-toggle_all_tags">${window.DecidimAwesome.i18n.selectDeselectAll}</a></div>`);
87
87
  } else {
88
88
  console.error("Can't find the section to insert the controls");
89
89
  }
@@ -158,7 +158,7 @@ export default class ControlsUI {
158
158
 
159
159
  const label = document.querySelector(`label.awesome_map-hashtag-${hashtag.tag}`);
160
160
  // update number of items
161
- label.setAttribute("title", `${parseInt(label.title || 0, 10) + 1} ${window.DecidimAwesome.texts.items}`);
161
+ label.setAttribute("title", `${parseInt(label.title || 0, 10) + 1} ${window.DecidimAwesome.i18n.items}`);
162
162
  });
163
163
  }
164
164
  }
@@ -171,12 +171,12 @@ export default class ControlsUI {
171
171
  if (label) {
172
172
  label.style.display = "block";
173
173
  // update number of items
174
- label.setAttribute("title", `${parseInt(label.title || 0, 10) + 1} ${window.DecidimAwesome.texts.items}`);
174
+ label.setAttribute("title", `${parseInt(label.title || 0, 10) + 1} ${window.DecidimAwesome.i18n.items}`);
175
175
  }
176
176
  if (parent) {
177
177
  // show parent if apply
178
178
  parent.style.display = "block"
179
- parent.setAttribute("title", `${parseInt(parent.title || 0, 10) + 1} ${window.DecidimAwesome.texts.items}`);
179
+ parent.setAttribute("title", `${parseInt(parent.title || 0, 10) + 1} ${window.DecidimAwesome.i18n.items}`);
180
180
  }
181
181
  }
182
182
 
@@ -224,7 +224,7 @@ export default class ControlsUI {
224
224
  updateStats(uid, total) {
225
225
  // update component stats
226
226
  const $component = $(`#awesome_map-${uid}`);
227
- $component.attr("title", `${total} ${window.DecidimAwesome.texts.items}`);
227
+ $component.attr("title", `${total} ${window.DecidimAwesome.i18n.items}`);
228
228
  }
229
229
 
230
230
  _indeterminateParentInput(cat) {
@@ -25,7 +25,7 @@ document.addEventListener("DOMContentLoaded", () => {
25
25
  const dataset = document.getElementById("awesome-map").dataset;
26
26
  const config = {
27
27
  length: parse(dataset.truncate) || 254,
28
- center: sanitizeCenter(parse(dataset.mapCenter)),
28
+ center: sanitizeCenter(dataset.mapCenter),
29
29
  zoom: parse(dataset.mapZoom),
30
30
  menu: {
31
31
  amendments: parse(dataset.menuAmendments),
@@ -55,12 +55,12 @@ document.addEventListener("DOMContentLoaded", () => {
55
55
  };
56
56
 
57
57
  if (!window.localStorage) {
58
- showMsg(window.DecidimAwesome.texts.autosavedError, true);
58
+ showMsg(window.DecidimAwesome.i18n.autosavedError, true);
59
59
  return;
60
60
  }
61
61
 
62
62
  if (window.localStorage.getItem(storeId)) {
63
- showMsg(window.DecidimAwesome.texts.autosavedRetrieved, false, 5000);
63
+ showMsg(window.DecidimAwesome.i18n.autosavedRetrieved, false, 5000);
64
64
  }
65
65
 
66
66
  // restore if available
@@ -85,7 +85,7 @@ document.addEventListener("DOMContentLoaded", () => {
85
85
  checkboxes[el.id] = el.checked;
86
86
  });
87
87
  window.localStorage.setItem(storeCheckboxesId, JSON.stringify(checkboxes));
88
- showMsg(window.DecidimAwesome.texts.autosavedSuccess);
88
+ showMsg(window.DecidimAwesome.i18n.autosavedSuccess);
89
89
  };
90
90
 
91
91
  // save changes when modifications
@@ -2,53 +2,6 @@ import "formBuilder/dist/form-render.min.js";
2
2
  import "src/decidim/decidim_awesome/forms/rich_text_plugin"
3
3
 
4
4
  export default class CustomFieldsRenderer { // eslint-disable-line no-unused-vars
5
- constructor() {
6
- this.lang = this.getLang(window.DecidimAwesome.currentLocale);
7
- }
8
-
9
- getLang(lang) {
10
- const langs = {
11
- // ar: 'ar-SA', // Not in decidim yet
12
- "ar": "ar-TN",
13
- "ca": "ca-ES",
14
- "cs": "cs-CZ",
15
- "da": "da-DK",
16
- "de": "de-DE",
17
- "el": "el-GR",
18
- "en": "en-US",
19
- "es": "es-ES",
20
- "fa": "fa-IR",
21
- "fi": "fi-FI",
22
- "fr": "fr-FR",
23
- "he": "he-IL",
24
- "hu": "hu-HU",
25
- "it": "it-IT",
26
- "ja": "ja-JP",
27
- "my": "my-MM",
28
- "nb": "nb-NO",
29
- "nl": "nl-NL",
30
- "pl": "pl-PL",
31
- "pt": "pt-BR",
32
- "qz": "qz-MM",
33
- "ro": "ro-RO",
34
- "ru": "ru-RU",
35
- "sl": "sl-SI",
36
- "th": "th-TH",
37
- "tr": "tr-TR",
38
- "uk": "uk-UA",
39
- "vi": "vi-VN",
40
- "zh-TW": "zh-TW",
41
- "zh": "zh-CN"
42
- };
43
- if (langs[lang]) {
44
- return langs[lang];
45
- }
46
- if (langs[lang.substr(0, 2)]) {
47
- return langs[lang.substr(0, 2)];
48
- }
49
- return "en-US";
50
- }
51
-
52
5
  /*
53
6
  * Creates an XML document with a subset of html-compatible dl/dd/dt elements
54
7
  * to store the custom fields answers
@@ -116,70 +69,6 @@ export default class CustomFieldsRenderer { // eslint-disable-line no-unused-var
116
69
  return `<xml>${$dl[0].outerHTML}</xml>`;
117
70
  }
118
71
 
119
- fixBuggyFields() {
120
- if (!this.$element) {
121
- return false;
122
- }
123
-
124
- /**
125
- * Hack to fix required checkboxes being reset
126
- * Issue: https://github.com/decidim-ice/decidim-module-decidim_awesome/issues/82
127
- */
128
- this.$element.find(".formbuilder-checkbox-group").each((_key, group) => {
129
- const inputs = $(".formbuilder-checkbox input", group);
130
- const $label = $(group).find("label");
131
- const data = this.spec.find((obj) => obj.type === "checkbox-group" && obj.name === $label.attr("for"));
132
- let values = data.userData;
133
- if (!inputs.length || !data || !values) {
134
- return;
135
- }
136
-
137
- inputs.each((_idx, input) => {
138
- let index = values.indexOf(input.value);
139
- if (index >= 0) {
140
- values.splice(index, 1)
141
- // setting checked=true do not makes the browser aware that the form is valid if the field is required
142
- if (!input.checked)
143
- {$(input).click();}
144
- } else if (input.checked)
145
- {$(input).click();}
146
- });
147
-
148
- // Fill "other" option
149
- const otherOption = $(".other-option", inputs.parent())[0];
150
- const otherVal = $(".other-val", inputs.parent())[0];
151
- const otherText = values.join(" ");
152
-
153
- if (otherOption) {
154
- if (otherText) {
155
- otherOption.checked = true;
156
- otherOption.value = otherText;
157
- otherVal.value = otherText;
158
- } else {
159
- otherOption.checked = false;
160
- otherOption.value = "";
161
- otherVal.value = "";
162
- }
163
- }
164
- });
165
-
166
- /**
167
- * Hack to fix required radio buttons "other" value
168
- * Issue: https://github.com/decidim-ice/decidim-module-decidim_awesome/issues/133
169
- */
170
- this.$element.find(".formbuilder-radio input.other-val").on("input", (input) => {
171
- const $input = $(input.currentTarget);
172
- const $group = $input.closest(".formbuilder-radio-group");
173
- $group.find("input").each((_key, radio) => {
174
- const name = $(radio).attr("name");
175
- if (name && name.endsWith("[]")) {
176
- $(radio).attr("name", name.slice(0, -2));
177
- }
178
- });
179
- });
180
- return this;
181
- }
182
-
183
72
  // Saves xml to the hidden input
184
73
  storeData() {
185
74
  if (!this.$element) {
@@ -203,7 +92,7 @@ export default class CustomFieldsRenderer { // eslint-disable-line no-unused-var
203
92
  // in case of multilang tabs we only render one form due a limitation in the library for handling several instances
204
93
  this.instance = $element.formRender({
205
94
  i18n: {
206
- locale: this.lang,
95
+ locale: window.DecidimAwesome.currentLocale,
207
96
  location: window.DecidimAwesome.formBuilderLangsLocation
208
97
  },
209
98
  formData: this.spec,
@@ -215,6 +104,5 @@ export default class CustomFieldsRenderer { // eslint-disable-line no-unused-var
215
104
  }
216
105
  }
217
106
  });
218
- this.fixBuggyFields();
219
107
  }
220
108
  }
@@ -15,7 +15,7 @@ document.addEventListener("DOMContentLoaded", () => {
15
15
 
16
16
  const span = document.createElement("span");
17
17
  span.className = "input-character-counter__text";
18
- span.innerHTML = window.DecidimAwesome.texts.dragAndDropImage;
18
+ span.innerHTML = window.DecidimAwesome.i18n.dragAndDropImage;
19
19
  textarea.parentNode.appendChild(span);
20
20
  attach(textarea, {
21
21
  uploadUrl: window.DecidimAwesome.editorUploaderPath,
@@ -0,0 +1,111 @@
1
+ NATIVE_NAME = سعودي
2
+ ENGLISH_NAME = Arabic (Saudi Arabia)
3
+
4
+ addOption = إضافة خيار +
5
+ allFieldsRemoved = تم إزالة جميع الحقول.
6
+ allowMultipleFiles = السماح بأكثر من ملف
7
+ autocomplete = الاكمال التلقائي
8
+ button = زر
9
+ cannotBeEmpty = هذا الحقل لا يمكن أن تكون فارغة
10
+ checkboxGroup = مجموعة حقول اختيارات
11
+ checkbox = حقل اختيار
12
+ checkboxes = حقول اختيار
13
+ className = عنوان الصنف
14
+ clearAllMessage = هل أنت متأكد أنك تريد مسح كافة المعلومات؟
15
+ clear = إزالة
16
+ close = إغلاق
17
+ content = محتوى
18
+ copy = نسخ إلى ذاكرة النصوص
19
+ copyButton = &#43;
20
+ copyButtonTooltip = نسخ
21
+ dateField = حقل تاريخ
22
+ description = نص مساعدة
23
+ descriptionField = وصف
24
+ devMode = وضع تطوير
25
+ editNames = تحرير الأسماء
26
+ editorTitle = عناصر النموذج
27
+ editXML = تحرير XML
28
+ enableOther = تفعيل &quot;أخرى&quot;
29
+ enableOtherMsg = السماح للمستخدمين بإضافة خيار غير موجود
30
+ fieldDeleteWarning = خطأ
31
+ fieldVars = متغيرات الحقل
32
+ fieldNonEditable = هذا الحقل لا يمكن تعديله.
33
+ fieldRemoveWarning = هل أنت متأكد من مسح هذا الحقل؟
34
+ fileUpload = حقل رفع ملف
35
+ formUpdated = تم تحديث النموذج
36
+ getStarted = قم بسحب حقل من اليمين إلى هذه المنطقة
37
+ header = ترويسة
38
+ hide = تعديل
39
+ hidden = حقل مخفي
40
+ inline = في السطر
41
+ inlineDesc = عرض {type} في السطر
42
+ label = اسم الحقل
43
+ labelEmpty = اسم الحقل لا يمكن أن يكون فارغ
44
+ limitRole = تقييد الوصول إلى واحد أو أكثر من الأدوار التالية:
45
+ mandatory = إلزامي
46
+ maxlength = الحد الأقصى للطول
47
+ minOptionMessage = هذا الحقل يتطلب خيارين على الأقل
48
+ minSelectionRequired = يتطلب {min} تحديدات على الأقل
49
+ multipleFiles = ملفات
50
+ name = اسم
51
+ no = لا
52
+ noFieldsToClear = لا توجد حقول للإزالة
53
+ number = رقم
54
+ off = معطل
55
+ on = مفعل
56
+ option = خيار
57
+ optionCount = خيار {count}
58
+ options = خيارات
59
+ optional = اختياري
60
+ optionLabelPlaceholder = نص مساعد
61
+ optionValuePlaceholder = نص
62
+ optionEmpty = الخيار مطلوب
63
+ other = أخرى
64
+ paragraph = نص
65
+ placeholder = نص مساعد
66
+ placeholders.value = نص
67
+ placeholders.label = نص مساعد
68
+ placeholders.text =
69
+ placeholders.textarea =
70
+ placeholders.email = ادخل بريدك الإلكتروني
71
+ placeholders.placeholder =
72
+ placeholders.className = foo class bar
73
+ placeholders.password = ادخل كلمة المرور
74
+ preview = معاينة
75
+ radioGroup = مجموعة حقول اختيار
76
+ radio = اختيار
77
+ removeMessage = إزالة عنصر
78
+ removeOption = إزالة خيار
79
+ remove = &#215;
80
+ required = مطلوب
81
+ requireValidOption = يتطلب خيار مسبق تعريفه
82
+ richText = معالج النصوص
83
+ roles = التمكين من
84
+ rows = صفوف
85
+ save = حفظ
86
+ selectOptions = خيارات
87
+ select = حقل تحديد
88
+ selectColor = اختيار اللون
89
+ selectionsMessage = السماح بأكثر من تحديد
90
+ size = الحجم
91
+ size.xs = صغير جدا
92
+ size.sm = صغير
93
+ size.m = عادي
94
+ size.lg = كبير
95
+ style = المظهر
96
+ styles.btn.default = افتراضي
97
+ styles.btn.danger = خطر
98
+ styles.btn.info = معلومة
99
+ styles.btn.primary = أساسي
100
+ styles.btn.success = نجاح
101
+ styles.btn.warning = تحذير
102
+ subtype = النوع
103
+ text = حقل نصي
104
+ textArea = حقل نص كبير
105
+ toggle = نوع التبديل
106
+ warning = تحذير
107
+ value = قيمة
108
+ viewJSON = [{&hellip;}]
109
+ viewXML = &lt;/&gt;
110
+ yes = نعم
111
+ Arabic Label = اسم الحقل بالعربية
@@ -0,0 +1,94 @@
1
+ NATIVE_NAME = تونسي
2
+ ENGLISH_NAME = Arabic (Tunisian)
3
+
4
+ addOption = إضافة خيار
5
+ allFieldsRemoved = تمّت إزالة جميع المجالات..
6
+ allowSelect = السماح بالإختيار
7
+ autocomplete = الإكمال التلقائي
8
+ button = زر
9
+ cannotBeEmpty = هذه المعلومة لا يمكن أن تكون فارغة
10
+ checkboxGroup = مجموعة خانات إختيار
11
+ checkbox = خانة الاختيار
12
+ checkboxes = خانات إختيار
13
+ class = صنف
14
+ clearAllMessage = هل أنت متأكد أنك تريد مسح كافة المعلومات؟
15
+ clear = إفسخ
16
+ close = أغلق
17
+ content = محتوى
18
+ copy = نسخ إلى الحافظة
19
+ dateField = حقل تاريخ
20
+ description = نص المساعدة
21
+ descriptionField = وصف
22
+ devMode = وضع المطور
23
+ editNames = تغيير الأسماء
24
+ editorTitle = عناصر النموذج
25
+ editXML = تحرير XML
26
+ fieldDeleteWarning: خاطئة
27
+ fieldVars = متغيّرات الحقل
28
+ fieldNonEditable = هذا الحقل لا يمكن تعديله.
29
+ fieldRemoveWarning = هل حقا تريد حذف هذا المجال؟
30
+ fileUpload = تحميل الملف
31
+ formUpdated = تّم تحديث الإستمارة
32
+ getStarted = إسحب إختيار(حقل) من اليمين إلى هذا المجال
33
+ header = رأس الصفحة
34
+ hide = تحديث
35
+ hidden = الإدخال مخفي
36
+ label = التسمية
37
+ labelEmpty = التسمية لا يمكن أن يكون فارغا
38
+ limitRole = تقييد الوصول إلى واحد أو أكثر من الأدوار التالية:
39
+ mandatory = إلزامي
40
+ maxlength = الحد الاقصى للطول
41
+ minOptionMessage = يتطلب هذا المجال لا تقل عن 2 خيارات
42
+ name = الإسم
43
+ no = لا
44
+ off = عاطل
45
+ on = مفعل
46
+ option = خيار
47
+ optional = خيار
48
+ optionEmpty = قيمة الخيار المطلوبة
49
+ paragraph = فقرة
50
+ placeholder = العنصر النائب
51
+ placeholder.value = القيمة
52
+ placeholder.label = تسمية
53
+ placeholder.text = أدخل بعض النص
54
+ placeholder.textarea = إدخال الكثير من النص
55
+ placeholder.email = أدخل البريد الإلكتروني
56
+ placeholder.placeholder = العنصر النائب
57
+ placeholder.className = فئات مفصولة بمسافات
58
+ placeholder.password = أدخل كلمة المرور
59
+ preview = المعاينة
60
+ radioGroup = اختيار مجموعة
61
+ radio = اختيار
62
+ removeMessage = إزالة عنصر
63
+ remove = &#215;
64
+ required = إجبارية
65
+ richText = محرر WYSIWYG
66
+ roles = وصول
67
+ save = حفظ
68
+ selectOptions = خيارات
69
+ select = للاختيار
70
+ selectColor = اختيار اللون
71
+ selectionsMessage = سماح اختيارات متعددة
72
+ size = حجم
73
+ sizes = الأحجام
74
+ sizes.xs = صغيرة اضافية
75
+ sizes.sm = صغير
76
+ sizes.m = تبعا للإعدادات الافتراضية
77
+ sizes.lg = كبير
78
+ style = شكل
79
+ styles = الأشكال
80
+ styles.btn = شكل الزر
81
+ styles.btn.default = تبعا للإعدادات الافتراضية
82
+ styles.btn.danger = خطر
83
+ styles.btn.info = معلومات
84
+ styles.btn.primary = أساسي
85
+ styles.btn.success = نجاح
86
+ styles.btn.warning = إعلام
87
+ subtype = نوع
88
+ text = الميدان النص
89
+ textArea = تيكستاريا
90
+ toggle = نوع التبديل
91
+ warning = تحذير!
92
+ viewXML = </>
93
+ viewJSON = { }
94
+ yes = نعم