Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
75a4e81
feat: add sr-only with email example in registration new
Stef-Rousset Aug 21, 2025
3d3f1d7
feat: improve accessibility on terms of service in registration
Stef-Rousset Aug 21, 2025
4a75eea
Trigger CI
Stef-Rousset Aug 22, 2025
2717d0e
test: fix failing proposal system test
Stef-Rousset Sep 9, 2025
c852f97
Merge branch 'develop' of github.com:decidim/decidim into fix/input_a…
alecslupu Nov 28, 2025
b2d0ebe
New Crowdin updates (#15681)
decidim-bot Dec 9, 2025
f08bf40
Error handling of not found resources for GraphQL API (#15721)
alecslupu Dec 10, 2025
a0841c2
Fix NuValidator image (#15773)
alecslupu Dec 11, 2025
f72c523
Change Vote button to Edit vote when user has already voted (#15761)
antopalidi Dec 11, 2025
4ef4a70
Add total votes count to election results in admin and public views (…
antopalidi Dec 11, 2025
15dbb71
Allow editing last question on receipt page for per-question election…
antopalidi Dec 11, 2025
00b96d3
Prevent server error on proposal page when the user is not logged in …
fblupi Dec 12, 2025
e55f4c4
Use `GraphQL::ExecutionError` to handle API permissions (#15682)
alecslupu Dec 12, 2025
085ede4
Refactor QueryExtensions to move the implementation to API (#15768)
alecslupu Dec 12, 2025
cb5212d
Extract breadcrumb related specs to their own tests (#15737)
alecslupu Dec 13, 2025
1a80b16
Rename private participants to members (#15749)
andreslucena Dec 14, 2025
370ebe4
Add short_name field to Organizations for PWA (#15729)
andreslucena Dec 15, 2025
24e19c2
Add AWS Bucket configuration for public assets (#15777)
alecslupu Dec 15, 2025
0623de4
Extract documentation from /api to docs.decidim.org (#15804)
andreslucena Dec 15, 2025
c4aa90c
Fix search result comment with link (#15774)
Ginger-Leo Dec 15, 2025
4c1c6a0
Improve handling of `PermissionNotSetError` exceptions in GraphQL API…
alecslupu Dec 16, 2025
5fb38f0
Show responses menu entry in Surveys' admin (#15785)
greenwoodt Dec 16, 2025
94b7039
Fix process and assembly admin members action logs (#15788)
alecslupu Dec 17, 2025
9b079c2
Sorting via created_at attribute within spaces (#15810)
greenwoodt Dec 17, 2025
243d573
Fix focus trap in modal dialog for sharing (#15807)
Ginger-Leo Dec 17, 2025
b16ed4e
Add errors pages and more examples to API (#15814)
alecslupu Dec 18, 2025
b72051b
Move FormFactory to be accessible from API (#15819)
alecslupu Dec 19, 2025
c4faf2a
Add additional API exceptions (#15789)
alecslupu Dec 19, 2025
8361425
Update docs for GitHub Actions configuration (#15824)
andreslucena Dec 19, 2025
e2e272b
Enable EnforcedShorthandSyntax: always on rubocop configuration (#15822)
andreslucena Dec 19, 2025
6b4549b
Write API: vote/unvote proposals (#15791)
alecslupu Dec 19, 2025
0f9074e
Fix details in ProposalAnswerType spec file (#15826)
andreslucena Dec 19, 2025
97f1461
Merge branch 'develop' into fix/input_assistance_indications
Stef-Rousset Dec 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/actions/spelling/excludes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
^\Qdecidim-core/app/views/layouts/decidim/_edit_link.html.erb\E$
^\Qdecidim-core/lib/decidim/db/common-passwords.txt\E$
^\Qdecidim-core/spec/mailers/decidim_devise_mailer_spec.rb\E$
^\Qdecidim-core/spec/db/data/add_short_name_to_organizations_spec.rb\E$
^\Qdecidim-dev/lib/decidim/dev/assets/assemblies.json\E$
^\Qdecidim-dev/lib/decidim/dev/assets/base64_content.html\E$
^\Qdecidim-dev/lib/decidim/dev/assets/empty_file.csv\E$
Expand Down
5 changes: 4 additions & 1 deletion .github/actions/spelling/expect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,8 @@ evanfuture
evt
Exampledocument
exitstatus
Existente
EXISTINGCITY
faketoken
Fal
fcell
Expand Down Expand Up @@ -547,6 +549,7 @@ msword
multichoice
multifield
multitenant
mycity
myengine
mypass
myprovider
Expand Down Expand Up @@ -639,7 +642,7 @@ pamplona
pandoc
paramxx
partcipatory
participatoryspaceprivateusers
participatoryspace
patrimonigracia
Peguera
pepito
Expand Down
83 changes: 39 additions & 44 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,41 @@
# Decidim GitHub Actions workflows

We use GitHub Actions as CI.

- `lint_code.yml`: runs the linters for Ruby, JS and ERB files.
- `ci_main.yml`: runs the tests for the main folder
- `ci_core.yml`: runs the tests for the `decidim-core` module. The remaining workflows (except noted) are based on this one.

Individual workflows with changes:

- `ci_generators.yml`: `decidim-generators` does not need to create the test_app, so this command is removed. Screenshots uploads and chromedriver setup steps are also not needed for this module and thus removed. We also customize the gems path after running `bundle install`:

```yml
# ci_generators.yml
- run: bundle install --path vendor/bundle --jobs 4 --retry 3
name: Install Ruby deps
- run: cp -R vendor/bundle decidim-generators
- run: bundle exec rspec
name: RSpec
working-directory: ${{ env.DECIDIM_MODULE }}
```

- `ci_javascript.yml`: Runs tests for the JS files. Tests must run from the project root folder. You will need to install NodeJS and the JS dependencies:

```yml
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm ci
name: Install JS deps
- run: npm run test
name: Test JS files
```

- Some specs are split in three workflows, so if we need to retry this particular workflow we do not need to retry all the module suite. For instance proposals:

- `ci_proposals_system_admin.yml`: Runs the system specs for the admin section
- `ci_proposals_system_public.yml`: Runs the system specs for the public section
- `ci_proposals_unit_tests.yml`: Runs the unit tests

- `ci_performance_metrics_monitoring.yml`: Runs Lighthouse metrics expectations against the app to detect any performance regression. The expectations can be found in `lighthouse_budget.json`, where a time is defined for each metric:

- [First Contentful Paint](https://web.dev/first-contentful-paint/): 2 seconds
- [Speed Index](https://web.dev/speed-index/): 4 seconds
- [Time to Interactive](https://web.dev/interactive/): 5 seconds
- [Largest Contentful Paint](https://web.dev/lcp/): 2.5 seconds
We use GitHub Actions as CI with two key optimizations: **workflow splitting** and **composite actions**.

## Architecture

### Composite Actions

- `test_app.yml`: [Reusable workflow](https://docs.github.com/en/actions/using-workflows/reusing-workflows) that provides all common CI setup (Ruby, Node.js, database, Chrome, etc.)
- All `ci_*.yml` workflows use this composite action via `uses: ./.github/workflows/test_app.yml`
- Reduces duplication and simplifies maintenance

### Workflow Splitting

Large test suites are split into [parallel workflows](https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow) to reduce execution time:

## Core Workflows

- `lint_code.yml`: Lints Ruby, JS, and ERB files
- `ci_main.yml`: Tests for main folder
- `ci_core.yml`: Base template for module testing using `test_app.yml`

## Special Cases

- `ci_generators.yml`: No test app needed, uses custom gem path setup
- `ci_javascript.yml`: Runs JS tests from project root with Node.js setup

## Split Workflows (Parallel Execution)

Modules with large test suites are split across multiple workflows:

- Proposals: `ci_proposals_system_admin.yml`, `ci_proposals_system_public.yml`, `ci_proposals_unit_tests.yml`
- Similar patterns for other large modules

## Performance Monitoring

- `ci_performance_metrics_monitoring.yml`: Lighthouse CI with budgets:
- [First Contentful Paint](https://web.dev/first-contentful-paint/): 2s
- [Speed Index](https://web.dev/speed-index/): 4s
- [Time to Interactive](https://web.dev/interactive/): 5s
- [Largest Contentful Paint](https://web.dev/lcp/): 2.5s
1 change: 1 addition & 0 deletions .github/workflows/ci_api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ jobs:
with:
working-directory: "decidim-api"
test_command: bundle exec parallel_test --type rspec --pattern spec/
bullet_enabled: true
bullet_n_plus_one: true
bullet_unused_eager_loading: true
2 changes: 1 addition & 1 deletion .github/workflows/test_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
PARALLEL_TEST_PROCESSORS: 3
services:
validator:
image: ghcr.io/validator/validator:latest
image: ghcr.io/validator/validator@sha256:7667b0ffa6d395c27aa8f9e21db1cfe6b66549245a3972e9397d255de5ef0ec6
ports: ["8888:8888"]
postgres:
image: postgres:14
Expand Down
1 change: 1 addition & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -914,6 +914,7 @@ GEM

PLATFORMS
arm64-darwin-23
arm64-darwin-25
x86_64-linux

DEPENDENCIES
Expand Down
16 changes: 13 additions & 3 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ At the moment we are adding this gem so we can start doing data migrations for f

You can read more about this change on PR [#15501](https://github.com/decidim/decidim/pull/15501).

#### 2.4. Fix gitignore for ServiceWorker related files
### 2.4. Fix gitignore for ServiceWorker related files

We detected a bug where some dynamic files are not added to the gitignore, so they could be committed to the repository. For fixing it, you need to add them to your gitignore file:

Expand All @@ -104,7 +104,17 @@ echo "/public/sw.js*" >> .gitignore

You can read more about this change on PR [#15601](https://github.com/decidim/decidim/pull/15601).

### 2.5. Add locale to the url
### 2.5. Data migration for organization short_name

A new data migration has been added to populate the `short_name` field for existing organizations. This field is required for the PWA (Progressive Web App) manifest to properly display the application name on mobile devices' home screens.

The migration automatically generates a short_name for each organization based on its name by removing spaces and truncating to 12 characters maximum. Organizations with names that result in less than 3 characters after processing will not have a short_name set and will need to be configured manually through the admin panel.

This migration runs automatically when executing `bin/rails data:migrate` as part of the upgrade process.

You can read more about this change on PR [#15729](https://github.com/decidim/decidim/pull/15729).

### 2.6. Add locale to the url

For a long time Decidim has been using internally the user browser to detect the language of the user. This has been changed to use the locale of the url instead.

Expand All @@ -119,7 +129,7 @@ It also enables the users of multi language platforms to share the links to the

You can read more about this change on PR [#14432](https://github.com/decidim/decidim/pull/14432).

### 2.6. [[TITLE OF THE ACTION]]
### 2.7. [[TITLE OF THE ACTION]]

You can read more about this change on PR [#XXXX](https://github.com/decidim/decidim/pull/XXXX).

Expand Down
2 changes: 1 addition & 1 deletion config/i18n-tasks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ search:
## %w(*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less *.yml *.json)
exclude:
- decidim-dev/lib/decidim/dev/assets/iso-8859-15.md
- decidim-dev/lib/decidim/dev/assets/import_participatory_space_private_users_iso8859-1.csv
- decidim-dev/lib/decidim/dev/assets/import_members_iso8859-1.csv
- decidim-comments/app/assets/javascripts/decidim/comments/bundle.js
- decidim-comments/app/assets/javascripts/decidim/comments/bundle.js.map
- "*.jpeg"
Expand Down
2 changes: 1 addition & 1 deletion decidim-accountability/config/locales/eu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ eu:
one: Emaitza 1
other: "%{count} emaitza"
home_header:
global_status: Exekuzio-egoera orokorra
global_status: Helburuen betetze-maila
milestones:
title: Mugarriak
no_results: Ez dago proiekturik
Expand Down
1 change: 1 addition & 0 deletions decidim-accountability/config/locales/ja.yml
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ ja:
accountability:
actions:
comment: コメント
vote_comment: コメントに投票
name: アカウンタビリティ
settings:
global:
Expand Down
56 changes: 56 additions & 0 deletions decidim-accountability/config/locales/tr-TR.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
tr:
activemodel:
attributes:
milestone:
description: Açıklama
entry_date: Tarih
title: Başlık
result:
decidim_accountability_status_id: Durum
decidim_category_id: Kategori
Expand Down Expand Up @@ -36,13 +40,15 @@ tr:
decidim:
accountability:
actions:
add_milestone: Aşama ekle
confirm_delete_result: Bu sonucu silmek istediğinizden emin misiniz?
confirm_destroy: Bu %{name}silmek istediğinize emin misiniz?
deleted_results_info: Silinen sonuçlar çöp kutusundan geri yüklenebilir.
destroy: silmek
edit: Düzenle
import: Sonuçları başka bir bileşenden içe aktar
import_csv: Sonuçları CSV dosyasından içe aktarın
new_milestone: Yeni aşama
new_result: Yeni sonuç
new_status: Yeni Durum
preview: Ön izleme
Expand Down Expand Up @@ -83,6 +89,20 @@ tr:
create:
invalid: Sonuçlar içe aktarılırken bir sorun oluştu.
success: Dosya aktarımı başladı. Birkaç dakika içinde içe aktarma işleminin sonucunu içeren bir e-posta alacaksınız.
milestones:
create:
invalid: Bu aşama oluşturulurken bir hata oluştu.
success: Aşama başarıyla oluşturuldu.
destroy:
success: Aşama başarıyla silindi.
edit:
title: Aşamayı düzenle
update: Aşamayı güncelle
new:
create: Aşama oluştur
update:
invalid: Bu aşama güncellenirken bir hata oluştu.
success: Aşama başarıyla güncellendi.
models:
result:
name: Sonuç
Expand Down Expand Up @@ -133,6 +153,7 @@ tr:
invalid: Sonuçlar %{results} için sınıflandırmalar %{taxonomies} seçilemiyor
select_a_result: Bir sonuç seç
select_a_taxonomy: Bir sınıflandırma seç
success: '%{results} için sınıflandırmalar %{taxonomies} başarıyla güncellendi'
shared:
subnav:
statuses: durumlar
Expand All @@ -157,6 +178,7 @@ tr:
result:
create: "%{user_name} sonuç yaratmıştır %{resource_name} içinde %{space_name}"
delete: "%{user_name} %{resource_name} sonuçtan %{space_name}sildi"
restore: "%{user_name}, %{space_name}'deki %{resource_name} sonucunu geri yükledi"
update: "%{user_name} güncellenen sonuç %{resource_name} in %{space_name}"
status:
create: "48 / 5.000\nÇeviri sonuçları\nÇeviri sonucu\n%{user_name}, %{resource_name} kaydını oluşturdu"
Expand All @@ -168,6 +190,8 @@ tr:
content_blocks:
highlighted_results:
results: Sonuç
creation:
text: Bu sonuç eklendi
import_mailer:
import:
errors: Hatalar
Expand All @@ -177,8 +201,18 @@ tr:
success: Sonuçların içe aktarılması başarılı. Sonuçları yönetim arayüzünde inceleyebilirsiniz.
import_projects_mailer:
import:
added_projects:
one: Projelerden bir sonuç içe aktarıldı.
other: "%{count} sonuç projelerden içe aktarıldı."
subject: Projeler başarıyla aktarılmıştır
success: '%{component_name} bileşenindekiprojeler başarıyla aktarılmıştır. Sonuçları yönetim arayüzünde inceleyebilirsiniz.'
import_proposals_mailer:
import:
added_proposals:
one: Tekliflerden bir sonuç içe aktarıldı
other: "%{count} sonuç tekliflerden içe aktarıldı."
subject: Tekliflerin içe aktarımı başarılı
success: Teklifler %{component_name} bileşenindeki sonuçlara başarıyla aktarılmıştır. Sonuçları yönetim arayüzünde inceleyebilirsiniz.
last_activity:
new_result: 'Yeni sonuç:'
models:
Expand All @@ -203,6 +237,8 @@ tr:
other: "%{count} sonuç"
home_header:
global_status: Genel yürütme durumu
milestones:
title: Aşamalar
no_results: Proje Bulunamadı
search:
search: İşlemleri ara
Expand All @@ -214,19 +250,32 @@ tr:
results:
status_id_eq:
label: Durum
tooltips:
deleted_results_info: Bu sonuç silinemiyor
components:
accountability:
actions:
comment: Yorum
vote_comment: Yorumu oyla
name: Sorumluluk
settings:
global:
clear_all: Tümünü sil
comments_enabled: Yorumlar etkin
comments_max_length: Maksimum yorum uzunluğu (Varsayılan değer için 0 bırakın)
default_taxonomy: Varsayılan sınıflandırma
default_taxonomy_help: Varsayılan olarak hangi sınıflandırmayı göstermek istediğinizi seçin. Eğer herhangi bir sınıflandırma seçilmezse, sonuçlar liste biçiminde gösterilecektir.
define_taxonomy_filters: Bu ayarı kullanmadan önce lütfen bu katılımcı alan için bazı filtreler tanımlayın.
display_progress_enabled: İlerlemeyi göster
intro: Tanıtım
no_taxonomy_filters_found: Sınıflandırma filtresi bulunamadı.
taxonomy_filters_add: Filtre ekle
step:
comments_blocked: Yorumlar engellendi
download_your_data:
show:
result_comments: Sonuç yorumlarını dışa aktar
results: Sonuçları içe aktar
events:
accountability:
proposal_linked:
Expand All @@ -241,8 +290,15 @@ tr:
notification_title: '<a href="%{proposal_path}">%{proposal_title}</a> teklifini içeren <a href="%{resource_path}">%{resource_title}</a> sonucu: %{progress} tamamlandı.'
open_data:
help:
result_comments:
author: Bu yorumu yapan katılımcının adı
body: Yorumun kendisi
created_at: Bu yorumun oluşturulduğu tarih
root_commentable_url: Bu yoruma bağlı kaynağın URL bağlantısı
results:
address: Sonucun adresi (varsa)
created_at: Sonucun oluşturulma tarihi
taxonomies:
participatory_spaces:
highlighted_results:
see_all: Tüm sonuçları gör (%{count})
Expand Down
6 changes: 3 additions & 3 deletions decidim-accountability/lib/decidim/api/accountability_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ def results
Result.where(component: object).includes(:component)
end

def result(**args)
Result.where(component: object).find_by(id: args[:id])
def result(id:)
Result.where(component: object).find(id)
end

def statuses
Status.where(component: object).order(:progress, :key, :id)
end

def status(id:)
Status.where(component: object).find_by(id:)
Status.where(component: object).find(id)
end
end
end
Expand Down
Loading
Loading