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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +24 -14
- data/Rakefile +12 -0
- data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +14 -2
- data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +5 -4
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +3 -3
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +1 -1
- data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
- data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +41 -0
- data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
- data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -4
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
- data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
- data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
- data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
- data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
- data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
- data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +13 -0
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +1 -1
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
- data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
- data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
- data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
- data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
- data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
- data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
- data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +10 -6
- data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
- data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
- data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
- data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
- data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
- data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
- data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
- data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
- data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
- data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
- data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
- data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
- data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
- data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
- data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
- data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
- data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
- data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
- data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
- data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
- data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
- data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
- data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
- data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
- data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
- data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
- data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
- data/app/packs/src/vendor/hashcash.js +83 -0
- data/app/packs/src/vendor/sha1.js +143 -0
- data/app/packs/src/vendor/stamp.js +50 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
- data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
- data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +4 -4
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
- data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
- data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
- data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
- data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
- data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
- data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
- data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +1 -1
- data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
- data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
- data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
- data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
- data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
- data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +5 -0
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
- data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
- data/config/assets.rb +1 -0
- data/config/i18n-tasks.yml +1 -0
- data/config/locales/ca.yml +69 -30
- data/config/locales/cs.yml +68 -29
- data/config/locales/de.yml +67 -28
- data/config/locales/en.yml +81 -32
- data/config/locales/es.yml +68 -29
- data/config/locales/eu.yml +31 -31
- data/config/locales/fr.yml +82 -31
- data/config/locales/ja.yml +31 -31
- data/lib/decidim/decidim_awesome/admin_engine.rb +8 -5
- data/lib/decidim/decidim_awesome/awesome.rb +29 -7
- data/lib/decidim/decidim_awesome/checksums.yml +15 -40
- data/lib/decidim/decidim_awesome/engine.rb +11 -2
- data/lib/decidim/decidim_awesome/menu.rb +151 -138
- data/lib/decidim/decidim_awesome/test/initializer.rb +4 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +1 -3
- data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +2 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +8 -1
- data/lib/decidim/decidim_awesome/version.rb +1 -1
- data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -1
- data/package.json +3 -4
- metadata +68 -10
- data/config/rubocop/disabled.yml +0 -11
- data/config/rubocop/faker.yml +0 -480
- data/config/rubocop/rails.yml +0 -88
- data/config/rubocop/rspec.yml +0 -65
- 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
|
18
|
-
const
|
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 (
|
36
|
-
|
35
|
+
if (inputFields.length > 0) {
|
36
|
+
inputFields.forEach((inputField) => {
|
37
|
+
inputField.setAttribute("name", `config[${attribute}][${result.key}]`);
|
38
|
+
});
|
37
39
|
}
|
38
|
-
if (
|
39
|
-
|
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:
|
21
|
-
location:
|
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:
|
21
|
-
|
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.
|
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.
|
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.
|
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.
|
86
|
-
<div id="awesome_map-hashtags-control"><b class="awesome_map-title-control">${window.DecidimAwesome.
|
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.
|
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.
|
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.
|
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.
|
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(
|
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.
|
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.
|
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.
|
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:
|
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.
|
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 = +
|
20
|
+
copyButtonTooltip = نسخ
|
21
|
+
dateField = حقل تاريخ
|
22
|
+
description = نص مساعدة
|
23
|
+
descriptionField = وصف
|
24
|
+
devMode = وضع تطوير
|
25
|
+
editNames = تحرير الأسماء
|
26
|
+
editorTitle = عناصر النموذج
|
27
|
+
editXML = تحرير XML
|
28
|
+
enableOther = تفعيل "أخرى"
|
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 = ×
|
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 = [{…}]
|
109
|
+
viewXML = </>
|
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 = ×
|
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 = +
|
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 "Other" = 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 = ×
|
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
|