From 5c03e05d7894a7f448c1e3918ac492ad3109dd7f Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Thu, 16 Oct 2025 22:47:20 +0200 Subject: [PATCH 01/15] Make the WYSIWYG editor vertical resizable (#15371) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Pereira de Lucena --- decidim-core/app/packs/stylesheets/decidim/editor.scss | 4 +++- decidim-core/lib/decidim/form_builder.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/decidim-core/app/packs/stylesheets/decidim/editor.scss b/decidim-core/app/packs/stylesheets/decidim/editor.scss index 5035beaa02391..dcdb902403440 100644 --- a/decidim-core/app/packs/stylesheets/decidim/editor.scss +++ b/decidim-core/app/packs/stylesheets/decidim/editor.scss @@ -89,7 +89,9 @@ } .ProseMirror { - @apply relative p-2.5 outline-0 min-h-full prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0; + @apply relative p-2.5 outline-0 resize-y overflow-hidden prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0; + + min-height: inherit; &.ProseMirror-focused, &.dialog-open { diff --git a/decidim-core/lib/decidim/form_builder.rb b/decidim-core/lib/decidim/form_builder.rb index 53cde5122a1e1..37b78ea251384 100644 --- a/decidim-core/lib/decidim/form_builder.rb +++ b/decidim-core/lib/decidim/form_builder.rb @@ -230,7 +230,7 @@ def editor(name, options = {}) disabled: options[:disabled], options: editor_options[:editor] } - ) { content_tag(:div, nil, class: "editor-input", style: "height: #{lines}rem") } + ) { content_tag(:div, nil, class: "editor-input", style: "min-height: #{lines}rem") } template += error_for(name, options) if error?(name) template += editor_upload(editor_image, editor_options[:upload]) template.html_safe From 8d8f65adc8743f2b2a722d693adba3f1e8190730 Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Fri, 17 Oct 2025 03:00:31 +0200 Subject: [PATCH 02/15] Fix deleted comments on public profile (#15377) Co-authored-by: stephanierousset <61418966+Stef-Rousset@users.noreply.github.com> Co-authored-by: Alexandru Emil Lupu --- .../app/cells/decidim/user_activity_cell.rb | 7 ++++- .../cells/decidim/user_activity_cell_spec.rb | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/decidim-core/app/cells/decidim/user_activity_cell.rb b/decidim-core/app/cells/decidim/user_activity_cell.rb index 0ee51977d51a3..7f6d25f41f282 100644 --- a/decidim-core/app/cells/decidim/user_activity_cell.rb +++ b/decidim-core/app/cells/decidim/user_activity_cell.rb @@ -11,7 +11,12 @@ def show end def activities - context[:activities] + resource_ids_to_filter = context[:activities].select { |log| log[:action] == "delete" && log[:resource_type] == "Decidim::Comments::Comment" }.map(&:resource_id) + if resource_ids_to_filter.any? + context[:activities].where.not("resource_id in (?) AND resource_type = ?", resource_ids_to_filter, "Decidim::Comments::Comment") + else + context[:activities] + end end def resource_types diff --git a/decidim-core/spec/cells/decidim/user_activity_cell_spec.rb b/decidim-core/spec/cells/decidim/user_activity_cell_spec.rb index 57116de1cbcaa..40265cf18496b 100644 --- a/decidim-core/spec/cells/decidim/user_activity_cell_spec.rb +++ b/decidim-core/spec/cells/decidim/user_activity_cell_spec.rb @@ -89,6 +89,33 @@ end end + context "when comment is deleted" do + let!(:logs) do + comments.first(14).map do |comment| + create( + :action_log, + action: "publish", + visibility: "all", + user: model, + resource: comment, + organization: component.organization, + participatory_space: component.participatory_space + ) + end + end + let!(:log_one) { create(:action_log, action: "create", visibility: "all", user: model, resource: comments.last, organization: component.organization, participatory_space: component.participatory_space) } + let!(:log_two) { create(:action_log, action: "delete", visibility: "all", user: model, resource: comments.last, organization: component.organization, participatory_space: component.participatory_space) } + + it "does not display the references to the comment on the first page if comment has been deleted" do + logs.last(2) do |log| + root_link = Decidim::ResourceLocatorPresenter.new(log.resource.root_commentable).path + comment_link = "#{root_link}?commentId=#{log.resource.id}#comment_#{log.resource.id}" + title = html_truncate(translated_attribute(log.resource.root_commentable.title), length: 80) + expect(subject).to have_no_link(title, href: comment_link) + end + end + end + context "when on the second page" do let(:current_page) { 2 } From 73c59255ff6d4ceddd91c2e1e64e2633155d9f7c Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Fri, 17 Oct 2025 13:16:04 +0300 Subject: [PATCH 03/15] Show badges next to user nicknames (#15350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Pereira de Lucena Co-authored-by: Tom Greenwood <101816158+greenwoodt@users.noreply.github.com> --- .erb_lint.yml | 1 - .../app/cells/decidim/author/badge.erb | 6 +++++ .../app/cells/decidim/author/show.erb | 6 ++++- decidim-core/app/cells/decidim/author_cell.rb | 10 +++++++++ .../app/cells/decidim/profile/avatar.erb | 2 -- .../app/cells/decidim/profile/badge.erb | 6 ++--- .../app/cells/decidim/profile/details.erb | 3 ++- .../packs/stylesheets/decidim/_author.scss | 4 ++++ .../packs/stylesheets/decidim/_profile.scss | 12 +++++----- .../spec/cells/decidim/author_cell_spec.rb | 10 ++++++++- .../spec/cells/decidim/profile_cell_spec.rb | 22 ++++++++++++++----- 11 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 decidim-core/app/cells/decidim/author/badge.erb diff --git a/.erb_lint.yml b/.erb_lint.yml index c834bd806cad1..7ef66fda69fe9 100644 --- a/.erb_lint.yml +++ b/.erb_lint.yml @@ -124,7 +124,6 @@ linters: - author-data__extra - author-data__main - author__avatar--small - - author__badge - author__date - author__name--container - author__nickname diff --git a/decidim-core/app/cells/decidim/author/badge.erb b/decidim-core/app/cells/decidim/author/badge.erb new file mode 100644 index 0000000000000..ca63f9f807c37 --- /dev/null +++ b/decidim-core/app/cells/decidim/author/badge.erb @@ -0,0 +1,6 @@ +<% if show_badge? %> + + <%= icon "star-s-fill" %> + <%= officialization_text %> + +<% end %> diff --git a/decidim-core/app/cells/decidim/author/show.erb b/decidim-core/app/cells/decidim/author/show.erb index 47c80b652c242..f17422a7119cc 100644 --- a/decidim-core/app/cells/decidim/author/show.erb +++ b/decidim-core/app/cells/decidim/author/show.erb @@ -6,7 +6,10 @@ <%= render :avatar %> - <%= render :name %> + + <%= render :name %> + <%= render :badge %> + <% context_actions.each do |action| %> <%= render action %> @@ -17,6 +20,7 @@ <% else %> <%= render :avatar %> <%= render :name %> + <%= render :badge %> <% end %> <% end %> diff --git a/decidim-core/app/cells/decidim/author_cell.rb b/decidim-core/app/cells/decidim/author_cell.rb index c55259cd44fb4..00dee59273cb7 100644 --- a/decidim-core/app/cells/decidim/author_cell.rb +++ b/decidim-core/app/cells/decidim/author_cell.rb @@ -186,5 +186,15 @@ def has_tooltip? model.has_tooltip? end + + def show_badge? + return false unless model.respond_to? :officialized? + + model.officialized? + end + + def officialization_text + translated_attribute(model.officialized_as).presence || t("decidim.profiles.show.officialized") + end end end diff --git a/decidim-core/app/cells/decidim/profile/avatar.erb b/decidim-core/app/cells/decidim/profile/avatar.erb index ebdf3c7da8746..48813df7d9888 100644 --- a/decidim-core/app/cells/decidim/profile/avatar.erb +++ b/decidim-core/app/cells/decidim/profile/avatar.erb @@ -2,6 +2,4 @@
<%= image_tag avatar_url, alt: t("decidim.author.avatar", name: decidim_sanitize(presented_profile.name)) %>
- - <%= render :badge if show_badge? %> diff --git a/decidim-core/app/cells/decidim/profile/badge.erb b/decidim-core/app/cells/decidim/profile/badge.erb index 3d7e0adca73e2..c81bab5b81f72 100644 --- a/decidim-core/app/cells/decidim/profile/badge.erb +++ b/decidim-core/app/cells/decidim/profile/badge.erb @@ -1,4 +1,4 @@ -
+ <%= icon "star-s-fill" %> - <%= officialization_text %> -
+ <%= officialization_text %> +
diff --git a/decidim-core/app/cells/decidim/profile/details.erb b/decidim-core/app/cells/decidim/profile/details.erb index 7172437ba559a..9b84d48b0b1aa 100644 --- a/decidim-core/app/cells/decidim/profile/details.erb +++ b/decidim-core/app/cells/decidim/profile/details.erb @@ -1,7 +1,8 @@
-

+

<%= presented_profile.name %> <%= tab_items.find { |tab_item| is_active_link?(tab_item[:path]) }&.dig(:text) %> (<%= presented_profile.name %>) + <%= render :badge if show_badge? %>

<% details_items.each do |detail| %> diff --git a/decidim-core/app/packs/stylesheets/decidim/_author.scss b/decidim-core/app/packs/stylesheets/decidim/_author.scss index d58a346fe74fa..ad47a1b2e4e0c 100644 --- a/decidim-core/app/packs/stylesheets/decidim/_author.scss +++ b/decidim-core/app/packs/stylesheets/decidim/_author.scss @@ -33,6 +33,10 @@ @apply text-secondary font-semibold; } + &__badge svg { + @apply grid overflow-hidden place-items-center bg-primary rounded-full w-4 h-4 text-white fill-current; + } + &__metadata { @apply flex items-center gap-1 text-gray-2 text-sm; diff --git a/decidim-core/app/packs/stylesheets/decidim/_profile.scss b/decidim-core/app/packs/stylesheets/decidim/_profile.scss index 1a20e680ac393..530ac405e420f 100644 --- a/decidim-core/app/packs/stylesheets/decidim/_profile.scss +++ b/decidim-core/app/packs/stylesheets/decidim/_profile.scss @@ -9,18 +9,18 @@ &-container { @apply w-24 h-24 relative; } + } + + &__details { + @apply pb-3 space-y-2; &-badge { - @apply absolute top-full right-0 -translate-y-full grid place-items-center w-6 h-6 rounded-full overflow-hidden bg-primary border border-white; + @apply flex items-center gap-1 text-sm text-gray-2; svg { - @apply w-4 h-4 text-white fill-current; + @apply w-4 h-4 inline-block bg-primary rounded-full text-white fill-current; } } - } - - &__details { - @apply pb-3 space-y-2; &-data { @apply flex flex-wrap gap-x-6 gap-y-4; diff --git a/decidim-core/spec/cells/decidim/author_cell_spec.rb b/decidim-core/spec/cells/decidim/author_cell_spec.rb index 2496acd3b41fe..d45d38041ca99 100644 --- a/decidim-core/spec/cells/decidim/author_cell_spec.rb +++ b/decidim-core/spec/cells/decidim/author_cell_spec.rb @@ -8,7 +8,7 @@ controller Decidim::PagesController let(:my_cell) { cell("decidim/author", model) } - let!(:organization) { create(:organization) } + let!(:organization) { build(:organization) } let(:user) { create(:user, :confirmed, organization:) } let(:user_group) { create(:user_group, :verified) } let(:model) { Decidim::UserPresenter.new(user) } @@ -17,6 +17,14 @@ it "renders a User author card" do expect(subject).to have_css("[data-author]") end + + context "and when this user is officialized" do + let(:user) { create(:user, :confirmed, :officialized, organization:) } + + it "shows the officialization badge" do + expect(subject).to have_xpath("//svg/use[contains(@href, 'ri-star-s-fill')]") + end + end end context "when rendering a user group" do diff --git a/decidim-core/spec/cells/decidim/profile_cell_spec.rb b/decidim-core/spec/cells/decidim/profile_cell_spec.rb index 0c3703714b193..65768a668a4eb 100644 --- a/decidim-core/spec/cells/decidim/profile_cell_spec.rb +++ b/decidim-core/spec/cells/decidim/profile_cell_spec.rb @@ -6,9 +6,9 @@ controller Decidim::ProfilesController subject { my_cell.call } - let(:organization) { create(:organization, user_groups_enabled: true) } - let(:user) { create(:user, :managed, organization:, blocked: false) } - let(:context) { { content_cell: "decidim/user_conversations", conversations: [] } } + let(:organization) { build(:organization, user_groups_enabled: true) } + let(:user) { build(:user, :managed, organization:, blocked: false) } + let(:context) { { content_cell: "decidim/badges" } } let(:my_cell) { cell("decidim/profile", user, context:) } context "when show is rendered" do @@ -19,7 +19,7 @@ context "when the user displayed is blocked" do context "and is an admin" do - let(:user) { create(:user, :managed, organization:, blocked: true, admin: true) } + let(:user) { build(:user, :managed, organization:, blocked: true, admin: true) } it "shows the user profile" do expect(subject).to have_no_text("This profile is inaccessible due to terms of service violation!") @@ -27,11 +27,23 @@ end context "and is not an admin" do - let(:user) { create(:user, :managed, organization:, blocked: true, admin: false) } + let(:user) { build(:user, :managed, organization:, blocked: true, admin: false) } it "shows the inaccessible profile alert" do expect(subject).to have_text("This profile is inaccessible due to terms of service violation!") end end end + + context "when the user displayed is officialized" do + let(:user) { build(:user, :officialized, organization:) } + + it "shows the officialization badge" do + expect(subject).to have_xpath("//svg/use[contains(@href, 'ri-star-s-fill')]") + end + + it "shows the officialization name" do + expect(subject).to have_content(decidim_sanitize_translated(user.officialized_as)) + end + end end From 9d7403b5dffd0dc3441ad2289a1c615242e5c5e9 Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Fri, 17 Oct 2025 14:38:15 +0300 Subject: [PATCH 04/15] Revert "Fix w3c validator CI pipeline (NuValidator json errors) (#15343)" (#15381) This reverts commit 35692134e2904d57ba76bfc20d839acced76c64e. --- .github/workflows/test_app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 0c348ce4fa6b7..0d1896456b719 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -58,7 +58,7 @@ jobs: DECIDIM_SPAM_DETECTION_BACKEND_USER: "memory" services: validator: - image: ghcr.io/validator/validator@sha256:28bd490412bb5abf1cf23eae0e3c197e9fbbda43cb9d23239b9ce859dc585db0 + image: ghcr.io/validator/validator:latest ports: ["8888:8888"] postgres: image: postgres:14 From 64cd0c608f99b1ead2ed0701f73d0763d20b1030 Mon Sep 17 00:00:00 2001 From: Alejandro Puerta <71900287+apuertadelaguila@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:56:13 +0200 Subject: [PATCH 05/15] Add format validation for name and nickname in UserGroupForm (#15368) --- .../app/forms/decidim/user_group_form.rb | 2 ++ .../spec/system/user_group_creation_spec.rb | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/decidim-core/app/forms/decidim/user_group_form.rb b/decidim-core/app/forms/decidim/user_group_form.rb index e29a26691d35b..add1de002af2b 100644 --- a/decidim-core/app/forms/decidim/user_group_form.rb +++ b/decidim-core/app/forms/decidim/user_group_form.rb @@ -16,10 +16,12 @@ class UserGroupForm < Form attribute :phone validates :name, presence: true + validates :name, format: { with: Decidim::UserBaseEntity::REGEXP_NAME } validates :email, presence: true, "valid_email_2/email": { disposable: true } validates :nickname, presence: true validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true } + validates :nickname, format: { with: Decidim::UserBaseEntity::REGEXP_NICKNAME } validates :avatar, passthru: { to: Decidim::UserGroup } validate :unique_document_number diff --git a/decidim-core/spec/system/user_group_creation_spec.rb b/decidim-core/spec/system/user_group_creation_spec.rb index 0c326d756e421..c049c795530e1 100644 --- a/decidim-core/spec/system/user_group_creation_spec.rb +++ b/decidim-core/spec/system/user_group_creation_spec.rb @@ -36,4 +36,40 @@ expect(page).to have_content(user.name) end end + + context "when nickname has invalid format" do + it "shows validation error in the form instead of raising exception" do + click_on "Create group" + + fill_in "Name", with: "Valid Group Name" + fill_in "Nickname", with: "Invalid Nickname" + fill_in "Email", with: "user_group@decidim.org" + fill_in "Document number", with: "12345678X" + fill_in "Phone", with: "12345678" + + click_on "Create group" + + expect(page).to have_content("There was a problem creating the group") + expect(page).to have_css("small.form-error.is-visible", text: "is invalid") + expect(page).to have_css(".is-invalid-input#group_nickname") + end + end + + context "when name has invalid format" do + it "shows validation error in the form instead of raising exception" do + click_on "Create group" + + fill_in "Name", with: "" + fill_in "Nickname", with: "valid_nickname" + fill_in "Email", with: "user_group@decidim.org" + fill_in "Document number", with: "12345678X" + fill_in "Phone", with: "12345678" + + click_on "Create group" + + expect(page).to have_content("There was a problem creating the group") + expect(page).to have_css("small.form-error.is-visible", text: "is invalid") + expect(page).to have_css(".is-invalid-input#group_name") + end + end end From 671b0549c8b5a8eb826444055b3cd1aadf247bdc Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Fri, 17 Oct 2025 15:37:38 +0200 Subject: [PATCH 06/15] Fix drag_and_drop on mobile without scrolling (#15388) Co-authored-by: David --- .../app/packs/src/decidim/forms/forms.js | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/decidim-forms/app/packs/src/decidim/forms/forms.js b/decidim-forms/app/packs/src/decidim/forms/forms.js index a4dd5ad4f41df..0b4b95179a55c 100644 --- a/decidim-forms/app/packs/src/decidim/forms/forms.js +++ b/decidim-forms/app/packs/src/decidim/forms/forms.js @@ -35,10 +35,31 @@ $(() => { } }); - document.querySelectorAll(".js-sortable-check-box-collection").forEach((el) => new DragonDrop(el, { - handle: false, - item: ".js-collection-input" - })); + document.querySelectorAll(".js-sortable-check-box-collection").forEach((el) => { + + /** + * Due to a bug reported in https://github.com/decidim/decidim/issues/15191 + * we have to listen to the `drag` event and prevent the scrolling + * and enabling it back again after it. + */ + + let preventScroll = function(event) { + event.preventDefault(); + } + + el.addEventListener("touchmove", (event) => { + preventScroll(event); + }, { passive: false }); + + el.addEventListener("touchend", () => { + el.removeEventListener("touchmove", preventScroll) + }); + + return new DragonDrop(el, { + handle: false, + item: ".js-collection-input" + }); + }); $(".answer-questionnaire .question[data-conditioned='true']").each((idx, el) => { createDisplayConditions({ From 3d543b111c027de7ef9f61cd60961e03f062cdc8 Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Fri, 17 Oct 2025 16:19:28 +0200 Subject: [PATCH 07/15] Add missing translation key for enable machine translation (#15385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ’Barbara Oliveira <143180473+BarbaraOliveira13@users.noreply.github.com> Co-authored-by: Tom Greenwood <101816158+greenwoodt@users.noreply.github.com> Co-authored-by: Alexandru Emil Lupu --- decidim-admin/config/locales/en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/decidim-admin/config/locales/en.yml b/decidim-admin/config/locales/en.yml index 2a7f077fd91a1..2805010609462 100644 --- a/decidim-admin/config/locales/en.yml +++ b/decidim-admin/config/locales/en.yml @@ -53,6 +53,7 @@ en: customize_welcome_notification: Customize welcome notification default_locale: Default locale description: Description + enable_machine_translations: Enable machine translations enable_omnipresent_banner: Show omnipresent banner enable_participatory_space_filters: Enable participatory space filters facebook_handler: Facebook handler From 72a7af2d9405ec90a4c2a3039e6ebc1be7aa58ea Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Sat, 18 Oct 2025 01:14:22 +0200 Subject: [PATCH 08/15] Fix Regex expression in Etiquette Validator (#15395) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivan Vergés --- .../app/validators/etiquette_validator.rb | 4 ++-- .../spec/validators/etiquette_validator_spec.rb | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/decidim-core/app/validators/etiquette_validator.rb b/decidim-core/app/validators/etiquette_validator.rb index e298189b48f6e..16fdebb1dad4b 100644 --- a/decidim-core/app/validators/etiquette_validator.rb +++ b/decidim-core/app/validators/etiquette_validator.rb @@ -24,7 +24,7 @@ def clean_value(value) end def validate_caps(record, attribute, value) - number_of_caps = value.scan(/[A-Z]/).length + number_of_caps = value.scan(/[[:upper:]]/).length return if number_of_caps.zero? || number_of_caps < value.length / 2 # 50% record.errors.add(attribute, options[:message] || :too_much_caps) @@ -37,7 +37,7 @@ def validate_marks(record, attribute, value) end def validate_caps_first(record, attribute, value) - return if value.scan(/\A[a-z]{1}/).empty? + return if value.scan(/\A[[:lower:]]{1}/).empty? record.errors.add(attribute, options[:message] || :must_start_with_caps) end diff --git a/decidim-core/spec/validators/etiquette_validator_spec.rb b/decidim-core/spec/validators/etiquette_validator_spec.rb index 885620d65b25c..4c0091810bfc5 100644 --- a/decidim-core/spec/validators/etiquette_validator_spec.rb +++ b/decidim-core/spec/validators/etiquette_validator_spec.rb @@ -24,7 +24,8 @@ def self.model_name [ %(I am a very reasonable body, ain't I? I have the right length, the right style, the right words. Yup.), %("Validate bodies", they said. "It is gonna be fun!", they said.), - %(I contain special characters because I am à la mode.) + %(I contain special characters because I am à la mode.), + %(À la mode, I want to contain special characters.) ].each do |a_body| describe "like \"#{a_body}\"" do let(:body) { a_body } @@ -50,6 +51,12 @@ def self.model_name context "when etiquette_validator is enabled" do it { is_expected.to be_invalid } end + + context "when the text has non-ascii uppercase characters" do + let(:body) { "À ÑÓ ÂÊ" } + + it { is_expected.to be_invalid } + end end context "when the text has too many marks" do @@ -85,6 +92,12 @@ def self.model_name it { is_expected.to be_invalid } end + context "with non ascii characters" do + let(:body) { "à la mode, we start with a non-ascii character in downcase." } + + it { is_expected.to be_invalid } + end + context "with a multiple line body with the second line starting in downcase" do let(:body) { "This is a multiline body\nwith a line starting with downcase." } From e39f9712381555a3d4e41af17c576d7d65329a33 Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Wed, 22 Oct 2025 21:35:39 +0200 Subject: [PATCH 09/15] Add notes for configuring CSP with ActiveStorage (#15409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Pereira de Lucena --- .../assets/images/content_security_policy.png | Bin 0 -> 119729 bytes .../pages/content_security_policy.adoc | 16 +++++++++++----- docs/modules/services/pages/activestorage.adoc | 5 +++++ 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 docs/modules/customize/assets/images/content_security_policy.png diff --git a/docs/modules/customize/assets/images/content_security_policy.png b/docs/modules/customize/assets/images/content_security_policy.png new file mode 100644 index 0000000000000000000000000000000000000000..ab67864b333356b1882bfb6394b7e017445f1ba2 GIT binary patch literal 119729 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

ZfxBNzvRRU7sLl$g0`=2muO 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 %w(https://*.example.com), - "img-src" => %w(https://*.example.com) -} +Decidim.configure do |config| + config.content_security_policies_extra = { + "connect-src" => %w(https://*.example.com), + "img-src" => %w(https://*.example.com) + } +end .... For specific organization setup, you could use the system panel to customize the Content Security Policies, by adding the domains or directives that you need to allow in the predesignated spots. diff --git a/docs/modules/services/pages/activestorage.adoc b/docs/modules/services/pages/activestorage.adoc index e895773282adc..6b75c6099d3c8 100644 --- a/docs/modules/services/pages/activestorage.adoc +++ b/docs/modules/services/pages/activestorage.adoc @@ -4,6 +4,11 @@ Decidim uses https://edgeguides.rubyonrails.org/active_storage_overview.html[Act In order to plug Decidim into a storage provider of your choice, you need to generate the Decidim application using the `--storage` modifier as explained at the xref:configure:index.adoc[configuration guide]. You will also need to provide the correct configuration options for the selected storage provider as explained at the xref:configure:environment_variables.adoc[environment variables guide]. +[NOTE] +==== +If you use any other provider than the default (`local`) you will need to also configure the xref:customize:content_security_policy.adoc[Content security policy]. For the directives "default-src", "img-src", "media-src", and "connect-src"`. +==== + == Dynamic file uploads Decidim allows participants to upload files dynamically from their browsers to the website using the upload modals where participants can drag and drop the files to or select them from their computer. With the default configuration using a local file storage, this feature does not require any additional configuration. With external storage providers, you have to configure those storages properly to support the client-side file uploads to Decidim. From f0d72470e552890f4091c013823b1a2ec7b23284 Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Wed, 22 Oct 2025 21:39:21 +0200 Subject: [PATCH 10/15] Remove the `parallel_tests/tasks` from `common_rake` (#15408) Co-authored-by: Alexandru Emil Lupu --- decidim-dev/lib/decidim/dev/common_rake.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/decidim-dev/lib/decidim/dev/common_rake.rb b/decidim-dev/lib/decidim/dev/common_rake.rb index 3350d811aa6cc..001edb5748e7e 100644 --- a/decidim-dev/lib/decidim/dev/common_rake.rb +++ b/decidim-dev/lib/decidim/dev/common_rake.rb @@ -3,7 +3,6 @@ require "bundler/gem_tasks" require "rspec/core/rake_task" require "decidim/dev" -require "parallel_tests/tasks" RSpec::Core::RakeTask.new(:spec) do |t| t.rspec_opts = "--format progress --format RspecJunitFormatter -o ~/rspec/rspec.xml" if ENV["CI"] From f93ce2b33d49167c046132d4c8cfd10f75b392a1 Mon Sep 17 00:00:00 2001 From: decidim-bot Date: Wed, 22 Oct 2025 21:41:25 +0200 Subject: [PATCH 11/15] Fix phase and date order in "Phase & duration" block (#15402) Co-authored-by: Renato --- .../participatory_processes/content_blocks/extra_data_cell.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decidim-participatory_processes/app/cells/decidim/participatory_processes/content_blocks/extra_data_cell.rb b/decidim-participatory_processes/app/cells/decidim/participatory_processes/content_blocks/extra_data_cell.rb index 0021c1b281120..c4e8f7d946f77 100644 --- a/decidim-participatory_processes/app/cells/decidim/participatory_processes/content_blocks/extra_data_cell.rb +++ b/decidim-participatory_processes/app/cells/decidim/participatory_processes/content_blocks/extra_data_cell.rb @@ -11,7 +11,7 @@ class ExtraDataCell < Decidim::ContentBlocks::ParticipatorySpaceExtraDataCell private def extra_data_items - [step_item, dates_item, group_item].compact + [dates_item, step_item, group_item].compact end def active_step_name From cb3b543f3cac4b602b56ef2e218056b746b3c27c Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Thu, 23 Oct 2025 09:50:51 +0300 Subject: [PATCH 12/15] Backport 'Back to responses button in surveys' to v0.30 (#15412) Co-authored-by: Tom Greenwood <101816158+greenwoodt@users.noreply.github.com> --- decidim-forms/config/locales/en.yml | 2 +- .../views/decidim/surveys/admin/publish_answers/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/decidim-forms/config/locales/en.yml b/decidim-forms/config/locales/en.yml index 2fe8fd83dae29..e42bdf27a76ad 100644 --- a/decidim-forms/config/locales/en.yml +++ b/decidim-forms/config/locales/en.yml @@ -55,7 +55,7 @@ en: tos: Terms of service questionnaires: actions: - back: Back to questions + back: Back to responses publish_answers: Publish answers show: Show responses answer_option: diff --git a/decidim-surveys/app/views/decidim/surveys/admin/publish_answers/index.html.erb b/decidim-surveys/app/views/decidim/surveys/admin/publish_answers/index.html.erb index 0d320a474a665..3bc756ef83171 100644 --- a/decidim-surveys/app/views/decidim/surveys/admin/publish_answers/index.html.erb +++ b/decidim-surveys/app/views/decidim/surveys/admin/publish_answers/index.html.erb @@ -4,7 +4,7 @@

<%= t(".title") %> - <%= link_to t("actions.back", scope: "decidim.forms.admin.questionnaires"), questionnaire_url, class: "button button__sm button__secondary new" %> + <%= link_to t("actions.back", scope: "decidim.forms.admin.questionnaires"), survey_answers_path, class: "button button__sm button__secondary new" %>

From 3eba38c04f3f0e9b79255c5aab8beae770650455 Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Thu, 23 Oct 2025 09:53:24 +0300 Subject: [PATCH 13/15] Fix saving geocoding data when present in proposals (#15413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivan Vergés --- .../decidim/proposals/create_proposal.rb | 6 ++++- .../decidim/proposals/create_proposal_spec.rb | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb b/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb index 76803e3a46ee1..f88f776cd89ee 100644 --- a/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb +++ b/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb @@ -84,7 +84,11 @@ def create_proposal proposal.taxonomizations = form.taxonomizations if form.taxonomizations.present? proposal.documents = form.documents if form.documents.present? - proposal.address = form.address if form.has_address? && !form.geocoded? + if form.geocoded? + proposal.latitude = form.latitude + proposal.longitude = form.longitude + end + proposal.address = form.address if form.has_address? proposal.add_coauthor(@current_user, user_group:) proposal.save! @attached_to = proposal diff --git a/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb b/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb index 3b2cbc5e01b51..3b5774fd00875 100644 --- a/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb +++ b/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb @@ -193,6 +193,28 @@ module Proposals end end end + + describe "when geocoding is enabled" do + let(:component) { create(:proposal_component, :with_geocoding_enabled) } + let(:form_params) do + { + title: "A reasonable proposal title", + body: "A reasonable proposal body", + address: "Barcelona", + latitude: 41.394897, + longitude: 2.153088 + } + end + + it "saves geocoding data" do + expect { command.call }.to broadcast(:ok) + proposal = Decidim::Proposals::Proposal.last + + expect(proposal.address).to eq(form_params[:address]) + expect(proposal.latitude).to eq(form_params[:latitude]) + expect(proposal.longitude).to eq(form_params[:longitude]) + end + end end end end From 5c00e01f9e6dd35ae0546c0809f6eeabfc2b35bc Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Thu, 23 Oct 2025 09:55:02 +0300 Subject: [PATCH 14/15] Add published/unpublished state in the Meetings' admin index page (#15411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Pereira de Lucena --- .../meetings/admin/meetings/_meeting-tr.html.erb | 10 +++++++++- .../meetings/admin/meetings/_meetings-thead.html.erb | 3 +++ decidim-meetings/config/locales/en.yml | 3 +++ .../spec/system/admin/admin_manages_meetings_spec.rb | 12 ++++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb index 2ddd3dd899731..ae4bcfccf86b5 100644 --- a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +++ b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb @@ -32,7 +32,15 @@ <%= present(meeting).taxonomy_names.join(", ") %> - + "> + <% if meeting.published? %> + <%= t("admin.meetings.index.published", scope: "decidim.meetings") %> + <% else %> + <%= t("admin.meetings.index.unpublished", scope: "decidim.meetings") %> + <% end %> + + + "> <% if is_linked %> <%= t("index.linked_meeting_warning_html", href: edit_meeting_path(meeting), name: present(meeting).space_title, scope: "decidim.meetings.admin.meetings") %> <% else %> diff --git a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb index c432644fa8446..eb7eb20d0a364 100644 --- a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +++ b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb @@ -21,6 +21,9 @@ <%= sort_link(query, :scope_name, t("models.meeting.fields.taxonomies", scope: "decidim.meetings") ) %> + + <%= t("models.meeting.fields.published", scope: "decidim.meetings") %> + <%= t("actions.title", scope: "decidim.meetings") %> diff --git a/decidim-meetings/config/locales/en.yml b/decidim-meetings/config/locales/en.yml index 63720c7282b3f..16f3aab6d4c56 100644 --- a/decidim-meetings/config/locales/en.yml +++ b/decidim-meetings/config/locales/en.yml @@ -365,7 +365,9 @@ en: select_an_iframe_access_level: Please select an iframe access level index: linked_meeting_warning_html: This meeting must be edited from
%{name} + published: Published title: Meetings + unpublished: Unpublished linked_spaces: assign: Assign link_a_space: Link a space @@ -637,6 +639,7 @@ en: id: ID map: Map official_meeting: Official meeting + published: Published start_time: Start date taxonomies: Taxonomies title: Title diff --git a/decidim-meetings/spec/system/admin/admin_manages_meetings_spec.rb b/decidim-meetings/spec/system/admin/admin_manages_meetings_spec.rb index e828626e0d1c5..efed7584da53e 100644 --- a/decidim-meetings/spec/system/admin/admin_manages_meetings_spec.rb +++ b/decidim-meetings/spec/system/admin/admin_manages_meetings_spec.rb @@ -48,7 +48,11 @@ accept_confirm { click_on "Unpublish" } end - expect(page).to have_admin_callout("successfully") + within "tr", text: Decidim::Meetings::MeetingPresenter.new(meeting).title do + expect(page).to have_content("Unpublished") + end + + expect(page).to have_admin_callout("Meeting successfully unpublished") within "tr", text: Decidim::Meetings::MeetingPresenter.new(meeting).title do expect(page).to have_css(".action-icon--publish") @@ -58,7 +62,11 @@ click_on "Publish" end - expect(page).to have_admin_callout("successfully") + within "tr", text: Decidim::Meetings::MeetingPresenter.new(meeting).title do + expect(page).to have_content("Published") + end + + expect(page).to have_admin_callout("Meeting successfully published") within "tr", text: Decidim::Meetings::MeetingPresenter.new(meeting).title do expect(page).to have_css(".action-icon--unpublish") From 3f254cd231989421025fcddf6f3db8049cf21965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A0xim=20Colls?= Date: Fri, 28 Feb 2025 20:37:17 +0100 Subject: [PATCH 15/15] Improve accountability results visualization (#14067) --- .../accountability/results_controller.rb | 22 +++++++++-- .../app/packs/stylesheets/accountability.scss | 36 +++++++++++++++-- .../accountability/results/_filters.html.erb | 4 ++ .../results/_home_aside.html.erb | 12 ++++++ .../results/_home_taxonomies.html.erb | 39 ++++--------------- .../results/_one_level_taxonomies.html.erb | 17 ++++++++ .../results/_projects_aside.html.erb | 4 +- .../_root_taxonomies_selector.html.erb | 17 ++++++++ .../results/_two_levels_taxonomies.html.erb | 30 ++++++++++++++ .../accountability/results/home.html.erb | 36 ++++++----------- decidim-accountability/config/locales/en.yml | 8 ++-- .../lib/decidim/accountability/component.rb | 3 ++ .../lib/decidim/accountability/engine.rb | 4 ++ .../spec/system/explore_results_spec.rb | 13 ++----- .../helpers/decidim/admin/settings_helper.rb | 14 +++++-- .../spec/helpers/settings_helper_spec.rb | 2 +- .../lib/decidim/budgets/component.rb | 2 +- decidim-core/lib/decidim/settings_manifest.rb | 5 ++- .../spec/lib/settings_manifest_spec.rb | 2 +- .../lib/decidim/proposals/component.rb | 8 ++-- docs/modules/develop/pages/components.adoc | 2 +- 21 files changed, 190 insertions(+), 90 deletions(-) create mode 100644 decidim-accountability/app/views/decidim/accountability/results/_filters.html.erb create mode 100644 decidim-accountability/app/views/decidim/accountability/results/_home_aside.html.erb create mode 100644 decidim-accountability/app/views/decidim/accountability/results/_one_level_taxonomies.html.erb create mode 100644 decidim-accountability/app/views/decidim/accountability/results/_root_taxonomies_selector.html.erb create mode 100644 decidim-accountability/app/views/decidim/accountability/results/_two_levels_taxonomies.html.erb diff --git a/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb b/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb index 49bfae03532a3..aac085f0fdf1d 100644 --- a/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb +++ b/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb @@ -8,7 +8,7 @@ class ResultsController < Decidim::Accountability::ApplicationController helper Decidim::TraceabilityHelper helper Decidim::Accountability::BreadcrumbHelper - helper_method :results, :result, :first_class_taxonomies, :count_calculator + helper_method :results, :result, :count_calculator, :selected_root_taxonomy, :selected_taxonomy_children, :selected_taxonomy_grandchildren? before_action :set_controller_breadcrumb @@ -46,8 +46,24 @@ def default_filter_params } end - def first_class_taxonomies - @first_class_taxonomies ||= current_organization.taxonomies.where(parent_id: current_component.available_root_taxonomies, id: current_component.available_taxonomy_ids) + def selected_taxonomy_grandchildren? + @selected_taxonomy_grandchildren ||= selected_root_taxonomy.all_children.count > selected_taxonomy_children.count + end + + def selected_taxonomy_children + return [] if selected_root_taxonomy.blank? + + @selected_taxonomy_children ||= current_organization.taxonomies.where(parent_id: selected_root_taxonomy.id, id: current_component.available_taxonomy_ids) + end + + def selected_root_taxonomy + @selected_root_taxonomy ||= if params[:root_taxonomy_id] == "list" + nil + elsif params[:root_taxonomy_id].blank? + current_component.available_root_taxonomies.find_by(id: component_settings.default_taxonomy) + else + current_component.available_root_taxonomies.find_by(id: params[:root_taxonomy_id]) + end end def count_calculator(taxonomy_id) diff --git a/decidim-accountability/app/packs/stylesheets/accountability.scss b/decidim-accountability/app/packs/stylesheets/accountability.scss index 04bf71ec3f51e..72a96ffadeaa1 100644 --- a/decidim-accountability/app/packs/stylesheets/accountability.scss +++ b/decidim-accountability/app/packs/stylesheets/accountability.scss @@ -97,10 +97,16 @@ } &__grid { - @apply grid md:grid-cols-3 items-start gap-x-10 gap-y-8 md:gap-y-16; + @apply grid md:grid-cols-3 items-start gap-x-6 gap-y-6; - & > :nth-child(even) { - @apply grid md:col-span-2; + &--one-level { + @apply grid; + } + + &--two-levels { + & > :nth-child(even) { + @apply grid md:col-span-2; + } } /* display the titles only for the first two rows in desktop */ @@ -171,4 +177,28 @@ &__filters { @apply w-full space-y-10; } + + &__taxonomies { + @apply w-full; + + ul { + @apply flex flex-wrap gap-4 mt-4; + + li { + @apply bg-white py-1 px-4 rounded; + + a { + @apply text-secondary font-semibold text-sm; + } + + &.active { + @apply bg-secondary text-white; + + a { + @apply text-white; + } + } + } + } + } } diff --git a/decidim-accountability/app/views/decidim/accountability/results/_filters.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_filters.html.erb new file mode 100644 index 0000000000000..2bce0495b2cf6 --- /dev/null +++ b/decidim-accountability/app/views/decidim/accountability/results/_filters.html.erb @@ -0,0 +1,4 @@ +
+ <%= render partial: "search" %> + <%= render partial: "root_taxonomies_selector" %> +
diff --git a/decidim-accountability/app/views/decidim/accountability/results/_home_aside.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_home_aside.html.erb new file mode 100644 index 0000000000000..7061e2fd903f3 --- /dev/null +++ b/decidim-accountability/app/views/decidim/accountability/results/_home_aside.html.erb @@ -0,0 +1,12 @@ +

<%= component_name %>

+ +<% if component_settings.display_progress_enabled? %> + <%= cell( + "decidim/accountability/status", + nil, + title: t("decidim.accountability.results.home_header.global_status"), + progress: progress_calculator(nil).presence, + extra_classes: "accountability__status__home" + ) %> +<% end %> +<%= render partial: "filters" %> diff --git a/decidim-accountability/app/views/decidim/accountability/results/_home_taxonomies.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_home_taxonomies.html.erb index d162597d586e8..22b5a6cac87e1 100644 --- a/decidim-accountability/app/views/decidim/accountability/results/_home_taxonomies.html.erb +++ b/decidim-accountability/app/views/decidim/accountability/results/_home_taxonomies.html.erb @@ -1,32 +1,9 @@ -
- <% first_class_taxonomies.each do |taxonomy| %> - <% subelements = cell( - "decidim/accountability/status", - taxonomy, - extra_classes: "accountability__status__background", - url: results_path(filter: { taxonomies_part_of_contains: taxonomy }), - render_blank: true - ) %> +

+ <%= translated_attribute(selected_root_taxonomy.name) %> +

-
- <%= subelements.call %> -
- -
- <% if subelements.has_results? %> -
- <% taxonomy.children.where(id: current_component.available_taxonomy_ids).each do |sub_taxonomy| %> - <%= cell( - "decidim/accountability/status", - sub_taxonomy, - extra_classes: "accountability__status__border", - url: results_path(filter: { taxonomies_part_of_contains: sub_taxonomy }) - ) %> - <% end %> -
- <% else %> - <%= cell("decidim/announcement", t("no_results", scope: "decidim.accountability.results")) %> - <% end %> -
- <% end %> -
+<% if selected_taxonomy_grandchildren? %> + <%= render "two_levels_taxonomies" %> +<% else %> + <%= render "one_level_taxonomies" %> +<% end %> diff --git a/decidim-accountability/app/views/decidim/accountability/results/_one_level_taxonomies.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_one_level_taxonomies.html.erb new file mode 100644 index 0000000000000..bc6ddfcb757fd --- /dev/null +++ b/decidim-accountability/app/views/decidim/accountability/results/_one_level_taxonomies.html.erb @@ -0,0 +1,17 @@ +
+ <% selected_taxonomy_children.each do |taxonomy| %> + <% subelements = cell( + "decidim/accountability/status", + taxonomy, + extra_classes: "accountability__status__background", + url: results_path(filter: { taxonomies_part_of_contains: taxonomy }), + render_blank: true + ) %> + + <% if subelements.has_results? %> +
+ <%= subelements.call %> +
+ <% end %> + <% end %> +
diff --git a/decidim-accountability/app/views/decidim/accountability/results/_projects_aside.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_projects_aside.html.erb index 64a3faf678aeb..ebc9e1cca0534 100644 --- a/decidim-accountability/app/views/decidim/accountability/results/_projects_aside.html.erb +++ b/decidim-accountability/app/views/decidim/accountability/results/_projects_aside.html.erb @@ -37,6 +37,4 @@ <% end %>
-
- <%= render partial: "search" %> -
+<%= render partial: "filters" %> diff --git a/decidim-accountability/app/views/decidim/accountability/results/_root_taxonomies_selector.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_root_taxonomies_selector.html.erb new file mode 100644 index 0000000000000..4f330606f8d33 --- /dev/null +++ b/decidim-accountability/app/views/decidim/accountability/results/_root_taxonomies_selector.html.erb @@ -0,0 +1,17 @@ +
+

+ <%= t("decidim.accountability.results.root_taxonomies.title") %> +

+
    + <% current_component.available_root_taxonomies.each do |taxonomy| %> + <% is_selected = selected_root_taxonomy&.id == taxonomy.id %> +
  • "> + <% if is_selected %> + <%= link_to translated_attribute(taxonomy.name), home_results_path(root_taxonomy_id: "list") %> + <% else %> + <%= link_to translated_attribute(taxonomy.name), home_results_path(root_taxonomy_id: taxonomy.id) %> + <% end %> +
  • + <% end %> +
+
diff --git a/decidim-accountability/app/views/decidim/accountability/results/_two_levels_taxonomies.html.erb b/decidim-accountability/app/views/decidim/accountability/results/_two_levels_taxonomies.html.erb new file mode 100644 index 0000000000000..6ad41c1ecbf36 --- /dev/null +++ b/decidim-accountability/app/views/decidim/accountability/results/_two_levels_taxonomies.html.erb @@ -0,0 +1,30 @@ +
+ <% selected_taxonomy_children.each do |taxonomy| %> + <% subelements = cell( + "decidim/accountability/status", + taxonomy, + extra_classes: "accountability__status__background", + url: results_path(filter: { taxonomies_part_of_contains: taxonomy }), + render_blank: true + ) %> + + <% if subelements.has_results? %> +
+ <%= subelements.call %> +
+ +
+
+ <% taxonomy.children.where(id: current_component.available_taxonomy_ids).each do |sub_taxonomy| %> + <%= cell( + "decidim/accountability/status", + sub_taxonomy, + extra_classes: "accountability__status__border", + url: results_path(filter: { taxonomies_part_of_contains: sub_taxonomy }) + ) %> + <% end %> +
+
+ <% end %> + <% end %> +
diff --git a/decidim-accountability/app/views/decidim/accountability/results/home.html.erb b/decidim-accountability/app/views/decidim/accountability/results/home.html.erb index c7f4add0e9689..37ef6489b4107 100644 --- a/decidim-accountability/app/views/decidim/accountability/results/home.html.erb +++ b/decidim-accountability/app/views/decidim/accountability/results/home.html.erb @@ -8,24 +8,10 @@ <%= append_stylesheet_pack_tag "decidim_accountability" %> <% content_for :aside do %> -

<%= component_name %>

- - <% if component_settings.display_progress_enabled? %> - <%= cell( - "decidim/accountability/status", - nil, - title: t("decidim.accountability.results.home_header.global_status"), - progress: progress_calculator(nil).presence, - extra_classes: "accountability__status__home" - ) %> - <% end %> -
- <%= render partial: "search" %> -
+ <%= render partial: "home_aside" %> <% end %> <%= render layout: "layouts/decidim/shared/layout_two_col" do %> - <% if Decidim::Map.available?(:geocoding, :dynamic) && component_settings.geocoding_enabled? %>
<%= cell "decidim/map", @all_geocoded_results, metadata_card: "decidim/accountability/result_metadata" %> @@ -36,14 +22,14 @@
<%= decidim_sanitize_admin translated_attribute(component_settings.intro) %>
-
- <% if first_class_taxonomies.empty? %> - <%= cell("decidim/announcement", - params[:filter].present? ? - t("empty_filters", scope: "decidim.accountability.results.home") : - t("empty", scope: "decidim.accountability.results.home")) %> - <% end %> - <%= render partial: "home_taxonomies" %> -
- + <% if selected_root_taxonomy.present? %> +
+ <%= render partial: "home_taxonomies" %> +
+ <% else %> +
+ <%= cell "decidim/accountability/results", results %> + <%= decidim_paginate results, order_start_time: params[:order_start_time] %> +
+ <% end %> <% end %> diff --git a/decidim-accountability/config/locales/en.yml b/decidim-accountability/config/locales/en.yml index d9644ef97d3ad..382e679684acf 100644 --- a/decidim-accountability/config/locales/en.yml +++ b/decidim-accountability/config/locales/en.yml @@ -274,12 +274,11 @@ en: results_count: one: 1 result other: "%{count} results" - home: - empty: There are no results yet. - empty_filters: There are no results with this criteria. home_header: global_status: Global execution status no_results: There are no projects + root_taxonomies: + title: 'View by:' search: search: Search for actions show: @@ -304,6 +303,8 @@ en: clear_all: Clear all comments_enabled: Comments enabled comments_max_length: Comments max length (Leave 0 for default value) + default_taxonomy: Default taxonomy + default_taxonomy_help: Select which taxonomy you want to show by default. If no taxonomy is selected, the results will be shown in a list format. define_taxonomy_filters: Please define some filters for this participatory space before using this setting. display_progress_enabled: Display progress geocoding_enabled: Maps enabled @@ -313,6 +314,7 @@ en: taxonomy_filters_add: Add filter step: comments_blocked: Comments blocked + visualization: Visualization download_your_data: show: result_comments: Result comments export diff --git a/decidim-accountability/lib/decidim/accountability/component.rb b/decidim-accountability/lib/decidim/accountability/component.rb index 0bf15a8c1e077..e4c0dac6ab7d5 100644 --- a/decidim-accountability/lib/decidim/accountability/component.rb +++ b/decidim-accountability/lib/decidim/accountability/component.rb @@ -31,6 +31,9 @@ settings.attribute :intro, type: :text, translated: true, editor: true settings.attribute :display_progress_enabled, type: :boolean, default: true settings.attribute :geocoding_enabled, type: :boolean, default: false + settings.attribute :default_taxonomy, type: :select, include_blank: true, raw_choices: true, choices: lambda { |context| + context[:component].available_root_taxonomies.map { |taxonomy| [taxonomy.name["en"], taxonomy.id] } + } end component.register_stat :results_count, primary: true, priority: Decidim::StatsRegistry::HIGH_PRIORITY do |components, _start_at, _end_at| diff --git a/decidim-accountability/lib/decidim/accountability/engine.rb b/decidim-accountability/lib/decidim/accountability/engine.rb index 301a34f8bcbb1..0289e16114600 100644 --- a/decidim-accountability/lib/decidim/accountability/engine.rb +++ b/decidim-accountability/lib/decidim/accountability/engine.rb @@ -13,6 +13,10 @@ class Engine < ::Rails::Engine routes do resources :results, only: [:index, :show] do resources :versions, only: [:show] + + collection do + get :home + end end root to: "results#home" end diff --git a/decidim-accountability/spec/system/explore_results_spec.rb b/decidim-accountability/spec/system/explore_results_spec.rb index 7b1f2a5613419..d5b2971f6254d 100644 --- a/decidim-accountability/spec/system/explore_results_spec.rb +++ b/decidim-accountability/spec/system/explore_results_spec.rb @@ -29,14 +29,13 @@ let(:taxonomy_filter_ids) { [] } it "shows an empty page with a message" do - expect(page).to have_content "There are no results yet" + expect(page).to have_content "There are no projects" end end context "with a taxonomy" do it "shows an empty page with a message" do within "main" do - expect(page).to have_i18n_content(taxonomy.name) expect(page).to have_content "There are no projects" end end @@ -85,14 +84,10 @@ expect(page).to have_css(".accountability__map") end - it "shows taxonomies and sub_taxonomies with results for enabled filters" do - [taxonomy, sub_taxonomy].each do |item| - taxonomy_count = Decidim::Accountability::ResultsCalculator.new(component, item.id).count - expect(page).to have_content(translated(item.name)) if taxonomy_count.positive? + it "shows root taxonomies filters" do + within("aside") do + expect(page).to have_content(translated(taxonomy.parent.name)) end - - expect(page).to have_no_content(translated(other_taxonomy.name)) - expect(page).to have_no_content(translated(other_sub_taxonomy.name)) end it "shows progress" do diff --git a/decidim-admin/app/helpers/decidim/admin/settings_helper.rb b/decidim-admin/app/helpers/decidim/admin/settings_helper.rb index 71d9e32e0c0e2..7bd1b3e94e4cc 100644 --- a/decidim-admin/app/helpers/decidim/admin/settings_helper.rb +++ b/decidim-admin/app/helpers/decidim/admin/settings_helper.rb @@ -91,15 +91,23 @@ def render_field_form_method(form_method, form, attribute, name, i18n_scope, opt # @param name (see #settings_attribute_input) # @param i18n_scope (see #settings_attribute_input) # @param options (see #settings_attribute_input) - # @option :tabs_prefix (see #settings_attribute_input) - # @option :readonly (see #settings_attribute_input) + # @option options [String] :tabs_prefix (see #settings_attribute_input) + # @option options [Boolean] :readonly (see #settings_attribute_input) # @option options [String] :label The label that this field has # @option options [String] :help_text The help text shown after the input field # @return (see #settings_attribute_input) def render_select_form_field(form, attribute, name, i18n_scope, options) + choices = attribute.build_choices(component: @component).map do |o| + if attribute.raw_choices + o + else + [t("#{name}_options.#{o}", scope: i18n_scope), o] + end + end + html = form.select( name, - attribute.build_choices.map { |o| [t("#{name}_options.#{o}", scope: i18n_scope), o] }, + choices, { include_blank: attribute.include_blank, label: options[:label] } ) html << content_tag(:p, options[:help_text], class: "help-text") if options[:help_text] diff --git a/decidim-admin/spec/helpers/settings_helper_spec.rb b/decidim-admin/spec/helpers/settings_helper_spec.rb index 0477f5698a5a4..2010bb0ba5548 100644 --- a/decidim-admin/spec/helpers/settings_helper_spec.rb +++ b/decidim-admin/spec/helpers/settings_helper_spec.rb @@ -143,7 +143,7 @@ def render_input context "when choices is a lambda function" do let(:choices) do - -> { full_choices.map(&:last) } + ->(_context) { full_choices.map(&:last) } end it "is supported" do diff --git a/decidim-budgets/lib/decidim/budgets/component.rb b/decidim-budgets/lib/decidim/budgets/component.rb index 841e36543f546..3b3cc942b6cd1 100644 --- a/decidim-budgets/lib/decidim/budgets/component.rb +++ b/decidim-budgets/lib/decidim/budgets/component.rb @@ -76,7 +76,7 @@ component.settings(:global) do |settings| settings.attribute :taxonomy_filters, type: :taxonomy_filters - settings.attribute :workflow, type: :enum, default: "one", choices: -> { Decidim::Budgets.workflows.keys.map(&:to_s) } + settings.attribute :workflow, type: :enum, default: "one", choices: ->(_context) { Decidim::Budgets.workflows.keys.map(&:to_s) } settings.attribute :projects_per_page, type: :integer, default: 12 settings.attribute :vote_rule_threshold_percent_enabled, type: :boolean, default: true settings.attribute :vote_threshold_percent, type: :integer, default: 70 diff --git a/decidim-core/lib/decidim/settings_manifest.rb b/decidim-core/lib/decidim/settings_manifest.rb index 3f32b8b7ab73d..028dbf143d4a5 100644 --- a/decidim-core/lib/decidim/settings_manifest.rb +++ b/decidim-core/lib/decidim/settings_manifest.rb @@ -129,6 +129,7 @@ class Attribute attribute :required_for_authorization, Boolean, default: false attribute :readonly attribute :choices + attribute :raw_choices, Boolean, default: false attribute :units attribute :include_blank, Boolean, default: false @@ -154,8 +155,8 @@ def default_value default || TYPES[type][:default] end - def build_choices - choices.try(:call) || choices + def build_choices(context = nil) + choices.try(:call, context) || choices end def build_units diff --git a/decidim-core/spec/lib/settings_manifest_spec.rb b/decidim-core/spec/lib/settings_manifest_spec.rb index a7671f3984ebd..596d8b991aa3a 100644 --- a/decidim-core/spec/lib/settings_manifest_spec.rb +++ b/decidim-core/spec/lib/settings_manifest_spec.rb @@ -91,7 +91,7 @@ module Decidim subject.attribute :something, choices: %w(a b c) expect(subject.attributes[:something].build_choices).to eq(%w(a b c)) - subject.attribute :something, choices: -> { %w(a b c) } + subject.attribute :something, choices: ->(_context) { %w(a b c) } expect(subject.attributes[:something].build_choices).to eq(%w(a b c)) end diff --git a/decidim-proposals/lib/decidim/proposals/component.rb b/decidim-proposals/lib/decidim/proposals/component.rb index e76f16ef5e2b6..cad6e2e8c6c7d 100644 --- a/decidim-proposals/lib/decidim/proposals/component.rb +++ b/decidim-proposals/lib/decidim/proposals/component.rb @@ -34,12 +34,12 @@ settings.attribute :minimum_votes_per_user, type: :integer, default: 0, required: true settings.attribute :proposal_limit, type: :integer, default: 0, required: true settings.attribute :proposal_length, type: :integer, default: 500 - settings.attribute :proposal_edit_time, type: :enum, default: "limited", choices: -> { %w(infinite limited) } + settings.attribute :proposal_edit_time, type: :enum, default: "limited", choices: ->(_context) { %w(infinite limited) } settings.attribute :edit_time, type: :integer_with_units, default: [5, "minutes"], required: true, units: %w(minutes hours days) settings.attribute :threshold_per_proposal, type: :integer, default: 0, required: true settings.attribute :can_accumulate_votes_beyond_threshold, type: :boolean, default: false settings.attribute :proposal_answering_enabled, type: :boolean, default: true - settings.attribute :default_sort_order, type: :select, default: "automatic", choices: -> { POSSIBLE_SORT_ORDERS } + settings.attribute :default_sort_order, type: :select, default: "automatic", choices: ->(_context) { POSSIBLE_SORT_ORDERS } settings.attribute :official_proposals_enabled, type: :boolean, default: true settings.attribute :comments_enabled, type: :boolean, default: true settings.attribute :comments_max_length, type: :integer, required: true @@ -73,13 +73,13 @@ settings.attribute :proposal_answering_enabled, type: :boolean, default: true settings.attribute :publish_answers_immediately, type: :boolean, default: true settings.attribute :answers_with_costs, type: :boolean, default: false - settings.attribute :default_sort_order, type: :select, include_blank: true, choices: -> { POSSIBLE_SORT_ORDERS } + settings.attribute :default_sort_order, type: :select, include_blank: true, choices: ->(_context) { POSSIBLE_SORT_ORDERS } settings.attribute :amendment_creation_enabled, type: :boolean, default: true settings.attribute :amendment_reaction_enabled, type: :boolean, default: true settings.attribute :amendment_promotion_enabled, type: :boolean, default: true settings.attribute :amendments_visibility, type: :enum, default: "all", - choices: -> { Decidim.config.amendments_visibility_options } + choices: ->(_context) { Decidim.config.amendments_visibility_options } settings.attribute :announcement, type: :text, translated: true, editor: true settings.attribute :automatic_hashtags, type: :text, editor: false, required: false settings.attribute :suggested_hashtags, type: :text, editor: false, required: false diff --git a/docs/modules/develop/pages/components.adoc b/docs/modules/develop/pages/components.adoc index 805bb47035505..21167121ecc52 100644 --- a/docs/modules/develop/pages/components.adoc +++ b/docs/modules/develop/pages/components.adoc @@ -140,7 +140,7 @@ Decidim.register_component(:my_component) do |component| component.settings(:step) do |settings| settings.attribute :a_text_setting, type: :text, default: false, required: true, translated: true, editor: true - settings.attribute :a_lambda_enum_setting, type: :enum, default: "all", choices: -> { SomeClass.enum_options } + settings.attribute :a_lambda_enum_setting, type: :enum, default: "all", choices: ->(_context) { SomeClass.enum_options } settings.attribute :a_readonly_setting, type: :string, readonly: ->(context) { SomeClass.readonly?(context[:component]) } end