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
@@ -0,0 +1,94 @@
1
+ NATIVE_NAME = 繁體中文(台灣)
2
+ ENGLISH_NAME = Chinese (Taiwan)
3
+
4
+ addOption = 新增選項
5
+ allFieldsRemoved = 所有欄位已移除
6
+ allowSelect = 允許選擇
7
+ autocomplete = 自動完成
8
+ button = 按鈕
9
+ cannotBeEmpty = 此欄位不能是空白
10
+ checkboxGroup = 核取方塊群組
11
+ checkbox = 核取方塊
12
+ checkboxes = 核取方塊組
13
+ class = CSS 類別
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: false
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 = 此欄位至少要兩個選項
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 = 文字編輯框
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 = Default
82
+ styles.btn.danger = Danger
83
+ styles.btn.info = Info
84
+ styles.btn.primary = Primary
85
+ styles.btn.success = Success
86
+ styles.btn.warning = Warning
87
+ subtype = 格式
88
+ text = 文字欄位
89
+ textArea = 文字區塊
90
+ toggle = 彈出提示
91
+ warning = 警告!
92
+ viewXML = 顯示 XML
93
+ viewJSON = { }
94
+ yes = 是
@@ -0,0 +1,83 @@
1
+ // http://www.hashcash.org/docs/hashcash.html
2
+ // <input type="hidden" name="hashcash" data-hashcash="{resource: 'site.example', bits: 16}"/>
3
+
4
+ import Stamp from "src/vendor/stamp"
5
+
6
+ export default class Hashcash {
7
+ static default = {
8
+ version: 1,
9
+ bits: 20,
10
+ extension: null,
11
+ }
12
+
13
+ constructor(input) {
14
+ this.options = JSON.parse(input.getAttribute("data-hashcash"))
15
+ this.input = input
16
+ this.disableParentForm()
17
+ this.input.dispatchEvent(new CustomEvent("hashcash:mint", {bubbles: true}))
18
+
19
+ this.mint((stamp) => {
20
+ this.input.value = stamp.toString()
21
+ console.log("Hashcash stamp: ", stamp)
22
+ console.log("Hashcash input: ", this.input.value)
23
+ this.enableParentForm()
24
+ this.input.dispatchEvent(new CustomEvent("hashcash:minted", {bubbles: true, detail: {stamp: stamp}}))
25
+ })
26
+ }
27
+
28
+ static setup() {
29
+ if (document.readyState != "loading") {
30
+ var input = document.querySelector("input#hashcash")
31
+ input && new Hashcash(input)
32
+ } else
33
+ document.addEventListener("DOMContentLoaded", Hashcash.setup )
34
+ }
35
+
36
+ setSubmitText(submit, text) {
37
+ if (!text) {
38
+ return
39
+ }
40
+ if (submit.tagName == "BUTTON") {
41
+ !submit.originalValue && (submit.originalValue = submit.innerHTML)
42
+ submit.innerHTML = text
43
+ } else {
44
+ !submit.originalValue && (submit.originalValue = submit.value)
45
+ submit.value = text
46
+ }
47
+ }
48
+
49
+ disableParentForm() {
50
+ this.input.form.querySelectorAll("[type=submit]").forEach((submit) => {
51
+ this.setSubmitText(submit, this.options["waiting_message"])
52
+ submit.disabled = true
53
+ })
54
+ }
55
+
56
+ enableParentForm() {
57
+ this.input.form.querySelectorAll("[type=submit]").forEach((submit) => {
58
+ this.setSubmitText(submit, submit.originalValue)
59
+ submit.disabled = null
60
+ })
61
+ }
62
+
63
+ mint(callback) {
64
+ var options = this.options
65
+ var resource = this.options.resource
66
+ // Format date to YYMMDD
67
+ var date = new Date
68
+ var year = date.getFullYear().toString()
69
+ year = year.slice(year.length - 2, year.length)
70
+ var month = (date.getMonth() + 1).toString().padStart(2, "0")
71
+ var day = date.getDate().toString().padStart(2, "0")
72
+
73
+ var stamp = new Stamp(
74
+ options.version || Hashcash.default.version,
75
+ options.bits || Hashcash.default.bits,
76
+ options.date || year + month + day,
77
+ resource,
78
+ options.extension || Hashcash.default.extension,
79
+ options.rand || Math.random().toString(36).substr(2, 10),
80
+ )
81
+ return stamp.work(callback)
82
+ }
83
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Secure Hash Algorithm (SHA1)
3
+ * http://www.webtoolkit.info/
4
+ **/
5
+ export default function SHA1(msg) {
6
+ var blockstart;
7
+ var i, j;
8
+ var W = new Array(80);
9
+ var H0 = 0x67452301;
10
+ var H1 = 0xEFCDAB89;
11
+ var H2 = 0x98BADCFE;
12
+ var H3 = 0x10325476;
13
+ var H4 = 0xC3D2E1F0;
14
+ var A, B, C, D, E;
15
+ var temp;
16
+ msg = Utf8Encode(msg);
17
+ var msg_len = msg.length;
18
+ var word_array = new Array();
19
+ for (i = 0; i < msg_len - 3; i += 4) {
20
+ j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 |
21
+ msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3);
22
+ word_array.push(j);
23
+ }
24
+ switch (msg_len % 4) {
25
+ case 0:
26
+ i = 0x080000000;
27
+ break;
28
+ case 1:
29
+ i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000;
30
+ break;
31
+ case 2:
32
+ i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000;
33
+ break;
34
+ case 3:
35
+ i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80;
36
+ break;
37
+ }
38
+ word_array.push(i);
39
+ while ((word_array.length % 16) != 14) word_array.push(0);
40
+ word_array.push(msg_len >>> 29);
41
+ word_array.push((msg_len << 3) & 0x0ffffffff);
42
+ for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
43
+ for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i];
44
+ for (i = 16; i <= 79; i++) W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
45
+ A = H0;
46
+ B = H1;
47
+ C = H2;
48
+ D = H3;
49
+ E = H4;
50
+ for (i = 0; i <= 19; i++) {
51
+ temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
52
+ E = D;
53
+ D = C;
54
+ C = rotate_left(B, 30);
55
+ B = A;
56
+ A = temp;
57
+ }
58
+ for (i = 20; i <= 39; i++) {
59
+ temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
60
+ E = D;
61
+ D = C;
62
+ C = rotate_left(B, 30);
63
+ B = A;
64
+ A = temp;
65
+ }
66
+ for (i = 40; i <= 59; i++) {
67
+ temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
68
+ E = D;
69
+ D = C;
70
+ C = rotate_left(B, 30);
71
+ B = A;
72
+ A = temp;
73
+ }
74
+ for (i = 60; i <= 79; i++) {
75
+ temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
76
+ E = D;
77
+ D = C;
78
+ C = rotate_left(B, 30);
79
+ B = A;
80
+ A = temp;
81
+ }
82
+ H0 = (H0 + A) & 0x0ffffffff;
83
+ H1 = (H1 + B) & 0x0ffffffff;
84
+ H2 = (H2 + C) & 0x0ffffffff;
85
+ H3 = (H3 + D) & 0x0ffffffff;
86
+ H4 = (H4 + E) & 0x0ffffffff;
87
+ }
88
+ return [H0, H1, H2, H3, H4]
89
+ }
90
+
91
+ export function hexSha1(msg) {
92
+ var array = SHA1(msg)
93
+ return cvt_hex(array[0]) + cvt_hex(array[1]) + cvt_hex(array[2]) + cvt_hex(array3) + cvt_hex(array[4])
94
+ }
95
+
96
+ function rotate_left(n, s) {
97
+ var t4 = (n << s) | (n >>> (32 - s));
98
+ return t4;
99
+ };
100
+
101
+ function lsb_hex(val) {
102
+ var str = '';
103
+ var i;
104
+ var vh;
105
+ var vl;
106
+ for (i = 0; i <= 6; i += 2) {
107
+ vh = (val >>> (i * 4 + 4)) & 0x0f;
108
+ vl = (val >>> (i * 4)) & 0x0f;
109
+ str += vh.toString(16) + vl.toString(16);
110
+ }
111
+ return str;
112
+ };
113
+
114
+ function cvt_hex(val) {
115
+ var str = '';
116
+ var i;
117
+ var v;
118
+ for (i = 7; i >= 0; i--) {
119
+ v = (val >>> (i * 4)) & 0x0f;
120
+ str += v.toString(16);
121
+ }
122
+ return str;
123
+ };
124
+
125
+ function Utf8Encode(string) {
126
+ string = string.replace(/\r\n/g, '\n');
127
+ var utftext = '';
128
+ for (var n = 0; n < string.length; n++) {
129
+ var c = string.charCodeAt(n);
130
+ if (c < 128) {
131
+ utftext += String.fromCharCode(c);
132
+ } else if ((c > 127) && (c < 2048)) {
133
+ utftext += String.fromCharCode((c >> 6) | 192);
134
+ utftext += String.fromCharCode((c & 63) | 128);
135
+ } else {
136
+ utftext += String.fromCharCode((c >> 12) | 224);
137
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
138
+ utftext += String.fromCharCode((c & 63) | 128);
139
+ }
140
+ }
141
+ return utftext;
142
+ };
143
+
@@ -0,0 +1,50 @@
1
+ import SHA1 from "src/vendor/sha1"
2
+
3
+ export default class Stamp {
4
+ constructor(version, bits, date, resource, extension, rand, counter = 0) {
5
+ this.version = version
6
+ this.bits = bits
7
+ this.date = date
8
+ this.resource = resource
9
+ this.extension = extension
10
+ this.rand = rand
11
+ this.counter = counter
12
+ }
13
+
14
+ static parse(string) {
15
+ const args = string.split(":")
16
+ return new Stamp(args[0], args[1], args[2], args[3], args[4], args[5], args[6])
17
+ }
18
+
19
+ toString() {
20
+ return [this.version, this.bits, this.date, this.resource, this.extension, this.rand, this.counter].join(":")
21
+ }
22
+
23
+ // Trigger the given callback when the problem is solved.
24
+ // In order to not freeze the page, setTimeout is called every 100ms to let some CPU to other tasks.
25
+ work(callback) {
26
+ this.startClock()
27
+ const timer = performance.now()
28
+ while (!this.check())
29
+ if (this.counter++ && performance.now() - timer > 100)
30
+ return setTimeout(this.work.bind(this), 0, callback)
31
+ this.stopClock()
32
+ callback(this)
33
+ }
34
+
35
+ check() {
36
+ const array = SHA1(this.toString())
37
+ return array[0] >> (160-this.bits) == 0
38
+ }
39
+
40
+ startClock() {
41
+ this.startedAt || (this.startedAt = performance.now())
42
+ }
43
+
44
+ stopClock() {
45
+ this.endedAt || (this.endedAt = performance.now())
46
+ const duration = this.endedAt - this.startedAt
47
+ const speed = Math.round(this.counter * 1000 / duration)
48
+ console.debug("Hashcash " + this.toString() + " minted in " + duration + "ms (" + speed + " per seconds)")
49
+ }
50
+ }
@@ -1,17 +1,7 @@
1
1
  .awesome_autosave-notice {
2
- background-color: rgb(var(--success-rgb) / 90%);
3
- position: fixed;
4
- top: 90%;
5
- left: 50%;
6
- transform: translate(-50%, -50%);
7
- padding: 1em 2em;
8
- border-radius: 4px;
9
- border: 1px solid var(--success);
10
- font-weight: 600;
11
- color: white;
12
- z-index: 1000;
2
+ @apply bg-success/90 fixed top-[2%] right-[2%] p-4 rounded border border-success font-semibold text-white z-[1000];
13
3
 
14
4
  &.error {
15
- background-color: rgb(var(--alert-rgb) / 90%);
5
+ @apply bg-alert/90;
16
6
  }
17
7
  }
@@ -31,7 +31,7 @@ module Decidim
31
31
  end
32
32
 
33
33
  def time_ago
34
- I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.time_ago", time: time_ago_in_words(last_date)) if last_date
34
+ I18n.t("decidim.decidim_awesome.admin.private_data.private_data.time_ago", time: time_ago_in_words(last_date)) if last_date
35
35
  end
36
36
 
37
37
  def destroyable?
@@ -63,7 +63,7 @@ module Decidim
63
63
  return if destroyable?
64
64
  return if last_date
65
65
 
66
- I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.done")
66
+ I18n.t("decidim.decidim_awesome.admin.private_data.private_data.done")
67
67
  end
68
68
  end
69
69
  end
@@ -10,12 +10,12 @@
10
10
  </span>
11
11
  <div class="dropdown-pane" id="export-dropdown" data-dropdown data-auto-focus="true" data-close-on-click="true">
12
12
  <ul class="vertical menu add-components">
13
- <% %w{CSV JSON Excel}.each do |format| %>
13
+ <% %w(CSV JSON Excel).each do |format| %>
14
14
  <li class="exports--format--<%= format.downcase %> exports--registrations">
15
15
  <%= link_to t("decidim.decidim_awesome.admin.admin_accountability.exports.export_as", export_format:
16
- format.upcase), export_admin_accountability_path(export_params.merge(format: format)),
17
- method: :post,
18
- class: "focus-visible:outline-none" %>
16
+ format.upcase), export_admin_accountability_path(export_params.merge(format:)),
17
+ method: :post,
18
+ class: "focus-visible:outline-none" %>
19
19
  </li>
20
20
  <% end %>
21
21
  </ul>
@@ -1,3 +1,3 @@
1
1
  <%= cell("decidim/announcement",
2
- local_assigns[:message].presence || t("decidim.decidim_awesome.admin.admin_authorizations.#{i18n_key}", name: workflow&.fullname, user: user.name),
3
- callout_class: klass) %>
2
+ local_assigns[:message].presence || t("decidim.decidim_awesome.admin.admin_authorizations.#{i18n_key}", name: workflow&.fullname, user: user.name),
3
+ callout_class: klass) %>
@@ -1,5 +1,5 @@
1
1
  <%= cell("decidim/announcement", {
2
- title: t("decidim.decidim_awesome.admin.admin_authorizations.conflict"),
3
- body: t("decidim.decidim_awesome.admin.admin_authorizations.conflict_help_html", user: link_to(conflict.user.name, decidim_admin.officializations_path(q: { name_or_nickname_or_email_cont: conflict.user.email })))
4
- },
5
- callout_class: "alert") %>
2
+ title: t("decidim.decidim_awesome.admin.admin_authorizations.conflict"),
3
+ body: t("decidim.decidim_awesome.admin.admin_authorizations.conflict_help_html", user: link_to(conflict.user.name, decidim_admin.officializations_path(q: { name_or_nickname_or_email_cont: conflict.user.email })))
4
+ },
5
+ callout_class: "alert") %>
@@ -1,10 +1,11 @@
1
1
  <div class="form-defaults">
2
+ <%= callout if defined?(callout) %>
2
3
  <%= decidim_form_for(handler,
3
- builder: Decidim::AuthorizationFormBuilder,
4
- as: "authorization_handler",
5
- url: decidim_admin_decidim_awesome.admin_authorization_path(id: user.id, handler: params[:handler]),
6
- method: :patch,
7
- remote: true) do |form| %>
4
+ builder: Decidim::AuthorizationFormBuilder,
5
+ as: "authorization_handler",
6
+ url: decidim_admin_decidim_awesome.admin_authorization_path(id: user.id, handler: params[:handler]),
7
+ method: :patch,
8
+ remote: true) do |form| %>
8
9
  <% if lookup_context.exists?(handler.to_partial_path, [], true) %>
9
10
  <%= render partial: handler.to_partial_path, locals: { handler:, form: } %>
10
11
  <% else %>
@@ -46,9 +46,9 @@
46
46
  <strong><%= t ".head_tags" %></strong>
47
47
  <ul class="vertical menu">
48
48
  <% {
49
- CSS: "//head/link[@rel='stylesheet'][contains(@href,'decidim_decidim_awesome')]",
50
- JavaScript: "//script[contains(@src,'decidim_decidim_awesome')]"
51
- }.each do |part, xpath| %>
49
+ CSS: "//head/link[@rel='stylesheet'][contains(@href,'decidim_decidim_awesome')]",
50
+ JavaScript: "//script[contains(@src,'decidim_decidim_awesome')]"
51
+ }.each do |part, xpath| %>
52
52
  <li>
53
53
  <%= part %>
54
54
  <% if head.xpath(xpath).count.positive? %>
@@ -66,9 +66,9 @@
66
66
  <strong><%= t ".admin_head_tags" %></strong>
67
67
  <ul class="vertical menu">
68
68
  <% {
69
- CSS: "//head/link[@rel='stylesheet'][contains(@href,'decidim_admin_decidim_awesome')]",
70
- JavaScript: "//script[contains(@src,'decidim_admin_decidim_awesome')]"
71
- }.each do |part, xpath| %>
69
+ CSS: "//head/link[@rel='stylesheet'][contains(@href,'decidim_admin_decidim_awesome')]",
70
+ JavaScript: "//script[contains(@src,'decidim_admin_decidim_awesome')]"
71
+ }.each do |part, xpath| %>
72
72
  <li>
73
73
  <%= part %>
74
74
  <% if admin_head.xpath(xpath).count.positive? %>
@@ -1,7 +1,7 @@
1
1
  <%= label_tag var do %>
2
2
  <%= t("config.#{var}",
3
- scope: "activemodel.attributes",
4
- id: "<span class='awesome-auto-edit' data-var='#{var}' data-scope='#{scope}' data-key='#{key}'>#{key}</span>").html_safe %>
3
+ scope: "activemodel.attributes",
4
+ id: "<span class='awesome-auto-edit' data-var='#{var}' data-scope='#{scope}' data-key='#{key}'>#{key}</span>").html_safe %>
5
5
 
6
6
  <%= icon_link_to "pencil-line", "#", t("edit_label", scope: "decidim.decidim_awesome.admin.config.form"), class: "awesome-auto-edit", data: { "scope" => "#{scope}" } %>
7
7
 
@@ -5,7 +5,7 @@
5
5
  <span class="label warning"><%= t ".always" %></span>
6
6
  <% end %>
7
7
 
8
- <ul class="constraints-list<%= " inactive" if constraints&.detect{|c| c.settings["participatory_space_manifest"]=="none" } %>">
8
+ <ul class="constraints-list<%= " inactive" if constraints&.find { |c| c.settings["participatory_space_manifest"] == "none" } %>">
9
9
  <% constraints&.each do |constraint| %>
10
10
  <li>
11
11
  <% constraint.settings.reverse_each do |k, val| %>
@@ -13,7 +13,7 @@
13
13
  <% end %>
14
14
 
15
15
  <div class="inline-flex items-center gap-1 ml-10">
16
- <button id="<%= "edit-#{key}-#{constraint.id}" %>" type="button" name="button" class="edit-condition button button__xs button__transparent-secondary" data-dialog-open="<%= "edit-modal-#{key}" %>" data-constraints-url="<%= constraint_path(id: constraint.id, key: key) %>">
16
+ <button id="<%= "edit-#{key}-#{constraint.id}" %>" type="button" name="button" class="edit-condition button button__xs button__transparent-secondary" data-dialog-open="<%= "edit-modal-#{key}" %>" data-constraints-url="<%= constraint_path(id: constraint.id, key:) %>">
17
17
  <%= t ".edit" %>
18
18
  </button>
19
19
 
@@ -23,7 +23,7 @@
23
23
  <% end %>
24
24
  </ul>
25
25
 
26
- <button id="<%= "new-#{key}" %>" type="button" name="button" class="add-condition button button__xs button__secondary" data-dialog-open="<%= "new-modal-#{key}" %>" data-constraints-url="<%= new_constraint_path(key: key) %>">
26
+ <button id="<%= "new-#{key}" %>" type="button" name="button" class="add-condition button button__xs button__secondary" data-dialog-open="<%= "new-modal-#{key}" %>" data-constraints-url="<%= new_constraint_path(key:) %>">
27
27
  <%= icon "add-box-line" %>
28
28
  <%= t ".add_condition" %>
29
29
  </button>
@@ -4,10 +4,11 @@
4
4
 
5
5
  <% form.object.scoped_admins&.each do |key, value| %>
6
6
  <div class="card p-4 scoped_admins_container js-box-container" data-key="<%= key %>">
7
- <%= render(partial: "decidim/decidim_awesome/admin/config/autoedit_box_label", locals: { var: "scoped_admins", key: key, scope: "scoped_admin_#{key}", delete_path: decidim_admin_decidim_awesome.scoped_admin_path(key: key) }) %>
8
- <p class="form-error is-visible" id="scoped-admin-error-<%= $key %>"><%= errors[key.to_sym].join("<br>") if errors %></p>
7
+ <%= render(partial: "decidim/decidim_awesome/admin/config/autoedit_box_label", locals: { var: "scoped_admins", key:, scope: "scoped_admin_#{key}", delete_path: decidim_admin_decidim_awesome.scoped_admin_path(key:) }) %>
8
+ <p class="form-error is-visible" id="scoped-admin-error-<%= key %>"><%= errors[key.to_sym].join("<br>") if errors %></p>
9
9
 
10
- <%= select_tag "config[scoped_admins][#{key}]", options_for_select(users_for(value), value), { include_blank: false , class: "multiusers-select", multiple: true, data: { url: decidim_admin_decidim_awesome.users_path } } %>
10
+ <%= hidden_field_tag("config[scoped_admins][#{key}][]") %>
11
+ <%= select_tag "config[scoped_admins][#{key}]", options_for_select(users_for(value), value), { include_blank: false, class: "multiusers-select", multiple: true, data: { url: decidim_admin_decidim_awesome.users_path } } %>
11
12
 
12
13
  <%= render(partial: "decidim/decidim_awesome/admin/config/constraints", locals: { key: "scoped_admin_#{key}", constraints: constraints_for("scoped_admin_#{key}") }) %>
13
14
  </div>
@@ -8,7 +8,7 @@
8
8
  <div class="row column card p-4">
9
9
  <%= form.check_box key, help_text: t("help.#{key}", scope: "decidim.decidim_awesome.admin.config.form") %>
10
10
 
11
- <%= render(partial: "decidim/decidim_awesome/admin/config/constraints", locals: { key: key, constraints: constraints_for(key) }) %>
11
+ <%= render(partial: "decidim/decidim_awesome/admin/config/constraints", locals: { key:, constraints: constraints_for(key) }) %>
12
12
  </div>
13
13
  <% end %>
14
14
  </div>
@@ -8,9 +8,9 @@
8
8
  <div>
9
9
  <p class="help-text text-alert"><%= t("help.proposal_private_custom_fields", scope: "decidim.decidim_awesome.admin.config.form") %></p>
10
10
  <p class="help-text"><%= t("help.proposal_private_custom_fields_translations",
11
- scope: "decidim.decidim_awesome.admin.config.form",
12
- warning: content_tag(:i, t("decidim.decidim_awesome.proposal_private_custom_fields_disclosure")),
13
- key: content_tag("code", "decidim.decidim_awesome.proposal_private_custom_fields_disclosure")
11
+ scope: "decidim.decidim_awesome.admin.config.form",
12
+ warning: content_tag(:i, t("decidim.decidim_awesome.proposal_private_custom_fields_disclosure")),
13
+ key: content_tag("code", "decidim.decidim_awesome.proposal_private_custom_fields_disclosure")
14
14
  ).html_safe %></p>
15
15
  </div>
16
16
  <% else %>
@@ -22,7 +22,7 @@
22
22
  <% end %>
23
23
  <% form.object.send(config_var)&.each do |key, value| %>
24
24
  <div class="card p-4 proposal_custom_fields_container<%= " private" if priv %> js-box-container" data-key="<%= key %>" data-var="<%= config_var %>">
25
- <%= render("decidim/decidim_awesome/admin/config/autoedit_box_label", var: config_var, key: key, scope: "#{field}_#{key}", delete_path: decidim_admin_decidim_awesome.proposal_custom_field_path(key: key, private: priv)) %>
25
+ <%= render("decidim/decidim_awesome/admin/config/autoedit_box_label", var: config_var, key:, scope: "#{field}_#{key}", delete_path: decidim_admin_decidim_awesome.proposal_custom_field_path(key:, private: priv)) %>
26
26
  <p class="form-error is-visible"><%= errors[key.to_sym].join("<br>") if errors %></p>
27
27
 
28
28
  <%= hidden_field_tag key, value, name: "config[#{config_var}][#{key}]" %>
@@ -11,7 +11,7 @@
11
11
  <%= t("help.scoped_admin_styles_variables", scope: "decidim.decidim_awesome.admin.config.form") %>
12
12
  </p>
13
13
  <p class="colors">
14
- <% ["primary", "secondary", "tertiary", "success", "warning", "alert"].each do |color| %>
14
+ <% %w(primary secondary tertiary success warning alert).each do |color| %>
15
15
  <span class="color-box <%= color %>" style="background-color: <%= current_organization.colors[color] %>"></span>
16
16
  <code>var(--<%= color %>)</code>
17
17
  <% end %>
@@ -23,7 +23,7 @@
23
23
  <%= t("help.scoped_styles_variables", scope: "decidim.decidim_awesome.admin.config.form") %>
24
24
  </p>
25
25
  <p class="colors">
26
- <% ["primary", "secondary", "tertiary", "success", "warning", "alert"].each do |color| %>
26
+ <% %w(primary secondary tertiary success warning alert).each do |color| %>
27
27
  <span class="color-box <%= color %>" style="background-color: <%= current_organization.colors[color] %>"></span>
28
28
  <code>var(--<%= color %>)</code>
29
29
  <% end %>
@@ -32,7 +32,7 @@
32
32
  <% end %>
33
33
  <% form.object.send(config_var)&.each do |key, value| %>
34
34
  <div class="card p-4 scoped_styles_container<%= " private" if admin_styles %> js-box-container" data-key="<%= key %>" data-var="<%= config_var %>">
35
- <%= render("decidim/decidim_awesome/admin/config/autoedit_box_label", var: config_var, key: key, scope: "#{style}_#{key}", delete_path: decidim_admin_decidim_awesome.scoped_style_path(key: key, admin_panel: admin_styles)) %>
35
+ <%= render("decidim/decidim_awesome/admin/config/autoedit_box_label", var: config_var, key:, scope: "#{style}_#{key}", delete_path: decidim_admin_decidim_awesome.scoped_style_path(key:, admin_panel: admin_styles)) %>
36
36
  <p class="form-error is-visible" id="custom-style-error-<%= key %>"><%= errors[key.to_sym].join("<br>") if errors %></p>
37
37
  <%= text_area_tag key, value, name: "config[#{config_var}][#{key}]", rows: 5 %>
38
38
  <%= render("decidim/decidim_awesome/admin/config/constraints", key: "#{style}_#{key}", constraints: constraints_for("#{style}_#{key}")) %>