decidim-core 0.26.7 → 0.26.8

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/collapsible_list/show.erb +1 -1
  3. data/app/controllers/decidim/authorization_modals_controller.rb +1 -1
  4. data/app/forms/url_validator.rb +1 -1
  5. data/app/helpers/decidim/layout_helper.rb +15 -4
  6. data/app/helpers/decidim/layout_helper.rb.orig +225 -0
  7. data/app/models/decidim/organization.rb +6 -0
  8. data/app/packs/src/decidim/map/controller/drag_marker.js +0 -2
  9. data/app/packs/src/decidim/map/controller/markers.js +0 -1
  10. data/app/packs/src/decidim/map/controller/static.js +0 -1
  11. data/app/packs/src/decidim/map/controller.js +0 -2
  12. data/app/packs/src/decidim/map/factory.js +4 -1
  13. data/app/packs/src/decidim/map/icon.js +0 -1
  14. data/app/packs/src/decidim/map/legacy.js +0 -1
  15. data/app/packs/src/decidim/map/provider/default.js +2 -0
  16. data/app/packs/src/decidim/map/provider/here.js +2 -1
  17. data/app/packs/stylesheets/decidim/modules/_dropdown_menu.scss +9 -0
  18. data/app/queries/decidim/metrics/users_metric_manage.rb +6 -6
  19. data/app/views/decidim/devise/registrations/new.html.erb.orig +231 -0
  20. data/config/environment.rb +0 -0
  21. data/config/locales/ar.yml +2 -2
  22. data/config/locales/ca.yml +7 -6
  23. data/config/locales/cs.yml +23 -7
  24. data/config/locales/de.yml +47 -12
  25. data/config/locales/el.yml +100 -0
  26. data/config/locales/en.yml +1 -0
  27. data/config/locales/eo.yml +3 -0
  28. data/config/locales/es-MX.yml +2 -1
  29. data/config/locales/es-PY.yml +4 -3
  30. data/config/locales/es.yml +7 -6
  31. data/config/locales/eu.yml +4 -4
  32. data/config/locales/fi-plain.yml +22 -0
  33. data/config/locales/fi.yml +1 -0
  34. data/config/locales/fr-CA.yml +6 -5
  35. data/config/locales/fr.yml +7 -6
  36. data/config/locales/gl.yml +4 -1
  37. data/config/locales/hu.yml +22 -1
  38. data/config/locales/id-ID.yml +4 -0
  39. data/config/locales/is-IS.yml +3 -1
  40. data/config/locales/it.yml +6 -6
  41. data/config/locales/ja.yml +15 -0
  42. data/config/locales/kaa.yml +4 -0
  43. data/config/locales/lb.yml +8 -8
  44. data/config/locales/lt.yml +1 -1
  45. data/config/locales/nl.yml +6 -6
  46. data/config/locales/no.yml +4 -4
  47. data/config/locales/pt-BR.yml +1 -1
  48. data/config/locales/pt.yml +1 -1
  49. data/config/locales/ru.yml +2 -0
  50. data/config/locales/sk.yml +17 -7
  51. data/config/locales/sr-CS.yml +8 -0
  52. data/config/locales/sv.yml +11 -11
  53. data/config/locales/uk.yml +2 -0
  54. data/config/locales/zh-TW.yml +16 -2
  55. data/db/migrate/20181030090144_destroy_deleted_users_follows.rb +1 -1
  56. data/db/migrate/20181204110723_remove_following_users_count_from_users.rb +11 -2
  57. data/db/migrate/20181214101250_add_notification_types_to_users.rb +6 -1
  58. data/db/migrate/20190412131728_fix_user_names.rb +13 -6
  59. data/db/migrate/20200211173227_add_direct_message_types_to_users.rb +6 -1
  60. data/db/migrate/20210302150803_invalidate_all_sessions_for_deleted_users.rb +10 -3
  61. data/db/migrate/20210310120640_add_followable_counter_cache_to_users.rb +13 -3
  62. data/lib/decidim/core/test/shared_examples/map_examples.rb +4 -1
  63. data/lib/decidim/core/version.rb +1 -1
  64. data/lib/decidim/core.rb +43 -0
  65. data/lib/decidim/dependency_resolver.rb +272 -0
  66. data/lib/decidim/form_builder.rb +6 -13
  67. data/lib/tasks/upgrade/decidim_user_moderation.rake +14 -0
  68. metadata +12 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d573b856227ec581d40d90cff9a85c1f21502a1ed6278b82aa9768a434f0e9c
4
- data.tar.gz: 2ca2fff70b6e6b9314450c35ab22965b3ba60af303a2839c7716e502cb566b3a
3
+ metadata.gz: 7ddc4e551d59fc9b95f5121333870c4e91a77eb2f53d03f659d63e16bea7ca7f
4
+ data.tar.gz: dd766575d88dfe729ce7f8ea151967642b40e875c0596443962d0a6d8d5cd101
5
5
  SHA512:
6
- metadata.gz: 1000d09afe7e9af0586fa14c917c77a150bf9f55adee9d0a243744799a9cf9c84aa364b0f014cdec6eda3855c10b4b15772732c979d9f15e381c8a62e78aad8f
7
- data.tar.gz: 1a4feafaa713a4fa540aab815e0306f125cc74d45599d5defbec2e9dd2cce8bc6223acd0148424b3973a0f1d6853b96cd3ee9a6fda7ff45cc91073fd2b84ac8a
6
+ metadata.gz: dcbcc2625fe80e646c9f5e05c0e187485004542bcb73c33978bd8f2b1f78f31c2e0a4f4dba6904ba0b660e5b4408977a21d13e0c02fe2d46cba8bdb13c399321
7
+ data.tar.gz: a1abc1c25bfe4c99875d00822beeefeadb20bd214672772b1491d07e515ce3990b6b24c96d5400e4bc71d1accb8c8484d7e57c6ed006f63fd19e23f8378234ce
@@ -16,7 +16,7 @@
16
16
  </span>
17
17
  </div>
18
18
  <% else %>
19
- <div class="collapsible-list <%= list_class %>">
19
+ <div class="<%= list_class %>">
20
20
  <% list.each do |element| %>
21
21
  <% if cell_name %>
22
22
  <%= cell cell_name, element, cell_options %>
@@ -17,7 +17,7 @@ module Decidim
17
17
  end
18
18
 
19
19
  def current_component
20
- @current_component ||= Decidim::Component.find(params[:component_id])
20
+ @current_component ||= Decidim::Component.where(participatory_space: current_organization.participatory_spaces).find(params[:component_id])
21
21
  end
22
22
 
23
23
  def authorization_action
@@ -6,7 +6,7 @@
6
6
  #
7
7
  class UrlValidator < ActiveModel::EachValidator
8
8
  def validate_each(record, attribute, value)
9
- record.errors[attribute] << (options[:message] || "must be a valid URL") unless url_valid?(value)
9
+ record.errors.add attribute, :url_format, **options unless url_valid?(value)
10
10
  end
11
11
 
12
12
  # a URL may be technically well-formed but may
@@ -74,8 +74,11 @@ module Decidim
74
74
  classes = _icon_classes(options) + ["external-icon"]
75
75
 
76
76
  if path.split(".").last == "svg"
77
+ icon_path = application_path(path)
78
+ return unless icon_path
79
+
77
80
  attributes = { class: classes.join(" ") }.merge(options)
78
- asset = File.read(application_path(path))
81
+ asset = File.read(icon_path)
79
82
  asset.gsub("<svg ", "<svg#{tag_builder.tag_options(attributes)} ").html_safe
80
83
  else
81
84
  image_pack_tag(path, class: classes.join(" "), style: "display: none")
@@ -83,9 +86,17 @@ module Decidim
83
86
  end
84
87
 
85
88
  def application_path(path)
86
- img_path = asset_pack_path(path)
87
- img_path = URI(img_path).path if Decidim.cors_enabled
88
- Rails.root.join("public/#{img_path}")
89
+ # Force the path to be returned without the protocol and host even when a
90
+ # custom asset host has been defined. The host parameter needs to be a
91
+ # non-nil because otherwise it will be set to the asset host at
92
+ # ActionView::Helpers::AssetUrlHelper#compute_asset_host.
93
+ img_path = asset_pack_path(path, host: "", protocol: :relative)
94
+ path = Rails.public_path.join(img_path.sub(%r{^/}, ""))
95
+ return unless File.exist?(path)
96
+
97
+ path
98
+ rescue ::Webpacker::Manifest::MissingEntryError
99
+ nil
89
100
  end
90
101
 
91
102
  # Allows to create role attribute according to accessibility rules
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # View helpers related to the layout.
5
+ module LayoutHelper
6
+ include Decidim::ModalHelper
7
+ include Decidim::TooltipHelper
8
+
9
+ # Public: Generates a set of meta tags that generate the different favicon
10
+ # versions for an organization.
11
+ #
12
+ # Returns a safe String with the versions.
13
+ def favicon
14
+ return if current_organization.favicon.blank?
15
+
16
+ safe_join(Decidim::OrganizationFaviconUploader::SIZES.map do |version, size|
17
+ favicon_link_tag(current_organization.attached_uploader(:favicon).variant_url(version, host: current_organization.host), sizes: "#{size}x#{size}")
18
+ end)
19
+ end
20
+
21
+ def apple_favicon
22
+ icon_image = current_organization.attached_uploader(:favicon).variant_url(:medium, host: current_organization.host)
23
+ return unless icon_image
24
+
25
+ favicon_link_tag(icon_image, rel: "apple-touch-icon", type: "image/png")
26
+ end
27
+
28
+ def legacy_favicon
29
+ variant = :favicon if current_organization.favicon.content_type != "image/vnd.microsoft.icon"
30
+ icon_image = current_organization.attached_uploader(:favicon).variant_url(variant, host: current_organization.host)
31
+ return unless icon_image
32
+
33
+ favicon_link_tag(icon_image, rel: "icon", sizes: "any", type: nil)
34
+ end
35
+
36
+ # Outputs an SVG-based icon.
37
+ #
38
+ # name - The String with the icon name.
39
+ # options - The Hash options used to customize the icon (default {}):
40
+ # :width - The Number of width in pixels (optional).
41
+ # :height - The Number of height in pixels (optional).
42
+ # :title - The title for the SVG element (optional, similar to alt for img)
43
+ # :aria_label - The String to set as aria label (optional).
44
+ # :aria_hidden - The Truthy value to enable aria_hidden (optional).
45
+ # :role - The String to set as the role (optional).
46
+ # :class - The String to add as a CSS class (optional).
47
+ #
48
+ # Returns a String.
49
+ def redesigned_icon(name, options = {})
50
+ default_html_properties = {
51
+ "width" => "1em",
52
+ "height" => "1em",
53
+ "role" => "img",
54
+ "aria-hidden" => "true"
55
+ }
56
+
57
+ html_properties = options.with_indifferent_access.transform_keys(&:dasherize).slice("width", "height", "aria-label", "role", "aria-hidden", "class", "style")
58
+ html_properties = default_html_properties.merge(html_properties)
59
+
60
+ href = Decidim.cors_enabled ? "" : asset_pack_path("media/images/remixicon.symbol.svg")
61
+
62
+ content_tag :svg, html_properties do
63
+ content_tag :use, nil, "href" => "#{href}#ri-#{name}", tabindex: -1
64
+ end
65
+ end
66
+
67
+ def legacy_icon(name, options = {})
68
+ options = options.with_indifferent_access
69
+ html_properties = {}
70
+
71
+ html_properties["width"] = options[:width]
72
+ html_properties["height"] = options[:height]
73
+ html_properties["aria-label"] = options[:aria_label] || options[:"aria-label"]
74
+ html_properties["role"] = options[:role] || "img"
75
+ html_properties["aria-hidden"] = options[:aria_hidden] || options[:"aria-hidden"]
76
+
77
+ html_properties["class"] = (["icon--#{name}"] + _icon_classes(options)).join(" ")
78
+
79
+ title = options["title"] || html_properties["aria-label"]
80
+ if title.blank? && html_properties["role"] == "img"
81
+ # This will make the accessibility audit tools happy as with the "img"
82
+ # role, the alternative text (aria-label) and title are required for the
83
+ # element. This will also force the SVG to be hidden because otherwise
84
+ # the screen reader would announce the icon name which can be in
85
+ # different language (English) than the page language which is not
86
+ # allowed.
87
+ title = name
88
+ html_properties["aria-label"] = title
89
+ html_properties["aria-hidden"] = true
90
+ end
91
+
92
+ href = Decidim.cors_enabled ? "" : asset_pack_path("media/images/icons.svg")
93
+
94
+ content_tag :svg, html_properties do
95
+ inner = content_tag :title, title
96
+ inner += content_tag :use, nil, "href" => "#{href}#icon-#{name}"
97
+
98
+ inner
99
+ end
100
+ end
101
+
102
+ def icon(*args)
103
+ redesign_enabled? ? redesigned_icon(*args) : legacy_icon(*args)
104
+ end
105
+
106
+ # Outputs a SVG icon from an external file. It apparently renders an image
107
+ # tag, but then a JS script kicks in and replaces it with an inlined SVG
108
+ # version.
109
+ #
110
+ # path - The asset's path
111
+ #
112
+ # Returns an <img /> tag with the SVG icon.
113
+ def external_icon(path, options = {})
114
+ classes = _icon_classes(options) + ["external-icon"]
115
+
116
+ if path.split(".").last == "svg"
117
+ icon_path = application_path(path)
118
+ return unless icon_path
119
+
120
+ attributes = { class: classes.join(" ") }.merge(options)
121
+ asset = File.read(icon_path)
122
+ asset.gsub("<svg ", "<svg#{tag_builder.tag_options(attributes)} ").html_safe
123
+ else
124
+ image_pack_tag(path, class: classes.join(" "), style: "display: none")
125
+ end
126
+ end
127
+
128
+ def application_path(path)
129
+ # Force the path to be returned without the protocol and host even when a
130
+ # custom asset host has been defined. The host parameter needs to be a
131
+ # non-nil because otherwise it will be set to the asset host at
132
+ # ActionView::Helpers::AssetUrlHelper#compute_asset_host.
133
+ img_path = asset_pack_path(path, host: "", protocol: :relative)
134
+ path = Rails.public_path.join(img_path.sub(%r{^/}, ""))
135
+ return unless File.exist?(path)
136
+
137
+ path
138
+ rescue ::Webpacker::Manifest::MissingEntryError
139
+ nil
140
+ end
141
+
142
+ # Allows to create role attribute according to accessibility rules
143
+ #
144
+ # Returns role attribute string if role option is specified
145
+ def role(options = {})
146
+ "role=\"#{options[:role]}\" " if options[:role]
147
+ end
148
+
149
+ def _icon_classes(options = {})
150
+ classes = options[:remove_icon_class] ? [] : ["icon"]
151
+ classes += [options[:class]]
152
+ classes.compact
153
+ end
154
+
155
+ def extended_navigation_bar(items, max_items: 5)
156
+ return unless items.any?
157
+
158
+ extra_items = items.slice((max_items + 1)..-1) || []
159
+ active_item = items.find { |item| item[:active] }
160
+
161
+ controller.view_context.render partial: "decidim/shared/extended_navigation_bar", locals: {
162
+ items:,
163
+ extra_items:,
164
+ active_item:,
165
+ max_items:
166
+ }
167
+ end
168
+
169
+ # Renders a view with the customizable CSS variables in two flavours:
170
+ # 1. as a hexadecimal valid CSS color (ie: #ff0000)
171
+ # 2. as a disassembled RGB components (ie: 255 0 0)
172
+ #
173
+ # Example:
174
+ #
175
+ # --primary: #ff0000;
176
+ # --primary-rgb: 255,0,0
177
+ #
178
+ # Hexadecimal variables can be used as a normal CSS color:
179
+ #
180
+ # color: var(--primary)
181
+ #
182
+ # While the disassembled variant can be used where you need to manipulate
183
+ # the color somehow (ie: adding a background transparency):
184
+ #
185
+ # background-color: rgba(var(--primary-rgb), 0.5)
186
+ def organization_colors
187
+ css = current_organization.colors.each.map { |k, v| "--#{k}: #{v};--#{k}-rgb: #{v[1..2].hex} #{v[3..4].hex} #{v[5..6].hex};" }.join
188
+ render partial: "layouts/decidim/organization_colors", locals: { css: }
189
+ end
190
+
191
+ <<<<<<< HEAD
192
+ def current_user_unread_data
193
+ return {} if current_user.blank?
194
+
195
+ {}.tap do |d|
196
+ d.merge!(unread_notifications: true) if current_user.notifications.any?
197
+ d.merge!(unread_conversations: true) if current_user.unread_conversations.any?
198
+ d.merge!(unread_items: d.present?)
199
+ end
200
+ end
201
+
202
+ ||||||| parent of 53b6893e5c (Use local emojibase data instead of CDN)
203
+ =======
204
+ # Public: Gets the name of the webpacker entrypoint that will be used
205
+ # for the locale of the Emojibase NPM package, used with @picmo/popup-picker
206
+ #
207
+ # Returns a string with the entrypoint name
208
+ def emojibase_entrypoint_locale
209
+ entrypoint = Decidim::Webpacker.configuration.entrypoints.keys.select do |entry|
210
+ entry == "decidim_emojibase_#{I18n.locale}"
211
+ end
212
+
213
+ return "decidim_emojibase_en" if entrypoint.empty?
214
+
215
+ entrypoint.first
216
+ end
217
+
218
+ >>>>>>> 53b6893e5c (Use local emojibase data instead of CDN)
219
+ private
220
+
221
+ def tag_builder
222
+ @tag_builder ||= ActionView::Helpers::TagHelper::TagBuilder.new(self)
223
+ end
224
+ end
225
+ end
@@ -87,6 +87,12 @@ module Decidim
87
87
  @top_scopes ||= scopes.top_level
88
88
  end
89
89
 
90
+ def participatory_spaces
91
+ @participatory_spaces ||= Decidim.participatory_space_manifests.flat_map do |manifest|
92
+ manifest.participatory_spaces.call(self)
93
+ end
94
+ end
95
+
90
96
  def public_participatory_spaces
91
97
  @public_participatory_spaces ||= Decidim.participatory_space_manifests.flat_map do |manifest|
92
98
  manifest.participatory_spaces.call(self).public_spaces
@@ -1,6 +1,4 @@
1
- import * as L from "leaflet";
2
1
  import MapController from "src/decidim/map/controller"
3
- import "src/decidim/vendor/leaflet-tilelayer-here"
4
2
 
5
3
  export default class MapDragMarkerController extends MapController {
6
4
  start() {
@@ -1,5 +1,4 @@
1
1
  import "src/decidim/vendor/jquery-tmpl"
2
- import * as L from "leaflet";
3
2
  import MapController from "src/decidim/map/controller"
4
3
  import "leaflet.markercluster";
5
4
 
@@ -1,4 +1,3 @@
1
- import * as L from "leaflet";
2
1
  import MapController from "src/decidim/map/controller"
3
2
 
4
3
  const openLink = window.open;
@@ -1,5 +1,3 @@
1
- import * as L from "leaflet";
2
- import "src/decidim/map/icon"
3
1
  import MapControllerRegistry from "src/decidim/map/controller_registry"
4
2
 
5
3
  export default class MapController {
@@ -1,3 +1,5 @@
1
+ import "src/decidim/map/icon"
2
+
1
3
  import MapMarkersController from "src/decidim/map/controller/markers"
2
4
  import MapStaticController from "src/decidim/map/controller/static"
3
5
  import MapDragMarkerController from "src/decidim/map/controller/drag_marker"
@@ -22,7 +24,8 @@ import MapDragMarkerController from "src/decidim/map/controller/drag_marker"
22
24
  * window.Decidim.createMapController = (mapId, config) => {
23
25
  * if (config.type === "custom") {
24
26
  * // Obviously you need to implement CustomMapController for this to
25
- * // work.
27
+ * // work. You can find an example at:
28
+ * // decidim-dev/app/packs/src/decidim/dev/test/custom_map_factory.js
26
29
  * return new window.Decidim.CustomMapController(mapId, config);
27
30
  * }
28
31
  *
@@ -1,4 +1,3 @@
1
- import * as L from "leaflet";
2
1
  import { SVGIcon } from "leaflet-svgicon"
3
2
 
4
3
  L.DivIcon.SVGIcon = SVGIcon;
@@ -1,6 +1,5 @@
1
1
  /* eslint-disable require-jsdoc */
2
2
 
3
- import * as L from "leaflet";
4
3
  import "src/decidim/map/factory"
5
4
 
6
5
  /**
@@ -1,3 +1,5 @@
1
+ import "leaflet"
2
+
1
3
  /**
2
4
  * NOTE:
3
5
  * This has to load before decidim/map in order for it to apply correctly when
@@ -1,4 +1,5 @@
1
- import * as L from "leaflet"
1
+ import "leaflet"
2
+ import "src/decidim/vendor/leaflet-tilelayer-here"
2
3
 
3
4
  /**
4
5
  * NOTE:
@@ -0,0 +1,9 @@
1
+ .dropdown.menu > li {
2
+ &.is-active > a {
3
+ color: var(--secondary);
4
+ }
5
+
6
+ &.is-dropdown-submenu-parent > a::after {
7
+ border-color: var(--secondary) transparent transparent;
8
+ }
9
+ }
@@ -11,15 +11,15 @@ module Decidim
11
11
  private
12
12
 
13
13
  def query
14
- return @query if @query
15
-
16
- @query = Decidim::User.where(organization: @organization)
17
- @query = @query.where("created_at <= ?", end_time)
18
- @query
14
+ @query ||= Decidim::User.where(organization: @organization)
15
+ .where("deleted_at IS NULL OR deleted_at > ?", end_time)
16
+ .where("blocked_at IS NULL OR blocked_at > ?", end_time)
17
+ .confirmed
18
+ .where("created_at <= ?", end_time)
19
19
  end
20
20
 
21
21
  def quantity
22
- @quantity ||= @query.where("created_at >= ?", start_time).count
22
+ @quantity ||= query.where("created_at >= ?", start_time).count
23
23
  end
24
24
  end
25
25
  end
@@ -0,0 +1,231 @@
1
+ <% add_decidim_page_title(t(".sign_up")) %>
2
+
3
+ <% content_for :devise_links do %>
4
+ <%= render "decidim/devise/shared/links" %>
5
+ <% end %>
6
+
7
+ <%= render layout: "layouts/decidim/shared/layout_center" do %>
8
+ <div class="flex justify-center">
9
+ <h1 class="h3 md:h1 decorator my-12"><%= t("decidim.devise.registrations.new.sign_up") %></h1>
10
+ </div>
11
+
12
+ <div class="login__info">
13
+ <p>
14
+ <%= t("decidim.devise.registrations.new.subtitle") %>
15
+ </p>
16
+ <p class="font-semibold">
17
+ <%= t("decidim.devise.registrations.new.already_have_an_account?") %>
18
+ <%= link_to t("decidim.devise.registrations.new.sign_in"), new_user_session_path %>
19
+ </p>
20
+ </div>
21
+
22
+ <div class="login__info-required">
23
+ <%= form_required_explanation %>
24
+ </div>
25
+
26
+ <div class="login__omniauth-container">
27
+ <% cache current_organization do %>
28
+ <%= render "decidim/devise/shared/omniauth_buttons" %>
29
+ <% end %>
30
+ </div>
31
+
32
+ <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { id: "register-form" }) do |f| %>
33
+ <%= invisible_captcha %>
34
+
35
+ <div class="form__wrapper">
36
+ <%= f.text_field :name, help_text: t("decidim.devise.registrations.new.username_help"), autocomplete: "name", placeholder: "John Doe" %>
37
+
38
+ <%= f.text_field :nickname, help_text: t("decidim.devise.registrations.new.nickname_help", organization: current_organization.name), autocomplete: "nickname", placeholder: "johndoe" %>
39
+
40
+ <%= f.email_field :email, autocomplete: "email", placeholder: "hi@email.com" %>
41
+
42
+ <%= f.password_field :password, password_field_options_for(:user) %>
43
+
44
+ <%= f.password_field :password_confirmation, password_field_options_for(:user).except(:help_text) %>
45
+ </div>
46
+
47
+ <div id="card__tos" class="form__wrapper-block">
48
+ <h4 class="h4"><%= t("decidim.devise.registrations.new.tos_title") %></h4>
49
+
50
+ <div class="tos-text">
51
+ <% terms_of_service_summary_content_blocks.each do |content_block| %>
52
+ <%= cell content_block.manifest.cell, content_block %>
53
+ <% end %>
54
+ </div>
55
+
56
+ <%= f.check_box :tos_agreement, label: t("decidim.devise.registrations.new.tos_agreement", link: link_to(t("decidim.devise.registrations.new.terms"), page_path("terms-of-service"))), label_options: { class: "form__wrapper-checkbox-label" } %>
57
+ </div>
58
+
59
+ <div id="card__newsletter" class="form__wrapper-block">
60
+ <h4 class="h4"><%= t("decidim.devise.registrations.new.newsletter_title") %></h4>
61
+ <%= f.check_box :newsletter, label: t("decidim.devise.registrations.new.newsletter"), checked: @form.newsletter, label_options: { class: "form__wrapper-checkbox-label" } %>
62
+ </div>
63
+
64
+ <div class="form__wrapper-block">
65
+ <button type="submit" class="button button__lg button__secondary">
66
+ <%= t("decidim.devise.registrations.new.sign_up") %>
67
+ <%= icon "arrow-right-line", class: "fill-current" %>
68
+ </button>
69
+ </div>
70
+
71
+ <div class="login__links">
72
+ <%= render "decidim/devise/shared/redesigned_links" %>
73
+ </div>
74
+ <% end %>
75
+ <% end %>
76
+
77
+ <<<<<<< HEAD
78
+ ||||||| parent of 4e14afa36c (add password toggle via unobstructive javascript)
79
+ <div class="row">
80
+ <div class="columns large-6 medium-10 medium-centered">
81
+
82
+ <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { class: "register-form new_user", id: "register-form" }) do |f| %>
83
+ <%= invisible_captcha %>
84
+ <div class="card">
85
+ <div class="card__content">
86
+ <%= form_required_explanation %>
87
+
88
+ <div class="user-person">
89
+ <div class="field">
90
+ <%= f.text_field :name, help_text: t(".username_help"), autocomplete: "name" %>
91
+ </div>
92
+ </div>
93
+
94
+ <div class="user-nickname">
95
+ <div class="field">
96
+ <%= f.text_field :nickname, help_text: t(".nickname_help", organization: current_organization.name), prefix: { value: "@", small: 1, large: 1 }, autocomplete: "nickname" %>
97
+ </div>
98
+ </div>
99
+
100
+ <div class="field">
101
+ <%= f.email_field :email, autocomplete: "email" %>
102
+ </div>
103
+
104
+ <div class="field">
105
+ <%= f.password_field :password, password_field_options_for(:user) %>
106
+ </div>
107
+
108
+ <div class="field">
109
+ <%= f.password_field :password_confirmation, password_field_options_for(:user).except(:help_text) %>
110
+ </div>
111
+ </div>
112
+ </div>
113
+
114
+ <div class="card" id="card__tos">
115
+ <div class="card__content">
116
+ <h3><%= t(".tos_title") %></h3>
117
+
118
+ <p class="tos-text">
119
+ <%= strip_tags(translated_attribute(terms_and_conditions_page.content)) %>
120
+ </p>
121
+
122
+ <div class="field">
123
+ <%= f.check_box :tos_agreement, label: t(".tos_agreement", link: link_to(t(".terms"), page_path("terms-and-conditions"))) %>
124
+ </div>
125
+ </div>
126
+ </div>
127
+
128
+ <div class="card" id="card__newsletter">
129
+ <div class="card__content">
130
+ <h3><%= t(".newsletter_title") %></h3>
131
+ <div class="field">
132
+ <%= f.check_box :newsletter, label: t(".newsletter"), checked: @form.newsletter %>
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ <div class="card">
138
+ <div class="card__content">
139
+ <div class="actions">
140
+ <%= f.submit t("devise.registrations.new.sign_up"), class: "button expanded" %>
141
+ </div>
142
+ <%= yield :devise_links %>
143
+ </div>
144
+ </div>
145
+ <% end %>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ =======
151
+ <div class="row">
152
+ <div class="columns large-6 medium-10 medium-centered">
153
+
154
+ <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { class: "register-form new_user", id: "register-form" }) do |f| %>
155
+ <%= invisible_captcha %>
156
+ <div class="card">
157
+ <div class="card__content">
158
+ <%= form_required_explanation %>
159
+
160
+ <div class="user-person">
161
+ <div class="field">
162
+ <%= f.text_field :name, help_text: t(".username_help"), autocomplete: "off" %>
163
+ </div>
164
+ </div>
165
+
166
+ <div class="user-nickname">
167
+ <div class="field">
168
+ <%= f.text_field :nickname, help_text: t(".nickname_help", organization: current_organization.name), prefix: { value: "@", small: 1, large: 1 }, autocomplete: "off" %>
169
+ </div>
170
+ </div>
171
+
172
+ <div class="field">
173
+ <%= f.email_field :email, autocomplete: "email" %>
174
+ </div>
175
+
176
+ <div class="user-password">
177
+ <div class="field">
178
+ <%= f.password_field :password, password_field_options_for(:user) %>
179
+ </div>
180
+ </div>
181
+
182
+ <div class="user-password-confirmation">
183
+ <div class="field">
184
+ <%= f.password_field :password_confirmation, password_field_options_for(:user).except(:help_text) %>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+
190
+ <div class="card" id="card__tos">
191
+ <div class="card__content">
192
+ <h3><%= t(".tos_title") %></h3>
193
+
194
+ <p class="tos-text">
195
+ <%= strip_tags(translated_attribute(terms_and_conditions_page.content)) %>
196
+ </p>
197
+
198
+ <div class="field">
199
+ <%= f.check_box :tos_agreement, label: t(".tos_agreement", link: link_to(t(".terms"), page_path("terms-and-conditions"))) %>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <div class="card" id="card__newsletter">
205
+ <div class="card__content">
206
+ <h3><%= t(".newsletter_title") %></h3>
207
+ <div class="field">
208
+ <%= f.check_box :newsletter, label: t(".newsletter"), checked: @form.newsletter %>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <div class="card">
214
+ <div class="card__content">
215
+ <div class="actions">
216
+ <%= f.submit t("devise.registrations.new.sign_up"), class: "button expanded" %>
217
+ </div>
218
+ <%= yield :devise_links %>
219
+ </div>
220
+ </div>
221
+ <% end %>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ >>>>>>> 4e14afa36c (add password toggle via unobstructive javascript)
227
+ <%= render "decidim/devise/shared/newsletter_modal" %>
228
+
229
+ <% content_for :js_content do %>
230
+ <%= javascript_pack_tag "decidim_registrations" %>
231
+ <% end %>
File without changes