decidim-decidim_awesome 0.11.4 → 0.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -6
  3. data/README.md +33 -39
  4. data/Rakefile +12 -0
  5. data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +14 -2
  6. data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +5 -4
  7. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +4 -4
  8. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +1 -1
  9. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal_cell.rb +3 -5
  10. data/app/commands/concerns/decidim/decidim_awesome/system/{register_organization_override.rb → create_organization_override.rb} +1 -1
  11. data/app/commands/concerns/decidim/decidim_awesome/update_account_override.rb +4 -4
  12. data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +1 -1
  13. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +2 -2
  14. data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
  15. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +41 -0
  16. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
  17. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
  18. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -10
  19. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
  20. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
  21. data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
  22. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
  23. data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
  24. data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
  25. data/app/forms/concerns/decidim/decidim_awesome/proposals/{proposal_wizard_create_step_form_override.rb → proposal_form_customizations.rb} +1 -1
  26. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
  27. data/app/forms/concerns/decidim/decidim_awesome/system/organization_form_override.rb +2 -2
  28. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +13 -0
  29. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +1 -1
  30. data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
  31. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
  32. data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
  33. data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
  34. data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
  35. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
  36. data/app/packs/entrypoints/decidim_admin_decidim_awesome_search_form.scss +1 -0
  37. data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
  38. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +10 -6
  39. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
  40. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
  41. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
  42. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
  43. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
  44. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
  45. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
  46. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
  47. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
  48. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
  49. data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
  50. data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
  51. data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
  52. data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
  53. data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
  54. data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
  55. data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
  56. data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
  57. data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
  58. data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
  59. data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
  60. data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
  61. data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
  62. data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
  63. data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
  64. data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
  65. data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
  66. data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
  67. data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
  68. data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
  69. data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
  70. data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
  71. data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
  72. data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
  73. data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
  74. data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
  75. data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
  76. data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
  77. data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
  78. data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
  79. data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
  80. data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
  81. data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
  82. data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
  83. data/app/packs/src/vendor/hashcash.js +83 -0
  84. data/app/packs/src/vendor/sha1.js +143 -0
  85. data/app/packs/src/vendor/stamp.js +50 -0
  86. data/app/packs/stylesheets/decidim/decidim_awesome/admin/admin_accountability.scss +67 -0
  87. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
  88. data/app/permissions/decidim/decidim_awesome/permissions.rb +3 -2
  89. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
  90. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +12 -0
  91. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +5 -4
  92. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
  93. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
  94. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
  95. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
  96. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
  97. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  98. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
  99. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
  100. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
  101. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
  102. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
  103. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +1 -1
  104. data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
  105. data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
  106. data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
  107. data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
  108. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
  109. data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
  110. data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
  111. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
  112. data/app/views/decidim/decidim_awesome/admin/shared/_filters_with_date.html.erb +41 -32
  113. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
  114. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +5 -0
  115. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +1 -1
  116. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
  117. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
  118. data/config/assets.rb +3 -1
  119. data/config/i18n-tasks.yml +1 -0
  120. data/config/locales/ca.yml +69 -30
  121. data/config/locales/cs.yml +68 -29
  122. data/config/locales/de.yml +67 -28
  123. data/config/locales/en.yml +81 -32
  124. data/config/locales/es.yml +68 -29
  125. data/config/locales/eu.yml +31 -31
  126. data/config/locales/fr.yml +82 -31
  127. data/config/locales/ja.yml +31 -31
  128. data/lib/decidim/decidim_awesome/admin_engine.rb +8 -5
  129. data/lib/decidim/decidim_awesome/awesome.rb +49 -27
  130. data/lib/decidim/decidim_awesome/checksums.yml +47 -42
  131. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +2 -2
  132. data/lib/decidim/decidim_awesome/engine.rb +16 -6
  133. data/lib/decidim/decidim_awesome/menu.rb +151 -138
  134. data/lib/decidim/decidim_awesome/test/initializer.rb +4 -1
  135. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor_examples.rb +14 -14
  136. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +2 -4
  137. data/lib/decidim/decidim_awesome/test/shared_examples/custom_fields_examples.rb +8 -8
  138. data/lib/decidim/decidim_awesome/test/shared_examples/custom_styles_examples.rb +6 -6
  139. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +5 -4
  140. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +5 -5
  141. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +16 -9
  142. data/lib/decidim/decidim_awesome/version.rb +2 -2
  143. data/lib/decidim/decidim_awesome.rb +0 -1
  144. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -5
  145. data/package.json +9 -18
  146. metadata +82 -26
  147. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +0 -107
  148. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +0 -26
  149. data/config/rubocop/disabled.yml +0 -11
  150. data/config/rubocop/faker.yml +0 -480
  151. data/config/rubocop/rails.yml +0 -88
  152. data/config/rubocop/rspec.yml +0 -65
  153. data/config/rubocop/ruby.yml +0 -1210
  154. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +0 -39
  155. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +0 -35
  156. /data/{app/middleware/decidim/decidim_awesome → lib/decidim/decidim_awesome/middleware}/current_config.rb +0 -0
@@ -0,0 +1,108 @@
1
+ NATIVE_NAME = українська мова
2
+ ENGLISH_NAME = Ukrainian
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: false,
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 = Це поле передбачає не менше 2 варіантів
48
+ minSelectionRequired = Вибрати не менш, ніж {min}
49
+ multipleFiles = Кілька файлів
50
+ name = Ім'я
51
+ no = Ні
52
+ noFieldsToClear = Немає полів для очищення
53
+ number = Числове
54
+ off = Вимкнути
55
+ on = Увімкнути
56
+ option = Варіант
57
+ options = Варіанти
58
+ optional = варіативний
59
+ optionLabelPlaceholder = Назва
60
+ optionValuePlaceholder = Значення
61
+ optionEmpty = Необхідно вказати значення
62
+ other = Інша
63
+ paragraph = Абзац
64
+ placeholder = Вільне місце
65
+ placeholders.value = Значення
66
+ placeholders.label = Напис
67
+ placeholders.text =
68
+ placeholders.textarea =
69
+ placeholders.email = Введіть e-mail адресу
70
+ placeholders.placeholder =
71
+ placeholders.className = Назви класів через пробіл
72
+ placeholders.password = Введіть пароль
73
+ preview = Попередній перегляд
74
+ radioGroup = Радіокнопку
75
+ radio = Радіокнопка
76
+ removeMessage = Видалити елемент
77
+ removeOption = Видалити варіант
78
+ remove = ×
79
+ required = Обов'язкове
80
+ richText = Редактор з форматуванням
81
+ roles = Доступ
82
+ rows = Рядки
83
+ save = Зберегти
84
+ selectOptions = Опції
85
+ select = Вибір
86
+ selectColor = Колір
87
+ selectionsMessage = Дозволити виділяти кілька
88
+ size = Розмір
89
+ size.xs = Дуже малий
90
+ size.sm = Малий
91
+ size.m = Звичайний
92
+ size.lg = Великий
93
+ style = Стиль
94
+ styles.btn.default = За замовчуванням
95
+ styles.btn.danger = Небезпека
96
+ styles.btn.info = Інформація
97
+ styles.btn.primary = Попередньо
98
+ styles.btn.success = Успішно
99
+ styles.btn.warning = Попередження
100
+ subtype = Тип
101
+ text = Рядок
102
+ textArea = текстового поля
103
+ toggle = Перемикач
104
+ warning = Увага!
105
+ value = Значення
106
+ viewJSON = [{…}]
107
+ viewXML = </>
108
+ yes = Так
@@ -0,0 +1,94 @@
1
+ NATIVE_NAME = tiếng Việt
2
+ ENGLISH_NAME = Vietnamese
3
+
4
+ addOption = Thêm tùy chọn
5
+ allFieldsRemoved = Tất cả các trường đã bị gỡ bỏ.
6
+ allowSelect = Cho phép chọn
7
+ autocomplete = Tự động hoàn thành
8
+ button = Nút
9
+ cannotBeEmpty = Trường này không thể để trống
10
+ checkboxGroup = Nhóm hộp kiểm
11
+ checkbox = Hộp kiểm
12
+ checkboxes = Các hộp kiểm
13
+ class = Class
14
+ clearAllMessage = Bạn có chắc muốn xóa tất cả các trường?
15
+ clear = Xóa
16
+ close = Đóng
17
+ content = Nội dung
18
+ copy = Sao chép vào bộ nhớ
19
+ dateField = Trường thời gian
20
+ description = Văn bản trợ giúp
21
+ descriptionField = Mô tả
22
+ devMode = Chế độ nhà phát triển
23
+ editNames = Sửa tên
24
+ editorTitle = Các phần tử biểu mẫu
25
+ editXML = Sửa XML
26
+ fieldDeleteWarning: false
27
+ fieldVars = Field Variables
28
+ fieldNonEditable = Trường này không thể sửa
29
+ fieldRemoveWarning = Bạn có chắc muốn xóa trường này?
30
+ fileUpload = Tải lên tập tin
31
+ formUpdated = Biểu mẫu đã cập nhật
32
+ getStarted = Kéo một trường từ bên phải vào vùng này
33
+ header = Tiêu đề
34
+ hide = Sửa
35
+ hidden = Input ẩn
36
+ label = Nhãn
37
+ labelEmpty = Nhãn không thể để trống
38
+ limitRole = Giới hạn truy cập vào một trong những quyền sau:
39
+ mandatory = Bắt buộc
40
+ maxlength = Độ dài tối đa
41
+ minOptionMessage = Trường này yêu cầu tối thiểu 2 tùy chọn
42
+ name = Tên
43
+ no = Không
44
+ off = Tắt
45
+ on = Bật
46
+ option = Tùy chọn
47
+ optional = tùy chọn
48
+ optionEmpty = Giá trị của tùy chọn là bắt buộc
49
+ paragraph = Đoạn văn bản
50
+ placeholder = Phần giữ chỗ
51
+ placeholder.value = Giá trị
52
+ placeholder.label = Nhãn
53
+ placeholder.text = Nhập văn bản
54
+ placeholder.textarea = Nhập một đoạn văn bản
55
+ placeholder.email = Nhập địa chỉ email của bạn
56
+ placeholder.placeholder = Phần giữ chỗ
57
+ placeholder.className = các class
58
+ placeholder.password = Nhập mật khẩu của bạn
59
+ preview = Xem trước
60
+ radioGroup = Nhóm Radio
61
+ radio = Radio
62
+ removeMessage = Gỡ bỏ phần tử
63
+ remove = ×
64
+ required = Bắt buộc
65
+ richText = Trình soạn thảo văn bản có định dạng
66
+ roles = Truy cập
67
+ save = Lưu lại
68
+ selectOptions = Các tùy chọn
69
+ select = Chọn
70
+ selectColor = Chọn màu
71
+ selectionsMessage = Cho phép nhiều lựa chọn
72
+ size = Kích cỡ
73
+ sizes = Kích cỡ
74
+ sizes.xs = Rất nhỏ
75
+ sizes.sm = Nhỏ
76
+ sizes.m = Mặc định
77
+ sizes.lg = Lớn
78
+ style = Style
79
+ styles = Styles
80
+ styles.btn = Kiểu nút
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 = Loại
88
+ text = Trường văn bản
89
+ textArea = Vùng văn bản
90
+ toggle = Bật tắt
91
+ warning = Cảnh báo!
92
+ viewJSON = { }
93
+ viewXML = </>
94
+ yes = Đồng ý
@@ -0,0 +1,100 @@
1
+ NATIVE_NAME = 简体中文
2
+ ENGLISH_NAME = Chinese
3
+
4
+ addOption = 新增选项
5
+ number = 数字
6
+ allFieldsRemoved = 所有字段已删除
7
+ allowSelect = 允许选择
8
+ autocomplete = 自动完成
9
+ button = 按钮
10
+ cannotBeEmpty = 此字段不能为空
11
+ checkboxGroup = 复选框组
12
+ checkbox = 复选框
13
+ checkboxes = 复选框
14
+ class = CSS样式
15
+ clearAllMessage = 您确定要清空所有字段吗?
16
+ clear = 清除所有
17
+ close = 关闭
18
+ content = 内容
19
+ copy = 复制
20
+ copyButtonTooltip=复制
21
+ dateField = 日期字段
22
+ description = 帮助信息
23
+ descriptionField = 描述
24
+ devMode = 开发者模式
25
+ editNames = 编辑名称
26
+ editorTitle = 表单元素
27
+ editXML = 编辑XML
28
+ fieldDeleteWarning: false
29
+ fieldVars = 字段变量
30
+ fieldNonEditable = 此字段不允许修改。
31
+ fieldRemoveWarning = 您确定要移除此字段吗?
32
+ fileUpload = 文件上传
33
+ formUpdated = 表单已更新
34
+ getStarted = 请从右边拖拽原件到此为止。
35
+ header = 表头
36
+ hide = 编辑
37
+ hidden = 隐藏域
38
+ label = 标签
39
+ labelEmpty = 标签字段不能为空
40
+ limitRole = 角色受限
41
+ mandatory = 强制填写
42
+ maxlength = 最大长度
43
+ minOptionMessage = 此字段至少需要选择两项
44
+ name = 名称
45
+ no = 否
46
+ off = 关
47
+ on = 开
48
+ option = 选项
49
+ optional = 可选
50
+ optionEmpty = 请输入选择
51
+ paragraph = 段落
52
+ placeholder = 占位符
53
+ placeholder.value = 值
54
+ placeholder.label = 标签
55
+ placeholder.text = 请输入文字
56
+ placeholder.textarea = 请输入文字
57
+ placeholder.email = 请输入邮件地址
58
+ placeholder.placeholder = 占位符
59
+ placeholder.className = 输入类名,以空格分开
60
+ placeholder.password = 请输入密码
61
+ preview = 预览
62
+ radioGroup = 单选组
63
+ radio = 单选框
64
+ removeMessage = 移除元件
65
+ remove = &#215;
66
+ required = 必填
67
+ richText = 富文本框
68
+ roles = 访问
69
+ save = 保存
70
+ selectOptions = 选项
71
+ select = 选择
72
+ selectColor = 选择颜色
73
+ selectionsMessage = 允许多选
74
+ size = 大小
75
+ sizes = 大小
76
+ sizes.xs = 最小
77
+ sizes.sm = 小
78
+ sizes.m = 中
79
+ sizes.lg = 大
80
+ style = 样式
81
+ styles = 样式
82
+ styles.btn = 按钮样式
83
+ styles.btn.default = 默认样式
84
+ styles.btn.danger = 危险
85
+ styles.btn.info = 一般信息
86
+ styles.btn.primary = 主样式
87
+ styles.btn.success = 成功
88
+ styles.btn.warning = 警告
89
+ subtype = 格式
90
+ text = 单行文本
91
+ password = 密码
92
+ email = 邮箱
93
+ color = 颜色
94
+ tel = 电话
95
+ textArea = 多行文本
96
+ toggle = 弹出提示
97
+ warning = 警告!
98
+ viewXML = </>
99
+ viewJSON = { }
100
+ yes = 是
@@ -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 = &#215;
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
+ }