decidim-decidim_awesome 0.12.0 → 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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +24 -14
  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/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
  10. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +41 -0
  11. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
  12. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
  13. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -4
  14. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
  15. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
  16. data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
  17. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
  18. data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
  19. data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
  20. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
  21. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +13 -0
  22. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +1 -1
  23. data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
  24. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
  25. data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
  26. data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
  27. data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
  28. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
  29. data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
  30. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +10 -6
  31. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
  32. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
  33. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
  34. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
  35. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
  36. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
  37. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
  38. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
  39. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
  40. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
  41. data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
  42. data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
  43. data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
  44. data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
  45. data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
  46. data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
  47. data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
  48. data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
  49. data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
  50. data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
  51. data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
  52. data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
  53. data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
  54. data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
  55. data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
  56. data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
  57. data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
  58. data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
  59. data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
  60. data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
  61. data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
  62. data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
  63. data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
  64. data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
  65. data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
  66. data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
  67. data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
  68. data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
  69. data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
  70. data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
  71. data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
  72. data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
  73. data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
  74. data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
  75. data/app/packs/src/vendor/hashcash.js +83 -0
  76. data/app/packs/src/vendor/sha1.js +143 -0
  77. data/app/packs/src/vendor/stamp.js +50 -0
  78. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
  79. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
  80. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +4 -4
  81. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
  82. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
  83. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
  84. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
  85. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
  86. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  87. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
  88. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
  89. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
  90. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
  91. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
  92. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +1 -1
  93. data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
  94. data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
  95. data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
  96. data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
  97. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
  98. data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
  99. data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
  100. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
  101. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
  102. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +5 -0
  103. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
  104. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
  105. data/config/assets.rb +1 -0
  106. data/config/i18n-tasks.yml +1 -0
  107. data/config/locales/ca.yml +69 -30
  108. data/config/locales/cs.yml +68 -29
  109. data/config/locales/de.yml +67 -28
  110. data/config/locales/en.yml +81 -32
  111. data/config/locales/es.yml +68 -29
  112. data/config/locales/eu.yml +31 -31
  113. data/config/locales/fr.yml +82 -31
  114. data/config/locales/ja.yml +31 -31
  115. data/lib/decidim/decidim_awesome/admin_engine.rb +8 -5
  116. data/lib/decidim/decidim_awesome/awesome.rb +29 -7
  117. data/lib/decidim/decidim_awesome/checksums.yml +15 -40
  118. data/lib/decidim/decidim_awesome/engine.rb +11 -2
  119. data/lib/decidim/decidim_awesome/menu.rb +151 -138
  120. data/lib/decidim/decidim_awesome/test/initializer.rb +4 -1
  121. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +1 -3
  122. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +2 -1
  123. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +8 -1
  124. data/lib/decidim/decidim_awesome/version.rb +1 -1
  125. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -1
  126. data/package.json +3 -4
  127. metadata +68 -10
  128. data/config/rubocop/disabled.yml +0 -11
  129. data/config/rubocop/faker.yml +0 -480
  130. data/config/rubocop/rails.yml +0 -88
  131. data/config/rubocop/rspec.yml +0 -65
  132. data/config/rubocop/ruby.yml +0 -1210
@@ -14,8 +14,8 @@ 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
19
  const container = document.querySelector(`.js-box-container[data-key="${key}"]`);
20
20
  const deleteBox = container.querySelector(".awesome-auto-delete");
21
21
 
@@ -32,11 +32,15 @@ document.addEventListener("DOMContentLoaded", () => {
32
32
  const rebuildHtml = (result) => {
33
33
  rebuildLabel(result.key, result.scope);
34
34
  constraints.outerHTML = result.html;
35
- if (inputField) {
36
- inputField.setAttribute("name", `config[${attribute}][${result.key}]`);
35
+ if (inputFields.length > 0) {
36
+ inputFields.forEach((inputField) => {
37
+ inputField.setAttribute("name", `config[${attribute}][${result.key}]`);
38
+ });
37
39
  }
38
- if (multipleField) {
39
- multipleField.setAttribute("name", `config[${attribute}][${result.key}][]`);
40
+ if (multipleFields.length > 0) {
41
+ multipleFields.forEach((multipleField) => {
42
+ multipleField.setAttribute("name", `config[${attribute}][${result.key}][]`);
43
+ });
40
44
  }
41
45
  container.dataset.key = result.key;
42
46
  container.setAttribute("data-key", result.key);
@@ -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) {
@@ -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 = نعم
@@ -0,0 +1,110 @@
1
+ NATIVE_NAME = català
2
+ ENGLISH_NAME = Catalan
3
+
4
+ addOption = Afegir Opció +
5
+ allFieldsRemoved = S'han esborrat tots els camps
6
+ allowMultipleFiles = Carrega diversos fitxers
7
+ autocomplete = Autocompletar
8
+ button = Botó
9
+ cannotBeEmpty = Aquest camp no pot estar buit
10
+ checkboxGroup = Grup de caselles
11
+ checkbox = Casella
12
+ checkboxes = Caselles
13
+ className = Típus
14
+ clearAllMessage = Estas segur de voler esborrar tots els camps?
15
+ clear = Netejar
16
+ close = Tancar
17
+ content = Contingut
18
+ copy = Copiar al portapapers
19
+ copyButton = &#43;
20
+ copyButtonTooltip = Còpia
21
+ dateField = Camp de data
22
+ description = Descripció
23
+ descriptionField = Descripció
24
+ devMode = Mode de desenvolupador
25
+ editNames = Editar noms
26
+ editorTitle = Elements del Form
27
+ editXML = Editar XML
28
+ enableOther = Enable &quot;Other&quot; = Permetre d'altres
29
+ enableOtherMsg = Permetre als usuaris introduir una opció no catalogada
30
+ fieldDeleteWarning = Fals
31
+ fieldVars = Variables de camp
32
+ fieldNonEditable = Aquest camp no es pot editar
33
+ fieldRemoveWarning = Estas segur de voler treure aquest camp?
34
+ fileUpload = Pujade de fitxer
35
+ formUpdated = Formulari actualitzat
36
+ getStarted = Arrossega un camp de la dreta a aquesta àrea
37
+ header = Capçalera
38
+ hide = Editar
39
+ hidden = Camp ocult
40
+ inline = Lineal
41
+ inlineDesc = Mostrar lineal
42
+ label = Etiqueta
43
+ labelEmpty = Aquesta etiqueta no pot estar buida
44
+ limitRole = Limitar l’accés a una o més de les següents funcions:
45
+ mandatory = Obligatori
46
+ maxlength = Longitud màxima
47
+ minOptionMessage = Aquest camp necessita com a mínim 2 o
48
+ minSelectionRequired = Mínim de {min} selecions necessàries
49
+ multipleFiles = Diversos fitxers
50
+ name = Nom
51
+ no = No
52
+ noFieldsToClear = No hi ha camps per esborrar
53
+ number = Número
54
+ off =
55
+ on = Encendre
56
+ option = Opció
57
+ optionCount = Opció {count}
58
+ options = Opcions
59
+ optional = opcional
60
+ optionLabelPlaceholder = Etiqueta
61
+ optionValuePlaceholder = Valor
62
+ optionEmpty = Valor d'opció requerit
63
+ other = Altre/a
64
+ paragraph = Paragraf
65
+ placeholder = Propietari
66
+ placeholders.value = Valor
67
+ placeholders.label = Etiqueta
68
+ placeholders.text = Text
69
+ placeholders.textarea = Àrea de text
70
+ placeholders.email = Entra el teu correu
71
+ placeholders.placeholder = Propietari de propietaris
72
+ placeholders.className = Nom de la classe
73
+ placeholders.password = Entra la teva contrasenya
74
+ preview = Previsualització
75
+ radioGroup = Grup de selecció
76
+ radio = Selector
77
+ removeMessage = Treu Element
78
+ removeOption = Treu Opció
79
+ remove = &#215;
80
+ required = Requerit
81
+ requireValidOption = Només accepta una opció pre-definida
82
+ richText = Editor de Text Enriquit
83
+ roles = Access
84
+ rows = Files
85
+ save = Grava
86
+ selectOptions = Opcions
87
+ select = Selecció
88
+ selectColor = Selecciona Color
89
+ selectionsMessage = Permet Seleccions Multiples
90
+ size = Tamany
91
+ size.xs = Extra Petit
92
+ size.sm = Petit
93
+ size.m = Per Defecte
94
+ size.lg = Llarg
95
+ style = Estil
96
+ styles.btn.default = Per defecte
97
+ styles.btn.danger = Alerta
98
+ styles.btn.info = Info
99
+ styles.btn.primary = Primari
100
+ styles.btn.success = Fet
101
+ styles.btn.warning = Alerta
102
+ subtype = Type
103
+ text = Camp de text
104
+ textArea = Àrea de text
105
+ toggle = Típus de commutador
106
+ warning = Alerta!
107
+ value = Value
108
+ viewXML = </>
109
+ viewJSON = { }
110
+ yes = Si