diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt index 6e24102cd1629..28c5f8f988d94 100644 --- a/.github/actions/spelling/excludes.txt +++ b/.github/actions/spelling/excludes.txt @@ -103,6 +103,7 @@ ^\Qdecidim-core/spec/mailers/decidim_devise_mailer_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$ ^\Qdecidim-dev/lib/decidim/dev/assets/import_proposals.csv\E$ ^\Qdecidim-dev/lib/decidim/dev/assets/import_proposals.json\E$ ^\Qdecidim-dev/lib/decidim/dev/assets/import_proposals_broken.csv\E$ diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index b46fc6a8049ee..15ae877a1ee36 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -6,16 +6,20 @@ abcert abcloktpes acceptada accesslist -Aceasta acentos acro +actioncable +actionmailbox +actionmailer +actionpack +actiontext +actionview activejob activelog activemodel activerecord activestorage actualizado -additionalreply addlabel Adeu adjunt @@ -33,18 +37,15 @@ amagat amd amendables AMR -Amz andreslucena ANOT antora Anunci apiauth apikey -appendable aproximadamente aquesta ARBITRARYREF -areachart arel Arquitectura Arrakis @@ -61,8 +62,6 @@ authorable auths autocorrection autocorrects -autojump -autoloaded automatisms autosort autotranslated @@ -83,7 +82,6 @@ beforeinput beforeinstallprompt belighted bem -bfrozen bgset Biblioteca bindir @@ -100,7 +98,6 @@ boundingbox Brakus breadcrumb browserstack -builder bugfixing byebug bytesize @@ -115,7 +112,6 @@ cami Capfile carolromero Carrer -carrierwave carryforward catala Catalunya @@ -127,15 +123,12 @@ ccv cdn cdp cellphone -centerblock changeme chartkick cherrypicking childs chromedriver -cht cityhall -cld clickable clickbait cmax @@ -143,7 +136,6 @@ cmin coauthorable coauthorabledummy cobertura -codeclimate codecov codefor CODEOWNERS @@ -176,11 +168,8 @@ crt cryptor CSPs csrf -csscustom -csseditable csslintrc CSSs -csvfile cta cuenta Cugat @@ -195,13 +184,11 @@ dataselect dataviz Daunou dayjs -daysy DDG ddmm deauthorizes debante debian -decdim decidiamo decidim decidimcommandscreateresource @@ -212,7 +199,6 @@ Defg deivid demodulize demodulized -demonym Denesik denunciat detalles @@ -231,7 +217,6 @@ displaycondition django dni dockerflow -doctag Doctum doesnot doggotrainer @@ -243,10 +228,8 @@ downvotes downvoting draggables dragula -drilldown drinkform dropcluster -dropmenu dsl dtend dtgt @@ -255,7 +238,6 @@ dtlt dtlteq dtstart dvh -dximagetransform editlabel editorlabel edu @@ -280,27 +262,20 @@ enviado envrc EOCONTENT EOEXPECTED -EOJOINCATS EOLIST EOPARAGRAPH EORESULT -EOSQL EOTASK -EOTITLE eql equalcat equales equalto erabaki erblint -ERESOLVE Errbit -ERVz Esa espa estat -este -Etags etherpad evanfuture evt @@ -344,9 +319,6 @@ Fpb freetext Fritsch Froilan -fsb -fsc -fulltext gadgetmodel gamification gamified @@ -367,8 +339,6 @@ GFM GHSA gia Girona -Gitflow -gitk gitpod googleoff googleon @@ -392,8 +362,6 @@ haml Hammes hashdiff hashtaggable -hashtagging -hastaggable hashtags heighta heightb @@ -419,7 +387,6 @@ httpdate httpfoobar httpsfoobar huedelta -Hyperlinks iaa iban ical @@ -439,9 +406,7 @@ Indicacions infoa infob informables -Inici iniciar -initialiser inodes inputdialog inputname @@ -469,7 +434,6 @@ joh johndoe johnohara jon -joomla josepjaume jpe jschmoe @@ -488,8 +452,6 @@ kramdown kwbegin laguardia Lalalilo -lastcenter -lastleft latlng Layouter LCell @@ -501,12 +463,11 @@ libicu libpq libreadline libreoffice -libvips +libretranslate libyaml Liddel lighthouserc linebreak -linechart linkbubble linkedin linthtml @@ -525,19 +486,16 @@ lon LOPD los Lovecraft -lowlight lsclusters lte lteq LTREE Lupu lvh -lvml magick mainio Malgrat Mandaliya -mangosteens maptiles markercluster marydoe @@ -548,10 +506,8 @@ maxtimeout mcdoggo mcell medios -mediumlarge meeny meh -mendocito mensaje mentionables mergeable @@ -561,23 +517,19 @@ metadecidim metaprogrammed metaprogramming metatags -meva mic mickdoe mikedoe Milhouse millor Millora -minicard mintimeout minuscat misogi mlat mlon -Moby Mobi modals -modernizr modernizrrc modestbranding modificado @@ -586,25 +538,17 @@ modqule mongoid morphdom Mostrar -motionui mpassid -mqa mrc mri -msgpack mso msword multichoice multifield -multiscope multitenant -multiusers -mutante myengine -myhashtag mypass myprovider -myrealdomain mytesturl myuser neighbourhoods @@ -625,22 +569,14 @@ nlevel nocaps nocookie NOCREATEROLE -nodatafound -nodesource -nodistro nodoc nok -nomargin nombre nominatim -noopen -nopadding noresults normalcase -nosniff notif notselected -npmjs nric nto nuqmnw @@ -674,7 +610,6 @@ openxmlformats OPR optin orga -orgchart Oriol oriolgual ORMs @@ -705,7 +640,6 @@ paramxx partcipatory participatoryspaceprivateusers patrimonigracia -PDFs Peguera pepito Percebe @@ -743,7 +677,6 @@ preheader premailer Preproc presenceness -previewer previewurl privatable Procesos @@ -756,7 +689,6 @@ promotal promotors proposta Propostes -propozitie Propuesta prosemirror protonmail @@ -805,13 +737,9 @@ Returs Riera Rigoberto riseup -rlt roadmap Rojman -roundtrippable -roundtripping routable -rowchart rowdata rowi RQR @@ -827,9 +755,6 @@ rvm Ryanair Sangtrait sanitizers -sassc -sbc -sbe scannables SCell scheleton @@ -839,7 +764,6 @@ screenreader screenshots searchables sectorials -sekrets selectables selectednode selfxss @@ -848,22 +772,18 @@ sereneinserenade serializeds setseed sgid -Shakacode shakapacker sharedapp shellcheckrc -shellwords shs sidekiq signedby -signin siguientes similars Simonis singlechoice slugization slugizes -smallmedium smartbreak Smileys Snowlvhme @@ -880,8 +800,6 @@ spammer spos spreadsheetml sqbracket -sqlcommenter -ssb sss Stabby stackprof @@ -892,9 +810,7 @@ stftime Stylelinter stylelintrc subattributes -subcategorized subelements -subfilters subforms subgems subkeys @@ -904,23 +820,18 @@ subquery subrecord subresult subscope -subscoped subsubscope subtemplate subtpl subu subvalue -suggestedhashtag suomifi Superkalifragilistic superklass superprocess sustainability swc -szr -szw tableize -tagsinput tailwindcss tarekraafat taxonomizable @@ -940,7 +851,6 @@ Textareas textb texto thant -thedoggokeeper thelma thepassword THH @@ -969,12 +879,9 @@ trashable trgm trobada tsearch -tumblr turbolinks Twilio tzid -tzip -uber ucw udev ueee @@ -983,16 +890,12 @@ ujs ukmany unassigning unassigns -uncollapse uncollapsing uncommentable undefines -unlike -unliking unfollow unhides Uninstalls -Unir unmark unofficializating unofficialization @@ -1021,30 +924,23 @@ upvoting usuarias usecase usename -usergroup -usermenu Uth utm -uuids Uusimaa Valero validable valids -valueline Valuetypes VCALENDAR veeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeery -vendorized verificator verylongnicknamethatcreatesanerror VEVENT vfield Vilanova vimeo -vizzs VJHT vkontakte -vml vnd voner vostre @@ -1061,11 +957,8 @@ webpage webpush websites wechat -weibo -whatinput whatislove whatsapp -widescreen widtha widthb wifi @@ -1074,20 +967,15 @@ winutils wip wisper withdrawability -wkhtmltopdf -wrapwidth WYSWYG XForwarded xing -xlarge xobject Xvfb XXXXXXXXY XXXXXXXY yardopts -yarnkey ydd -yjit yieldparam yieldreturn yoda @@ -1096,7 +984,5 @@ youtu youtube yuyuyukie Zbd -zeitwerk Zupper zzz -zzzupper diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000..404bc5482f75b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,75 @@ +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + # /Gemfile.lock + - package-ecosystem: "bundler" + directory: "/" + schedule: + interval: "weekly" + day: "thursday" + time: "09:00" + open-pull-requests-limit: 5 + groups: + rails: + patterns: + - "rails*" + - "actionpack" + - "actioncable" + - "actionmailbox" + - "actionmailer" + - "actiontext" + - "actionview" + - "activestorage" + - "railties" + - "activemodel" + - "activejob" + - "activerecord" + - "activesupport" + rspec: + patterns: + - "rspec-core" + - "rspec-expectations" + - "rspec-mocks" + - "rspec-support" + versioning-strategy: "increase" + labels: + - "dependencies" + - "type: internal" + + # /decidim-generators/Gemfile.lock + - package-ecosystem: "bundler" + directory: "/decidim-generators" + schedule: + interval: "weekly" + day: "thursday" + time: "09:00" + open-pull-requests-limit: 5 + groups: + rails: + patterns: + - "rails*" + - "actionpack" + - "actioncable" + - "actionmailbox" + - "actionmailer" + - "actiontext" + - "actionview" + - "activestorage" + - "railties" + - "activemodel" + - "activejob" + - "activerecord" + - "activesupport" + rspec: + patterns: + - "rspec-core" + - "rspec-expectations" + - "rspec-mocks" + - "rspec-support" + versioning-strategy: "increase" + labels: + - "dependencies" + - "type: internal" + - "decidim-generators" + diff --git a/.github/labeler.yml b/.github/labeler.yml index 97555d83c289d..7d86672707330 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -103,9 +103,6 @@ javascript: "module: proposals": - changed-files: - any-glob-to-any-file: decidim-proposals/**/* -"module: sortitions": - - changed-files: - - any-glob-to-any-file: decidim-sortitions/**/* "module: surveys": - changed-files: - any-glob-to-any-file: decidim-surveys/**/* diff --git a/.github/workflows/ci_backporter.yml b/.github/workflows/ci_backporter.yml index ea00977417fff..7eff2898615ca 100644 --- a/.github/workflows/ci_backporter.yml +++ b/.github/workflows/ci_backporter.yml @@ -9,7 +9,7 @@ concurrency: env: CI: "true" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 jobs: backport: diff --git a/.github/workflows/ci_generators.yml b/.github/workflows/ci_generators.yml index 02028669d5824..47a62c64943e7 100644 --- a/.github/workflows/ci_generators.yml +++ b/.github/workflows/ci_generators.yml @@ -16,7 +16,7 @@ on: env: CI: "true" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 NODE_VERSION: 22.14.0 NODE_ENV: "test" DECIDIM_MODULE: decidim-generators diff --git a/.github/workflows/ci_main.yml b/.github/workflows/ci_main.yml index 83cbb40e11148..a06f3b490fc81 100644 --- a/.github/workflows/ci_main.yml +++ b/.github/workflows/ci_main.yml @@ -11,7 +11,7 @@ on: env: CI: "true" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 NODE_VERSION: 22.14.0 SHAKAPACKER_RUNTIME_COMPILE: "false" diff --git a/.github/workflows/ci_performance_metrics_monitoring.yml b/.github/workflows/ci_performance_metrics_monitoring.yml index 77e95a5752253..0374d66465636 100644 --- a/.github/workflows/ci_performance_metrics_monitoring.yml +++ b/.github/workflows/ci_performance_metrics_monitoring.yml @@ -18,7 +18,7 @@ on: env: CI: "true" SIMPLECOV: "true" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 NODE_VERSION: 22.14.0 NODE_ENV: "test" RAILS_ENV: development diff --git a/.github/workflows/ci_production_check.yml b/.github/workflows/ci_production_check.yml index c2d810b51b646..cd151012b8923 100644 --- a/.github/workflows/ci_production_check.yml +++ b/.github/workflows/ci_production_check.yml @@ -12,7 +12,7 @@ on: env: CI: "false" SIMPLECOV: "false" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 NODE_VERSION: 22.14.0 NODE_ENV: "production" RAILS_ENV: production diff --git a/.github/workflows/ci_sortitions.yml b/.github/workflows/ci_sortitions.yml deleted file mode 100644 index e5eda5214d1ff..0000000000000 --- a/.github/workflows/ci_sortitions.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "[CI] Sortitions" -on: - push: - branches: - - develop - - release/* - - "*-stable" - pull_request: - branches-ignore: - - "chore/l10n*" - paths: - - "*" - - ".github/**" - - "decidim-admin/**" - - "decidim-comments/**" - - "decidim-core/**" - - "decidim-dev/**" - - "decidim-proposals/**" - - "decidim-sortitions/**" - -permissions: - contents: read - pull-requests: read - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} - cancel-in-progress: true - -jobs: - main: - name: Tests - uses: ./.github/workflows/test_app.yml - secrets: inherit - with: - working-directory: "decidim-sortitions" - test_command: bundle exec parallel_test --type rspec --pattern spec/ - bullet_n_plus_one: false - bullet_unused_eager_loading: false diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c0a1c8774c489..febf5cfff946e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -11,7 +11,7 @@ on: inputs: ruby_version: description: 'Ruby Version' - default: "3.3.4" + default: "3.4.7" type: string required: false node_version: diff --git a/.github/workflows/lint_code.yml b/.github/workflows/lint_code.yml index 5e23627de491f..2cf9e5e939cde 100644 --- a/.github/workflows/lint_code.yml +++ b/.github/workflows/lint_code.yml @@ -12,7 +12,7 @@ on: env: CI: "true" SIMPLECOV: "true" - RUBY_VERSION: 3.3.4 + RUBY_VERSION: 3.4.7 NODE_VERSION: 22.14.0 SHAKAPACKER_RUNTIME_COMPILE: "false" diff --git a/.github/workflows/test_app.yml b/.github/workflows/test_app.yml index 6915f4da14f3d..f1c7f8d7d90cc 100644 --- a/.github/workflows/test_app.yml +++ b/.github/workflows/test_app.yml @@ -3,7 +3,7 @@ on: inputs: ruby_version: description: 'Ruby Version' - default: "3.3.4" + default: "3.4.7" required: false type: string working-directory: diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 3cfff7655a7b6..bf356c10a5ec4 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -29,7 +29,7 @@ RUN curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | && echo ". ~/.nvm/nvm.sh" >> ~/.bashrc.d/50-node # Install rbenv and Ruby -ENV RUBY_VERSION=3.3.4 +ENV RUBY_VERSION=3.4.7 ENV WORKSPACE_GEM_HOME=/workspace/.gem RUN sudo apt-get install -y build-essential curl git zlib1g-dev libssl-dev \ libreadline-dev libyaml-dev libxml2-dev libxslt-dev diff --git a/.ruby-version b/.ruby-version index a0891f563f38b..2aa5131992119 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.4 +3.4.7 diff --git a/Gemfile.lock b/Gemfile.lock index fa68b314a2adc..962ba80e8dc2c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,7 +17,6 @@ PATH decidim-pages (= 0.32.0.dev) decidim-participatory_processes (= 0.32.0.dev) decidim-proposals (= 0.32.0.dev) - decidim-sortitions (= 0.32.0.dev) decidim-surveys (= 0.32.0.dev) decidim-system (= 0.32.0.dev) decidim-verifications (= 0.32.0.dev) @@ -187,11 +186,6 @@ PATH decidim-core (= 0.32.0.dev) doc2text (~> 0.4.0, >= 0.4.8) redcarpet (~> 3.5, >= 3.5.1) - decidim-sortitions (0.32.0.dev) - decidim-admin (= 0.32.0.dev) - decidim-comments (= 0.32.0.dev) - decidim-core (= 0.32.0.dev) - decidim-proposals (= 0.32.0.dev) decidim-surveys (0.32.0.dev) decidim-core (= 0.32.0.dev) decidim-forms (= 0.32.0.dev) @@ -342,7 +336,7 @@ GEM fast-stemmer (~> 1.0) matrix (~> 0.4) cmdparse (3.0.7) - commonmarker (0.23.11) + commonmarker (0.23.12) concurrent-ruby (1.3.5) connection_pool (2.5.4) crack (1.0.0) @@ -942,7 +936,7 @@ DEPENDENCIES web-console (~> 4.2) RUBY VERSION - ruby 3.3.4p94 + ruby 3.4.7p58 BUNDLED WITH 2.4.20 diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ef4832300dbce..74925e83bec21 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -37,6 +37,10 @@ bin/rails decidim:upgrade bin/rails db:migrate # skip this command if you have run it before: bin/rails decidim:upgrade:clean:remove_private_exports_attachments +echo "/public/sw.js*" >> .gitignore +bin/rails decidim:upgrade:remove_deleted_users_left_data +bin/rails decidim:upgrade:fix_deleted_private_follows +bin/rails data:migrate ``` ### 1.4. AWS/Azure/Google Cloud assets storage @@ -63,7 +67,7 @@ The Collaborative Drafts feature in the Proposals module (`decidim-proposals`) w #### Sortitions (decidim-sortitions) -The Sortitions module (`decidim-sortitions`) will be removed in v0.32. This module provided functionality to randomly select participants or proposals. Organizations relying on this feature should consider implementing alternative selection mechanisms. +The Sortitions module (`decidim-sortitions`) is removed in v0.32. This module provided functionality to randomly select participants or proposals. Organizations relying on this feature should consider implementing alternative selection mechanisms. #### Polls in Meetings (decidim-meetings polls functionality) @@ -89,6 +93,20 @@ 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 + +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: + +```bash +echo "/public/sw.js*" >> .gitignore +``` + +You can read more about this change on PR [#15601](https://github.com/decidim/decidim/pull/15601). + +### 2.5. [[TITLE OF THE ACTION]] + +You can read more about this change on PR [#XXXX](https://github.com/decidim/decidim/pull/XXXX). + ## 3. One time actions These are one time actions that need to be done after the code is updated in the production database. @@ -105,7 +123,27 @@ bin/rails decidim:upgrade:fix_action_log You can read more about this change on PR [#15390](https://github.com/decidim/decidim/pull/15390). -### 3.2. [[TITLE OF THE ACTION]] +### 3.2. Remove user data left behind by `Decidim::DestroyAccount` + +When a user deletes their account and the `Decidim::DestroyAccount` command is executed, certain related data such as authorizations, versions, private exports, access grants, access tokens, notifications, and reminders were left behind. To fix this issue, we've added a new rake task to clean up the leftover data for previously deleted users. + +```ruby +bin/rails decidim:upgrade:remove_deleted_users_left_data +``` + +You can read more about this change on PR [#14731](https://github.com/decidim/decidim/pull/14731). + +### 3.3. Remove the follows of former private users + +To delete the follows of ex private users of non transparent assemblies or processes, run + +```console +bin/rails decidim:upgrade:fix_deleted_private_follows +``` + +You can read more about this change on PR [#12878](https://github.com/decidim/decidim/pull/12878). + +### 3.4. [[TITLE OF THE ACTION]] You can read more about this change on PR [#XXXX](https://github.com/decidim/decidim/pull/XXXX). diff --git a/SECURITY.md b/SECURITY.md index c510be7a06499..2835cff1f93c1 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,12 +11,10 @@ of v0.28, giving ample time for organizations to upgrade to newer versions that include the latest design and features. | Version | Supported | -| -------- | ------------------ | +|----------|--------------------| +| 0.31.x | :white_check_mark: | | 0.30.x | :white_check_mark: | -| 0.29.x | :white_check_mark: | -| 0.28.x | :x: | -| 0.27.x | :white_check_mark: | -| \<= 0.26 | :x: | +| \<= 0.29.x | :x: | ## Reporting a Vulnerability diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index eccae9dc3f2ac..6dfc3ce28997c 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -229,9 +229,6 @@ ignore_unused: - decidim.budgets.projects.order_progress.vote_threshold_percent_rule.* - decidim.orders.checkout.* - decidim.budgets.projects.filters.* - - decidim.sortitions.admin_log.* - - decidim.sortitions.sortitions.filters.* - - decidim.sortitions.sortitions.orders.* - decidim.initiatives.admin_log.* - decidim.initiatives.initiatives.orders.* - decidim.initiatives.states.* diff --git a/decidim-accountability/app/controllers/concerns/decidim/accountability/admin/filterable.rb b/decidim-accountability/app/controllers/concerns/decidim/accountability/admin/filterable.rb index 7c47e726ab808..d81e1646cb74e 100644 --- a/decidim-accountability/app/controllers/concerns/decidim/accountability/admin/filterable.rb +++ b/decidim-accountability/app/controllers/concerns/decidim/accountability/admin/filterable.rb @@ -23,10 +23,6 @@ def base_query collection.includes(:taxonomies).joins(:taxonomies) end - def search_field_predicate - :id_string_or_title_cont - end - def filters [ :taxonomies_part_of_contains, diff --git a/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb b/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb index f3cdce8a64b74..4b5bf0fb88435 100644 --- a/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb +++ b/decidim-accountability/app/controllers/decidim/accountability/results_controller.rb @@ -10,8 +10,6 @@ class ResultsController < Decidim::Accountability::ApplicationController helper_method :results, :result, :count_calculator, :selected_root_taxonomy, :selected_taxonomy_children, :selected_taxonomy_grandchildren? - before_action :set_controller_breadcrumb - def show raise ActionController::RoutingError, "Not Found" unless result end @@ -70,23 +68,25 @@ def count_calculator(taxonomy_id) Decidim::Accountability::ResultsCalculator.new(current_component, taxonomy_id).count end - def controller_breadcrumb_items - @controller_breadcrumb_items ||= [] - end - - def set_controller_breadcrumb - controller_breadcrumb_items << breadcrumb_item - end - - def breadcrumb_item + def add_parent_breadcrumb_item return {} if result&.parent.blank? { label: translated_attribute(result.parent.title), - url: result_path(result.parent), + url: Decidim::EngineRouter.main_proxy(current_component).result_path(result.parent), active: true } end + + def add_breadcrumb_item + return {} if result.blank? + + { + label: translated_attribute(result.title), + url: Decidim::EngineRouter.main_proxy(current_component).result_path(result), + active: false + } + end end end end diff --git a/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb b/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb index 5f8ce48d8245b..507aaf53fb689 100644 --- a/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb +++ b/decidim-accountability/app/controllers/decidim/accountability/versions_controller.rb @@ -19,6 +19,16 @@ def versioned_resource def result @result ||= Result.includes(:milestones).where(component: current_component).find(params[:result_id]) end + + def add_breadcrumb_item + return {} if result.blank? + + { + label: translated_attribute(result.title), + url: Decidim::EngineRouter.main_proxy(current_component).result_path(result), + active: false + } + end end end end diff --git a/decidim-accountability/app/models/decidim/accountability/result.rb b/decidim-accountability/app/models/decidim/accountability/result.rb index bc9c23dd74a53..5a70742441e0a 100644 --- a/decidim-accountability/app/models/decidim/accountability/result.rb +++ b/decidim-accountability/app/models/decidim/accountability/result.rb @@ -103,11 +103,11 @@ def self.ransackable_scopes(_auth_object = nil) ransacker_i18n_multi :search_text, [:title, :description] def self.ransackable_attributes(auth_object = nil) - base = %w(search_text title description) + base = %w(id_string id search_text title description) return base unless auth_object&.admin? - base + %w(id_string created_at id progress) + base + %w(created_at progress) end def self.ransackable_associations(auth_object = nil) diff --git a/decidim-accountability/app/views/decidim/accountability/admin/results/_result-tr.html.erb b/decidim-accountability/app/views/decidim/accountability/admin/results/_result-tr.html.erb index cdc78857a54f5..5f0cc05983a4f 100644 --- a/decidim-accountability/app/views/decidim/accountability/admin/results/_result-tr.html.erb +++ b/decidim-accountability/app/views/decidim/accountability/admin/results/_result-tr.html.erb @@ -2,9 +2,6 @@ <%= check_box_tag "result_ids_s[]", result.id, false, data: { result_id: result.id, result_checkbox: true } %>
- "> - <%= result.id %>
- "> <% if result.parent_id.nil? %> <%= link_to translated_attribute(result.title), results_path(parent_id: result.id) %>
@@ -21,7 +18,7 @@ <% end %> "> - <%= result.progress&.to_i %> + <%= result.progress.nil? ? 0 : result.progress&.to_i %>% "> <%= l result.created_at, format: :decidim_short %> diff --git a/decidim-accountability/app/views/decidim/accountability/admin/results/_results-thead.html.erb b/decidim-accountability/app/views/decidim/accountability/admin/results/_results-thead.html.erb index 783cd2bf6e5b9..1be892827d343 100644 --- a/decidim-accountability/app/views/decidim/accountability/admin/results/_results-thead.html.erb +++ b/decidim-accountability/app/views/decidim/accountability/admin/results/_results-thead.html.erb @@ -3,9 +3,6 @@ <%= check_box_tag "results_bulk", "all", false, data: { "select-all" => true } %> - - <%= sort_link(query, :id, t("models.result.fields.id", scope: "decidim.accountability"), default_order: :desc ) %> - <%= sort_link(query, :title, t("models.result.fields.title", scope: "decidim.accountability")) %> diff --git a/decidim-accountability/config/locales/ar.yml b/decidim-accountability/config/locales/ar.yml index 21def6b473238..a406b99f88472 100644 --- a/decidim-accountability/config/locales/ar.yml +++ b/decidim-accountability/config/locales/ar.yml @@ -182,7 +182,6 @@ ar: fields: created_at: تم الإنشاء end_date: تاريخ الانتهاء - id: المعرف ID progress: تقدم start_date: تاريخ البدء status: الحالة diff --git a/decidim-accountability/config/locales/bg.yml b/decidim-accountability/config/locales/bg.yml index 4e075ea167b16..dcabc4b926a1d 100644 --- a/decidim-accountability/config/locales/bg.yml +++ b/decidim-accountability/config/locales/bg.yml @@ -124,7 +124,6 @@ bg: fields: created_at: Създаден end_date: Крайна дата - id: ID progress: Напредък start_date: Начална дата status: Статус diff --git a/decidim-accountability/config/locales/ca-IT.yml b/decidim-accountability/config/locales/ca-IT.yml index cdbb44d117060..59deb4b5ed5a4 100644 --- a/decidim-accountability/config/locales/ca-IT.yml +++ b/decidim-accountability/config/locales/ca-IT.yml @@ -254,7 +254,6 @@ ca-IT: fields: created_at: Creat end_date: Fi - id: ID progress: Progrés start_date: Inici status: Estat @@ -296,6 +295,7 @@ ca-IT: accountability: actions: comment: Comentar + vote_comment: Votar el comentari name: Seguiment settings: global: diff --git a/decidim-accountability/config/locales/ca.yml b/decidim-accountability/config/locales/ca.yml index ebff6156901e9..a1e7f89220605 100644 --- a/decidim-accountability/config/locales/ca.yml +++ b/decidim-accountability/config/locales/ca.yml @@ -254,7 +254,6 @@ ca: fields: created_at: Creat end_date: Fi - id: ID progress: Progrés start_date: Inici status: Estat @@ -296,6 +295,7 @@ ca: accountability: actions: comment: Comentar + vote_comment: Votar el comentari name: Seguiment settings: global: diff --git a/decidim-accountability/config/locales/cs.yml b/decidim-accountability/config/locales/cs.yml index 972f9df169dd0..23f34dd3fff72 100644 --- a/decidim-accountability/config/locales/cs.yml +++ b/decidim-accountability/config/locales/cs.yml @@ -265,7 +265,6 @@ cs: fields: created_at: Vytvořeno end_date: Datum ukončení - id: ID progress: Průběh start_date: Počáteční datum status: Stav diff --git a/decidim-accountability/config/locales/de.yml b/decidim-accountability/config/locales/de.yml index 576754900e82f..e836476bd1467 100644 --- a/decidim-accountability/config/locales/de.yml +++ b/decidim-accountability/config/locales/de.yml @@ -253,7 +253,6 @@ de: fields: created_at: Erstellt am end_date: Enddatum - id: ID progress: Fortschritt start_date: Startdatum status: Status diff --git a/decidim-accountability/config/locales/el.yml b/decidim-accountability/config/locales/el.yml index 5c14f3304b824..256758f9c0340 100644 --- a/decidim-accountability/config/locales/el.yml +++ b/decidim-accountability/config/locales/el.yml @@ -119,7 +119,6 @@ el: fields: created_at: Δημιουργήθηκε end_date: Ημερομηνία λήξης - id: Αναγνωριστικό ID progress: Πρόοδος start_date: Ημερομηνία έναρξης status: Κατάσταση diff --git a/decidim-accountability/config/locales/en.yml b/decidim-accountability/config/locales/en.yml index 6e794e4e3465c..925e619cb20ce 100644 --- a/decidim-accountability/config/locales/en.yml +++ b/decidim-accountability/config/locales/en.yml @@ -256,7 +256,6 @@ en: fields: created_at: Created end_date: End date - id: ID progress: Progress start_date: Start date status: Status @@ -298,6 +297,7 @@ en: accountability: actions: comment: Comment + vote_comment: Vote comment name: Accountability settings: global: diff --git a/decidim-accountability/config/locales/es-MX.yml b/decidim-accountability/config/locales/es-MX.yml index e945bb169876f..210a6f7de5fbe 100644 --- a/decidim-accountability/config/locales/es-MX.yml +++ b/decidim-accountability/config/locales/es-MX.yml @@ -254,7 +254,6 @@ es-MX: fields: created_at: Creado end_date: Fin - id: ID progress: Progreso start_date: Inicio status: Estado @@ -296,6 +295,7 @@ es-MX: accountability: actions: comment: Comentar + vote_comment: Votar el comentario name: Seguimiento settings: global: diff --git a/decidim-accountability/config/locales/es-PY.yml b/decidim-accountability/config/locales/es-PY.yml index d89823ee77f1e..ef22a71f70384 100644 --- a/decidim-accountability/config/locales/es-PY.yml +++ b/decidim-accountability/config/locales/es-PY.yml @@ -254,7 +254,6 @@ es-PY: fields: created_at: Creado end_date: Fin - id: ID progress: Progreso start_date: Inicio status: Estado @@ -296,6 +295,7 @@ es-PY: accountability: actions: comment: Comentar + vote_comment: Votar el comentario name: Seguimiento settings: global: diff --git a/decidim-accountability/config/locales/es.yml b/decidim-accountability/config/locales/es.yml index d7daee0e21872..b6880934be001 100644 --- a/decidim-accountability/config/locales/es.yml +++ b/decidim-accountability/config/locales/es.yml @@ -254,7 +254,6 @@ es: fields: created_at: Creado end_date: Fin - id: ID progress: Progreso start_date: Inicio status: Estado @@ -296,6 +295,7 @@ es: accountability: actions: comment: Comentar + vote_comment: Votar el comentario name: Seguimiento settings: global: diff --git a/decidim-accountability/config/locales/eu.yml b/decidim-accountability/config/locales/eu.yml index ad03c09322a4c..76920468f50b1 100644 --- a/decidim-accountability/config/locales/eu.yml +++ b/decidim-accountability/config/locales/eu.yml @@ -253,7 +253,6 @@ eu: fields: created_at: Noiz sortua end_date: Amaiera-data - id: ID progress: Aurrerapena start_date: Hasiera-data status: Egoera diff --git a/decidim-accountability/config/locales/fi-plain.yml b/decidim-accountability/config/locales/fi-plain.yml index 341a0038c0b7f..ddaa7413d9c08 100644 --- a/decidim-accountability/config/locales/fi-plain.yml +++ b/decidim-accountability/config/locales/fi-plain.yml @@ -253,7 +253,6 @@ fi-pl: fields: created_at: Luontiaika end_date: Päättymispäivä - id: ID progress: Edistyminen start_date: Alkamispäivä status: Tila diff --git a/decidim-accountability/config/locales/fi.yml b/decidim-accountability/config/locales/fi.yml index f3970c25abb6b..a9ac31d9631b2 100644 --- a/decidim-accountability/config/locales/fi.yml +++ b/decidim-accountability/config/locales/fi.yml @@ -253,7 +253,6 @@ fi: fields: created_at: Luontiaika end_date: Päättymispäivä - id: ID progress: Edistyminen start_date: Alkamispäivä status: Tila @@ -278,7 +277,7 @@ fi: root_taxonomies: title: 'Näytä luokittelun mukaan:' search: - search: Hae toimintoja + search: Hae toimenpiteitä show: stats: back_to_resource: Palaa tulokseen diff --git a/decidim-accountability/config/locales/fr-CA.yml b/decidim-accountability/config/locales/fr-CA.yml index cda3e1cba4a80..06152cc92e763 100644 --- a/decidim-accountability/config/locales/fr-CA.yml +++ b/decidim-accountability/config/locales/fr-CA.yml @@ -254,7 +254,6 @@ fr-CA: fields: created_at: Créé le end_date: Date de fin - id: ID progress: Avancement start_date: Date de début status: Statut @@ -296,6 +295,7 @@ fr-CA: accountability: actions: comment: Commenter + vote_comment: Vote sur le commentaire name: Suivi settings: global: diff --git a/decidim-accountability/config/locales/fr.yml b/decidim-accountability/config/locales/fr.yml index 30c64abb8ebe0..072b7a584e81a 100644 --- a/decidim-accountability/config/locales/fr.yml +++ b/decidim-accountability/config/locales/fr.yml @@ -254,7 +254,6 @@ fr: fields: created_at: Créé le end_date: Date de fin - id: ID progress: Avancement start_date: Date de début status: Statut @@ -296,6 +295,7 @@ fr: accountability: actions: comment: Commenter + vote_comment: Vote sur le commentaire name: Suivi settings: global: diff --git a/decidim-accountability/config/locales/ga-IE.yml b/decidim-accountability/config/locales/ga-IE.yml index dfee51951c149..33a62168de62a 100644 --- a/decidim-accountability/config/locales/ga-IE.yml +++ b/decidim-accountability/config/locales/ga-IE.yml @@ -52,7 +52,6 @@ ga: fields: created_at: Cruthaithe end_date: Dáta deiridh - id: ID progress: Forás status: Stádas title: Teideal diff --git a/decidim-accountability/config/locales/gl.yml b/decidim-accountability/config/locales/gl.yml index 57faeeef53284..f60b9e065593d 100644 --- a/decidim-accountability/config/locales/gl.yml +++ b/decidim-accountability/config/locales/gl.yml @@ -87,7 +87,6 @@ gl: fields: created_at: Creado end_date: Data de finalización - id: ID progress: Progreso start_date: Data de inicio status: Estado diff --git a/decidim-accountability/config/locales/he-IL.yml b/decidim-accountability/config/locales/he-IL.yml index c1bc1e4ce53ae..be3233fab6f53 100644 --- a/decidim-accountability/config/locales/he-IL.yml +++ b/decidim-accountability/config/locales/he-IL.yml @@ -168,7 +168,6 @@ he: fields: created_at: נוצר end_date: תאריך סיום - id: מספר מזהה progress: התקדמות start_date: תאריך התחלה status: סטטוס diff --git a/decidim-accountability/config/locales/hu.yml b/decidim-accountability/config/locales/hu.yml index 8911a2d8246e5..04c135eec703b 100644 --- a/decidim-accountability/config/locales/hu.yml +++ b/decidim-accountability/config/locales/hu.yml @@ -124,7 +124,6 @@ hu: fields: created_at: Létrehozva end_date: Befejezés dátuma - id: ID progress: Folyamat start_date: Kezdő dátum status: Állapot diff --git a/decidim-accountability/config/locales/is-IS.yml b/decidim-accountability/config/locales/is-IS.yml index a98e48cf72786..3c5e5b98c439f 100644 --- a/decidim-accountability/config/locales/is-IS.yml +++ b/decidim-accountability/config/locales/is-IS.yml @@ -84,7 +84,6 @@ is-IS: fields: created_at: Stofnað end_date: Loka dagsetning - id: ID progress: Framfarir start_date: Upphafsdagur status: Staða diff --git a/decidim-accountability/config/locales/it.yml b/decidim-accountability/config/locales/it.yml index 75c1351ceb8e7..13b5f989276e8 100644 --- a/decidim-accountability/config/locales/it.yml +++ b/decidim-accountability/config/locales/it.yml @@ -233,7 +233,6 @@ it: fields: created_at: Creato end_date: Data di fine - id: ID progress: Avanzamento start_date: Data di inizio status: Stato diff --git a/decidim-accountability/config/locales/ja.yml b/decidim-accountability/config/locales/ja.yml index d755d25f33d72..ad00838eb53c7 100644 --- a/decidim-accountability/config/locales/ja.yml +++ b/decidim-accountability/config/locales/ja.yml @@ -247,7 +247,6 @@ ja: fields: created_at: 作成日時 end_date: 終了日 - id: ID progress: 進捗状況 start_date: 開始日 status: ステータス diff --git a/decidim-accountability/config/locales/ko.yml b/decidim-accountability/config/locales/ko.yml index 8c97cafdb129a..6ba7022e4f33b 100644 --- a/decidim-accountability/config/locales/ko.yml +++ b/decidim-accountability/config/locales/ko.yml @@ -119,7 +119,6 @@ ko: fields: created_at: 생성됨 end_date: 종료 날짜 - id: 아이디 progress: 진행 상황 start_date: 시작 날짜 status: 상태 diff --git a/decidim-accountability/config/locales/lb.yml b/decidim-accountability/config/locales/lb.yml index 03f61c5ff1c47..cf01dc65f5d97 100644 --- a/decidim-accountability/config/locales/lb.yml +++ b/decidim-accountability/config/locales/lb.yml @@ -87,7 +87,6 @@ lb: fields: created_at: Erstellt am end_date: Enddatum - id: ID progress: Fortschritt start_date: Startdatum status: Status diff --git a/decidim-accountability/config/locales/lt.yml b/decidim-accountability/config/locales/lt.yml index 95aa667f7f351..0be9114221108 100644 --- a/decidim-accountability/config/locales/lt.yml +++ b/decidim-accountability/config/locales/lt.yml @@ -123,7 +123,6 @@ lt: fields: created_at: Sukurta end_date: Pabaigos data - id: ID progress: Progresas start_date: Pradžios data status: Statusas diff --git a/decidim-accountability/config/locales/nl.yml b/decidim-accountability/config/locales/nl.yml index f106f734b8738..a588e8b6bf620 100644 --- a/decidim-accountability/config/locales/nl.yml +++ b/decidim-accountability/config/locales/nl.yml @@ -91,7 +91,6 @@ nl: fields: created_at: Aangemaakt end_date: Einddatum - id: ID progress: Vooruitgang start_date: Startdatum status: Status diff --git a/decidim-accountability/config/locales/no.yml b/decidim-accountability/config/locales/no.yml index 35f71a646ceac..84f22aa851d8c 100644 --- a/decidim-accountability/config/locales/no.yml +++ b/decidim-accountability/config/locales/no.yml @@ -91,7 +91,6 @@ fields: created_at: Opprettet end_date: Sluttdato - id: ID progress: Framgang start_date: Startdato status: Status diff --git a/decidim-accountability/config/locales/pl.yml b/decidim-accountability/config/locales/pl.yml index 122239c9e15f6..aad3882b7c9e6 100644 --- a/decidim-accountability/config/locales/pl.yml +++ b/decidim-accountability/config/locales/pl.yml @@ -129,7 +129,6 @@ pl: fields: created_at: Utworzono end_date: Data zakończenia - id: ID progress: Postęp start_date: Data rozpoczęcia status: Status diff --git a/decidim-accountability/config/locales/pt-BR.yml b/decidim-accountability/config/locales/pt-BR.yml index f1f04baa7846f..33301c7b41785 100644 --- a/decidim-accountability/config/locales/pt-BR.yml +++ b/decidim-accountability/config/locales/pt-BR.yml @@ -251,7 +251,6 @@ pt-BR: fields: created_at: Criado end_date: Data final - id: ID progress: Progresso start_date: Data de início status: Status diff --git a/decidim-accountability/config/locales/pt.yml b/decidim-accountability/config/locales/pt.yml index b4e764a6c27ec..cc91a5bc417d2 100644 --- a/decidim-accountability/config/locales/pt.yml +++ b/decidim-accountability/config/locales/pt.yml @@ -103,7 +103,6 @@ pt: fields: created_at: Criado em end_date: Data final - id: ID progress: Progresso start_date: Data de início status: Estado diff --git a/decidim-accountability/config/locales/ro-RO.yml b/decidim-accountability/config/locales/ro-RO.yml index 31ce2212200b4..9745c775239be 100644 --- a/decidim-accountability/config/locales/ro-RO.yml +++ b/decidim-accountability/config/locales/ro-RO.yml @@ -129,7 +129,6 @@ ro: fields: created_at: Creat end_date: Data de sfârșit - id: ID progress: Progres start_date: Data de început status: Stare diff --git a/decidim-accountability/config/locales/sq-AL.yml b/decidim-accountability/config/locales/sq-AL.yml index 6da56a469b110..159a326d69ba5 100644 --- a/decidim-accountability/config/locales/sq-AL.yml +++ b/decidim-accountability/config/locales/sq-AL.yml @@ -124,7 +124,6 @@ sq: fields: created_at: Krijuar end_date: Data e përfundimit - id: ID progress: Ecuria start_date: Data e fillimit status: Statusi diff --git a/decidim-accountability/config/locales/sr-CS.yml b/decidim-accountability/config/locales/sr-CS.yml index c4f89102bd546..ce7107b0e202e 100644 --- a/decidim-accountability/config/locales/sr-CS.yml +++ b/decidim-accountability/config/locales/sr-CS.yml @@ -1,6 +1,9 @@ sr: activemodel: attributes: + milestone: + description: Opis + title: Naslov result: decidim_accountability_status_id: Stanje decidim_category_id: Kategorija @@ -28,6 +31,7 @@ sr: decidim: accountability: actions: + confirm_delete_result: Da li ste sigurni da želite da obrišete ovaj rezultat? confirm_destroy: Da li ste sigurni da želite da obrišete ovo %{name}? destroy: Obriši edit: Izmeni @@ -36,6 +40,9 @@ sr: admin: exports: results: Rezultati + import_results: + new: + title: Uvezi rezultate iz CSV datoteke models: result: name: Rezultat diff --git a/decidim-accountability/config/locales/sv.yml b/decidim-accountability/config/locales/sv.yml index b105639a2ab83..e46590e410562 100644 --- a/decidim-accountability/config/locales/sv.yml +++ b/decidim-accountability/config/locales/sv.yml @@ -254,7 +254,6 @@ sv: fields: created_at: Skapad end_date: Slutdatum - id: ID progress: Genomförande start_date: Startdatum status: Status diff --git a/decidim-accountability/config/locales/tr-TR.yml b/decidim-accountability/config/locales/tr-TR.yml index 5ea526da883bb..6f722b4ce4d98 100644 --- a/decidim-accountability/config/locales/tr-TR.yml +++ b/decidim-accountability/config/locales/tr-TR.yml @@ -186,7 +186,6 @@ tr: fields: created_at: Oluşturuldu end_date: Bitiş tarihi - id: ID progress: İlerleme start_date: Başlangıç tarihi status: durum diff --git a/decidim-accountability/config/locales/zh-TW.yml b/decidim-accountability/config/locales/zh-TW.yml index 41f0be329a2c7..6b0f2c84bd258 100644 --- a/decidim-accountability/config/locales/zh-TW.yml +++ b/decidim-accountability/config/locales/zh-TW.yml @@ -117,7 +117,6 @@ zh-TW: fields: created_at: 建立時間 end_date: 結束日期 - id: 編號 progress: 進度 start_date: 開始日期 status: 狀態 diff --git a/decidim-accountability/decidim-accountability.gemspec b/decidim-accountability/decidim-accountability.gemspec index 8198e000d5665..5510d78b1f3eb 100644 --- a/decidim-accountability/decidim-accountability.gemspec +++ b/decidim-accountability/decidim-accountability.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-accountability" s.summary = "Decidim accountability module" diff --git a/decidim-accountability/lib/decidim/accountability/component.rb b/decidim-accountability/lib/decidim/accountability/component.rb index 027802b101c59..f07e7c87126d7 100644 --- a/decidim-accountability/lib/decidim/accountability/component.rb +++ b/decidim-accountability/lib/decidim/accountability/component.rb @@ -16,14 +16,14 @@ end # These actions permissions can be configured in the admin panel - component.actions = %w(comment) + component.actions = %w(comment vote_comment) component.register_resource(:result) do |resource| resource.model_class_name = "Decidim::Accountability::Result" resource.template = "decidim/accountability/results/linked_results" resource.card = "decidim/accountability/result" resource.searchable = false - resource.actions = %w(comment) + resource.actions = %w(comment vote_comment) end component.settings(:global) do |settings| diff --git a/decidim-accountability/spec/shared/export_results_examples.rb b/decidim-accountability/spec/shared/export_results_examples.rb index 53e2dee8caaed..8868b7ee5a400 100644 --- a/decidim-accountability/spec/shared/export_results_examples.rb +++ b/decidim-accountability/spec/shared/export_results_examples.rb @@ -11,7 +11,7 @@ context "with query" do before do - fill_in "q[id_string_or_title_cont]", with: translated(results.last.title) + fill_in "q[title_cont]", with: translated(results.last.title) find("button[aria-label='Search']").click end diff --git a/decidim-accountability/spec/system/admin/admin_access_spec.rb b/decidim-accountability/spec/system/admin/admin_access_spec.rb new file mode 100644 index 0000000000000..d7483830881f2 --- /dev/null +++ b/decidim-accountability/spec/system/admin/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "accountability" } + let!(:result) { create(:result, component:) } + let(:title) { "Results" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-accountability/spec/system/admin/admin_filters_searches_and_paginates_results_spec.rb b/decidim-accountability/spec/system/admin/admin_filters_searches_and_paginates_results_spec.rb index e08f3ca91dbb5..f3fb086244670 100644 --- a/decidim-accountability/spec/system/admin/admin_filters_searches_and_paginates_results_spec.rb +++ b/decidim-accountability/spec/system/admin/admin_filters_searches_and_paginates_results_spec.rb @@ -49,7 +49,7 @@ end end - context "when searching by ID or title" do + context "when searching by title" do let!(:result1) do create(:result, component: current_component, title: Decidim::Faker::Localized.localized { generate(:title) }) @@ -61,12 +61,6 @@ let!(:result1_title) { translated(result1.title) } let!(:result2_title) { translated(result2.title) } - it "can be searched by ID" do - search_by_text(result1.id) - - expect(page).to have_content(result1_title) - end - it "can be searched by title" do search_by_text(result2_title) diff --git a/decidim-accountability/spec/system/admin/admin_orders_results_spec.rb b/decidim-accountability/spec/system/admin/admin_orders_results_spec.rb index a7d5d98951445..dd566f9ea1e52 100644 --- a/decidim-accountability/spec/system/admin/admin_orders_results_spec.rb +++ b/decidim-accountability/spec/system/admin/admin_orders_results_spec.rb @@ -23,17 +23,6 @@ include_context "when managing a component as an admin" - it "orders results by ID" do - ordered_results = results.sort_by(&:id).reverse - - click_on "ID" - rows = page.all("tbody tr") - - rows.each_with_index do |row, i| - expect(row).to have_text(translated(ordered_results[i].title)) - end - end - it "orders results by title" do ordered_results = results.sort_by { |result| translated(result.title) } diff --git a/decidim-accountability/spec/system/explore_results_spec.rb b/decidim-accountability/spec/system/explore_results_spec.rb index 83dbfea3a9d22..7ca151a5e21a2 100644 --- a/decidim-accountability/spec/system/explore_results_spec.rb +++ b/decidim-accountability/spec/system/explore_results_spec.rb @@ -155,6 +155,10 @@ end it "shows all results for the given process and taxonomy" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end + within("#results") do expect(page).to have_css(".card__list", count: results_count) @@ -175,6 +179,10 @@ end it "shows all result info" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(result.title)) + end expect(page).to have_i18n_content(result.title) expect(page).to have_i18n_content(result.description, strip_tags: true) expect(page).to have_content(result.reference) @@ -270,6 +278,12 @@ it "the result is mentioned in the subresult page" do click_on translated(first_subresult.title) expect(page).to have_i18n_content(result.title) + + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(result.title)) + expect(page).to have_content(translated(first_subresult.title)) + end end it "a banner links back to the result" do diff --git a/decidim-accountability/spec/system/explore_versions_spec.rb b/decidim-accountability/spec/system/explore_versions_spec.rb index 4fc38a7a059d2..06bd9842ff98e 100644 --- a/decidim-accountability/spec/system/explore_versions_spec.rb +++ b/decidim-accountability/spec/system/explore_versions_spec.rb @@ -36,6 +36,10 @@ end it "lists all versions" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(result.title)) + end expect(page).to have_link("Version 1 of 2") expect(page).to have_link("Version 2 of 2") end diff --git a/decidim-admin/app/commands/decidim/admin/destroy_participatory_space_private_user.rb b/decidim-admin/app/commands/decidim/admin/destroy_participatory_space_private_user.rb index df0fcaf2a4f26..6b15e2a84b796 100644 --- a/decidim-admin/app/commands/decidim/admin/destroy_participatory_space_private_user.rb +++ b/decidim-admin/app/commands/decidim/admin/destroy_participatory_space_private_user.rb @@ -13,6 +13,16 @@ def extra_params } } end + + def run_after_hooks + return unless resource.privatable_to.respond_to?(:private_space?) + return unless resource.privatable_to.private_space? + return if resource.privatable_to.respond_to?(:is_transparent) && resource.privatable_to.is_transparent? + + # When private user is destroyed, a hook to destroy the follows of user on private non-transparent assembly + # or private participatory process and the follows of their children + DestroyPrivateUsersFollowsJob.perform_later(resource.decidim_user_id, resource.privatable_to) + end end end end diff --git a/decidim-admin/app/helpers/decidim/admin/filterable_helper.rb b/decidim-admin/app/helpers/decidim/admin/filterable_helper.rb index 5ca948ed86bd5..6d0daa36e8ef1 100644 --- a/decidim-admin/app/helpers/decidim/admin/filterable_helper.rb +++ b/decidim-admin/app/helpers/decidim/admin/filterable_helper.rb @@ -77,7 +77,7 @@ def dropdown_link(key, menu_id) safe_join([ content_tag(:span) { extract_html_value(key) }, icon("arrow-right-s-line", class: "fill-secondary absolute right-2"), - icon("arrow-right-s-line", class: "!fill-current !text-white absolute right-2") + icon("arrow-right-s-line", class: "fill-current text-white absolute right-2") ]) end end diff --git a/decidim-admin/app/jobs/decidim/admin/destroy_private_users_follows_job.rb b/decidim-admin/app/jobs/decidim/admin/destroy_private_users_follows_job.rb new file mode 100644 index 0000000000000..04265cb72d121 --- /dev/null +++ b/decidim-admin/app/jobs/decidim/admin/destroy_private_users_follows_job.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Decidim + module Admin + class DestroyPrivateUsersFollowsJob < ApplicationJob + queue_as :default + + def perform(decidim_user_id, space) + return unless space.respond_to?(:private_space?) + + return unless space.private_space? + + return if space.respond_to?(:is_transparent) && space.is_transparent? + + user = Decidim::User.find_by(id: decidim_user_id) + + return if user.blank? + + return if space.respond_to?(:can_participate?) && space.can_participate?(user) + + follows = Decidim::Follow.where(user: user) + follows.where(followable: space).destroy_all + + destroy_children_follows(follows, space) + end + + def destroy_children_follows(follows, space) + follows.map do |follow| + object = follow.followable.presence + next unless object.respond_to?(:decidim_component_id) + + follow.destroy if space.component_ids.include?(object.decidim_component_id) + end + end + end + end +end diff --git a/decidim-admin/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb b/decidim-admin/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb index 479439f17157d..c1dfb56faae16 100644 --- a/decidim-admin/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb +++ b/decidim-admin/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb @@ -23,9 +23,9 @@ <%= impersonation_log.admin.name %> <%= impersonation_log.user.name %> <%= impersonation_log.reason %> - <%= impersonation_log.started_at ? l(impersonation_log.started_at, format: :long) : nil %> - <%= impersonation_log.ended_at ? l(impersonation_log.ended_at, format: :long) : nil %> - <%= impersonation_log.expired_at ? l(impersonation_log.expired_at, format: :long) : nil %> + <%= impersonation_log.started_at ? l(impersonation_log.started_at, format: :decidim_short) : nil %> + <%= impersonation_log.ended_at ? l(impersonation_log.ended_at, format: :decidim_short) : nil %> + <%= impersonation_log.expired_at ? l(impersonation_log.expired_at, format: :decidim_short) : nil %> <% end %> diff --git a/decidim-admin/app/views/decidim/admin/moderations/_moderation-tr.html.erb b/decidim-admin/app/views/decidim/admin/moderations/_moderation-tr.html.erb index 8bfef9a49e5d6..8de7fb11b7196 100644 --- a/decidim-admin/app/views/decidim/admin/moderations/_moderation-tr.html.erb +++ b/decidim-admin/app/views/decidim/admin/moderations/_moderation-tr.html.erb @@ -3,10 +3,6 @@ <%= check_box_tag "moderation_ids_s[]", moderation.id, false, class: "js-check-all-moderations js-moderation-list-check js-moderation-id-#{moderation.id}" %> - "> - <%= moderation.reportable.id %> - - "> <%= moderation.reportable.class.model_name.human %> @@ -33,7 +29,7 @@ "> - <%= l moderation.created_at, format: :long %> + <%= l moderation.created_at, format: :decidim_short %> "> @@ -42,7 +38,7 @@ <% if params[:hidden] %> "> - <%= l(moderation.hidden_at, format: :long) if moderation.hidden_at.present? %> + <%= l(moderation.hidden_at, format: :decidim_short) if moderation.hidden_at.present? %> <% end %> diff --git a/decidim-admin/app/views/decidim/admin/moderations/_moderations-thead.html.erb b/decidim-admin/app/views/decidim/admin/moderations/_moderations-thead.html.erb index 568aeac88e717..907b9163e1a52 100644 --- a/decidim-admin/app/views/decidim/admin/moderations/_moderations-thead.html.erb +++ b/decidim-admin/app/views/decidim/admin/moderations/_moderations-thead.html.erb @@ -1,7 +1,6 @@ <%= check_box_tag "moderations_bulk", "all", false, class: "js-check-all" %> - <%= t("models.moderation.fields.reportable_id", scope: "decidim.moderations") %> <%= t("models.moderation.fields.reportable_type", scope: "decidim.moderations") %> <% if !respond_to?(:current_participatory_space) %> <%= t("models.moderation.fields.participatory_space", scope: "decidim.moderations") %> diff --git a/decidim-admin/app/views/decidim/admin/moderations/reports/index.html.erb b/decidim-admin/app/views/decidim/admin/moderations/reports/index.html.erb index cf0f7b3d28cdf..8c6651b0f2f8d 100644 --- a/decidim-admin/app/views/decidim/admin/moderations/reports/index.html.erb +++ b/decidim-admin/app/views/decidim/admin/moderations/reports/index.html.erb @@ -57,7 +57,7 @@
<%= moderation.reportable.class.name.demodulize %>
<%= t("models.moderation.fields.created_at", scope: "decidim.moderations") %>
-
<%= l(moderation.created_at, format: :long) %>
+
<%= l(moderation.created_at, format: :decidim_short) %>
<%= t(".participatory_space") %>
<%= translated_attribute moderation.participatory_space.title %>
diff --git a/decidim-admin/app/views/decidim/admin/newsletters/index.html.erb b/decidim-admin/app/views/decidim/admin/newsletters/index.html.erb index 68fad7f13a538..43076fccff295 100644 --- a/decidim-admin/app/views/decidim/admin/newsletters/index.html.erb +++ b/decidim-admin/app/views/decidim/admin/newsletters/index.html.erb @@ -36,11 +36,11 @@ "> - <%= l(newsletter.created_at, format: :long) if newsletter.created_at %> + <%= l(newsletter.created_at, format: :decidim_short) if newsletter.created_at %> "> - <%= l(newsletter.sent_at, format: :long) if newsletter.sent_at %> + <%= l(newsletter.sent_at, format: :decidim_short) if newsletter.sent_at %> "> diff --git a/decidim-admin/config/locales/en.yml b/decidim-admin/config/locales/en.yml index 4ea88441b3089..5d01ead593d08 100644 --- a/decidim-admin/config/locales/en.yml +++ b/decidim-admin/config/locales/en.yml @@ -36,7 +36,7 @@ en: id: ID newsletter: body: Body - send_to_all_users: Send to all users + send_to_all_users: Send to all participants send_to_followers: Send to followers send_to_participants: Send to participants subject: Subject @@ -294,13 +294,13 @@ en: block_user: bulk_new: action: Block accounts and send justification - already_reported_html: Continuing with this action you will also hide all the participants contents. + already_reported_html: By continuing with this action, you will also hide all the participant's content. description: Blocking a user will render their account unusable. You may provide in your justification any guidelines on ways you would consider unblocking the user. justification: Justification title: Block Users new: action: Block account and send justification - already_reported_html: Continuing with this action you will also hide all the participants contents. + already_reported_html: By continuing with this action, you will also hide all the participant's content. description: Blocking a user will render their account unusable. You may provide in your justification any guidelines on ways you would consider unblocking the user. justification: Justification title: Block User %{name} @@ -394,7 +394,7 @@ en: form: domain_too_short: Domain too short update: - error: Failed to update list of allowed external domains + error: Failed to update list of allowed external domains. success: The list of allowed external domain successfully updated. exports: export_as: "%{name} as %{export_format}" @@ -479,7 +479,7 @@ en: import_csv: explanation: 'Guidance for file:' message_1: CSV files are supported - message_2: ".csv file with emails data" + message_2: ".csv file with email data" help_sections: error: There was a problem updating the help sections. form: @@ -1271,7 +1271,7 @@ en: last_day: Last day last_month: Last month last_week: Last week - no_users_count_statistics_yet: There are no users count statistics yet. + no_users_count_statistics_yet: There are no participant count statistics yet. participants: Participants forms: errors: diff --git a/decidim-admin/config/locales/eu.yml b/decidim-admin/config/locales/eu.yml index b37b6f9ae7763..d45d068f2a95c 100644 --- a/decidim-admin/config/locales/eu.yml +++ b/decidim-admin/config/locales/eu.yml @@ -48,7 +48,7 @@ eu: customize_welcome_notification: Pertsonalizatu ongi etorri jakinarazpena default_locale: Kokapen lehenetsia description: Deskribapena - enable_machine_translations: Gaitu itzulpen automatikoak + enable_machine_translations: Itzulpen automatikoak gaitu enable_omnipresent_banner: Erakutsi banner nonahikoa enable_participatory_space_filters: Gaitu iragazkiak parte hartzeko espazioan facebook_handler: Facebook kudeatzailea diff --git a/decidim-admin/decidim-admin.gemspec b/decidim-admin/decidim-admin.gemspec index c484fe8e2d40e..13bd2e44ab3cd 100644 --- a/decidim-admin/decidim-admin.gemspec +++ b/decidim-admin/decidim-admin.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-admin" s.summary = "Decidim organization administration" diff --git a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb index 195b2809f2783..2cd2d18506ace 100644 --- a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb +++ b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb @@ -75,3 +75,21 @@ end end end + +shared_examples "admin menu shows only assigned space" do |space_name:, other_spaces: []| + before do + switch_to_host(organization.host) + login_as role, scope: :user + visit target_path + end + + context "and does not show unassigned spaces" do + it "shows only the assigned space" do + expect(page).to have_content(space_name) + + other_spaces.each do |other_space| + expect(page).to have_no_content(other_space) + end + end + end +end diff --git a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb new file mode 100644 index 0000000000000..c0cabd000fd16 --- /dev/null +++ b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +shared_examples "accessing the component in a participatory space" do + context "when the user is a visitor" do + let(:user) { nil } + + it "shows the unauthenticated message" do + expect(page).to have_content "You need to log in or create an account before continuing." + end + end + + context "when the user is a normal user" do + let(:user) { create(:user, :confirmed, organization:) } + let(:unauthorized_path) { "/" } + + before do + login_as user, scope: :user + end + + it_behaves_like "a 404 page" do + let(:target_path) { manage_component_path(component) } + end + end + + context "when the user is a process admin" do + let(:user) { create(:process_admin, :confirmed, organization:, participatory_process:) } + + before do + login_as user, scope: :user + end + + it "access the index page" do + expect(page).to have_content(title) + end + end +end diff --git a/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb b/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb index 7cd65a339c946..df037d030b7a0 100644 --- a/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb +++ b/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb @@ -27,7 +27,7 @@ click_on link_text end all("tbody tr").each_with_index do |row, _index| - expect(row.find("td:nth-child(2)")).to have_content(reportables.first.id) + expect(row.find("td:nth-child(2)")).to have_content(reportables.first.class.model_name.human) end end end @@ -107,8 +107,8 @@ click_on "Reports count" all("tbody tr").each_with_index do |row, index| - reportable_id = moderations_ordered_by_report_count_asc[index].reportable.id - expect(row.find("td:nth-child(2)")).to have_content(reportable_id) + reportable_type = moderations_ordered_by_report_count_asc[index].reportable.class.model_name.human + expect(row.find("td:nth-child(2)")).to have_content(reportable_type) end end end diff --git a/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb b/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb index c91eb5e6c65fd..43ba90f553ff8 100644 --- a/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb +++ b/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb @@ -7,7 +7,6 @@ module Decidim::Admin subject { described_class.new(participatory_space_private_user, user) } let(:organization) { create(:organization) } - # let(:privatable_to) { create :participatory_process } let(:user) { create(:user, :admin, :confirmed, organization:) } let(:participatory_space_private_user) { create(:participatory_space_private_user, user:) } @@ -37,5 +36,43 @@ module Decidim::Admin action_log = Decidim::ActionLog.last expect(action_log.version).to be_nil end + + context "when assembly is private and user follows assembly" do + let(:normal_user) { create(:user, organization:) } + let(:assembly) { create(:assembly, :private, :published, organization: user.organization) } + let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: normal_user, privatable_to: assembly) } + let!(:follow) { create(:follow, followable: assembly, user: normal_user) } + + context "and assembly is transparent" do + it "does not enqueue a job" do + assembly.update(is_transparent: true) + expect(Decidim::Follow.where(user: normal_user).count).to eq(1) + expect { subject.call }.not_to have_enqueued_job(DestroyPrivateUsersFollowsJob) + end + end + + context "when assembly is not transparent" do + it "enqueues a job" do + assembly.update(is_transparent: false) + expect(Decidim::Follow.where(user: normal_user).count).to eq(1) + expect { subject.call }.to have_enqueued_job(DestroyPrivateUsersFollowsJob) + end + end + end + + context "when participatory process is private" do + let(:normal_user) { create(:user, organization:) } + let(:participatory_process) { create(:participatory_process, :private, :published, organization: user.organization) } + let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: normal_user, privatable_to: participatory_process) } + + context "and user follows process" do + let!(:follow) { create(:follow, followable: participatory_process, user: normal_user) } + + it "enqueues a job" do + expect(Decidim::Follow.where(user: normal_user).count).to eq(1) + expect { subject.call }.to have_enqueued_job(DestroyPrivateUsersFollowsJob) + end + end + end end end diff --git a/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb b/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb new file mode 100644 index 0000000000000..15ad1b33c7240 --- /dev/null +++ b/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +require "spec_helper" + +module Decidim + module Admin + describe DestroyPrivateUsersFollowsJob do + let(:organization) { create(:organization) } + let!(:user) { create(:user, :admin, :confirmed, organization:) } + let!(:normal_user) { create(:user, organization:) } + let!(:follow) { create(:follow, followable: participatory_space, user: normal_user) } + let(:component) { create(:dummy_component, participatory_space:) } + let(:resource) { create(:dummy_resource, component: component, author: user) } + let!(:followed_resource) { create(:follow, followable: resource, user: normal_user) } + + context "when assembly is private and non transparent" do + let(:participatory_space) { create(:assembly, :private, :published, :opaque, organization: user.organization) } + + it "deletes follows of non private users" do + # we have 2 follows, one for assembly, and one for a "child" resource + expect { described_class.perform_now(normal_user.id, participatory_space) }.to change(Decidim::Follow, :count).by(-2) + end + end + + context "when assembly is private but transparent" do + let(:participatory_space) { create(:assembly, :private, :published, organization: user.organization) } + + it "preserves follows of non private users" do + # we have 2 follows, one for assembly, and one for a "child" resource + expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count) + end + end + + context "when assembly is public" do + let(:participatory_space) { create(:assembly, :published, organization: user.organization) } + + it "preserves follows of non private users" do + # we have 2 follows, one for assembly, and one for a "child" resource + expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count) + end + end + + context "when process is private" do + let(:participatory_space) { create(:participatory_process, :private, :published, organization: user.organization) } + + it "deletes follows of non private users" do + # we have 2 follows, one for process, and one for a "child" resource + expect { described_class.perform_now(normal_user.id, participatory_space) }.to change(Decidim::Follow, :count).by(-2) + end + end + + context "when process is public" do + let(:participatory_space) { create(:participatory_process, :published, organization: user.organization) } + + it "preserves follows of non private users" do + expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count) + end + end + end + end +end diff --git a/decidim-admin/spec/system/admin_moderates_user_spec.rb b/decidim-admin/spec/system/admin_moderates_user_spec.rb index b73b01ae3fad4..d18d31aed0801 100644 --- a/decidim-admin/spec/system/admin_moderates_user_spec.rb +++ b/decidim-admin/spec/system/admin_moderates_user_spec.rb @@ -58,7 +58,7 @@ end expect(page).to have_current_path(decidim_admin.new_user_block_path(user_id: reportable.id), ignore_query: true) - expect(page).to have_content("Continuing with this action you will also hide all the participants contents") + expect(page).to have_content("By continuing with this action, you will also hide all the participant's content.") end end diff --git a/decidim-ai/decidim-ai.gemspec b/decidim-ai/decidim-ai.gemspec index 84c127bee7b5a..49f507c746419 100644 --- a/decidim-ai/decidim-ai.gemspec +++ b/decidim-ai/decidim-ai.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-ai" s.summary = "A Decidim module with AI tools" diff --git a/decidim-api/decidim-api.gemspec b/decidim-api/decidim-api.gemspec index ac8e4331a01ac..766f6235d5140 100644 --- a/decidim-api/decidim-api.gemspec +++ b/decidim-api/decidim-api.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-api" s.summary = "Decidim API module" diff --git a/decidim-api/docs/usage.md b/decidim-api/docs/usage.md index c98b2ec316bdf..780ce727b59e1 100644 --- a/decidim-api/docs/usage.md +++ b/decidim-api/docs/usage.md @@ -296,7 +296,7 @@ Second, the response is not an Array, it is just the object we requested. We can #### Components -Every participatory space may (and should) have some components. There are 9 official components, these are `Proposals`, `Page`, `Meetings`, `Budgets`, `Surveys`, `Accountability`, `Debates`, `Sortitions` and `Blog`. Plugins may add their own components. +Every participatory space may (and should) have some components. There are 9 official components, these are `Proposals`, `Page`, `Meetings`, `Budgets`, `Surveys`, `Accountability`, `Debates` and `Blog`. Plugins may add their own components. If you know the `id`\* of a specific component you can obtain it by querying it directly: diff --git a/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb b/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb index 587471ee4c078..ea5b12e5a3a42 100644 --- a/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb +++ b/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb @@ -15,7 +15,6 @@ { name: "surveys_count", data: [0], tooltip_key: "surveys_count_tooltip" }, { name: "results_count", data: [0], tooltip_key: "results_count_tooltip" }, { name: "debates_count", data: [0], tooltip_key: "debates_count_tooltip" }, - { name: "sortitions_count", data: [0], tooltip_key: "sortitions_count_tooltip" }, { name: "posts_count", data: [0], tooltip_key: "posts_count_tooltip" }, { name: "collaborative_texts_count", data: [0], tooltip_key: "collaborative_texts_count_tooltip" } ])) @@ -36,7 +35,6 @@ { "name" => { "translation" => "Surveys" }, "value" => 0 }, { "name" => { "translation" => "Results" }, "value" => 0 }, { "name" => { "translation" => "Debates" }, "value" => 0 }, - { "name" => { "translation" => "Sortitions" }, "value" => 0 }, { "name" => { "translation" => "Posts" }, "value" => 0 }, { "name" => { "translation" => "Collaborative texts" }, "value" => 0 } ] diff --git a/decidim-assemblies/config/locales/en.yml b/decidim-assemblies/config/locales/en.yml index d92e4f1c4076a..4252a87199e40 100644 --- a/decidim-assemblies/config/locales/en.yml +++ b/decidim-assemblies/config/locales/en.yml @@ -385,6 +385,7 @@ en: assembly_type: The type of the assembly closing_date: The closing date of the assembly closing_date_reason: Why the assembly was closed + component_settings: The component settings of the assembly composition: The composition of the assembly created_at: The date this space was created created_by: Who has created this assembly diff --git a/decidim-assemblies/config/locales/sr-CS.yml b/decidim-assemblies/config/locales/sr-CS.yml index 2cdc8fe79a622..1af376c3881bd 100644 --- a/decidim-assemblies/config/locales/sr-CS.yml +++ b/decidim-assemblies/config/locales/sr-CS.yml @@ -1,4 +1,8 @@ sr: + activemodel: + attributes: + assembly: + youtube: YouTube decidim: admin: titles: diff --git a/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb b/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb new file mode 100644 index 0000000000000..4f16e1eabb44b --- /dev/null +++ b/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class RemoveLegacyImagesFromAssembliesModule < ActiveRecord::Migration[7.2] + def change + remove_column :decidim_assemblies, :hero_image, :string + remove_column :decidim_assemblies, :banner_image, :string + end +end diff --git a/decidim-assemblies/decidim-assemblies.gemspec b/decidim-assemblies/decidim-assemblies.gemspec index 28b6f50e83b84..e1cca4fd82b20 100644 --- a/decidim-assemblies/decidim-assemblies.gemspec +++ b/decidim-assemblies/decidim-assemblies.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-assemblies" s.summary = "Decidim assemblies module" diff --git a/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb b/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb index 9a990ce36c0d6..140a4ea33bec8 100644 --- a/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb +++ b/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb @@ -46,10 +46,8 @@ end participatory_space.exports :assemblies do |export| - export.collection do - Decidim::Assembly - .public_spaces - .includes(:attachment_collections) + export.collection do |participatory_space, _user| + Decidim::Assembly.public_spaces.includes(:attachment_collections).where(id: participatory_space) end export.include_in_open_data = true diff --git a/decidim-assemblies/spec/system/admin/admin_access_spec.rb b/decidim-assemblies/spec/system/admin/admin_access_spec.rb index 0dea02dcd6c01..e1c841f797dc2 100644 --- a/decidim-assemblies/spec/system/admin/admin_access_spec.rb +++ b/decidim-assemblies/spec/system/admin/admin_access_spec.rb @@ -16,6 +16,9 @@ let(:participatory_space_path) { decidim_assemblies.assembly_path(participatory_space) } it_behaves_like "admin participatory space access" + it_behaves_like "admin menu shows only assigned space", + space_name: "Assemblies", + other_spaces: %w(Processes Initiatives Conferences) describe "edit button" do let(:target_path) { decidim_admin_assemblies.edit_assembly_landing_page_path(participatory_space) } diff --git a/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb b/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb index 9789073ab46e0..1103ea69c6537 100644 --- a/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb +++ b/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb @@ -62,7 +62,7 @@ within_admin_sidebar_menu do click_on "Components" end - expect(Decidim::Assembly.last.components.size).to eq(9) + expect(Decidim::Assembly.last.components.size).to eq(8) within ".table-list" do Decidim::Assembly.last.components.each do |component| expect(page).to have_content(translated(component.name)) diff --git a/decidim-assemblies/spec/system/assemblies_spec.rb b/decidim-assemblies/spec/system/assemblies_spec.rb index 4a9bd7a290dae..10984a21afbfd 100644 --- a/decidim-assemblies/spec/system/assemblies_spec.rb +++ b/decidim-assemblies/spec/system/assemblies_spec.rb @@ -39,18 +39,6 @@ end end - context "when there are no assemblies and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "the menu link is not shown" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Assemblies") - end - end - end - context "when the assembly does not exist" do it_behaves_like "a 404 page" do let(:target_path) { decidim_assemblies.assembly_path(99_999_999) } @@ -68,18 +56,6 @@ let(:target_path) { decidim_assemblies.assemblies_path } end end - - context "and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "the menu link is not shown" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Assemblies") - end - end - end end context "when there are some published assemblies" do @@ -102,20 +78,6 @@ visit decidim_assemblies.assemblies_path end - context "and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "the menu link is shown" do - visit decidim.root_path - - within "#home__menu" do - click_on "Assemblies" - end - - expect(page).to have_current_path decidim_assemblies.assemblies_path - end - end - it "lists all the highlighted assemblies" do within "#highlighted-assemblies" do expect(page).to have_content(translated(promoted_assembly.title, locale: :en)) diff --git a/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb b/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb index 0a3dbb969658f..a0c885cfe7624 100644 --- a/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb +++ b/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb @@ -82,7 +82,7 @@ def paginate_posts end def post - @post ||= posts.find(params[:id]) + @post ||= posts.find_by(id: params[:id]) end def post_presenter @@ -103,6 +103,16 @@ def posts_most_commented .select("count(decidim_comments_comments.id) as counter") .select("decidim_blogs_posts.*").order("counter DESC").published_at_desc.limit(7) end + + def add_breadcrumb_item + return {} if post.blank? + + { + label: translated_attribute(post.title), + url: Decidim::EngineRouter.main_proxy(current_component).post_path(post), + active: false + } + end end end end diff --git a/decidim-blogs/config/locales/ca-IT.yml b/decidim-blogs/config/locales/ca-IT.yml index 3b6da1b7371de..d562c016e5d61 100644 --- a/decidim-blogs/config/locales/ca-IT.yml +++ b/decidim-blogs/config/locales/ca-IT.yml @@ -107,6 +107,7 @@ ca-IT: destroy: Esborrar like: '"M''agrada"' update: Actualitzar + vote_comment: Votar el comentari name: Blog settings: global: diff --git a/decidim-blogs/config/locales/ca.yml b/decidim-blogs/config/locales/ca.yml index f9eebfbc11824..bea99f26778a4 100644 --- a/decidim-blogs/config/locales/ca.yml +++ b/decidim-blogs/config/locales/ca.yml @@ -107,6 +107,7 @@ ca: destroy: Esborrar like: '"M''agrada"' update: Actualitzar + vote_comment: Votar el comentari name: Blog settings: global: diff --git a/decidim-blogs/config/locales/en.yml b/decidim-blogs/config/locales/en.yml index d7e172c686e1a..2ea4c132f231e 100644 --- a/decidim-blogs/config/locales/en.yml +++ b/decidim-blogs/config/locales/en.yml @@ -108,6 +108,7 @@ en: destroy: Delete like: Like update: Update + vote_comment: Vote comment name: Blog settings: global: diff --git a/decidim-blogs/config/locales/es-MX.yml b/decidim-blogs/config/locales/es-MX.yml index dbc1de7b3c21f..5264f4d561d9a 100644 --- a/decidim-blogs/config/locales/es-MX.yml +++ b/decidim-blogs/config/locales/es-MX.yml @@ -107,6 +107,7 @@ es-MX: destroy: Borrar like: '"Me gusta"' update: Actualizar + vote_comment: Votar el comentario name: Blog settings: global: diff --git a/decidim-blogs/config/locales/es-PY.yml b/decidim-blogs/config/locales/es-PY.yml index 03e8d98b2d2dc..9c1a227fa232b 100644 --- a/decidim-blogs/config/locales/es-PY.yml +++ b/decidim-blogs/config/locales/es-PY.yml @@ -107,6 +107,7 @@ es-PY: destroy: Borrar like: '"Me gusta"' update: Actualizar + vote_comment: Votar el comentario name: Blog settings: global: diff --git a/decidim-blogs/config/locales/es.yml b/decidim-blogs/config/locales/es.yml index 2e5e770ddc143..982823f590a40 100644 --- a/decidim-blogs/config/locales/es.yml +++ b/decidim-blogs/config/locales/es.yml @@ -107,6 +107,7 @@ es: destroy: Borrar like: '"Me gusta"' update: Actualizar + vote_comment: Votar el comentario name: Blog settings: global: diff --git a/decidim-blogs/config/locales/fr-CA.yml b/decidim-blogs/config/locales/fr-CA.yml index a98a8a6538a2b..10c06ad6bff58 100644 --- a/decidim-blogs/config/locales/fr-CA.yml +++ b/decidim-blogs/config/locales/fr-CA.yml @@ -106,6 +106,7 @@ fr-CA: create: Créer destroy: Supprimer update: Mettre à jour + vote_comment: Vote sur le commentaire name: Actualités settings: global: diff --git a/decidim-blogs/config/locales/fr.yml b/decidim-blogs/config/locales/fr.yml index caa1612c8034a..5a204cdb2010f 100644 --- a/decidim-blogs/config/locales/fr.yml +++ b/decidim-blogs/config/locales/fr.yml @@ -106,6 +106,7 @@ fr: create: Créer destroy: Supprimer update: Mettre à jour + vote_comment: Vote sur le commentaire name: Actualités settings: global: diff --git a/decidim-blogs/decidim-blogs.gemspec b/decidim-blogs/decidim-blogs.gemspec index 0ad92b049a1ed..8ed75da51dd31 100644 --- a/decidim-blogs/decidim-blogs.gemspec +++ b/decidim-blogs/decidim-blogs.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-blogs" s.summary = "Decidim blogs module" diff --git a/decidim-blogs/lib/decidim/blogs/component.rb b/decidim-blogs/lib/decidim/blogs/component.rb index f87f03a37260a..58ef1eaeafd36 100644 --- a/decidim-blogs/lib/decidim/blogs/component.rb +++ b/decidim-blogs/lib/decidim/blogs/component.rb @@ -50,7 +50,7 @@ component.register_resource(:blogpost) do |resource| resource.model_class_name = "Decidim::Blogs::Post" resource.card = "decidim/blogs/post" - resource.actions = %w(like comment) + resource.actions = %w(like comment vote_comment) resource.searchable = true end diff --git a/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb b/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb index 6351f93ded640..376039279c953 100644 --- a/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb +++ b/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb @@ -34,7 +34,7 @@ module Blogs context "when not logged in" do it "throws exception on non published page" do expect { get :show, params: { id: unpublished.id } } - .to raise_error(ActiveRecord::RecordNotFound) + .to raise_error(ActionController::RoutingError) end end @@ -47,7 +47,7 @@ module Blogs it "throws exception on non published page" do expect { get :show, params: { id: unpublished.id } } - .to raise_error(ActiveRecord::RecordNotFound) + .to raise_error(ActionController::RoutingError) end end diff --git a/decidim-blogs/spec/system/admin_access_spec.rb b/decidim-blogs/spec/system/admin_access_spec.rb new file mode 100644 index 0000000000000..d650e04270380 --- /dev/null +++ b/decidim-blogs/spec/system/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "blogs" } + let!(:post) { create(:post, component:, title: { en: "Blog post title" }) } + let(:title) { "Posts" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-blogs/spec/system/explore_posts_spec.rb b/decidim-blogs/spec/system/explore_posts_spec.rb index f8596bad46a51..9cba82f5d0380 100644 --- a/decidim-blogs/spec/system/explore_posts_spec.rb +++ b/decidim-blogs/spec/system/explore_posts_spec.rb @@ -38,6 +38,9 @@ end it "shows the component name in the sidebar" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end within("aside") do expect(page).to have_content(translated(component.name)) end @@ -86,6 +89,10 @@ within ".author__name" do expect(page).to have_content("Official") end + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(post.title)) + end end end diff --git a/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb b/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb index 3d191ae76fcee..fcb87792be20f 100644 --- a/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb +++ b/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb @@ -23,10 +23,6 @@ def base_query collection.includes(:taxonomies).joins(:taxonomies) end - def search_field_predicate - :id_string_or_title_cont - end - def filters [ :taxonomies_part_of_contains, diff --git a/decidim-budgets/app/models/decidim/budgets/project.rb b/decidim-budgets/app/models/decidim/budgets/project.rb index 261f69af96f4b..9990eab6dddcb 100644 --- a/decidim-budgets/app/models/decidim/budgets/project.rb +++ b/decidim-budgets/app/models/decidim/budgets/project.rb @@ -151,11 +151,11 @@ def self.ransackable_scopes(_auth_object = nil) end def self.ransackable_attributes(auth_object = nil) - base = %w(search_text description title) + base = %w(id_string id search_text description title) return base unless auth_object&.admin? - base + %w(id_string id selected selected_at confirmed_orders_count) + base + %w(selected selected_at confirmed_orders_count) end def self.ransackable_associations(_auth_object = nil) diff --git a/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb b/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb index eef9246f9f198..17faa519d2eed 100644 --- a/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb +++ b/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb @@ -2,9 +2,6 @@ <%= check_box_tag "project_ids_s[]", project.id, false, class: "js-check-all-resources js-project-list-check js-resource-id-#{project.id}" %>
- "> - <%= project.id %>
- "> <% if allowed_to? :update, :project, project: project %> <%= link_to translated_attribute(project.title), resource_locator([budget, project]).edit %>
diff --git a/decidim-budgets/app/views/decidim/budgets/admin/projects/_projects-thead.html.erb b/decidim-budgets/app/views/decidim/budgets/admin/projects/_projects-thead.html.erb index fe3bf57a8fcf5..8461708195b5c 100644 --- a/decidim-budgets/app/views/decidim/budgets/admin/projects/_projects-thead.html.erb +++ b/decidim-budgets/app/views/decidim/budgets/admin/projects/_projects-thead.html.erb @@ -1,7 +1,6 @@ <%= check_box_tag "projects_bulk", "all", false, class: "js-check-all" %> - <%= sort_link(query, :id, t("models.project.fields.id", scope: "decidim.budgets"), default_order: :desc) %> <%= sort_link(query, :title, t("models.project.fields.title", scope: "decidim.budgets")) %> <%= sort_link(query, :taxonomies_name, t("models.project.fields.taxonomies", scope: "decidim.budgets") ) %> <%= sort_link(query, :confirmed_orders_count, t("index.confirmed_orders_count")) %> diff --git a/decidim-budgets/config/locales/bg.yml b/decidim-budgets/config/locales/bg.yml index aa90b027a3e68..bcfdb15b3299d 100644 --- a/decidim-budgets/config/locales/bg.yml +++ b/decidim-budgets/config/locales/bg.yml @@ -168,7 +168,6 @@ bg: total_budget: Общ бюджет project: fields: - id: ID map: Карта title: Заглавие order: diff --git a/decidim-budgets/config/locales/ca-IT.yml b/decidim-budgets/config/locales/ca-IT.yml index 168759b61235b..201c10001bf2c 100644 --- a/decidim-budgets/config/locales/ca-IT.yml +++ b/decidim-budgets/config/locales/ca-IT.yml @@ -213,7 +213,6 @@ ca-IT: total_budget: Pressupost total project: fields: - id: ID map: Mapa taxonomies: Taxonomies title: Títol @@ -339,6 +338,7 @@ ca-IT: actions: comment: Comentar vote: Vota + vote_comment: Votar el comentari name: Pressupostos settings: global: diff --git a/decidim-budgets/config/locales/ca.yml b/decidim-budgets/config/locales/ca.yml index 485ea30c76198..3b3abbbbe4f4f 100644 --- a/decidim-budgets/config/locales/ca.yml +++ b/decidim-budgets/config/locales/ca.yml @@ -213,7 +213,6 @@ ca: total_budget: Pressupost total project: fields: - id: ID map: Mapa taxonomies: Taxonomies title: Títol @@ -339,6 +338,7 @@ ca: actions: comment: Comentar vote: Vota + vote_comment: Votar el comentari name: Pressupostos settings: global: diff --git a/decidim-budgets/config/locales/cs.yml b/decidim-budgets/config/locales/cs.yml index 2052e599951d4..49d004a5beaef 100644 --- a/decidim-budgets/config/locales/cs.yml +++ b/decidim-budgets/config/locales/cs.yml @@ -221,7 +221,6 @@ cs: total_budget: Celkový rozpočet project: fields: - id: ID map: Mapa taxonomies: Taxonomie title: Titul diff --git a/decidim-budgets/config/locales/de.yml b/decidim-budgets/config/locales/de.yml index 641d5a5e2e14f..9b4e389492b54 100644 --- a/decidim-budgets/config/locales/de.yml +++ b/decidim-budgets/config/locales/de.yml @@ -213,7 +213,6 @@ de: total_budget: Gesamt Budget project: fields: - id: ID map: Karte taxonomies: Klassifizierungen title: Titel @@ -262,9 +261,9 @@ de: are_you_sure: Sind Sie sicher, dass Sie Ihre Stimme zurückziehen wollen? cancel_order: Stimme löschen checked_out: - description: Sie haben bereits über dieses Budget abgestimmt. Wenn Sie Ihre Meinung geändert haben, können Sie %{cancel_link}. + description: Sie haben bereits über dieses Budget abgestimmt. Wenn Sie Ihre Meinung geändert haben, können Sie Ihre Stimmen löschen. title: Budget-Abstimmung abgeschlossen - vote: Gewähltes Budget + vote: Für Budget abstimmen count: projects_count: one: 1 Projekt @@ -314,10 +313,10 @@ de: project_budget_button: add: Zur Abstimmung hinzufügen add_descriptive: Projekt %{resource_name} zu Ihrer Abstimmung hinzufügen. - added: Zu deiner Abstimmung hinzugefügt + added: Ausgewählt added_descriptive: Project %{resource_name} zu Ihrer Abstimmung hinzugefügt. project_filter: - added: Hinzugefügt + added: Ausgewählt all: Alle projects_for: Projekte für %{name} select_projects: Projekt hinzufügen diff --git a/decidim-budgets/config/locales/el.yml b/decidim-budgets/config/locales/el.yml index 17e9b85a4bab9..6bdc9621d9913 100644 --- a/decidim-budgets/config/locales/el.yml +++ b/decidim-budgets/config/locales/el.yml @@ -142,7 +142,6 @@ el: total_budget: Συνολικός προϋπολογισμός project: fields: - id: ID title: Τίτλος order: status: diff --git a/decidim-budgets/config/locales/en.yml b/decidim-budgets/config/locales/en.yml index b3b16a2bd28d4..5f8ca1d601fe7 100644 --- a/decidim-budgets/config/locales/en.yml +++ b/decidim-budgets/config/locales/en.yml @@ -214,7 +214,6 @@ en: total_budget: Total budget project: fields: - id: ID map: Map taxonomies: Taxonomies title: Title @@ -340,6 +339,7 @@ en: actions: comment: Comment vote: Vote + vote_comment: Vote comment name: Budgets settings: global: diff --git a/decidim-budgets/config/locales/es-MX.yml b/decidim-budgets/config/locales/es-MX.yml index 36683c32cc06d..37beb0083178d 100644 --- a/decidim-budgets/config/locales/es-MX.yml +++ b/decidim-budgets/config/locales/es-MX.yml @@ -210,7 +210,6 @@ es-MX: total_budget: Presupuesto total project: fields: - id: ID map: Mapa taxonomies: Taxonomías title: Título @@ -336,6 +335,7 @@ es-MX: actions: comment: Comentar vote: Votar + vote_comment: Votar el comentario name: Presupuestos settings: global: diff --git a/decidim-budgets/config/locales/es-PY.yml b/decidim-budgets/config/locales/es-PY.yml index 2224fd3641233..07f8cde89d1f1 100644 --- a/decidim-budgets/config/locales/es-PY.yml +++ b/decidim-budgets/config/locales/es-PY.yml @@ -213,7 +213,6 @@ es-PY: total_budget: Presupuesto total project: fields: - id: ID map: Mapa taxonomies: Taxonomías title: Título @@ -339,6 +338,7 @@ es-PY: actions: comment: Comentar vote: Votar + vote_comment: Votar el comentario name: Presupuestos settings: global: diff --git a/decidim-budgets/config/locales/es.yml b/decidim-budgets/config/locales/es.yml index a9db2e8a57611..8b7cf69b083de 100644 --- a/decidim-budgets/config/locales/es.yml +++ b/decidim-budgets/config/locales/es.yml @@ -213,7 +213,6 @@ es: total_budget: Presupuesto total project: fields: - id: ID map: Mapa taxonomies: Taxonomías title: Título @@ -339,6 +338,7 @@ es: actions: comment: Comentar vote: Vota + vote_comment: Votar el comentario name: Presupuestos settings: global: diff --git a/decidim-budgets/config/locales/eu.yml b/decidim-budgets/config/locales/eu.yml index ff946d5332ff7..210e6d671ac1b 100644 --- a/decidim-budgets/config/locales/eu.yml +++ b/decidim-budgets/config/locales/eu.yml @@ -213,7 +213,6 @@ eu: total_budget: Aurrekontua guztira project: fields: - id: ID map: Mapa taxonomies: Taxonomiak title: Izenburua diff --git a/decidim-budgets/config/locales/fi-plain.yml b/decidim-budgets/config/locales/fi-plain.yml index 11347b6ac60e8..9a34988d7a8fa 100644 --- a/decidim-budgets/config/locales/fi-plain.yml +++ b/decidim-budgets/config/locales/fi-plain.yml @@ -213,7 +213,6 @@ fi-pl: total_budget: Kokonaisbudjetti project: fields: - id: ID map: Kartta taxonomies: Luokittelut title: Otsikko diff --git a/decidim-budgets/config/locales/fi.yml b/decidim-budgets/config/locales/fi.yml index 2279ae4a8df0f..ce40dc0dc63d2 100644 --- a/decidim-budgets/config/locales/fi.yml +++ b/decidim-budgets/config/locales/fi.yml @@ -213,7 +213,6 @@ fi: total_budget: Kokonaisbudjetti project: fields: - id: ID map: Kartta taxonomies: Luokittelut title: Otsikko diff --git a/decidim-budgets/config/locales/fr-CA.yml b/decidim-budgets/config/locales/fr-CA.yml index 4788813740f24..d01b681714295 100644 --- a/decidim-budgets/config/locales/fr-CA.yml +++ b/decidim-budgets/config/locales/fr-CA.yml @@ -201,7 +201,6 @@ fr-CA: total_budget: Budget total project: fields: - id: ID map: Carte title: Titre order: @@ -326,6 +325,7 @@ fr-CA: actions: comment: Commenter vote: Voter + vote_comment: Vote sur le commentaire name: Budgets settings: global: diff --git a/decidim-budgets/config/locales/fr.yml b/decidim-budgets/config/locales/fr.yml index 25f19e65b71f7..3cecf6f208df9 100644 --- a/decidim-budgets/config/locales/fr.yml +++ b/decidim-budgets/config/locales/fr.yml @@ -201,7 +201,6 @@ fr: total_budget: Budget total project: fields: - id: ID map: Carte title: Titre order: @@ -326,6 +325,7 @@ fr: actions: comment: Commenter vote: Voter + vote_comment: Vote sur le commentaire name: Budgets settings: global: diff --git a/decidim-budgets/config/locales/gl.yml b/decidim-budgets/config/locales/gl.yml index 8750e8d101478..46a2511c9ecbd 100644 --- a/decidim-budgets/config/locales/gl.yml +++ b/decidim-budgets/config/locales/gl.yml @@ -96,7 +96,6 @@ gl: total_budget: Orzamento total project: fields: - id: ID title: Título order: status: diff --git a/decidim-budgets/config/locales/hu.yml b/decidim-budgets/config/locales/hu.yml index 787db25b0c48b..f5a59346c5226 100644 --- a/decidim-budgets/config/locales/hu.yml +++ b/decidim-budgets/config/locales/hu.yml @@ -154,7 +154,6 @@ hu: total_budget: Teljes költségvetés project: fields: - id: Azonosító map: Térkép title: Cím order: diff --git a/decidim-budgets/config/locales/ja.yml b/decidim-budgets/config/locales/ja.yml index 0d85289d8b977..3ad5109ac8a3e 100644 --- a/decidim-budgets/config/locales/ja.yml +++ b/decidim-budgets/config/locales/ja.yml @@ -209,7 +209,6 @@ ja: total_budget: 予算の合計 project: fields: - id: ID map: 地図 taxonomies: タクソノミー title: タイトル diff --git a/decidim-budgets/config/locales/lt.yml b/decidim-budgets/config/locales/lt.yml index 69e2485e74db2..efcd45f7cfa31 100644 --- a/decidim-budgets/config/locales/lt.yml +++ b/decidim-budgets/config/locales/lt.yml @@ -149,7 +149,6 @@ lt: total_budget: Visas biudžetas project: fields: - id: ID title: Pavadinimas order: status: diff --git a/decidim-budgets/config/locales/nl.yml b/decidim-budgets/config/locales/nl.yml index c306a8279eaca..beabb767cac4f 100644 --- a/decidim-budgets/config/locales/nl.yml +++ b/decidim-budgets/config/locales/nl.yml @@ -114,7 +114,6 @@ nl: total_budget: Totale budget project: fields: - id: ID title: Titel order: status: diff --git a/decidim-budgets/config/locales/no.yml b/decidim-budgets/config/locales/no.yml index 17bcc472aec0a..521e7036799fc 100644 --- a/decidim-budgets/config/locales/no.yml +++ b/decidim-budgets/config/locales/no.yml @@ -105,7 +105,6 @@ total_budget: Totalt budsjett project: fields: - id: ID title: Tittel order: status: diff --git a/decidim-budgets/config/locales/pl.yml b/decidim-budgets/config/locales/pl.yml index a60b5ad8df6e5..8c5a5e7a6e00d 100644 --- a/decidim-budgets/config/locales/pl.yml +++ b/decidim-budgets/config/locales/pl.yml @@ -161,7 +161,6 @@ pl: total_budget: Całkowity budżet project: fields: - id: Identyfikator map: Mapa title: Tytuł order: diff --git a/decidim-budgets/config/locales/pt-BR.yml b/decidim-budgets/config/locales/pt-BR.yml index 7aea36a80130b..0934a1b10d774 100644 --- a/decidim-budgets/config/locales/pt-BR.yml +++ b/decidim-budgets/config/locales/pt-BR.yml @@ -168,7 +168,6 @@ pt-BR: total_budget: Orçamento total project: fields: - id: ID map: Mapa title: Título order: diff --git a/decidim-budgets/config/locales/ro-RO.yml b/decidim-budgets/config/locales/ro-RO.yml index 0efe83412b131..bdc78da938abc 100644 --- a/decidim-budgets/config/locales/ro-RO.yml +++ b/decidim-budgets/config/locales/ro-RO.yml @@ -109,7 +109,6 @@ ro: total_budget: Buget total project: fields: - id: ID title: Titlu order: status: diff --git a/decidim-budgets/config/locales/sv.yml b/decidim-budgets/config/locales/sv.yml index 37448cdca6645..b769923634516 100644 --- a/decidim-budgets/config/locales/sv.yml +++ b/decidim-budgets/config/locales/sv.yml @@ -213,7 +213,6 @@ sv: total_budget: Total budget project: fields: - id: ID map: Karta taxonomies: Kategorisering title: Titel diff --git a/decidim-budgets/config/locales/zh-TW.yml b/decidim-budgets/config/locales/zh-TW.yml index 19f6550c48b3e..6f0ed34f4df41 100644 --- a/decidim-budgets/config/locales/zh-TW.yml +++ b/decidim-budgets/config/locales/zh-TW.yml @@ -140,7 +140,6 @@ zh-TW: total_budget: 總預算 project: fields: - id: ID title: 標題 order: status: diff --git a/decidim-budgets/decidim-budgets.gemspec b/decidim-budgets/decidim-budgets.gemspec index 0e5305201cab0..7bd234812d232 100644 --- a/decidim-budgets/decidim-budgets.gemspec +++ b/decidim-budgets/decidim-budgets.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-budgets" s.summary = "Decidim budgets module" diff --git a/decidim-budgets/lib/decidim/budgets/component.rb b/decidim-budgets/lib/decidim/budgets/component.rb index 2fb10eef2e5cf..532e781a1d466 100644 --- a/decidim-budgets/lib/decidim/budgets/component.rb +++ b/decidim-budgets/lib/decidim/budgets/component.rb @@ -15,7 +15,7 @@ component.query_type = "Decidim::Budgets::BudgetsType" - component.actions = %w(vote comment) + component.actions = %w(vote comment vote_comment) component.on(:before_destroy) do |instance| raise StandardError, "Cannot remove this component" if Decidim::Budgets::Budget.where(component: instance).any? diff --git a/decidim-budgets/spec/shared/export_projects_examples.rb b/decidim-budgets/spec/shared/export_projects_examples.rb index db560c0120651..b90beff12d645 100644 --- a/decidim-budgets/spec/shared/export_projects_examples.rb +++ b/decidim-budgets/spec/shared/export_projects_examples.rb @@ -9,7 +9,7 @@ context "with query" do before do - fill_in "q[id_string_or_title_cont]", with: translated(projects.last.title) + fill_in "q[title_cont]", with: translated(projects.last.title) find("button[aria-label='Search']").click end diff --git a/decidim-budgets/spec/system/admin_access_spec.rb b/decidim-budgets/spec/system/admin_access_spec.rb new file mode 100644 index 0000000000000..cfe1575049135 --- /dev/null +++ b/decidim-budgets/spec/system/admin_access_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "budgets" } + let(:budget) { create(:budget, component:) } + let!(:project) { create(:project, budget:) } + let(:title) { "Budgets" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" + + describe "when accessing projects" do + context "when the user is a process admin" do + let(:user) { create(:process_admin, :confirmed, organization:, participatory_process:) } + + before do + login_as user, scope: :user + end + + it "access the projects' index page" do + click_on(translated(budget.title)) + expect(page).to have_content(translated(project.title)) + end + end + end +end diff --git a/decidim-budgets/spec/system/admin_filters_searches_and_paginates_projects_spec.rb b/decidim-budgets/spec/system/admin_filters_searches_and_paginates_projects_spec.rb index e231bcb189ee2..41c530fd8ff73 100644 --- a/decidim-budgets/spec/system/admin_filters_searches_and_paginates_projects_spec.rb +++ b/decidim-budgets/spec/system/admin_filters_searches_and_paginates_projects_spec.rb @@ -48,7 +48,7 @@ end end - context "when searching by ID or title" do + context "when searching by title" do let!(:project1) { create(:project, budget:) } let!(:project2) { create(:project, budget:) } let!(:project1_title) { translated(project1.title) } @@ -56,12 +56,6 @@ before { visit current_path } - it "can be searched by ID" do - search_by_text(project1.id) - - expect(page).to have_content(project1_title) - end - it "can be searched by title" do search_by_text(project2_title) diff --git a/decidim-budgets/spec/system/admin_orders_projects_spec.rb b/decidim-budgets/spec/system/admin_orders_projects_spec.rb index 1a6452e65ad5f..8a00466ceee77 100644 --- a/decidim-budgets/spec/system/admin_orders_projects_spec.rb +++ b/decidim-budgets/spec/system/admin_orders_projects_spec.rb @@ -35,17 +35,6 @@ end end - it "orders projects by ID" do - ordered_projects = projects.sort_by(&:id).reverse - - click_on "ID" - rows = page.all("tbody tr") - - rows.each_with_index do |row, i| - expect(row).to have_text(translated(ordered_projects[i].title)) - end - end - it "orders projects by title" do ordered_projects = projects.sort_by { |project| translated(project.title) } diff --git a/decidim-collaborative_texts/app/controllers/decidim/collaborative_texts/documents_controller.rb b/decidim-collaborative_texts/app/controllers/decidim/collaborative_texts/documents_controller.rb index 02d97d4ad2822..680b43eb12ac4 100644 --- a/decidim-collaborative_texts/app/controllers/decidim/collaborative_texts/documents_controller.rb +++ b/decidim-collaborative_texts/app/controllers/decidim/collaborative_texts/documents_controller.rb @@ -34,7 +34,7 @@ def update private def document - @document ||= documents.find(params[:id]) + @document ||= documents.find_by(id: params[:id]) end def presenter @@ -52,6 +52,16 @@ def documents def paginate_documents @paginate_documents ||= paginate(documents.enabled_desc) end + + def add_breadcrumb_item + return {} if document.blank? + + { + label: translated_attribute(document.title), + url: Decidim::EngineRouter.main_proxy(current_component).document_path(document), + active: false + } + end end end end diff --git a/decidim-collaborative_texts/app/views/decidim/collaborative_texts/admin/documents/_document-tr.html.erb b/decidim-collaborative_texts/app/views/decidim/collaborative_texts/admin/documents/_document-tr.html.erb index 553697d150d7c..6f25fdeb117aa 100644 --- a/decidim-collaborative_texts/app/views/decidim/collaborative_texts/admin/documents/_document-tr.html.erb +++ b/decidim-collaborative_texts/app/views/decidim/collaborative_texts/admin/documents/_document-tr.html.erb @@ -7,7 +7,9 @@ <% end %> "> - <%= t("booleans.#{document.accepting_suggestions}") %> + !text-sm"> + <%= humanize_boolean document.accepting_suggestions %> + "> <% if document.published? %> diff --git a/decidim-collaborative_texts/config/locales/cs.yml b/decidim-collaborative_texts/config/locales/cs.yml index b7b3746c96a11..799bb90a62d67 100644 --- a/decidim-collaborative_texts/config/locales/cs.yml +++ b/decidim-collaborative_texts/config/locales/cs.yml @@ -71,6 +71,9 @@ cs: update_settings: invalid: Při aktualizaci dokumentu došlo k chybě. success: Dokument byl úspěšně aktualizován. + index: + published: Zveřejněno + unpublished: Zneveřejněno admin_log: document: create: "%{user_name} vytvořil kolaborativní text %{resource_name} v %{space_name}" @@ -102,6 +105,10 @@ cs: published: Zveřejněno suggestions: Přijmout návrhy title: Název + suggestion: + add_html: Přidat: %{text} + remove_html: Odstranit: %{text} + replace_html: Nahradit: %{text} suggestions: create: invalid: Při vytváření návrhu došlo k chybě. diff --git a/decidim-collaborative_texts/decidim-collaborative_texts.gemspec b/decidim-collaborative_texts/decidim-collaborative_texts.gemspec index 9790dd558c420..0541b3a7f42e6 100644 --- a/decidim-collaborative_texts/decidim-collaborative_texts.gemspec +++ b/decidim-collaborative_texts/decidim-collaborative_texts.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-collaborative_texts" s.summary = "A Decidim module for creating Collaborative Texts" diff --git a/decidim-collaborative_texts/spec/controllers/decidim/collaborative_texts/documents_controller_spec.rb b/decidim-collaborative_texts/spec/controllers/decidim/collaborative_texts/documents_controller_spec.rb index 350788a20dfeb..1377244dffd0c 100644 --- a/decidim-collaborative_texts/spec/controllers/decidim/collaborative_texts/documents_controller_spec.rb +++ b/decidim-collaborative_texts/spec/controllers/decidim/collaborative_texts/documents_controller_spec.rb @@ -36,8 +36,8 @@ module CollaborativeTexts end context "when document does not exist" do - it "raises an ActiveRecord::RecordNotFound error" do - expect { get :show, params: { id: "non-existent" } }.to raise_error(ActiveRecord::RecordNotFound) + it "raises an ActionController::RoutingError error" do + expect { get :show, params: { id: "non-existent" } }.to raise_error(ActionController::RoutingError) end end end diff --git a/decidim-collaborative_texts/spec/system/admin/admin_access_spec.rb b/decidim-collaborative_texts/spec/system/admin/admin_access_spec.rb new file mode 100644 index 0000000000000..495a021b7d502 --- /dev/null +++ b/decidim-collaborative_texts/spec/system/admin/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "collaborative_texts" } + let!(:document) { create(:collaborative_text_document, :published, component:) } + let(:title) { "Collaborative texts" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-collaborative_texts/spec/system/user_sends_suggestions_spec.rb b/decidim-collaborative_texts/spec/system/user_sends_suggestions_spec.rb index e12a570f1bc38..13bdf4b263e25 100644 --- a/decidim-collaborative_texts/spec/system/user_sends_suggestions_spec.rb +++ b/decidim-collaborative_texts/spec/system/user_sends_suggestions_spec.rb @@ -46,6 +46,9 @@ end it "lists all the documents" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end within("aside") do expect(page).to have_content(translated(component.name)) end @@ -57,6 +60,11 @@ it "shows the document details" do click_on document.title + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(document.title)) + end + expect(page).to have_content(translated(document.title)) within("aside") do expect(page).to have_content("Index") diff --git a/decidim-comments/db/data/20251117070404_update_user_groups_references.rb b/decidim-comments/db/data/20251117070404_update_user_groups_references.rb new file mode 100644 index 0000000000000..c336651e3c984 --- /dev/null +++ b/decidim-comments/db/data/20251117070404_update_user_groups_references.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +class UpdateUserGroupsReferences < ActiveRecord::Migration[7.2] + def up + Rails.logger.info "Starting comment body updates..." + + updated_count = 0 + skipped_count = 0 + error_count = 0 + + Decidim::Comments::Comment.find_each do |comment| + next if comment.body.blank? + + updated_body = process_comment_body(comment.body) + body_changed = updated_body != comment.body + + if body_changed + comment.update_column(:body, updated_body) # rubocop:disable Rails/SkipsModelValidations + updated_count += 1 + Rails.logger.info "✓ Updated comment ##{comment.id}" + else + skipped_count += 1 + end + rescue StandardError => e + error_count += 1 + Rails.logger.error "✗ Error updating comment ##{comment.id}: #{e.message}" + end + + log_summary(updated_count, skipped_count, error_count) + end + + def down + raise ActiveRecord::IrreversibleMigration + end + + private + + def process_comment_body(body) + updated_body = {} + + body.each do |locale, text| + updated_body[locale] = if locale == "machine_translations" && text.is_a?(Hash) + process_machine_translations(text) + else + replace_user_group_references(text) + end + end + + updated_body + end + + def process_machine_translations(translations) + updated_translations = {} + + translations.each do |translation_locale, translation_text| + next if translation_text.blank? + + updated_translations[translation_locale] = replace_user_group_references(translation_text) + end + + updated_translations + end + + def replace_user_group_references(text) + return text if text.blank? + + text.gsub( + %r{gid://([^/]+)/Decidim::UserGroup/(\d+)}, + 'gid://\1/Decidim::User/\2' + ) + end + + def log_summary(updated_count, skipped_count, error_count) + Rails.logger.info "=" * 50 + Rails.logger.info "Comment body update completed!" + Rails.logger.info "=" * 50 + Rails.logger.info "Updated: #{updated_count}" + Rails.logger.info "Skipped: #{skipped_count}" + Rails.logger.info "Errors: #{error_count}" + Rails.logger.info "=" * 50 + end +end diff --git a/decidim-comments/decidim-comments.gemspec b/decidim-comments/decidim-comments.gemspec index 19f8a7ae9e194..e2b7711752d51 100644 --- a/decidim-comments/decidim-comments.gemspec +++ b/decidim-comments/decidim-comments.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-comments" s.summary = "Decidim comments module" diff --git a/decidim-comments/lib/decidim/comments/commentable_with_component.rb b/decidim-comments/lib/decidim/comments/commentable_with_component.rb index c38a9b1f83f7c..72558eac7498e 100644 --- a/decidim-comments/lib/decidim/comments/commentable_with_component.rb +++ b/decidim-comments/lib/decidim/comments/commentable_with_component.rb @@ -29,6 +29,15 @@ def user_allowed_to_comment?(user) ActionAuthorizer.new(user, "comment", component, self).authorize.ok? end + + # Public: Whether the user can vote comments or not. + # Checks for vote_comment permissions on the component. + def user_allowed_to_vote_comment?(user) + return false unless accepts_new_comments? + return false unless can_participate?(user) + + ActionAuthorizer.new(user, "vote_comment", component, self).authorize.ok? + end end end end diff --git a/decidim-comments/spec/db/data/update_user_groups_references_spec.rb b/decidim-comments/spec/db/data/update_user_groups_references_spec.rb new file mode 100644 index 0000000000000..cf628ac717327 --- /dev/null +++ b/decidim-comments/spec/db/data/update_user_groups_references_spec.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "spec_helper" +require "./db/data/20251117070404_update_user_groups_references" + +describe UpdateUserGroupsReferences do + let(:migrator) do + described_class.new.tap do |m| + m.verbose = false + end + end + + describe "#up" do + let!(:comment) { create(:comment, body:) } + + describe "with a normal body" do + let(:body) { { "en" => "This is a normal body" } } + let(:result) { { "en" => "This is a normal body" } } + + it "does not do anything" do + expect(comment.reload.body).to eq(body) + migrator.migrate(:up) + expect(comment.reload.body).to eq(result) + end + end + + describe "with a User reference in the body" do + let(:body) { { "en" => "This is a body mentioning gid://decidim-test/Decidim::User/9" } } + let(:result) { { "en" => "This is a body mentioning gid://decidim-test/Decidim::User/9" } } + + it "does not do anything" do + expect(comment.reload.body).to eq(body) + migrator.migrate(:up) + expect(comment.reload.body).to eq(result) + end + end + + describe "with a UserGroup reference in the body" do + let(:body) { { "en" => "This is a body mentioning gid://decidim-development-app/Decidim::UserGroup/5" } } + let(:result) { { "en" => "This is a body mentioning gid://decidim-development-app/Decidim::User/5" } } + + it "changes the reference to User" do + expect(comment.reload.body).to eq(body) + migrator.migrate(:up) + expect(comment.reload.body).to eq(result) + end + end + + describe "with a UserGroup reference in the body and machine translation enabled" do + let(:body) do + { + "en" => "This is a body mentioning gid://decidim-development-app/Decidim::UserGroup/5", + "machine_translations" => { + "es" => "Este es el cuerpo mencionando gid://decidim-development-app/Decidim::UserGroup/5" + } + } + end + let(:result) do + { + "en" => "This is a body mentioning gid://decidim-development-app/Decidim::User/5", + "machine_translations" => { + "es" => "Este es el cuerpo mencionando gid://decidim-development-app/Decidim::User/5" + } + } + end + + it "changes the reference to User" do + expect(comment.reload.body).to eq(body) + migrator.migrate(:up) + expect(comment.reload.body).to eq(result) + end + end + end + + describe "#down" do + it "raises IrreversibleMigration exception" do + expect { migrator.migrate(:down) }.to raise_error(ActiveRecord::IrreversibleMigration) + end + end +end diff --git a/decidim-comments/spec/tasks/decidim_comments_spec.rb b/decidim-comments/spec/lib/tasks/decidim_comments_upgrade_participatory_process_in_comments_spec.rb similarity index 100% rename from decidim-comments/spec/tasks/decidim_comments_spec.rb rename to decidim-comments/spec/lib/tasks/decidim_comments_upgrade_participatory_process_in_comments_spec.rb diff --git a/decidim-conferences/app/packs/stylesheets/decidim/conferences/_program.scss b/decidim-conferences/app/packs/stylesheets/decidim/conferences/_program.scss index 4ec534831a1a4..3080beba9fcfd 100644 --- a/decidim-conferences/app/packs/stylesheets/decidim/conferences/_program.scss +++ b/decidim-conferences/app/packs/stylesheets/decidim/conferences/_program.scss @@ -13,7 +13,7 @@ @apply h-10 grid place-items-center border-b-2 border-tertiary text-center text-xl text-gray-2 font-semibold; } - &-category { + &-taxonomy { @apply h-10 w-full bg-background-4 border-b-2 border-secondary text-center text-secondary font-semibold text-md truncate leading-10; &-container { diff --git a/decidim-conferences/app/views/decidim/conferences/admin/conference_invites/index.html.erb b/decidim-conferences/app/views/decidim/conferences/admin/conference_invites/index.html.erb index 7edaa9bf90d90..1570a5a9721bf 100644 --- a/decidim-conferences/app/views/decidim/conferences/admin/conference_invites/index.html.erb +++ b/decidim-conferences/app/views/decidim/conferences/admin/conference_invites/index.html.erb @@ -33,7 +33,7 @@ <% if invite.sent_at %> - <%= l invite.sent_at, format: :long %> + <%= l invite.sent_at, format: :decidim_short %> <% end %> diff --git a/decidim-conferences/app/views/decidim/conferences/conference_program/_program_item.html.erb b/decidim-conferences/app/views/decidim/conferences/conference_program/_program_item.html.erb index 7022ed6c91884..4add117864fa0 100644 --- a/decidim-conferences/app/views/decidim/conferences/conference_program/_program_item.html.erb +++ b/decidim-conferences/app/views/decidim/conferences/conference_program/_program_item.html.erb @@ -4,23 +4,23 @@ <%= start_time.to_fs(:time) %> - <%= end_time.to_fs(:time) %>
- <% categories = meetings.map(&:category).uniq %> + <% taxonomies = meetings.map(&:taxonomies).uniq %> <% seed = SecureRandom.hex(3).to_s %> - <% if categories.present? %> -
diff --git a/decidim-core/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb b/decidim-core/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb index 22b013f8900d7..9d027b5f2d97f 100644 --- a/decidim-core/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb +++ b/decidim-core/app/views/layouts/decidim/header/_focus_mode_back_button.html.erb @@ -9,6 +9,10 @@ <% end %> + +
<%= link_to( content_for(:focus_mode_return_path), diff --git a/decidim-core/app/views/layouts/decidim/header/_follow_space_menu_bar_button.html.erb b/decidim-core/app/views/layouts/decidim/header/_follow_space_menu_bar_button.html.erb index 24fa2648ac10d..797687e6efcde 100644 --- a/decidim-core/app/views/layouts/decidim/header/_follow_space_menu_bar_button.html.erb +++ b/decidim-core/app/views/layouts/decidim/header/_follow_space_menu_bar_button.html.erb @@ -1,7 +1,7 @@ <%= content_for :participatory_space_actions do %> - <%= cell("decidim/follow_button", participatory_space, button_classes: "button button__sm button__transparent") %> + <%= cell("decidim/follow_button", participatory_space, button_classes: "button button__sm button__transparent-secondary") %> <% end %> <%= content_for :participatory_space_mobile_actions do %> - <%= cell("decidim/follow_button", participatory_space, button_classes: "button button__sm button__transparent", mobile: true) %> + <%= cell("decidim/follow_button", participatory_space, button_classes: "button button__sm button__transparent-secondary", mobile: true) %> <% end %> diff --git a/decidim-core/app/views/layouts/decidim/header/_main.html.erb b/decidim-core/app/views/layouts/decidim/header/_main.html.erb index 0f12401449026..9533c257faa57 100644 --- a/decidim-core/app/views/layouts/decidim/header/_main.html.erb +++ b/decidim-core/app/views/layouts/decidim/header/_main.html.erb @@ -16,14 +16,16 @@ <% if current_user&.ephemeral? %> <%= render partial: "layouts/decidim/header/close_ephemeral_session" %> <% else %> - - -
- <%= render partial: "layouts/decidim/header/main_menu_mobile" %> +
+ + +
+ <%= render partial: "layouts/decidim/header/main_menu_mobile" %> +
<%= render partial: "layouts/decidim/header/main_links_mobile_account" if current_user %> <% end %> diff --git a/decidim-core/app/views/layouts/decidim/footer/_main_language_chooser.html.erb b/decidim-core/app/views/layouts/decidim/header/_main_language_chooser.html.erb similarity index 72% rename from decidim-core/app/views/layouts/decidim/footer/_main_language_chooser.html.erb rename to decidim-core/app/views/layouts/decidim/header/_main_language_chooser.html.erb index 3d6f50d197d9b..85c9bd3c40468 100644 --- a/decidim-core/app/views/layouts/decidim/footer/_main_language_chooser.html.erb +++ b/decidim-core/app/views/layouts/decidim/header/_main_language_chooser.html.erb @@ -4,19 +4,15 @@ <%= icon "global-line" %> <%= t("name", scope: "locale" ) %> <%= icon "arrow-down-s-line" %> - - <% available_locales.each do |locale| %> - - <%= I18n.with_locale(locale) { t("layouts.decidim.language_chooser.choose_language") } %> - - <% end %> + + <%= t("layouts.decidim.language_chooser.choose_language") %>
+ diff --git a/decidim-core/app/views/layouts/decidim/header/_main_menu_mobile.html.erb b/decidim-core/app/views/layouts/decidim/header/_main_menu_mobile.html.erb index 6c7a2cffdd826..c14917542ad6e 100644 --- a/decidim-core/app/views/layouts/decidim/header/_main_menu_mobile.html.erb +++ b/decidim-core/app/views/layouts/decidim/header/_main_menu_mobile.html.erb @@ -1,9 +1,11 @@ +
diff --git a/decidim-elections/app/views/decidim/elections/censuses/_internal_users_form.html.erb b/decidim-elections/app/views/decidim/elections/censuses/_internal_users_form.html.erb index b063841343ea3..7a286593fc830 100644 --- a/decidim-elections/app/views/decidim/elections/censuses/_internal_users_form.html.erb +++ b/decidim-elections/app/views/decidim/elections/censuses/_internal_users_form.html.erb @@ -1,6 +1,21 @@ <% if current_user %> <% if @form.in_census? && @form.invalid? %> <%= cell "decidim/announcement", title: t(".invalid"), body: t(".authorization_options_invalid"), callout_class: "alert" %> + <% cell("decidim/authorization_modal", @form.authorization_status).verifications.each do |verification| %> +
+ <% verification[:messages].each do |msg| %> +

<%= msg %>

+ <% end %> + + <% if verification[:fields].present? %> + + <% end %> +
+ <% end %> <%= link_to t(".exit_button"), exit_path, class: "button button__secondary button__lg w-full mt-12" %> <%= render "decidim/elections/censuses/submit_button", form: form, disabled: true %> <% else %> diff --git a/decidim-elections/app/views/decidim/elections/votes/show.html.erb b/decidim-elections/app/views/decidim/elections/votes/show.html.erb index b76cde2df6248..9463d769b0c96 100644 --- a/decidim-elections/app/views/decidim/elections/votes/show.html.erb +++ b/decidim-elections/app/views/decidim/elections/votes/show.html.erb @@ -4,12 +4,16 @@ <%= render_question_description(question) %> -
+
<% question.response_options.each do |option| %> -
diff --git a/decidim-elections/config/locales/ca-IT.yml b/decidim-elections/config/locales/ca-IT.yml index c7d6a2cafd64d..34477e12a20e4 100644 --- a/decidim-elections/config/locales/ca-IT.yml +++ b/decidim-elections/config/locales/ca-IT.yml @@ -44,7 +44,6 @@ ca-IT: choose_census: Tria el tipus de cens que vols vincular a aquesta elecció created_at: Creada el identifier: Identificador d'usuària - title: Tipus de cens preview: title: one: La vista prèvia de la llista està limitada a %{count} registre. diff --git a/decidim-elections/config/locales/ca.yml b/decidim-elections/config/locales/ca.yml index b170de5dcf804..474b6fcd7745f 100644 --- a/decidim-elections/config/locales/ca.yml +++ b/decidim-elections/config/locales/ca.yml @@ -44,7 +44,6 @@ ca: choose_census: Tria el tipus de cens que vols vincular a aquesta elecció created_at: Creada el identifier: Identificador d'usuària - title: Tipus de cens preview: title: one: La vista prèvia de la llista està limitada a %{count} registre. diff --git a/decidim-elections/config/locales/cs.yml b/decidim-elections/config/locales/cs.yml index f011de3f0d7b4..236addfc4cc1e 100644 --- a/decidim-elections/config/locales/cs.yml +++ b/decidim-elections/config/locales/cs.yml @@ -128,7 +128,22 @@ cs: already_have_an_account?: Již máte účet? are_you_new?: Nový účastník? sign_in_description: Přihlaste se k hlasování v těchto volbách + sign_up_description: Vytvořte účet pro hlasování v této volbě + internal_users_form: + authorization_options_invalid: Bohužel, i když máte všechna požadovaná oprávnění, některé z nich pro tyto volby neplatí. + invalid: V těchto volbách nemáte oprávnění volit. + missing: Vašemu uživateli chybí některá požadovaná autorizace. Zkontrolujte prosím informace a zkuste to znovu. + resume_with_method: Pokračovat v ověřování pomocí %{name} + verify_with_method: Ověřit pomocí %{name} token_csv: + example: | + e-mail;token + user@example.org;123456 + user2@example.org;ABCXYZ + info_html: | + Musí být soubor ve formátu CSV se dvěma sloupci, jedna s e-mailovou adresou a druhá s hodnotou tokenu, který uživatel bude muset představit, aby mohl hlasovat. + Musí být oddělena středníkem (;) + label: Neregistrovaní účastníci s tokeny (fixní) upload_file: Nahrát soubor upload_new_census: Nahrát CSV soubor token_csv_form: @@ -146,6 +161,7 @@ cs: other: "%{count} voleb" elections: empty: Nejsou k dispozici žádné volby. + empty_filters: Neexistují žádné volby, které by odpovídaly vašim filtrům. filters: all: Vše state: Stav @@ -163,6 +179,8 @@ cs: show: vote_button: Hlasovat vote_results: + subtitle: + per_question: Výsledky jsou k dispozici na jednu otázku. Výsledky pro každou otázku můžete vidět po povolení hlasování a po zveřejnění výsledků. title: Výsledky models: election: @@ -175,11 +193,14 @@ cs: per_question_votes: waiting: edit_vote: Upravte svůj hlas + exit_button: Odejít z čekací místnosti + title: Čekání na další otázku status: active: Aktivní finished: Dokončeno not_started: Nezahájeno ongoing: Probíhající + published_results: Zveřejněné výsledky scheduled: Naplánováno unpublished: Nezveřejněno voting_enabled: Probíhá hlasování @@ -189,9 +210,11 @@ cs: success: Váš hlas byl úspěšně odeslán. check_census: access: Přístup + election_not_open: Volby ještě nejsou otevřeny. Zkontrolujte prosím datum a zkuste to znovu. failed: Vaši identitu nelze ověřit. Zkontrolujte zadané informace a zkuste to znovu. form_title: Ověřte svou identitu confirm: + edit_vote: Upravte svůj hlas not_answered: Na tuto otázku jste neodpověděl. title: Potvrďte svůj hlas not_authorized: V těchto volbách nemáte oprávnění volit. diff --git a/decidim-elections/config/locales/en.yml b/decidim-elections/config/locales/en.yml index 3c970ec5c7a37..1f2e3d1adf4b0 100644 --- a/decidim-elections/config/locales/en.yml +++ b/decidim-elections/config/locales/en.yml @@ -2,6 +2,8 @@ en: activemodel: attributes: + elections_question: + max_choices: Maximum number of choices token_csv: file: File remove_all: Remove all current census data @@ -200,9 +202,6 @@ en: authorization_options_invalid: Unfortunately, although you have all the required authorizations, some of them are not valid for this election. exit_button: Exit the voting booth invalid: You are not authorized to vote in this election. - missing: Your user misses some required authorizations. Please check the information and try again. - not_authorized: '"%{adapter}" authorization does not match the required conditions.' - not_granted: '"%{adapter}" authorization is not granted.' resume_with_method: Resume verification with %{name} verify_with_method: Verify with %{name} token_csv: @@ -302,6 +301,9 @@ en: question: back: Back cast_vote: Cast vote + max_choices: 'Max choices: %{count}' + max_choices_alert: You have selected too many options. Please deselect some to continue. + max_choices_exceeded: You cannot select more than %{max} options. Please go back and adjust your selection. next: Next receipt: description: Yo can vote again at any time while the voting period is open. Your previous vote will be overwritten by the new one. diff --git a/decidim-elections/config/locales/es-MX.yml b/decidim-elections/config/locales/es-MX.yml index a713fdaaf03e6..b9f00c38dae2a 100644 --- a/decidim-elections/config/locales/es-MX.yml +++ b/decidim-elections/config/locales/es-MX.yml @@ -44,7 +44,6 @@ es-MX: choose_census: Elige el tipo de censo que quieres vincular esta elección created_at: Creado el identifier: Identificador de usuaria - title: Tipo de censo preview: title: one: La vista previa de la lista está limitada a %{count} registro. diff --git a/decidim-elections/config/locales/es-PY.yml b/decidim-elections/config/locales/es-PY.yml index 7b50d4ac3b4b7..d899df8ca3fab 100644 --- a/decidim-elections/config/locales/es-PY.yml +++ b/decidim-elections/config/locales/es-PY.yml @@ -44,7 +44,6 @@ es-PY: choose_census: Elige el tipo de censo que quieres vincular esta elección created_at: Creado el identifier: Identificador de usuaria - title: Tipo de censo preview: title: one: La vista previa de la lista está limitada a %{count} registro. diff --git a/decidim-elections/config/locales/es.yml b/decidim-elections/config/locales/es.yml index 0e107c8291698..26653fe7d7a95 100644 --- a/decidim-elections/config/locales/es.yml +++ b/decidim-elections/config/locales/es.yml @@ -44,7 +44,6 @@ es: choose_census: Elige el tipo de censo que quieres vincular esta elección created_at: Creado el identifier: Identificador de usuaria - title: Tipo de censo preview: title: one: La vista previa de la lista está limitada a %{count} registro. diff --git a/decidim-elections/config/locales/eu.yml b/decidim-elections/config/locales/eu.yml index 4009958aa6e39..f978acc27c79d 100644 --- a/decidim-elections/config/locales/eu.yml +++ b/decidim-elections/config/locales/eu.yml @@ -44,7 +44,6 @@ eu: choose_census: Hautatu hauteskunde hauetarako erabili nahi duzun errolda-mota created_at: Sortze-data identifier: Parte-hartzailearen identifikatzailea - title: Errolda-mota preview: title: one: Aurrebistaren zerrenda erregistro batera mugatuta dago. @@ -180,7 +179,7 @@ eu: unpublish: "%{user_name} parte-hartzaileak %{resource_name} hauteskundea despublikatu du %{space_name} espazioan" update: "%{user_name} parte-hartzaileak %{resource_name} hauteskundea eguneratu du %{space_name} espazioan" question: - update: "%{user_name} -k eguneratu ditu %{resource_name} aukerako galderak" + update: "%{user_name} parte-hartzaileak eguneratu ditu %{resource_name} aukerako galderak" censuses: census_ready_html: Erroldako datuak kargatuta daude eta prest daude % %{election_title}{@eleccion_title} bozketan erabiltzeko. census_size_html: diff --git a/decidim-elections/config/locales/fi-plain.yml b/decidim-elections/config/locales/fi-plain.yml index baa445dd43f2b..b2560c07ea471 100644 --- a/decidim-elections/config/locales/fi-plain.yml +++ b/decidim-elections/config/locales/fi-plain.yml @@ -44,7 +44,6 @@ fi-pl: choose_census: Valitse henkilötietorekisterin tyyppi, jota haluat käyttää tälle vaalille created_at: Luonnin ajankohta identifier: Käyttäjän tunniste - title: Henkilötietorekisterin tyyppi preview: title: one: Esikatselulista on rajattu %{count} tietueeseen. diff --git a/decidim-elections/config/locales/fi.yml b/decidim-elections/config/locales/fi.yml index 09d527ab23005..9fb410f86b70e 100644 --- a/decidim-elections/config/locales/fi.yml +++ b/decidim-elections/config/locales/fi.yml @@ -44,7 +44,6 @@ fi: choose_census: Valitse henkilötietorekisterin tyyppi, jota haluat käyttää tälle vaalille created_at: Luonnin ajankohta identifier: Käyttäjän tunniste - title: Henkilötietorekisterin tyyppi preview: title: one: Esikatselulista on rajattu %{count} tietueeseen. diff --git a/decidim-elections/config/locales/fr-CA.yml b/decidim-elections/config/locales/fr-CA.yml index b07e1de80e09d..ad54e715b1042 100644 --- a/decidim-elections/config/locales/fr-CA.yml +++ b/decidim-elections/config/locales/fr-CA.yml @@ -40,6 +40,7 @@ fr-CA: admin: census: edit: + choose_census: Choisissez le type de recensement que vous souhaitez utiliser pour cette élection created_at: Créée le identifier: Identifiant de l'utilisateur preview: @@ -71,6 +72,7 @@ fr-CA: publish_button: Publier les résultats title: Résultats status: + census: 'Recensement:' results_availability: after_end: Résultats disponibles après la fin de l'élection per_question: Résultats disponibles par question @@ -80,6 +82,8 @@ fr-CA: create: invalid: Il y a eu un problème lors de la création de l'élection. success: Élection créée avec succès. + dashboard: + subtitle: 'Étape finale: éxaminez vos détails. Des modifications peuvent toujours être apportées avant de publier. Une fois publiée, vous serez toujours en mesure de mettre à jour la description de l''élection.' edit: title: Modifier l'élection form: @@ -142,6 +146,9 @@ fr-CA: internal_users: already_have_an_account?: Vous avez déjà un compte? are_you_new?: Nouveau participant ? + info_html: | + Vous pouvez restreindre la participation à l'élection aux participants qui ont une autorisation.
+ Notez que les participants devront satisfaire aux autorisations sélectionnées pour voter. Laisser toutes les cases à cocher vides permettra à toute personne enregistrée de voter. internal_type_title: Autorisations supplémentaires requises pour voter (facultatif) sign_in_description: Connectez-vous pour voter durant cette élection sign_up_description: Créer un compte pour voter durant cette élection @@ -184,6 +191,7 @@ fr-CA: state_values: finished: Terminées ongoing: En cours + scheduled: Programmé orders: end_at: Date de fin label: Trier par diff --git a/decidim-elections/config/locales/fr.yml b/decidim-elections/config/locales/fr.yml index 68d35c0b00b69..7244ea07f2183 100644 --- a/decidim-elections/config/locales/fr.yml +++ b/decidim-elections/config/locales/fr.yml @@ -40,6 +40,7 @@ fr: admin: census: edit: + choose_census: Choisissez le type de recensement que vous souhaitez utiliser pour cette élection created_at: Créée le identifier: Identifiant de l'utilisateur preview: @@ -71,6 +72,7 @@ fr: publish_button: Publier les résultats title: Résultats status: + census: 'Recensement:' results_availability: after_end: Résultats disponibles après la fin de l'élection per_question: Résultats disponibles par question @@ -80,6 +82,8 @@ fr: create: invalid: Il y a eu un problème lors de la création de l'élection. success: Élection créée avec succès. + dashboard: + subtitle: 'Étape finale: éxaminez vos détails. Des modifications peuvent toujours être apportées avant de publier. Une fois publiée, vous serez toujours en mesure de mettre à jour la description de l''élection.' edit: title: Modifier l'élection form: @@ -142,6 +146,9 @@ fr: internal_users: already_have_an_account?: Vous avez déjà un compte? are_you_new?: Nouveau participant ? + info_html: | + Vous pouvez restreindre la participation à l'élection aux participants qui ont une autorisation.
+ Notez que les participants devront satisfaire aux autorisations sélectionnées pour voter. Laisser toutes les cases à cocher vides permettra à toute personne enregistrée de voter. internal_type_title: Autorisations supplémentaires requises pour voter (facultatif) sign_in_description: Connectez-vous pour voter durant cette élection sign_up_description: Créer un compte pour voter durant cette élection @@ -184,6 +191,7 @@ fr: state_values: finished: Terminées ongoing: En cours + scheduled: Programmé orders: end_at: Date de fin label: Trier par diff --git a/decidim-elections/config/locales/ja.yml b/decidim-elections/config/locales/ja.yml index 56db4c3bd6645..550cb2d9ca32e 100644 --- a/decidim-elections/config/locales/ja.yml +++ b/decidim-elections/config/locales/ja.yml @@ -44,7 +44,6 @@ ja: choose_census: この選挙に使用したいセンサスの種類を選択してください created_at: 作成日時 identifier: ユーザーID - title: センサスの種類 preview: title: other: プレビューリストは %{count} レコードに制限されています。 diff --git a/decidim-elections/config/locales/sv.yml b/decidim-elections/config/locales/sv.yml index 79514ca975b30..e4888aa9694d9 100644 --- a/decidim-elections/config/locales/sv.yml +++ b/decidim-elections/config/locales/sv.yml @@ -39,7 +39,6 @@ sv: choose_census: Välj vilken typ av folkräkning du vill använda för detta val created_at: Skapad den identifier: Identifierare för användare - title: Typ av folkräkning preview: title: one: Förhandsgranskningen är begränsad till %{count} post. diff --git a/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb b/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb new file mode 100644 index 0000000000000..4e2d8aadcac24 --- /dev/null +++ b/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddMaxChoicesToDecidimElectionsQuestions < ActiveRecord::Migration[7.2] + def change + add_column :decidim_elections_questions, :max_choices, :integer + end +end diff --git a/decidim-elections/decidim-elections.gemspec b/decidim-elections/decidim-elections.gemspec index e46c1f172e9a8..c4d592bca87f1 100644 --- a/decidim-elections/decidim-elections.gemspec +++ b/decidim-elections/decidim-elections.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-elections" s.summary = "A Decidim module for creating Elections." diff --git a/decidim-elections/lib/decidim/elections/test/factories.rb b/decidim-elections/lib/decidim/elections/test/factories.rb index 50ae7c6bd5cac..c50e57fc0fe00 100644 --- a/decidim-elections/lib/decidim/elections/test/factories.rb +++ b/decidim-elections/lib/decidim/elections/test/factories.rb @@ -69,8 +69,8 @@ end trait :with_questions do - after :create do |election, _evaluator| - create_list(:election_question, 2, :with_response_options, :voting_enabled, election:) + after :create do |election, evaluator| + create_list(:election_question, 2, :with_response_options, :voting_enabled, election:, skip_injection: evaluator.skip_injection) end end @@ -95,8 +95,12 @@ end factory :election_question, class: "Decidim::Elections::Question" do + transient do + skip_injection { false } + end + association :election - body { generate_localized_title(:question_body) } + body { generate_localized_title(:question_body, skip_injection:) } description { generate_localized_description(:question_description) } question_type { "multiple_option" } sequence(:position) { |n| n } diff --git a/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb b/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb index 4d0d6369ec37b..b1d35796b0490 100644 --- a/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb +++ b/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb @@ -190,6 +190,67 @@ module Admin end end + context "when updating max_choices" do + let(:update_max_choices_params) do + { + "questions" => [ + { + "id" => first_question.id, + "body" => first_question.body, + "description" => first_question.description, + "question_type" => "multiple_option", + "max_choices" => 2, + "response_options" => [ + { "id" => first_question_first_option.id, "body" => first_question_first_option.body }, + { "id" => first_question_second_option.id, "body" => first_question_second_option.body } + ] + } + ] + } + end + + let(:form) { Decidim::Elections::Admin::QuestionsForm.from_params(update_max_choices_params).with_context(context_params) } + let(:command) { described_class.new(form, election) } + + it "updates max_choices field" do + command.call + updated = election.reload.questions.find_by(id: first_question.id) + expect(updated.max_choices).to eq(2) + end + end + + context "when adding a new question with max_choices" do + let(:add_with_max_choices_params) do + { + "questions" => [ + { + "body" => { en: "Q with max choices" }, + "description" => { en: "Description" }, + "question_type" => "multiple_option", + "max_choices" => 3, + "response_options" => [ + { "body" => { en: "Option 1" } }, + { "body" => { en: "Option 2" } }, + { "body" => { en: "Option 3" } }, + { "body" => { en: "Option 4" } } + ] + } + ] + } + end + + let(:form) { Decidim::Elections::Admin::QuestionsForm.from_params(add_with_max_choices_params).with_context(context_params) } + let(:command) { described_class.new(form, election) } + + it "creates a new question with max_choices" do + expect { command.call } + .to change { election.reload.questions.count }.by(1) + new_question = election.reload.questions.last + expect(new_question.max_choices).to eq(3) + expect(new_question.response_options.size).to eq(4) + end + end + context "when updating, deleting, and adding at once" do let(:combo_params) do { diff --git a/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb b/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb index e340e150c9e3c..7cab91d3c4936 100644 --- a/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb +++ b/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb @@ -96,6 +96,56 @@ module Elections expect(session[:votes_buffer]).to eq({ question.id.to_s => nil, second_question.id.to_s => nil }) expect(response).to redirect_to(confirm_election_votes_path) end + + context "when question has max_choices limit" do + let!(:question_with_limit) do + create(:election_question, :voting_enabled, election:, question_type: "multiple_option", max_choices: 2) + end + let!(:option1) { create(:election_response_option, question: question_with_limit) } + let!(:option2) { create(:election_response_option, question: question_with_limit) } + let!(:option3) { create(:election_response_option, question: question_with_limit) } + + it "rejects vote when exceeding max_choices" do + patch :update, params: params.merge( + id: question_with_limit.id, + response: { + question_with_limit.id.to_s => [option1.id, option2.id, option3.id] + } + ) + + expect(response).to have_http_status(:ok) + expect(flash[:alert]).to match(/cannot select more than 2/) + expect(subject).to render_template(:show) + end + + it "accepts vote when within max_choices limit" do + session[:votes_buffer] = { question.id.to_s => nil, second_question.id.to_s => nil } + + patch :update, params: params.merge( + id: question_with_limit.id, + response: { + question_with_limit.id.to_s => [option1.id, option2.id] + } + ) + + expect(session[:votes_buffer][question_with_limit.id.to_s]).to eq([option1.id.to_s, option2.id.to_s]) + expect(response).to redirect_to(confirm_election_votes_path) + end + + it "accepts vote with less than max_choices" do + session[:votes_buffer] = { question.id.to_s => nil, second_question.id.to_s => nil } + + patch :update, params: params.merge( + id: question_with_limit.id, + response: { + question_with_limit.id.to_s => [option1.id] + } + ) + + expect(session[:votes_buffer][question_with_limit.id.to_s]).to eq([option1.id.to_s]) + expect(response).to redirect_to(confirm_election_votes_path) + end + end end end diff --git a/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb b/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb index f5a0349884b82..75e3f42235347 100644 --- a/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb +++ b/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb @@ -55,6 +55,72 @@ module Admin it { is_expected.not_to be_valid } end + describe "max_choices validation" do + let(:attributes) do + { + body_en: body_en, + description_en: description_en, + question_type: question_type, + response_options: response_options, + max_choices: max_choices + } + end + + context "when max_choices is valid" do + let(:max_choices) { 2 } + + it { is_expected.to be_valid } + end + + context "when max_choices is greater than number of options" do + let(:max_choices) { 10 } + + it { is_expected.not_to be_valid } + + it "adds an error on max_choices" do + subject.valid? + expect(subject.errors[:max_choices]).not_to be_empty + end + end + + context "when max_choices is 1" do + let(:max_choices) { 1 } + + it { is_expected.not_to be_valid } + + it "adds an error on max_choices" do + subject.valid? + expect(subject.errors[:max_choices]).not_to be_empty + end + end + + context "when max_choices is nil" do + let(:max_choices) { nil } + + it { is_expected.to be_valid } + end + + context "when max_choices is blank string" do + let(:max_choices) { "" } + + it { is_expected.to be_valid } + end + end + + describe "#number_of_options" do + it "returns the count of response options" do + expect(subject.number_of_options).to eq(2) + end + + context "when there are no response options" do + let(:response_options) { {} } + + it "returns 0" do + expect(subject.number_of_options).to eq(0) + end + end + end + it_behaves_like "form to param", default_id: "questionnaire-question-id" end end diff --git a/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb b/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb index b97f8cf74614d..dc5f1b63cd5a4 100644 --- a/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb +++ b/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb @@ -18,6 +18,10 @@ module Censuses {} end + before do + organization.update!(available_authorizations: %w(dummy_authorization_handler)) + end + subject { described_class.new.with_context(election:, current_user: user) } it { is_expected.to be_valid } @@ -77,6 +81,9 @@ module Censuses it "adds an error for the base" do subject.validate expect(subject.errors[:base]).to include(I18n.t("decidim.elections.censuses.internal_users_form.invalid")) + expect(subject.authorization_status).to be_a(Decidim::ActionAuthorizer::AuthorizationStatusCollection) + expect(subject.authorization_status).not_to be_ok + expect(subject.authorization_status.statuses.first.data).to eq({ :extra_explanation => [{ :key => "extra_explanation.postal_codes", :params => { :scope => "decidim.verifications.dummy_authorization", :count => 1, :postal_codes => "08002" } }] }) end context "when the user does not match the options" do diff --git a/decidim-elections/spec/models/decidim/elections/question_spec.rb b/decidim-elections/spec/models/decidim/elections/question_spec.rb index 3f33d9493f9e4..fad27465bc732 100644 --- a/decidim-elections/spec/models/decidim/elections/question_spec.rb +++ b/decidim-elections/spec/models/decidim/elections/question_spec.rb @@ -155,6 +155,22 @@ module Elections it "returns the count of response options" do expect(subject.max_votable_options).to eq(2) end + + context "when max_choices is set" do + let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: 1) } + + it "returns the max_choices value" do + expect(subject.max_votable_options).to eq(1) + end + end + + context "when max_choices is nil" do + let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: nil) } + + it "returns the count of response options" do + expect(subject.max_votable_options).to eq(2) + end + end end end @@ -182,6 +198,15 @@ module Elections expect(question.safe_responses(response_ids)).to be_empty end end + + context "when max_choices is set" do + let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: 1) } + + it "returns only max_choices number of responses" do + response_ids = question.response_options.pluck(:id) + expect(question.safe_responses(response_ids).count).to eq(1) + end + end end describe "#sibling_questions" do diff --git a/decidim-elections/spec/system/admin/admin_access_spec.rb b/decidim-elections/spec/system/admin/admin_access_spec.rb new file mode 100644 index 0000000000000..ce6e0ca70a8a0 --- /dev/null +++ b/decidim-elections/spec/system/admin/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "elections" } + let!(:election) { create(:election, :with_token_csv_census, :published, component:) } + let(:title) { "Elections" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb b/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb index 74495a43005ea..53e36e01b138a 100644 --- a/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb +++ b/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb @@ -225,6 +225,74 @@ end end + context "when admin user sets max_choices for multiple_option question" do + it "creates a question with max_choices" do + visit questions_edit_path + + click_on "Add question" + expand_all_questions + + within "form.edit_questions" do + within page.all(".questionnaire-question").first do + fill_in find_nested_form_field_locator("body_en"), with: "Select up to 2 options" + select "Multiple option", from: "Type" + + 3.times { click_on "Add response option" } + + page.all(".questionnaire-question-response-option").each_with_index do |option, idx| + within option do + fill_in find_nested_form_field_locator("body_en"), with: "Option #{idx + 1}" + end + end + + select "2", from: "Maximum number of choices" + end + end + + click_on "Save and continue" + + expect(page).to have_admin_callout("successfully") + + visit questions_edit_path + expand_all_questions + + expect(page).to have_css("input[value='Select up to 2 options']") + expect(election.questions.last.max_choices).to eq(2) + end + + it "updates max_choices on existing question" do + question = create(:election_question, :with_response_options, + election:, + question_type: "multiple_option", + max_choices: nil) + + visit questions_edit_path + find("#questionnaire_question_#{question.id}-button").click + + within "#accordion-questionnaire_question_#{question.id}-field" do + select "2", from: "Maximum number of choices" + end + + click_on "Save and continue" + + expect(page).to have_admin_callout("successfully") + expect(question.reload.max_choices).to eq(2) + end + + it "shows 'Any' option for max_choices when unset" do + question = create(:election_question, :with_response_options, + election:, + question_type: "multiple_option") + + visit questions_edit_path + find("#questionnaire_question_#{question.id}-button").click + + within "#accordion-questionnaire_question_#{question.id}-field" do + expect(page).to have_select("Maximum number of choices", selected: "Any") + end + end + end + private def find_nested_form_field_locator(attribute, visible: :visible) diff --git a/decidim-elections/spec/system/election_results_spec.rb b/decidim-elections/spec/system/election_results_spec.rb index a5c9adb11fb4f..0653401acf4d2 100644 --- a/decidim-elections/spec/system/election_results_spec.rb +++ b/decidim-elections/spec/system/election_results_spec.rb @@ -4,7 +4,7 @@ require "decidim/elections/test/vote_examples" describe "Dashboard" do - let(:election) { create(:election, :published, :ongoing, :real_time, :with_internal_users_census, :with_questions) } + let(:election) { create(:election, :published, :ongoing, :real_time, :with_internal_users_census, :with_questions, skip_injection: true) } let(:question1) { election.questions.first } let(:question2) { election.questions.second } let(:option11) { question1.response_options.first } @@ -70,8 +70,8 @@ def expect_vote_count(question, option, count) context "when the election is per question" do let(:election) { create(:election, :published, :ongoing, :per_question, :with_internal_users_census) } - let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, election:) } - let!(:question2) { create(:election_question, :with_response_options, election:) } + let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true) } + let!(:question2) { create(:election_question, :with_response_options, election:, skip_injection: true) } let(:option11) { question1.response_options.first } let(:option12) { question1.response_options.second } let(:option21) { question2.response_options.first } @@ -84,7 +84,7 @@ def expect_vote_count(question, option, count) end context "when all questions are enabled" do - let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:) } + let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true) } it_behaves_like "shows questions in an election" end diff --git a/decidim-elections/spec/system/user_votes_in_an_election_spec.rb b/decidim-elections/spec/system/user_votes_in_an_election_spec.rb index bed6fc96a6fb4..54ec42daacb07 100644 --- a/decidim-elections/spec/system/user_votes_in_an_election_spec.rb +++ b/decidim-elections/spec/system/user_votes_in_an_election_spec.rb @@ -6,8 +6,8 @@ describe "Dashboard" do let(:user) { create(:user, :confirmed, organization:) } let!(:election) { create(:election, :published, :ongoing, :with_internal_users_census, census_settings:) } - let!(:question1) { create(:election_question, :with_response_options, election:, question_type: "single_option") } - let!(:question2) { create(:election_question, :with_response_options, election:, question_type: "multiple_option") } + let!(:question1) { create(:election_question, :with_response_options, skip_injection: true, election:, question_type: "single_option") } + let!(:question2) { create(:election_question, :with_response_options, skip_injection: true, election:, question_type: "multiple_option") } let(:organization) { election.organization } let(:census_settings) do { @@ -30,6 +30,7 @@ def election_vote_path(question) end before do + organization.update!(available_authorizations: %w(dummy_authorization_handler)) switch_to_host(organization.host) end @@ -94,6 +95,10 @@ def election_vote_path(question) let(:election) { create(:election, :published, :finished, :with_internal_users_census) } it "does not allow to vote" do + within(".menu-bar") do + expect(page).to have_content(translated(election.component.name)) + expect(page).to have_content(translated(election.title)) + end expect(page).to have_no_link("Vote") expect(page).to have_no_content("You have already voted.") visit new_election_vote_path @@ -103,6 +108,62 @@ def election_vote_path(question) end end + context "when question has max_choices limit", :js do + let(:election_with_limit) { create(:election, :published, :ongoing, :with_internal_users_census, component: election.component) } + let!(:question_with_limit) { create(:election_question, election: election_with_limit, question_type: "multiple_option", max_choices: 2, body: { en: "Choose your options" }) } + let!(:option1) { create(:election_response_option, question: question_with_limit, body: { en: "Option 1" }) } + let!(:option2) { create(:election_response_option, question: question_with_limit, body: { en: "Option 2" }) } + let!(:option3) { create(:election_response_option, question: question_with_limit, body: { en: "Option 3" }) } + let(:new_election_with_limit_vote_path) { Decidim::EngineRouter.main_proxy(election.component).new_election_vote_path(election_id: election_with_limit.id) } + + before do + login_as user, scope: :user + visit new_election_with_limit_vote_path + end + + it "shows max_choices in question title" do + expect(page).to have_content("Choose your options (Max choices: 2)") + end + + it "shows alert when selecting more than max_choices" do + check "Option 1" + check "Option 2" + check "Option 3" + + expect(page).to have_css(".max-choices-alert", visible: :visible) + end + + it "hides alert when deselecting options" do + check "Option 1" + check "Option 2" + check "Option 3" + + expect(page).to have_css(".max-choices-alert", visible: :visible) + + uncheck "Option 3" + + expect(page).to have_css(".max-choices-alert", visible: :hidden) + end + + it "shows server-side validation error when exceeding limit" do + check "Option 1" + check "Option 2" + check "Option 3" + + click_on "Next" + + expect(page).to have_content("You cannot select more than 2 options") + end + + context "when question is single_option" do + let!(:single_question) { create(:election_question, election: election_with_limit, question_type: "single_option", body: { en: "Choose one option" }) } + + it "does not show max_choices for single_option questions" do + expect(page).to have_no_content("Choose one option (Max choices:") + end + end + end + context "when the election is per_question" do let(:election) { create(:election, :published, :ongoing, :with_internal_users_census, :per_question) } diff --git a/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb b/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb index 87f3717b88796..7be60f6e774b7 100644 --- a/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb +++ b/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb @@ -21,8 +21,8 @@ let(:receipt_election_votes_path) { Decidim::EngineRouter.main_proxy(election.component).receipt_election_per_question_votes_path(election_id: election.id) } let(:confirm_election_votes_path) { Decidim::EngineRouter.main_proxy(election.component).confirm_election_per_question_votes_path(election_id: election.id) } let(:new_election_normal_vote_path) { Decidim::EngineRouter.main_proxy(election.component).new_election_vote_path(election_id: election.id) } - let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, question_type: "single_option", election:, position: 1) } - let!(:question2) { create(:election_question, :with_response_options, election:, position: 2) } + let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, skip_injection: true, question_type: "single_option", election:, position: 1) } + let!(:question2) { create(:election_question, :with_response_options, election:, skip_injection: true, position: 2) } let(:voter_uid) { user.to_global_id.to_s } def election_vote_path(question) @@ -62,8 +62,8 @@ def election_vote_path(question) end context "when navigating through already voted questions" do - let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, position: 2) } - let!(:question3) { create(:election_question, :with_response_options, election:, position: 3) } + let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true, position: 2) } + let!(:question3) { create(:election_question, :with_response_options, election:, skip_injection: true, position: 3) } before do login_as user, scope: :user diff --git a/decidim-forms/config/locales/eu.yml b/decidim-forms/config/locales/eu.yml index ede0eb99271a5..3faf10583f609 100644 --- a/decidim-forms/config/locales/eu.yml +++ b/decidim-forms/config/locales/eu.yml @@ -139,7 +139,7 @@ eu: remove: Kendu separator: Bereizlea title_and_description: - collapse: Kolapsoa + collapse: Tolestu description: Deskribapena expand: Zabaldu remove: Kendu @@ -195,7 +195,7 @@ eu: body: Galdetegi honen ezaugarri batzuk desaktibatu egingo dira. Zure esperientzia hobetzeko, gaitu JavaScript zure nabigatzailean. title: Javascript desaktibatuta dago questionnaire_not_published: - body: Argitalpen hau oraindik ez da argitaratu. + body: Formulario hau ez da oraindik argitaratu. questionnaire_responded: body: Dagoeneko inkesta hau erantzun duzu. title: Dagoeneko erantzunda diff --git a/decidim-forms/decidim-forms.gemspec b/decidim-forms/decidim-forms.gemspec index e0220203de50f..0ce9b4620b584 100644 --- a/decidim-forms/decidim-forms.gemspec +++ b/decidim-forms/decidim-forms.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-forms" s.summary = "Decidim forms" diff --git a/decidim-forms/lib/decidim/forms/test/factories.rb b/decidim-forms/lib/decidim/forms/test/factories.rb index d831bc65dc4b7..1aef9e948a7bf 100644 --- a/decidim-forms/lib/decidim/forms/test/factories.rb +++ b/decidim-forms/lib/decidim/forms/test/factories.rb @@ -117,14 +117,18 @@ end trait :with_response_options do - response_options do - Array.new(3).collect { build(:response_option, skip_injection:) } + after(:build) do |question, evaluator| + question.response_options = Array.new(3).collect do + build(:response_option, question:, skip_injection: evaluator.skip_injection) + end end end trait :conditioned do - display_conditions do - Array.new(3).collect { build(:display_condition, skip_injection:) } + after(:build) do |question, evaluator| + question.display_conditions = Array.new(3).collect do + build(:display_condition, question:, skip_injection: evaluator.skip_injection) + end end end @@ -194,7 +198,7 @@ transient do skip_injection { false } end - condition_question { create(:questionnaire_question, skip_injection:) } + condition_question { create(:questionnaire_question, questionnaire: question.questionnaire, skip_injection:) } question { create(:questionnaire_question, position: 1, skip_injection:) } condition_type { :responded } mandatory { true } diff --git a/decidim-generators/Gemfile.lock b/decidim-generators/Gemfile.lock index 85ca866494936..444107ddf8bd0 100644 --- a/decidim-generators/Gemfile.lock +++ b/decidim-generators/Gemfile.lock @@ -17,7 +17,6 @@ PATH decidim-pages (= 0.32.0.dev) decidim-participatory_processes (= 0.32.0.dev) decidim-proposals (= 0.32.0.dev) - decidim-sortitions (= 0.32.0.dev) decidim-surveys (= 0.32.0.dev) decidim-system (= 0.32.0.dev) decidim-verifications (= 0.32.0.dev) @@ -187,11 +186,6 @@ PATH decidim-core (= 0.32.0.dev) doc2text (~> 0.4.0, >= 0.4.8) redcarpet (~> 3.5, >= 3.5.1) - decidim-sortitions (0.32.0.dev) - decidim-admin (= 0.32.0.dev) - decidim-comments (= 0.32.0.dev) - decidim-core (= 0.32.0.dev) - decidim-proposals (= 0.32.0.dev) decidim-surveys (0.32.0.dev) decidim-core (= 0.32.0.dev) decidim-forms (= 0.32.0.dev) @@ -342,7 +336,7 @@ GEM fast-stemmer (~> 1.0) matrix (~> 0.4) cmdparse (3.0.7) - commonmarker (0.23.11) + commonmarker (0.23.12) concurrent-ruby (1.3.5) connection_pool (2.5.4) crack (1.0.0) @@ -934,7 +928,7 @@ DEPENDENCIES web-console (~> 4.2) RUBY VERSION - ruby 3.3.4p94 + ruby 3.4.7p58 BUNDLED WITH 2.4.20 diff --git a/decidim-generators/decidim-generators.gemspec b/decidim-generators/decidim-generators.gemspec index 078ba9acc0dd0..bb97cc67019b2 100644 --- a/decidim-generators/decidim-generators.gemspec +++ b/decidim-generators/decidim-generators.gemspec @@ -18,7 +18,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-generators" diff --git a/decidim-generators/exe/decidim b/decidim-generators/exe/decidim index 0e047a7add583..f778b9ce4e838 100755 --- a/decidim-generators/exe/decidim +++ b/decidim-generators/exe/decidim @@ -9,25 +9,25 @@ if File.exist?(File.expand_path("../../.git", __dir__)) end case ARGV[0] -when "--component" +when "--component", "-c" ARGV.replace(["component", *ARGV[1..-1]]) require "decidim/generators/component_generator" Decidim::Generators::ComponentGenerator.start -when "--version" +when "--version", "-v" require "decidim/core/version" puts Decidim::Core.version -when "--help" +when "--help", "-h" require "decidim/core/version" puts "Decidim #{Decidim::Core.version} Syntax: decidim [options] [App or Module name] https://decidim.org Options: - --help display this help and exit - --version output version information and exit - --component [name] creates a component for Decidim + -h, --help display this help and exit + -v, --version output version information and exit + -c, --component [name] creates a component for Decidim [name] creates an application based on Decidim App generation extra options (ignored if the --component flag is on): @@ -48,6 +48,10 @@ App generation extra options (ignored if the --component flag is on): --seed_db [true|false] Seed the database: generate demo data for each participatory space and component --recreate_db Recreate the database after installing Decidim +Component generation extra options (ignored if the --component flag is not defined) + --external To create a new module external to the main decidim repository + --destination-folder IF you want to point to an existing folder or give it a custom name + Examples: decidim my-application decidim --storage=s3 my-application @@ -55,6 +59,9 @@ Examples: decidim --locales=en,ca,es,fr my-application decidim --queue sidekiq my-application decidim --queue sidekiq --storage s3 my-application + + decidim --component --external my_component + decidim --component --external my_component --destination-folder my-comp " else require "decidim/generators/app_generator" diff --git a/decidim-generators/lib/decidim/generators/app_generator.rb b/decidim-generators/lib/decidim/generators/app_generator.rb index 344f2329303cf..d9dcaaa69e581 100644 --- a/decidim-generators/lib/decidim/generators/app_generator.rb +++ b/decidim-generators/lib/decidim/generators/app_generator.rb @@ -323,8 +323,7 @@ def modify_gitignore # Ignore the files and folders generated through Webpack /public/decidim-packs /public/packs-test - /public/sw.js - /public/sw.js.map + /public/sw.js* # Ignore node modules /node_modules diff --git a/decidim-generators/lib/decidim/generators/app_templates/.ruby-version b/decidim-generators/lib/decidim/generators/app_templates/.ruby-version index a0891f563f38b..2aa5131992119 100644 --- a/decidim-generators/lib/decidim/generators/app_templates/.ruby-version +++ b/decidim-generators/lib/decidim/generators/app_templates/.ruby-version @@ -1 +1 @@ -3.3.4 +3.4.7 diff --git a/decidim-generators/lib/decidim/generators/component_templates/.ruby-version b/decidim-generators/lib/decidim/generators/component_templates/.ruby-version index a0891f563f38b..2aa5131992119 100644 --- a/decidim-generators/lib/decidim/generators/component_templates/.ruby-version +++ b/decidim-generators/lib/decidim/generators/component_templates/.ruby-version @@ -1 +1 @@ -3.3.4 +3.4.7 diff --git a/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb b/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb index afe754f4f9f99..a79d068133eee 100644 --- a/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb +++ b/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb @@ -18,7 +18,7 @@ def base_query end def search_field_predicate - :title_or_description_or_id_string_or_author_name_or_author_nickname_cont + :title_or_description_or_author_name_or_author_nickname_cont end def filters diff --git a/decidim-initiatives/app/models/decidim/initiative.rb b/decidim-initiatives/app/models/decidim/initiative.rb index 93bfcd3476409..df2118eb55a85 100644 --- a/decidim-initiatives/app/models/decidim/initiative.rb +++ b/decidim-initiatives/app/models/decidim/initiative.rb @@ -450,6 +450,10 @@ def user_allowed_to_comment?(user) ActionAuthorizer.new(user, "comment", self, nil).authorize.ok? end + def user_allowed_to_vote_comment?(user) + ActionAuthorizer.new(user, "vote_comment", self, nil).authorize.ok? + end + def shareable_url(share_token) EngineRouter.main_proxy(self).initiative_url(self, share_token: share_token.token) end diff --git a/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb b/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb index 19a54708fd59a..83c31bc92a853 100644 --- a/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb +++ b/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb @@ -19,7 +19,6 @@ - @@ -31,7 +30,6 @@ <% @initiatives.each do |initiative| %> - - - diff --git a/decidim-meetings/config/locales/ar.yml b/decidim-meetings/config/locales/ar.yml index ecd6f37b5188c..2f001756ff2c1 100644 --- a/decidim-meetings/config/locales/ar.yml +++ b/decidim-meetings/config/locales/ar.yml @@ -498,7 +498,6 @@ ar: fields: closed: مغلق end_time: تاريخ الانتهاء - id: المعرف ID map: خريطة official_meeting: الاجتماع الرسمي start_time: تاريخ البدء diff --git a/decidim-meetings/config/locales/bg.yml b/decidim-meetings/config/locales/bg.yml index 0eeb869901590..e822eaffee073 100644 --- a/decidim-meetings/config/locales/bg.yml +++ b/decidim-meetings/config/locales/bg.yml @@ -548,7 +548,6 @@ bg: fields: closed: Затворен end_time: Крайна дата - id: ID map: Карта official_meeting: Официална среща start_time: Начална дата diff --git a/decidim-meetings/config/locales/ca-IT.yml b/decidim-meetings/config/locales/ca-IT.yml index e4078877a027f..95ebb175e7297 100644 --- a/decidim-meetings/config/locales/ca-IT.yml +++ b/decidim-meetings/config/locales/ca-IT.yml @@ -162,6 +162,7 @@ ca-IT: comment: Comentar join: Inscriu-t'hi reply_poll: Respondre el sondeig/consulta en directe + vote_comment: Votar el comentari name: Trobades settings: global: @@ -677,7 +678,6 @@ ca-IT: fields: closed: Tancada end_time: Data de finalització - id: ID map: Mapa official_meeting: Trobada oficial published: Publicada diff --git a/decidim-meetings/config/locales/ca.yml b/decidim-meetings/config/locales/ca.yml index 2bead4f65f194..f2397b057db03 100644 --- a/decidim-meetings/config/locales/ca.yml +++ b/decidim-meetings/config/locales/ca.yml @@ -162,6 +162,7 @@ ca: comment: Comentar join: Inscriu-t'hi reply_poll: Respondre el sondeig/consulta en directe + vote_comment: Votar el comentari name: Trobades settings: global: @@ -677,7 +678,6 @@ ca: fields: closed: Tancada end_time: Data de finalització - id: ID map: Mapa official_meeting: Trobada oficial published: Publicada diff --git a/decidim-meetings/config/locales/cs.yml b/decidim-meetings/config/locales/cs.yml index 5cbf38d745e0f..a1d38d6063c96 100644 --- a/decidim-meetings/config/locales/cs.yml +++ b/decidim-meetings/config/locales/cs.yml @@ -676,7 +676,6 @@ cs: fields: closed: Zavřeno end_time: Datum ukončení - id: ID map: Mapa official_meeting: Oficiální schůzka published: Zveřejněno diff --git a/decidim-meetings/config/locales/de.yml b/decidim-meetings/config/locales/de.yml index 2a91825a52b43..90f5358d1c48d 100644 --- a/decidim-meetings/config/locales/de.yml +++ b/decidim-meetings/config/locales/de.yml @@ -498,8 +498,8 @@ de: copy_calendar_url: Kopieren copy_calendar_url_clarification: Kalender-URL in Zwischenablage kopieren copy_calendar_url_copied: Kopiert! - copy_calendar_url_description: Sie können alle veröffentlichten Veranstaltungen in Ihrer Kalenderanwendung oder bei Ihrem Kalender-Anbieter sehen. Kopieren und fügen Sie diese URL mit der Option "Neuen Kalender von einer URL hinzufügen" in Ihren Kalender ein. - copy_calendar_url_explanation: Bitte beachten Sie, dass Sie eine Auswahl von Veranstaltungen exportieren, da es aktive Filter gibt. Wenn Sie alle Veranstaltungen exportieren möchten, setzen Sie zuerst alle Filter zurück. + copy_calendar_url_description: Sie können alle veröffentlichten Veranstaltungen auf Ihrer Kalenderanwendung anzeigen. Kopieren Sie diese URL und fügen Sie den Kalender mit der Option "Neuen Kalender von einer URL abonnieren" hinzu. + copy_calendar_url_explanation: Bitte beachten Sie, dass nur eine Auswahl von Veranstaltungen exportiert wird, weil Filter aktiv sind. Wenn Sie alle Veranstaltungen exportieren möchten, setzen Sie zuerst alle Filter zurück. copy_calendar_url_message: Die URL wurde erfolgreich in die Zwischenablage kopiert. export_calendar: Kalender exportieren close_meeting_reminder_mailer: @@ -673,7 +673,6 @@ de: fields: closed: Geschlossen end_time: Endtermin - id: ID map: Karte official_meeting: Offizielle Besprechung start_time: Anfangsdatum diff --git a/decidim-meetings/config/locales/el.yml b/decidim-meetings/config/locales/el.yml index 091ef63fc26a2..6011349a52a97 100644 --- a/decidim-meetings/config/locales/el.yml +++ b/decidim-meetings/config/locales/el.yml @@ -505,7 +505,6 @@ el: fields: closed: Κλειστό end_time: Ημερομηνία λήξης - id: ID map: Χάρτης official_meeting: Επίσημη συνάντηση start_time: Ημερομηνία έναρξης diff --git a/decidim-meetings/config/locales/en.yml b/decidim-meetings/config/locales/en.yml index 951b3cc2ae536..82dbc8c729ea3 100644 --- a/decidim-meetings/config/locales/en.yml +++ b/decidim-meetings/config/locales/en.yml @@ -163,6 +163,7 @@ en: comment: Comment join: Join reply_poll: Reply poll + vote_comment: Vote comment name: Meetings settings: global: @@ -678,7 +679,6 @@ en: fields: closed: Closed end_time: End date - id: ID map: Map official_meeting: Official meeting published: Published diff --git a/decidim-meetings/config/locales/es-MX.yml b/decidim-meetings/config/locales/es-MX.yml index 2d3d1dc6ae29d..0d9c02799b85e 100644 --- a/decidim-meetings/config/locales/es-MX.yml +++ b/decidim-meetings/config/locales/es-MX.yml @@ -162,6 +162,7 @@ es-MX: comment: Comentar join: Unirse reply_poll: Responder la consulta + vote_comment: Votar el comentario name: Encuentros settings: global: @@ -677,7 +678,6 @@ es-MX: fields: closed: Cerrado end_time: Fecha de finalización - id: ID map: Mapa official_meeting: Encuentro oficial published: Publicado diff --git a/decidim-meetings/config/locales/es-PY.yml b/decidim-meetings/config/locales/es-PY.yml index a889e47077ebe..0bbfddbc7ba7b 100644 --- a/decidim-meetings/config/locales/es-PY.yml +++ b/decidim-meetings/config/locales/es-PY.yml @@ -162,6 +162,7 @@ es-PY: comment: Comentar join: Unirse reply_poll: Responder la consulta + vote_comment: Votar el comentario name: Encuentros settings: global: @@ -677,7 +678,6 @@ es-PY: fields: closed: Cerrado end_time: Fecha de finalización - id: ID map: Mapa official_meeting: Encuentro oficial published: Publicado diff --git a/decidim-meetings/config/locales/es.yml b/decidim-meetings/config/locales/es.yml index a94a45da5bfc6..536b2689a0994 100644 --- a/decidim-meetings/config/locales/es.yml +++ b/decidim-meetings/config/locales/es.yml @@ -162,6 +162,7 @@ es: comment: Comentar join: Unirse reply_poll: Responder la consulta + vote_comment: Votar el comentario name: Encuentros settings: global: @@ -677,7 +678,6 @@ es: fields: closed: Cerrado end_time: Fecha de finalización - id: ID map: Mapa official_meeting: Encuentro oficial published: Publicado diff --git a/decidim-meetings/config/locales/eu.yml b/decidim-meetings/config/locales/eu.yml index faf7b1f0a82d0..81013957c8f1d 100644 --- a/decidim-meetings/config/locales/eu.yml +++ b/decidim-meetings/config/locales/eu.yml @@ -677,7 +677,6 @@ eu: fields: closed: Itxita end_time: Bukaera-data - id: ID map: Mapa official_meeting: Topaketa ofiziala published: Argitaratua diff --git a/decidim-meetings/config/locales/fi-plain.yml b/decidim-meetings/config/locales/fi-plain.yml index 451082aea94dd..dd9330737ca69 100644 --- a/decidim-meetings/config/locales/fi-plain.yml +++ b/decidim-meetings/config/locales/fi-plain.yml @@ -677,7 +677,6 @@ fi-pl: fields: closed: Suljettu end_time: Päättymispäivä - id: ID map: Kartta official_meeting: Virallinen tapahtuma published: Julkaistu diff --git a/decidim-meetings/config/locales/fi.yml b/decidim-meetings/config/locales/fi.yml index 11829fd36e687..166c0c7f25372 100644 --- a/decidim-meetings/config/locales/fi.yml +++ b/decidim-meetings/config/locales/fi.yml @@ -677,7 +677,6 @@ fi: fields: closed: Suljettu end_time: Päättymispäivä - id: ID map: Kartta official_meeting: Virallinen tapaaminen published: Julkaistu diff --git a/decidim-meetings/config/locales/fr-CA.yml b/decidim-meetings/config/locales/fr-CA.yml index 229fd4f52e597..82a2ae1585fa4 100644 --- a/decidim-meetings/config/locales/fr-CA.yml +++ b/decidim-meetings/config/locales/fr-CA.yml @@ -162,6 +162,7 @@ fr-CA: comment: Commenter join: Rejoindre reply_poll: Répondre au sondage + vote_comment: Vote sur le commentaire name: Rencontres settings: global: @@ -664,7 +665,6 @@ fr-CA: fields: closed: Fermée end_time: Date de fin - id: ID map: Carte official_meeting: Réunion officielle published: Publiée diff --git a/decidim-meetings/config/locales/fr.yml b/decidim-meetings/config/locales/fr.yml index a4249e60d3569..fe6b170b268ec 100644 --- a/decidim-meetings/config/locales/fr.yml +++ b/decidim-meetings/config/locales/fr.yml @@ -162,6 +162,7 @@ fr: comment: Commenter join: Rejoindre reply_poll: Répondre au sondage + vote_comment: Vote sur le commentaire name: Rencontres settings: global: @@ -664,7 +665,6 @@ fr: fields: closed: Fermée end_time: Date de fin - id: ID map: Carte official_meeting: Rencontre officielle published: Publiée diff --git a/decidim-meetings/config/locales/ja.yml b/decidim-meetings/config/locales/ja.yml index 95fa86b161261..1527b90e67791 100644 --- a/decidim-meetings/config/locales/ja.yml +++ b/decidim-meetings/config/locales/ja.yml @@ -670,7 +670,6 @@ ja: fields: closed: クローズ済み end_time: 終了日 - id: ID map: 地図 official_meeting: 公式ミーティング published: 公開済み diff --git a/decidim-meetings/config/locales/lt.yml b/decidim-meetings/config/locales/lt.yml index 356e5e91e68a0..3c8daf560d690 100644 --- a/decidim-meetings/config/locales/lt.yml +++ b/decidim-meetings/config/locales/lt.yml @@ -525,7 +525,6 @@ lt: fields: closed: Uždaryta end_time: Pabaigos data - id: ID map: Žemėlapis official_meeting: Oficialus susirinkimas start_time: Pradžios data diff --git a/decidim-meetings/config/locales/nl.yml b/decidim-meetings/config/locales/nl.yml index 5aa17260a0cf4..86027323d2673 100644 --- a/decidim-meetings/config/locales/nl.yml +++ b/decidim-meetings/config/locales/nl.yml @@ -436,7 +436,6 @@ nl: fields: closed: Gesloten end_time: Einddatum - id: ID map: Kaart official_meeting: Officiële vergadering start_time: Startdatum diff --git a/decidim-meetings/config/locales/pl.yml b/decidim-meetings/config/locales/pl.yml index 2c75495698c16..676c8287398c6 100644 --- a/decidim-meetings/config/locales/pl.yml +++ b/decidim-meetings/config/locales/pl.yml @@ -562,7 +562,6 @@ pl: fields: closed: Zakończone end_time: Data zakończenia - id: Numer ID map: Mapa official_meeting: Spotkanie oficjalne start_time: Data rozpoczęcia diff --git a/decidim-meetings/config/locales/pt-BR.yml b/decidim-meetings/config/locales/pt-BR.yml index e355ae79038ed..96cbb06b593e5 100644 --- a/decidim-meetings/config/locales/pt-BR.yml +++ b/decidim-meetings/config/locales/pt-BR.yml @@ -536,7 +536,6 @@ pt-BR: fields: closed: Fechadas end_time: Data final - id: ID map: Mapa official_meeting: Reunião oficial start_time: Data de início diff --git a/decidim-meetings/config/locales/sv.yml b/decidim-meetings/config/locales/sv.yml index a1e163fa5f85f..d88b37215060a 100644 --- a/decidim-meetings/config/locales/sv.yml +++ b/decidim-meetings/config/locales/sv.yml @@ -661,7 +661,6 @@ sv: fields: closed: Avslutade end_time: Slutdatum - id: ID map: Karta official_meeting: Officiellt möte published: Publicerad diff --git a/decidim-meetings/config/locales/zh-TW.yml b/decidim-meetings/config/locales/zh-TW.yml index cb4721d00adf5..5dfb7e3f21da2 100644 --- a/decidim-meetings/config/locales/zh-TW.yml +++ b/decidim-meetings/config/locales/zh-TW.yml @@ -499,7 +499,6 @@ zh-TW: fields: closed: 關閉 end_time: 結束日期 - id: ID map: 地圖 official_meeting: 官方會議 start_time: 開始日期 diff --git a/decidim-meetings/db/data/20251114085753_change_send_reminders_before_hours_for_legacy_meetings.rb b/decidim-meetings/db/data/20251114085753_change_send_reminders_before_hours_for_legacy_meetings.rb new file mode 100644 index 0000000000000..d8945d02bdb1a --- /dev/null +++ b/decidim-meetings/db/data/20251114085753_change_send_reminders_before_hours_for_legacy_meetings.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class ChangeSendRemindersBeforeHoursForLegacyMeetings < ActiveRecord::Migration[7.2] + class Meeting < ApplicationRecord + self.table_name = "decidim_meetings_meetings" + end + + def up + Meeting.where(send_reminders_before_hours: nil).update_all(send_reminders_before_hours: 48) # rubocop:disable Rails/SkipsModelValidations + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/decidim-meetings/decidim-meetings.gemspec b/decidim-meetings/decidim-meetings.gemspec index 31e69aa0d7034..466ea3533977c 100644 --- a/decidim-meetings/decidim-meetings.gemspec +++ b/decidim-meetings/decidim-meetings.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-meetings" s.summary = "Decidim meetings module" diff --git a/decidim-meetings/lib/decidim/meetings/component.rb b/decidim-meetings/lib/decidim/meetings/component.rb index 6954b33c63452..20917949c7256 100644 --- a/decidim-meetings/lib/decidim/meetings/component.rb +++ b/decidim-meetings/lib/decidim/meetings/component.rb @@ -23,7 +23,7 @@ resource.template = "decidim/meetings/meetings/linked_meetings" resource.card = "decidim/meetings/meeting" resource.reported_content_cell = "decidim/meetings/reported_content" - resource.actions = %w(join comment reply_poll) + resource.actions = %w(join comment reply_poll vote_comment) resource.searchable = true end diff --git a/decidim-meetings/lib/decidim/meetings/test/factories.rb b/decidim-meetings/lib/decidim/meetings/test/factories.rb index cdd1eb934fc58..d61a323b6dba4 100644 --- a/decidim-meetings/lib/decidim/meetings/test/factories.rb +++ b/decidim-meetings/lib/decidim/meetings/test/factories.rb @@ -182,7 +182,7 @@ factory :meeting_link, class: "Decidim::Meetings::MeetingLink" do meeting - component + component { meeting.component } end factory :registration, class: "Decidim::Meetings::Registration" do @@ -190,7 +190,7 @@ skip_injection { false } end meeting - user + user { create(:user, :confirmed, organization: meeting.component.organization, skip_injection:) } end factory :agenda, class: "Decidim::Meetings::Agenda" do @@ -236,7 +236,7 @@ skip_injection { false } end meeting - user + user { create(:user, :confirmed, organization: meeting.component.organization, skip_injection:) } sent_at { 1.day.ago } accepted_at { nil } rejected_at { nil } diff --git a/decidim-meetings/spec/cells/decidim/meetings/meeting_s_cell_spec.rb b/decidim-meetings/spec/cells/decidim/meetings/meeting_s_cell_spec.rb deleted file mode 100644 index dcad111f0bb46..0000000000000 --- a/decidim-meetings/spec/cells/decidim/meetings/meeting_s_cell_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim::Meetings - describe MeetingSCell, type: :cell do - controller Decidim::Meetings::MeetingsController - - subject { my_cell.call } - - let!(:meeting) { create(:meeting, :published) } - let(:my_cell) { cell("decidim/meetings/meeting_s", meeting) } - - context "when rendering" do - it "renders the card" do - expect(subject).to have_css("div#meeting_#{meeting.id}") - end - end - - context "when title contains special html entities" do - let!(:original_title) { meeting.title["en"] } - - before do - meeting.update!(title: { en: "#{original_title} &'<" }) - meeting.reload - end - - it "escapes them correctly" do - title = decidim_html_escape(original_title).gsub(""", '"') - expect(subject.to_s).to include("<strong>#{title}</strong> &'<") - end - end - end -end diff --git a/decidim-meetings/spec/models/decidim/meetings/invite_spec.rb b/decidim-meetings/spec/models/decidim/meetings/invite_spec.rb index 7378d811cb7c0..927bff50fca0b 100644 --- a/decidim-meetings/spec/models/decidim/meetings/invite_spec.rb +++ b/decidim-meetings/spec/models/decidim/meetings/invite_spec.rb @@ -20,7 +20,8 @@ module Meetings end context "without a meeting" do - let(:invite) { build(:invite, meeting: nil) } + let!(:user) { create(:user, :confirmed) } + let(:invite) { build(:invite, meeting: nil, user:) } it { is_expected.not_to be_valid } end diff --git a/decidim-meetings/spec/shared/export_meetings_examples.rb b/decidim-meetings/spec/shared/export_meetings_examples.rb index 53a909dceae1b..5464c858c0079 100644 --- a/decidim-meetings/spec/shared/export_meetings_examples.rb +++ b/decidim-meetings/spec/shared/export_meetings_examples.rb @@ -9,7 +9,7 @@ context "with query" do before do - fill_in "q[id_string_or_title_cont]", with: translated(meetings.last.title) + fill_in "q[title_cont]", with: translated(meetings.last.title) find("button[aria-label='Search']").click end diff --git a/decidim-meetings/spec/system/admin/admin_access_spec.rb b/decidim-meetings/spec/system/admin/admin_access_spec.rb new file mode 100644 index 0000000000000..941331b8a24a5 --- /dev/null +++ b/decidim-meetings/spec/system/admin/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "meetings" } + let!(:meeting) { create(:meeting, :published, component:) } + let(:title) { "Meetings" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-meetings/spec/system/admin/filter_meetings_spec.rb b/decidim-meetings/spec/system/admin/filter_meetings_spec.rb index 23fe788e57505..70abcb86e05a1 100644 --- a/decidim-meetings/spec/system/admin/filter_meetings_spec.rb +++ b/decidim-meetings/spec/system/admin/filter_meetings_spec.rb @@ -102,7 +102,7 @@ def meeting_without_type(type) end end - context "when searching by ID or title" do + context "when searching by title" do let!(:meeting1) { create(:meeting, component:) } let!(:meeting2) { create(:meeting, component:) } let!(:meeting1_title) { translated(meeting1.title) } @@ -110,12 +110,6 @@ def meeting_without_type(type) before { visit_component_admin } - it "can be searched by ID" do - search_by_text(meeting1.id) - - expect(page).to have_content(meeting1_title) - end - it "can be searched by title" do search_by_text(meeting2_title) diff --git a/decidim-meetings/spec/system/explore_meetings_spec.rb b/decidim-meetings/spec/system/explore_meetings_spec.rb index 40f213a136f21..a59311e7a6ef0 100644 --- a/decidim-meetings/spec/system/explore_meetings_spec.rb +++ b/decidim-meetings/spec/system/explore_meetings_spec.rb @@ -28,6 +28,11 @@ describe "index" do it "shows all meetings for the given process" do visit_component + + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end + expect(page).to have_selector(meetings_selector, count: meetings_count) meetings.each do |meeting| diff --git a/decidim-meetings/spec/system/explore_versions_spec.rb b/decidim-meetings/spec/system/explore_versions_spec.rb index f7ce7cc6a50da..cb06ce317d540 100644 --- a/decidim-meetings/spec/system/explore_versions_spec.rb +++ b/decidim-meetings/spec/system/explore_versions_spec.rb @@ -48,6 +48,10 @@ end it "lists all versions" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(meeting.reload.title)) + end expect(page).to have_link("Version 1 of 2") expect(page).to have_link("Version 2 of 2") end diff --git a/decidim-meetings/spec/system/show_spec.rb b/decidim-meetings/spec/system/show_spec.rb index e948ec005f7b9..77cea893e7ab7 100644 --- a/decidim-meetings/spec/system/show_spec.rb +++ b/decidim-meetings/spec/system/show_spec.rb @@ -41,6 +41,11 @@ end it "shows the correct time zone" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(meeting.reload.title)) + end + expect(page).to have_content("HST") end end diff --git a/decidim-pages/decidim-pages.gemspec b/decidim-pages/decidim-pages.gemspec index d7cb3405a148a..ddd12a8c6376a 100644 --- a/decidim-pages/decidim-pages.gemspec +++ b/decidim-pages/decidim-pages.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-pages" s.summary = "Decidim pages module" diff --git a/decidim-pages/spec/system/admin_access_spec.rb b/decidim-pages/spec/system/admin_access_spec.rb new file mode 100644 index 0000000000000..66ff844bcb0d6 --- /dev/null +++ b/decidim-pages/spec/system/admin_access_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "pages" } + let(:title) { "Edit page" } + + # This does not work for pages + # + # let!(:page) { create(:page, component:) } + # + # So, we need to do a workaround + before do + create(:page, component:) + end + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-participatory_processes/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb b/decidim-participatory_processes/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb index 8d387b2ee1c41..47a2ad106aaae 100644 --- a/decidim-participatory_processes/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +++ b/decidim-participatory_processes/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb @@ -50,6 +50,9 @@ class ParticipatoryProcessForm < Form validates :weight, presence: true + validates :start_date, date: { before: :end_date, allow_blank: true, if: proc { |obj| obj.end_date.present? } } + validates :end_date, date: { after: :start_date, allow_blank: true, if: proc { |obj| obj.start_date.present? } } + alias organization current_organization def map_model(model) diff --git a/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb b/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb index 79aa4d3b0e1f7..4dd6f8691b90b 100644 --- a/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb +++ b/decidim-participatory_processes/app/permissions/decidim/participatory_processes/permissions.rb @@ -154,7 +154,7 @@ def user_can_enter_processes_space_area? permission_action.subject == :space_area && context.fetch(:space_name, nil) == :processes - toggle_allow(user.admin? || user_has_any_role?(user, process, broad_check: true) || has_manageable_processes?) + toggle_allow(user.admin? || has_manageable_processes?) end # Only organization admins can manage process groups. diff --git a/decidim-participatory_processes/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb b/decidim-participatory_processes/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb index a334c7dbafbf0..5f71fdcf7ac99 100644 --- a/decidim-participatory_processes/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb +++ b/decidim-participatory_processes/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb @@ -33,12 +33,12 @@
<%= t("models.initiatives.fields.id", scope: "decidim.admin") %> <%= t("models.initiatives.fields.title", scope: "decidim.admin") %> <%= t("models.initiatives.fields.state", scope: "decidim.admin") %> <%= sort_link(query, :supports_count, t("models.initiatives.fields.supports_count", scope: "decidim.admin"), default_order: :desc) %>
"><%= initiative.id %> "> <% if allowed_to? :edit, :initiative, initiative: initiative %> <%= link_to translated_attribute(initiative.title), diff --git a/decidim-initiatives/config/locales/ar.yml b/decidim-initiatives/config/locales/ar.yml index d56a3199a3994..85925b7e0ad35 100644 --- a/decidim-initiatives/config/locales/ar.yml +++ b/decidim-initiatives/config/locales/ar.yml @@ -68,7 +68,6 @@ ar: initiatives: fields: created_at: أنشئت في - id: هوية شخصية state: الحالة supports_count: توقيعات title: المبادرات diff --git a/decidim-initiatives/config/locales/bg.yml b/decidim-initiatives/config/locales/bg.yml index e1ed9cf8c1dbf..48c836ebc93f4 100644 --- a/decidim-initiatives/config/locales/bg.yml +++ b/decidim-initiatives/config/locales/bg.yml @@ -111,7 +111,6 @@ bg: initiatives: fields: created_at: Създадено на - id: ID published_at: Публикувано на state: Статус supports_count: Подписи diff --git a/decidim-initiatives/config/locales/ca-IT.yml b/decidim-initiatives/config/locales/ca-IT.yml index 44ec84876aaeb..450b14f52f788 100644 --- a/decidim-initiatives/config/locales/ca-IT.yml +++ b/decidim-initiatives/config/locales/ca-IT.yml @@ -96,7 +96,7 @@ ca-IT: type_id_eq: label: Tipus search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria + title_or_description_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria initiatives_settings: update: error: S'ha produït un error en actualitzar la configuració de les iniciatives. @@ -118,7 +118,6 @@ ca-IT: initiatives: fields: created_at: Data de creació - id: ID published_at: Publicat el state: Estat supports_count: Signatures @@ -687,6 +686,7 @@ ca-IT: initiative: actions: comment: Comentar + vote_comment: Votar el comentari initiatives_type: actions: create: Crear una iniciativa diff --git a/decidim-initiatives/config/locales/ca.yml b/decidim-initiatives/config/locales/ca.yml index cda6777ada941..7825a93223e6e 100644 --- a/decidim-initiatives/config/locales/ca.yml +++ b/decidim-initiatives/config/locales/ca.yml @@ -96,7 +96,7 @@ ca: type_id_eq: label: Tipus search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria + title_or_description_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria initiatives_settings: update: error: S'ha produït un error en actualitzar la configuració de les iniciatives. @@ -118,7 +118,6 @@ ca: initiatives: fields: created_at: Data de creació - id: ID published_at: Publicat el state: Estat supports_count: Signatures @@ -687,6 +686,7 @@ ca: initiative: actions: comment: Comentar + vote_comment: Votar el comentari initiatives_type: actions: create: Crear una iniciativa diff --git a/decidim-initiatives/config/locales/cs.yml b/decidim-initiatives/config/locales/cs.yml index 73903772a73f2..b84342d94c7ed 100644 --- a/decidim-initiatives/config/locales/cs.yml +++ b/decidim-initiatives/config/locales/cs.yml @@ -122,7 +122,6 @@ cs: initiatives: fields: created_at: Vytvořeno v - id: ID published_at: Publikováno v state: Stav supports_count: Podpisy diff --git a/decidim-initiatives/config/locales/de.yml b/decidim-initiatives/config/locales/de.yml index dd86a8a6c8bfd..8949af2e45cff 100644 --- a/decidim-initiatives/config/locales/de.yml +++ b/decidim-initiatives/config/locales/de.yml @@ -95,8 +95,6 @@ de: validating: Technische Validierung type_id_eq: label: Typ - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Suche in %{collection} nach Titel, Beschreibung, ID oder Autoren initiatives_settings: update: error: Beim Aktualisieren der Initiativeneinstellungen ist ein Fehler aufgetreten. @@ -118,7 +116,6 @@ de: initiatives: fields: created_at: Erstellt am - id: ID published_at: Veröffentlicht am state: Status supports_count: Unterschriften diff --git a/decidim-initiatives/config/locales/el.yml b/decidim-initiatives/config/locales/el.yml index 1e7434e586960..4c1c277aa2155 100644 --- a/decidim-initiatives/config/locales/el.yml +++ b/decidim-initiatives/config/locales/el.yml @@ -66,7 +66,6 @@ el: initiatives: fields: created_at: Δημιουργήθηκε στις - id: Αναγνωριστικό published_at: Δημοσιεύτηκε στις state: Κατάσταση supports_count: Υπογραφές diff --git a/decidim-initiatives/config/locales/en.yml b/decidim-initiatives/config/locales/en.yml index 92827bf22f216..60adc39386bcf 100644 --- a/decidim-initiatives/config/locales/en.yml +++ b/decidim-initiatives/config/locales/en.yml @@ -97,7 +97,7 @@ en: type_id_eq: label: Type search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Search %{collection} by title, description, ID or author name + title_or_description_or_author_name_or_author_nickname_cont: Search %{collection} by title, description, or author name initiatives_settings: update: error: There was a problem updating the initiatives settings. @@ -119,7 +119,6 @@ en: initiatives: fields: created_at: Created at - id: ID published_at: Published at state: Status supports_count: Signatures @@ -688,6 +687,7 @@ en: initiative: actions: comment: Comment + vote_comment: Vote comment initiatives_type: actions: create: Create an initiative diff --git a/decidim-initiatives/config/locales/es-MX.yml b/decidim-initiatives/config/locales/es-MX.yml index c6d2597552805..236ecf58b917a 100644 --- a/decidim-initiatives/config/locales/es-MX.yml +++ b/decidim-initiatives/config/locales/es-MX.yml @@ -96,7 +96,7 @@ es-MX: type_id_eq: label: Tipo search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría + title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría initiatives_settings: update: error: Se produjo un problema al actualizar la configuración de las iniciativas. @@ -118,7 +118,6 @@ es-MX: initiatives: fields: created_at: Creado en - id: CARNÉ DE IDENTIDAD published_at: Publicada en state: Estado supports_count: Firmas @@ -687,6 +686,7 @@ es-MX: initiative: actions: comment: Comentar + vote_comment: Votar el comentario initiatives_type: actions: create: Crear una iniciativa diff --git a/decidim-initiatives/config/locales/es-PY.yml b/decidim-initiatives/config/locales/es-PY.yml index 9b6f30f9d3e46..fc51b30d3dd40 100644 --- a/decidim-initiatives/config/locales/es-PY.yml +++ b/decidim-initiatives/config/locales/es-PY.yml @@ -96,7 +96,7 @@ es-PY: type_id_eq: label: Tipo search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría + title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría initiatives_settings: update: error: Se produjo un problema al actualizar la configuración de las iniciativas. @@ -118,7 +118,6 @@ es-PY: initiatives: fields: created_at: Creado en - id: CARNÉ DE IDENTIDAD published_at: Publicada en state: Estado supports_count: Firmas @@ -687,6 +686,7 @@ es-PY: initiative: actions: comment: Comentar + vote_comment: Votar el comentario initiatives_type: actions: create: Crear una iniciativa diff --git a/decidim-initiatives/config/locales/es.yml b/decidim-initiatives/config/locales/es.yml index 812a353df7273..95543251355d3 100644 --- a/decidim-initiatives/config/locales/es.yml +++ b/decidim-initiatives/config/locales/es.yml @@ -96,7 +96,7 @@ es: type_id_eq: label: Tipo search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría + title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría initiatives_settings: update: error: Se produjo un problema al actualizar la configuración de las iniciativas. @@ -118,7 +118,6 @@ es: initiatives: fields: created_at: Creado en - id: ID published_at: Publicada el state: Estado supports_count: Firmas @@ -687,6 +686,7 @@ es: initiative: actions: comment: Comentar + vote_comment: Votar el comentario initiatives_type: actions: create: Crear una iniciativa diff --git a/decidim-initiatives/config/locales/eu.yml b/decidim-initiatives/config/locales/eu.yml index 12346f4bb34dc..3bc1263ba7b8e 100644 --- a/decidim-initiatives/config/locales/eu.yml +++ b/decidim-initiatives/config/locales/eu.yml @@ -95,8 +95,6 @@ eu: validating: Baliozkotze teknikoa type_id_eq: label: Mota - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Bilatu %{collection} izenburuaren, deskribapenaren, IDaren edo egiletzaren arabera initiatives_settings: update: error: Arazo bat izan da ekimenen konfigurazioak eguneratzean. @@ -118,7 +116,6 @@ eu: initiatives: fields: created_at: Sortze-data - id: ID published_at: Argitaratze-data state: Egoera supports_count: Sinadurak diff --git a/decidim-initiatives/config/locales/fi-plain.yml b/decidim-initiatives/config/locales/fi-plain.yml index 794e55b6339eb..22ea49a2e9554 100644 --- a/decidim-initiatives/config/locales/fi-plain.yml +++ b/decidim-initiatives/config/locales/fi-plain.yml @@ -95,8 +95,6 @@ fi-pl: validating: Teknisessä validoinnissa type_id_eq: label: Tyyppi - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Hae kohteesta %{collection} otsikon, kuvauksen, ID-numeron tai tekijän nimen perusteella initiatives_settings: update: error: Aloitteiden asetusten päivittäminen epäonnistui. @@ -118,7 +116,6 @@ fi-pl: initiatives: fields: created_at: Luontiaika - id: ID published_at: Julkaisuaika state: Maakunta/osavaltio supports_count: Allekirjoituksia diff --git a/decidim-initiatives/config/locales/fi.yml b/decidim-initiatives/config/locales/fi.yml index 94569eb72433c..5d622d101e8a3 100644 --- a/decidim-initiatives/config/locales/fi.yml +++ b/decidim-initiatives/config/locales/fi.yml @@ -95,8 +95,6 @@ fi: validating: Teknisessä validoinnissa type_id_eq: label: Tyyppi - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Hae kohteesta %{collection} otsikon, kuvauksen, ID-numeron tai tekijän nimen perusteella initiatives_settings: update: error: Aloitteiden asetusten päivittäminen epäonnistui. @@ -118,7 +116,6 @@ fi: initiatives: fields: created_at: Luontiaika - id: ID published_at: Julkaisuaika state: Tila supports_count: Allekirjoitusta diff --git a/decidim-initiatives/config/locales/fr-CA.yml b/decidim-initiatives/config/locales/fr-CA.yml index 2334d76e6e1a6..71b433a759466 100644 --- a/decidim-initiatives/config/locales/fr-CA.yml +++ b/decidim-initiatives/config/locales/fr-CA.yml @@ -94,7 +94,7 @@ fr-CA: type_id_eq: label: Type d'initiative search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description, ID ou nom de l'auteur + title_or_description_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description ou nom de l'auteur initiatives_settings: update: success: Les paramètres des pétitions ont bien été mis à jour. @@ -115,7 +115,6 @@ fr-CA: initiatives: fields: created_at: Créé à - id: ID published_at: Publiée à state: État supports_count: Signatures @@ -572,6 +571,7 @@ fr-CA: initiative: actions: comment: Commenter + vote_comment: Vote sur le commentaire initiatives_type: actions: title: Actions diff --git a/decidim-initiatives/config/locales/fr.yml b/decidim-initiatives/config/locales/fr.yml index 024f96cb54f51..0136ce82712a3 100644 --- a/decidim-initiatives/config/locales/fr.yml +++ b/decidim-initiatives/config/locales/fr.yml @@ -94,7 +94,7 @@ fr: type_id_eq: label: Type de pétition search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description, ID ou nom de l'auteur + title_or_description_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description ou nom de l'auteur initiatives_settings: update: success: Les paramètres des pétitions ont bien été mis à jour. @@ -115,7 +115,6 @@ fr: initiatives: fields: created_at: Créé à - id: ID published_at: Publiée à state: État supports_count: Signatures @@ -572,6 +571,7 @@ fr: initiative: actions: comment: Commenter + vote_comment: Vote sur le commentaire initiatives_type: actions: title: Actions diff --git a/decidim-initiatives/config/locales/ga-IE.yml b/decidim-initiatives/config/locales/ga-IE.yml index 71cb86bd126b2..179674e5350cd 100644 --- a/decidim-initiatives/config/locales/ga-IE.yml +++ b/decidim-initiatives/config/locales/ga-IE.yml @@ -37,7 +37,6 @@ ga: models: initiatives: fields: - id: ID state: Stádas initiatives_type_scope: fields: diff --git a/decidim-initiatives/config/locales/gl.yml b/decidim-initiatives/config/locales/gl.yml index 3db7e3af43b67..9d9bfe1f052bc 100644 --- a/decidim-initiatives/config/locales/gl.yml +++ b/decidim-initiatives/config/locales/gl.yml @@ -58,7 +58,6 @@ gl: initiatives: fields: created_at: Creado en - id: ID state: Estado supports_count: Sinaturas title: Iniciativas diff --git a/decidim-initiatives/config/locales/hu.yml b/decidim-initiatives/config/locales/hu.yml index 4fb31cb31bbde..bf2cab5327663 100644 --- a/decidim-initiatives/config/locales/hu.yml +++ b/decidim-initiatives/config/locales/hu.yml @@ -102,7 +102,6 @@ hu: initiatives: fields: created_at: 'Létrehozva:' - id: ID published_at: Publikálás ideje state: Állapot supports_count: Aláírások diff --git a/decidim-initiatives/config/locales/id-ID.yml b/decidim-initiatives/config/locales/id-ID.yml index 48ba6bf066a59..3f6ab86ecb35d 100644 --- a/decidim-initiatives/config/locales/id-ID.yml +++ b/decidim-initiatives/config/locales/id-ID.yml @@ -53,7 +53,6 @@ id: initiatives: fields: created_at: Dibuat di - id: ID state: Negara supports_count: Tanda tangan title: Inisiatif diff --git a/decidim-initiatives/config/locales/it.yml b/decidim-initiatives/config/locales/it.yml index 282eaa3bfc8b7..7fee86bd4165d 100644 --- a/decidim-initiatives/config/locales/it.yml +++ b/decidim-initiatives/config/locales/it.yml @@ -88,7 +88,6 @@ it: initiatives: fields: created_at: Creato il - id: ID published_at: Pubblicato il state: Stato supports_count: Firme diff --git a/decidim-initiatives/config/locales/ja.yml b/decidim-initiatives/config/locales/ja.yml index 8f34ea4a8521c..ec4b11ebd5fe9 100644 --- a/decidim-initiatives/config/locales/ja.yml +++ b/decidim-initiatives/config/locales/ja.yml @@ -92,8 +92,6 @@ ja: validating: 技術的検証 type_id_eq: label: タイプ - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: '%{collection} をタイトル、説明、ID、著者名で検索' initiatives_settings: update: error: イニシアチブ設定の更新中に問題が発生しました。 @@ -115,7 +113,6 @@ ja: initiatives: fields: created_at: 作成日時 - id: ID published_at: 公開日時 state: ステータス supports_count: 署名 diff --git a/decidim-initiatives/config/locales/lb.yml b/decidim-initiatives/config/locales/lb.yml index 6eb5b0b1eaf94..9220ab06b52ac 100644 --- a/decidim-initiatives/config/locales/lb.yml +++ b/decidim-initiatives/config/locales/lb.yml @@ -85,7 +85,6 @@ lb: initiatives: fields: created_at: Erstellt am - id: ID published_at: Veröffentlicht am state: Status supports_count: Unterschriften diff --git a/decidim-initiatives/config/locales/lt.yml b/decidim-initiatives/config/locales/lt.yml index 73347a4409052..e510452887251 100644 --- a/decidim-initiatives/config/locales/lt.yml +++ b/decidim-initiatives/config/locales/lt.yml @@ -111,7 +111,6 @@ lt: initiatives: fields: created_at: Sukurta - id: ID published_at: Publikuota state: Būsena supports_count: Parašai diff --git a/decidim-initiatives/config/locales/nl.yml b/decidim-initiatives/config/locales/nl.yml index 81466883883dc..cd6f6459ce634 100644 --- a/decidim-initiatives/config/locales/nl.yml +++ b/decidim-initiatives/config/locales/nl.yml @@ -69,7 +69,6 @@ nl: initiatives: fields: created_at: Aangemaakt op - id: ID kaart published_at: Gepubliceerd op state: Status supports_count: Handtekeningen diff --git a/decidim-initiatives/config/locales/no.yml b/decidim-initiatives/config/locales/no.yml index 1bc89c9bcc240..3b795d018cc33 100644 --- a/decidim-initiatives/config/locales/no.yml +++ b/decidim-initiatives/config/locales/no.yml @@ -86,7 +86,6 @@ initiatives: fields: created_at: Opprettet på - id: ID published_at: Publisert i state: Status supports_count: Underskrifter diff --git a/decidim-initiatives/config/locales/pl.yml b/decidim-initiatives/config/locales/pl.yml index fe020ce12e2ca..ae790c50bef07 100644 --- a/decidim-initiatives/config/locales/pl.yml +++ b/decidim-initiatives/config/locales/pl.yml @@ -117,7 +117,6 @@ pl: initiatives: fields: created_at: Utworzono - id: ID published_at: Opublikowano state: Stan supports_count: Podpisy diff --git a/decidim-initiatives/config/locales/pt-BR.yml b/decidim-initiatives/config/locales/pt-BR.yml index 18faf2c67f14f..5e01705bcb1a4 100644 --- a/decidim-initiatives/config/locales/pt-BR.yml +++ b/decidim-initiatives/config/locales/pt-BR.yml @@ -94,7 +94,6 @@ pt-BR: initiatives: fields: created_at: Criado em - id: identidade published_at: Publicado em state: Estado supports_count: Assinaturas diff --git a/decidim-initiatives/config/locales/pt.yml b/decidim-initiatives/config/locales/pt.yml index 715590bdc0fe6..2ec4eb919075f 100644 --- a/decidim-initiatives/config/locales/pt.yml +++ b/decidim-initiatives/config/locales/pt.yml @@ -85,7 +85,6 @@ pt: initiatives: fields: created_at: Criado em - id: Identidade published_at: Publicado em state: Estado supports_count: Assinaturas diff --git a/decidim-initiatives/config/locales/ro-RO.yml b/decidim-initiatives/config/locales/ro-RO.yml index 4204d5c137e2f..b1359215bf439 100644 --- a/decidim-initiatives/config/locales/ro-RO.yml +++ b/decidim-initiatives/config/locales/ro-RO.yml @@ -100,7 +100,6 @@ ro: initiatives: fields: created_at: Creat la - id: ID published_at: Publicat la state: Status supports_count: Semnături diff --git a/decidim-initiatives/config/locales/sk.yml b/decidim-initiatives/config/locales/sk.yml index 5de6c91811186..c63ae655ec065 100644 --- a/decidim-initiatives/config/locales/sk.yml +++ b/decidim-initiatives/config/locales/sk.yml @@ -60,7 +60,6 @@ sk: initiatives: fields: created_at: Vytvorené u - id: ID state: Štát supports_count: Podpisy title: Iniciatívy diff --git a/decidim-initiatives/config/locales/sv.yml b/decidim-initiatives/config/locales/sv.yml index 312bc7f0adb47..a7b8f1aa2eba6 100644 --- a/decidim-initiatives/config/locales/sv.yml +++ b/decidim-initiatives/config/locales/sv.yml @@ -93,8 +93,6 @@ sv: validating: Teknisk validering type_id_eq: label: Typ - search_placeholder: - title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Sök %{collection} med titel, beskrivning, ID eller författarnamn initiatives_settings: update: error: Det gick inte att uppdatera inställningarna för initiativ. @@ -116,7 +114,6 @@ sv: initiatives: fields: created_at: Skapad - id: ID published_at: Publicerad state: Status supports_count: Underskrifter diff --git a/decidim-initiatives/config/locales/tr-TR.yml b/decidim-initiatives/config/locales/tr-TR.yml index 82d0df5b36d5f..2c8de984dc3da 100644 --- a/decidim-initiatives/config/locales/tr-TR.yml +++ b/decidim-initiatives/config/locales/tr-TR.yml @@ -83,7 +83,6 @@ tr: initiatives: fields: created_at: Düzenlendi - id: İD published_at: Tarihinde yayınlandı state: Belirtmek, bildirmek supports_count: İmzalar diff --git a/decidim-initiatives/config/locales/zh-CN.yml b/decidim-initiatives/config/locales/zh-CN.yml index af8dc822f9398..0cad7d1a7bf1f 100644 --- a/decidim-initiatives/config/locales/zh-CN.yml +++ b/decidim-initiatives/config/locales/zh-CN.yml @@ -80,7 +80,6 @@ zh-CN: initiatives: fields: created_at: 创建于 - id: ID published_at: 发布于 state: 状态 supports_count: 签名 diff --git a/decidim-initiatives/config/locales/zh-TW.yml b/decidim-initiatives/config/locales/zh-TW.yml index 3cf9a08793845..8421676f0b850 100644 --- a/decidim-initiatives/config/locales/zh-TW.yml +++ b/decidim-initiatives/config/locales/zh-TW.yml @@ -102,7 +102,6 @@ zh-TW: initiatives: fields: created_at: 建立於 - id: ID published_at: 發佈於 state: 狀態 supports_count: 簽名 diff --git a/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb b/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb new file mode 100644 index 0000000000000..3484b1f1d0ff1 --- /dev/null +++ b/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveLegacyImagesFromInitiativesModule < ActiveRecord::Migration[7.2] + def change + remove_column :decidim_initiatives_types, :banner_image, :string + end +end diff --git a/decidim-initiatives/decidim-initiatives.gemspec b/decidim-initiatives/decidim-initiatives.gemspec index b69cdc05bb6b9..de517f4cd23f5 100644 --- a/decidim-initiatives/decidim-initiatives.gemspec +++ b/decidim-initiatives/decidim-initiatives.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-initiatives" s.summary = "Decidim initiatives module" diff --git a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb index 487945432d998..c25dbaebc0f3d 100644 --- a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb +++ b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb @@ -23,7 +23,7 @@ participatory_space.breadcrumb_cell = "decidim/initiatives/initiative_dropdown_metadata" participatory_space.register_resource(:initiative) do |resource| - resource.actions = %w(comment) + resource.actions = %w(comment vote_comment) resource.permissions_class_name = "Decidim::Initiatives::Permissions" resource.model_class_name = "Decidim::Initiative" resource.card = "decidim/initiatives/initiative" @@ -57,8 +57,8 @@ ] participatory_space.exports :initiatives do |export| - export.collection do - Decidim::Initiative.public_spaces + export.collection do |participatory_space, _user| + Decidim::Initiative.public_spaces.where(id: participatory_space) end export.include_in_open_data = true diff --git a/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb b/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb index 28bc1d65f0a08..84c0eb88ab9f7 100644 --- a/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb +++ b/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb @@ -113,12 +113,6 @@ def initiative_without_area(area) expect(page).to have_content(translated(open_initiative.title)) end - it "can be searched by id" do - search_by_text(open_initiative.id) - - expect(page).to have_content(translated(open_initiative.title)) - end - it "can be searched by author name" do search_by_text(open_initiative.author.name) diff --git a/decidim-initiatives/spec/system/authorized_comments_spec.rb b/decidim-initiatives/spec/system/authorized_comments_spec.rb index ad819d87cd0b3..6b1f32c848902 100644 --- a/decidim-initiatives/spec/system/authorized_comments_spec.rb +++ b/decidim-initiatives/spec/system/authorized_comments_spec.rb @@ -40,19 +40,44 @@ end end - context "when the initiative has no restriction on commenting" do + shared_examples_for "allowed to vote a comment" do + it do + within "#comment_#{comments[0].id}" do + page.find(".js-comment__votes--up").click + end + + expect(page).to have_css(".js-comment__votes--up", text: /1/) + end + end + + shared_examples_for "not allowed to vote a comment" do + it "does not allow voting" do + within "#comment_#{comments[0].id}" do + expect(page).to have_css(".js-comment__votes--up", text: /0/) + page.find(".js-comment__votes--up").click + # The vote counter should not have changed + expect(page).to have_css(".js-comment__votes--up", text: /0/) + end + end + end + + context "when the initiative has no restriction on commenting and voting comments" do before do visit resource_path end it_behaves_like "allowed to comment" + it_behaves_like "allowed to vote a comment" end - context "when the initiative has restrictions on commenting" do + context "when the initiative has restrictions on commenting and/or voting comments" do let!(:resource_permission) { commentable.create_resource_permission(permissions:) } let(:comment_permission) do { comment: authorization_handlers } end + let(:vote_comment_permission) do + { vote_comment: authorization_handlers } + end let(:authorization_handlers) do { authorization_handlers: { authorization_handler_name => { "options" => {} } } } end @@ -70,6 +95,19 @@ it_behaves_like "not allowed to comment" end + + describe "restricted vote_comment action" do + let(:permissions) { vote_comment_permission } + + it_behaves_like "not allowed to vote a comment" + end + + describe "restricted comment and vote_comment action" do + let(:permissions) { comment_permission.merge(vote_comment_permission) } + + it_behaves_like "not allowed to comment" + it_behaves_like "not allowed to vote a comment" + end end context "and user is verified" do @@ -80,6 +118,19 @@ it_behaves_like "allowed to comment" end + + describe "restricted vote_comment action" do + let(:permissions) { vote_comment_permission } + + it_behaves_like "allowed to vote a comment" + end + + describe "restricted comment and vote_comment action" do + let(:permissions) { comment_permission.merge(vote_comment_permission) } + + it_behaves_like "allowed to comment" + it_behaves_like "allowed to vote a comment" + end end end end diff --git a/decidim-initiatives/spec/system/initiative_types_spec.rb b/decidim-initiatives/spec/system/initiative_types_spec.rb index 0ecd93d52e2e1..bfcfc2e635925 100644 --- a/decidim-initiatives/spec/system/initiative_types_spec.rb +++ b/decidim-initiatives/spec/system/initiative_types_spec.rb @@ -8,21 +8,12 @@ let(:base_initiative) do create(:initiative, organization:) end - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } before do switch_to_host(organization.host) end context "when initiative types and scopes have not been created" do - it "does not show the menu link" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Initiatives") - end - end - it "does not let access to the initiatives" do visit decidim_initiatives.initiatives_path @@ -36,17 +27,6 @@ create(:initiative, organization:) end - it "shows the menu link" do - type = create(:initiatives_type, organization:) - create(:initiatives_type_scope, type:) - - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_content("Initiatives") - end - end - context "when there are some published initiatives" do let!(:initiative) { base_initiative } let!(:unpublished_initiative) do @@ -75,13 +55,9 @@ it "the menu link is shown" do visit decidim_initiatives.initiatives_path - find_by_id("main-dropdown-summary").hover - within ".menu-bar__dropdown-menu" do + within "#menu-bar" do expect(page).to have_content("Initiatives") - click_on "Initiatives" end - - expect(page).to have_current_path(decidim_initiatives.initiatives_path) end end diff --git a/decidim-initiatives/spec/system/initiatives_spec.rb b/decidim-initiatives/spec/system/initiatives_spec.rb index faeb4857b299a..44d2df87efa0c 100644 --- a/decidim-initiatives/spec/system/initiatives_spec.rb +++ b/decidim-initiatives/spec/system/initiatives_spec.rb @@ -8,21 +8,12 @@ let(:base_initiative) do create(:initiative, organization:) end - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } before do switch_to_host(organization.host) end context "when initiative types and scopes have not been created" do - it "does not show the menu link" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Initiatives") - end - end - it "does not let access to the initiatives" do visit decidim_initiatives.initiatives_path @@ -36,17 +27,6 @@ create(:initiative, organization:) end - it "shows the menu link" do - type = create(:initiatives_type, organization:) - create(:initiatives_type_scope, type:) - - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_content("Initiatives") - end - end - context "when there are some published initiatives" do let!(:initiative) { base_initiative } let!(:unpublished_initiative) do diff --git a/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb index e9ae6a277f9b3..a6e47514c13cc 100644 --- a/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb +++ b/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb @@ -16,12 +16,7 @@ def show private def card_size - case @options[:size] - when :s - "decidim/meetings/meeting_s" - else - "decidim/meetings/meeting_l" - end + "decidim/meetings/meeting_l" end def resource_icon diff --git a/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb deleted file mode 100644 index cde9e16e665b8..0000000000000 --- a/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Meetings - # This cell renders the Search (:s) meeting card - # for a given instance of a Meeting - class MeetingSCell < Decidim::CardSCell - private - - def metadata_cell - "decidim/meetings/meeting_card_metadata" - end - end - end -end diff --git a/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb b/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb index 3ee6589bdf8c5..b65690789a4f8 100644 --- a/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb +++ b/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb @@ -45,10 +45,6 @@ def filters_with_values } end - def search_field_predicate - :id_string_or_title_cont - end - def meeting_types Meeting::TYPE_OF_MEETING end diff --git a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb index f209131c97ffa..be43cad6c15e9 100644 --- a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +++ b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb @@ -201,6 +201,16 @@ def previous_space rescue NameError, LoadError nil end + + def add_breadcrumb_item + return {} if meeting.blank? + + { + label: translated_attribute(meeting.title), + url: Decidim::EngineRouter.main_proxy(current_component).meeting_path(meeting), + active: false + } + end end end end diff --git a/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb b/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb index f43d416399fcf..d7d33bbc463a5 100644 --- a/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb +++ b/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb @@ -9,6 +9,16 @@ class VersionsController < Decidim::Meetings::ApplicationController def versioned_resource @versioned_resource ||= Meeting.not_hidden.where(component: current_component).find(params[:meeting_id]) end + + def add_breadcrumb_item + return {} if versioned_resource.blank? + + { + label: translated_attribute(versioned_resource.title), + url: Decidim::EngineRouter.main_proxy(current_component).meeting_path(versioned_resource), + active: false + } + end end end end diff --git a/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb b/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb index 4bb2461857ba8..f1867fe1ba9a0 100644 --- a/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb +++ b/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb @@ -48,7 +48,7 @@ <% if invite.sent_at %> - <%= l invite.sent_at, format: :long %> + <%= l invite.sent_at, format: :decidim_short %> <% end %> 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 560f69ff903c0..7d1a58b7100b2 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 @@ -1,9 +1,6 @@ <% is_linked = meeting.decidim_component_id != current_component.id %>
"> - <%= meeting.id %>
-
"> <% if allowed_to? :update, :meeting, meeting: meeting %> <%= link_to present(meeting).title(html_escape: true), edit_meeting_path(meeting) %> @@ -13,12 +10,12 @@ "> <% if meeting.start_time %> - <%= l meeting.start_time, format: :long %> + <%= l meeting.start_time, format: :decidim_short %> <% end %> "> <% if meeting.end_time %> - <%= l meeting.end_time, format: :long %> + <%= l meeting.end_time, format: :decidim_short %> <% end %> "> 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 eb7eb20d0a364..b0ea27d239202 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 @@ -1,8 +1,5 @@
- <%= sort_link(query, :id, t("models.meeting.fields.id", scope: "decidim.meetings"), default_order: :desc ) %> - <%= sort_link(query, :translated_title, t("models.meeting.fields.title", scope: "decidim.meetings"), default_order: :desc ) %> "> <% if step.start_date %> - <%= l step.start_date, format: :long %> + <%= l step.start_date, format: :decidim_short %> <% end %> "> <% if step.end_date %> - <%= l step.end_date, format: :long %> + <%= l step.end_date, format: :decidim_short %> <% end %> "> diff --git a/decidim-participatory_processes/config/locales/en.yml b/decidim-participatory_processes/config/locales/en.yml index 0e78b29e3a099..5755e225b94b6 100644 --- a/decidim-participatory_processes/config/locales/en.yml +++ b/decidim-participatory_processes/config/locales/en.yml @@ -341,6 +341,7 @@ en: participatory_processes: announcement: The announcement (callout) information area: The area where the process is taking place + component_settings: The component settings of the process created_at: The date this space was created description: A long description of the process developer_group: The developer group of the process. This is the organization that is promoting the process. diff --git a/decidim-participatory_processes/config/locales/eu.yml b/decidim-participatory_processes/config/locales/eu.yml index 247f5a2cb0fc1..628367fc21bbc 100644 --- a/decidim-participatory_processes/config/locales/eu.yml +++ b/decidim-participatory_processes/config/locales/eu.yml @@ -267,7 +267,7 @@ eu: titles: participatory_process_groups: Partaidetza-prozesuen taldeak participatory_process_types: Partaidetza-prozesu motak - participatory_processes: Prozesu pare-hartzaileak + participatory_processes: Partaidetza-prozesuak participatory_processes_deleted: Ezabatutako partaidetza-prozesuak tooltips: deleted_processes_info: Prozesu bat soilik ezabatu daiteke egoera "Argitaratugabea" bada. diff --git a/decidim-participatory_processes/db/migrate/20251112113613_remove_legacy_images_from_participatory_processes_module.rb b/decidim-participatory_processes/db/migrate/20251112113613_remove_legacy_images_from_participatory_processes_module.rb new file mode 100644 index 0000000000000..ba8b3f9571c27 --- /dev/null +++ b/decidim-participatory_processes/db/migrate/20251112113613_remove_legacy_images_from_participatory_processes_module.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveLegacyImagesFromParticipatoryProcessesModule < ActiveRecord::Migration[7.2] + def change + remove_column :decidim_participatory_processes, :hero_image, :string + + remove_column :decidim_participatory_process_groups, :hero_image, :string + end +end diff --git a/decidim-participatory_processes/decidim-participatory_processes.gemspec b/decidim-participatory_processes/decidim-participatory_processes.gemspec index fa3d28f62c6cc..824bf669e6dfc 100644 --- a/decidim-participatory_processes/decidim-participatory_processes.gemspec +++ b/decidim-participatory_processes/decidim-participatory_processes.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-participatory_processes" s.summary = "Decidim participatory processes module" diff --git a/decidim-participatory_processes/lib/decidim/participatory_processes/participatory_space.rb b/decidim-participatory_processes/lib/decidim/participatory_processes/participatory_space.rb index 67e229f6df4af..43ae5ec4ae0d3 100644 --- a/decidim-participatory_processes/lib/decidim/participatory_processes/participatory_space.rb +++ b/decidim-participatory_processes/lib/decidim/participatory_processes/participatory_space.rb @@ -42,8 +42,8 @@ end participatory_space.exports :participatory_processes do |export| - export.collection do - Decidim::ParticipatoryProcess.public_spaces + export.collection do |participatory_space, _user| + Decidim::ParticipatoryProcess.public_spaces.where(id: participatory_space) end export.include_in_open_data = true diff --git a/decidim-participatory_processes/spec/forms/participatory_process_form_spec.rb b/decidim-participatory_processes/spec/forms/participatory_process_form_spec.rb index 87fe7aecc25d9..04fae369103d8 100644 --- a/decidim-participatory_processes/spec/forms/participatory_process_form_spec.rb +++ b/decidim-participatory_processes/spec/forms/participatory_process_form_spec.rb @@ -44,6 +44,8 @@ module Admin ca: "Descripció curta" } end + let(:start_date) { 1.month.ago } + let(:end_date) { 1.month.from_now } let(:slug) { "slug" } let(:attachment) { upload_test_file(Decidim::Dev.test_file("city.jpeg", "image/jpeg")) } let(:attributes) do @@ -62,6 +64,8 @@ module Admin "short_description_en" => short_description[:en], "short_description_es" => short_description[:es], "short_description_ca" => short_description[:ca], + "start_date" => start_date, + "end_date" => end_date, "hero_image" => attachment, "slug" => slug, "taxonomies" => [taxonomies.first.id, taxonomies.second.id] @@ -176,6 +180,45 @@ module Admin end end end + + context "when the start_date is later than end_date" do + let(:start_date) { 1.month.from_now } + let(:end_date) { 2.months.ago } + + it { is_expected.to be_invalid } + + it "has an error" do + subject.valid? + + expect(subject.errors).not_to be_empty + expect(subject.errors[:end_date]).not_to be_empty + expect(subject.errors[:start_date]).not_to be_empty + end + end + + context "when start_date is present" do + let(:start_date) { 3.months.ago } + + it { is_expected.to be_valid } + end + + context "when end_date is present" do + let(:end_date) { 2.months.from_now } + + it { is_expected.to be_valid } + end + + context "when start_date is not present" do + let(:start_date) { nil } + + it { is_expected.to be_valid } + end + + context "when end_date is not present" do + let(:end_date) { nil } + + it { is_expected.to be_valid } + end end end end diff --git a/decidim-participatory_processes/spec/shared/manage_process_components_examples.rb b/decidim-participatory_processes/spec/shared/manage_process_components_examples.rb index 360c53d8c5fd6..6dc595da5530f 100644 --- a/decidim-participatory_processes/spec/shared/manage_process_components_examples.rb +++ b/decidim-participatory_processes/spec/shared/manage_process_components_examples.rb @@ -372,6 +372,47 @@ def participatory_space participatory_process end + describe "does not reorder components after edit" do + let!(:component1) { create(:component, name: { en: "Component 1" }, participatory_space:) } + let!(:component2) { create(:component, name: { en: "Component 2" }, participatory_space:) } + let!(:component3) { create(:component, name: { en: "Component 3" }, participatory_space:) } + + before do + visit participatory_space_components_path(participatory_space) + end + + it "does not reorder when component updates" do + expect(page.text.index("Component 1")).to be < page.text.index("Component 2") + expect(page.text.index("Component 2")).to be < page.text.index("Component 3") + within ".component-#{component1.id}" do + find("button[data-controller='dropdown']").click + click_on "Configure" + end + within ".edit_component" do + fill_in_i18n( + :component_name, + "#component-name-tabs", + **attributes[:name].except("machine_translations") + ) + within ".global-settings" do + all("input[type=checkbox]").last.click + end + + within "#panel-step_settings" do + all("input[type=checkbox]").first.click + end + + click_on "Update" + end + expect(page).to have_admin_callout("The component was updated successfully.") + expect(page).to have_content(translated(attributes[:name])) + expect(page).to have_content("Component 2") + expect(page).to have_content("Component 3") + expect(page.text.index(translated(attributes[:name]))).to be < page.text.index("Component 2") + expect(page.text.index("Component 2")).to be < page.text.index("Component 3") + end + end + def participatory_space_components_path(participatory_space) decidim_admin_participatory_processes.components_path(participatory_space) end diff --git a/decidim-participatory_processes/spec/shared/manage_process_steps_examples.rb b/decidim-participatory_processes/spec/shared/manage_process_steps_examples.rb index e83b34bf6f7ec..cc4c68fad8128 100644 --- a/decidim-participatory_processes/spec/shared/manage_process_steps_examples.rb +++ b/decidim-participatory_processes/spec/shared/manage_process_steps_examples.rb @@ -53,8 +53,8 @@ within "#steps table" do expect(page).to have_content(translated(attributes[:title])) - expect(page).to have_content("#{Time.new.utc.day},") - expect(page).to have_content("#{(Time.new.utc + 2.days).day},") + expect(page).to have_content(Time.new.utc.day) + expect(page).to have_content((Time.new.utc + 2.days).day) end visit decidim_admin.root_path expect(page).to have_content("created the #{translated(attributes[:title])} phase in") diff --git a/decidim-participatory_processes/spec/shared/process_announcements_examples.rb b/decidim-participatory_processes/spec/shared/process_announcements_examples.rb index de81e137af698..06c2e267640c0 100644 --- a/decidim-participatory_processes/spec/shared/process_announcements_examples.rb +++ b/decidim-participatory_processes/spec/shared/process_announcements_examples.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true shared_examples "manage processes announcements" do - let!(:participatory_process) { create(:participatory_process, :with_content_blocks, organization:, blocks_manifests: [:announcement]) } + let!(:participatory_process) { create(:participatory_process, :with_content_blocks, organization:, blocks_manifests: [:announcement], announcement: {}) } it "can customize a general announcement for the process" do within "tr", text: translated(participatory_process.title) do @@ -39,4 +39,39 @@ expect(page).to have_content("An important announcement") end end + + it "remove announcement element if announcement body is empty" do + within "tr", text: translated(participatory_process.title) do + click_on translated(participatory_process.title) + end + + within_admin_sidebar_menu do + click_on "About this process" + end + + find_by_id("participatory_process-announcement-tabs").click + send_keys("T") + send_keys(:backspace) + + within ".edit_participatory_process" do + find("*[type=submit]").click + end + + expect(page).to have_admin_callout("successfully") + + visit decidim_admin_participatory_processes.participatory_processes_path + + new_window = window_opened_by do + within("tr", text: translated(participatory_process.title)) do + find("button[data-controller='dropdown']").click + click_on "Preview" + end + end + + page.within_window(new_window) do + expect(page).to have_no_css(".flash") + expect(page).to have_no_css(".flash__message") + expect(page).to have_no_css(".announcement") + end + end end diff --git a/decidim-participatory_processes/spec/system/admin/admin_access_spec.rb b/decidim-participatory_processes/spec/system/admin/admin_access_spec.rb index 3fc81c863aade..9e32973897a97 100644 --- a/decidim-participatory_processes/spec/system/admin/admin_access_spec.rb +++ b/decidim-participatory_processes/spec/system/admin/admin_access_spec.rb @@ -16,6 +16,9 @@ let(:participatory_space_path) { decidim_participatory_processes.participatory_process_path(participatory_space) } it_behaves_like "admin participatory space access" + it_behaves_like "admin menu shows only assigned space", + space_name: "Processes", + other_spaces: %w(Assemblies Initiatives Conferences) describe "edit button" do let(:target_path) { decidim_admin_participatory_processes.edit_participatory_process_landing_page_path(participatory_space) } diff --git a/decidim-participatory_processes/spec/system/participatory_processes_spec.rb b/decidim-participatory_processes/spec/system/participatory_processes_spec.rb index d3c242ee6f361..f32e1dc6f20cc 100644 --- a/decidim-participatory_processes/spec/system/participatory_processes_spec.rb +++ b/decidim-participatory_processes/spec/system/participatory_processes_spec.rb @@ -28,18 +28,6 @@ end end - context "when there are no processes and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "does not show the menu link" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Processes") - end - end - end - context "when the process does not exist" do it_behaves_like "a 404 page" do let(:target_path) { decidim_participatory_processes.participatory_process_path(99_999_999) } @@ -57,18 +45,6 @@ let(:target_path) { decidim_participatory_processes.participatory_processes_path } end end - - context "and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "the menu link is not shown" do - visit decidim.root_path - - within "#home__menu" do - expect(page).to have_no_content("Processes") - end - end - end end context "when there are some published processes" do @@ -96,20 +72,6 @@ it_behaves_like "accessible page" - context "and accessing from the homepage" do - let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) } - - it "the menu link is not shown" do - visit decidim.root_path - - within "#home__menu" do - click_on "Processes" - end - - expect(page).to have_current_path decidim_participatory_processes.participatory_processes_path - end - end - context "with highlighted processes" do before do promoted_process.title["en"] = "D'Artagnan #{promoted_process.title["en"]}" diff --git a/decidim-proposals/app/controllers/concerns/decidim/proposals/admin/filterable.rb b/decidim-proposals/app/controllers/concerns/decidim/proposals/admin/filterable.rb index 0c9a4349a098b..21bad67ffba8c 100644 --- a/decidim-proposals/app/controllers/concerns/decidim/proposals/admin/filterable.rb +++ b/decidim-proposals/app/controllers/concerns/decidim/proposals/admin/filterable.rb @@ -32,10 +32,6 @@ def accessible_proposals_collection collection.with_evaluation_assigned_to(current_user, current_participatory_space) end - def search_field_predicate - :id_string_or_title_cont - end - def filter_config @filter_config ||= Decidim::AdminFilter.new(:proposals).build_for(self) end diff --git a/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb index 7fbededb0c7f3..c4022c86680bb 100644 --- a/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb +++ b/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb @@ -20,7 +20,7 @@ class ProposalsController < Decidim::Proposals::ApplicationController before_action :authenticate_user!, only: [:new, :create] before_action :ensure_is_draft, only: [:preview, :publish, :edit_draft, :update_draft, :destroy_draft] - before_action :set_proposal, only: [:show, :edit, :update, :withdraw] + before_action :proposal, only: [:show, :edit, :update, :withdraw] before_action :edit_form, only: [:edit_draft, :edit] before_action :set_view_mode, only: [:index] @@ -216,8 +216,8 @@ def ensure_is_draft redirect_to Decidim::ResourceLocatorPresenter.new(@proposal).path unless @proposal.draft? end - def set_proposal - @proposal = Proposal.published.not_hidden.where(component: current_component).find_by(id: params[:id]) + def proposal + @proposal ||= Proposal.published.not_hidden.where(component: current_component).find_by(id: params[:id]) end # Returns true if the proposal is NOT an emendation or the user IS an admin. @@ -289,6 +289,24 @@ def set_view_mode def default_view_mode @default_view_mode ||= current_component.settings.attachments_allowed? ? "grid" : "list" end + + def add_breadcrumb_item + return {} if proposal.blank? + + if proposal.emendation? + { + label: translated_attribute(proposal.amendable.title), + url: Decidim::EngineRouter.main_proxy(current_component).proposal_path(proposal.amendable), + active: false + } + else + { + label: translated_attribute(proposal.title), + url: Decidim::EngineRouter.main_proxy(current_component).proposal_path(proposal), + active: false + } + end + end end end end diff --git a/decidim-proposals/app/controllers/decidim/proposals/versions_controller.rb b/decidim-proposals/app/controllers/decidim/proposals/versions_controller.rb index 953d320d1018b..7529ca3880f97 100644 --- a/decidim-proposals/app/controllers/decidim/proposals/versions_controller.rb +++ b/decidim-proposals/app/controllers/decidim/proposals/versions_controller.rb @@ -11,11 +11,21 @@ class VersionsController < Decidim::Proposals::ApplicationController def versioned_resource @versioned_resource ||= if params[:proposal_id] - present(Proposal.not_hidden.published.where(component: current_component).find(params[:proposal_id])) + Proposal.not_hidden.published.where(component: current_component).find(params[:proposal_id]) else CollaborativeDraft.where(component: current_component).find(params[:collaborative_draft_id]) end end + + def add_breadcrumb_item + return {} if versioned_resource.blank? + + { + label: translated_attribute(versioned_resource.title), + url: Decidim::EngineRouter.main_proxy(current_component).proposal_path(versioned_resource), + active: false + } + end end end end diff --git a/decidim-proposals/app/packs/stylesheets/decidim/proposals/proposals.scss b/decidim-proposals/app/packs/stylesheets/decidim/proposals/proposals.scss index 1420d1fe9f58a..7e92bdcd1953c 100644 --- a/decidim-proposals/app/packs/stylesheets/decidim/proposals/proposals.scss +++ b/decidim-proposals/app/packs/stylesheets/decidim/proposals/proposals.scss @@ -112,7 +112,7 @@ &__list-list { .card__proposals-item { - @apply border-l-4 rounded-[10px] md:rounded-md border-[#F5F5F5] hover:border-tertiary focus-visible:border-tertiary flex flex-col md:items-center md:flex-row md:justify-between min-h-0 md:min-h-[127px] lg:min-h-[83px]; + @apply border-l-4 rounded-[10px] md:rounded-md border-neutral-100 hover:border-tertiary focus-visible:border-tertiary flex flex-col md:items-center md:flex-row md:justify-between min-h-0 md:min-h-[127px] lg:min-h-[83px]; .card__list { @apply border-none md:flex-1 md:items-center mb-2.5 md:mb-0; @@ -128,7 +128,7 @@ .card__proposals-votes, .card__proposals-votes-hidden { - @apply flex md:flex-col lg:flex-row bg-[#F5F5F5] justify-around md:flex-[0.6] lg:flex-[0.8] items-center md:items-stretch lg:items-center lg:min-w-[196px] h-[68px] md:h-auto lg:h-[68px]; + @apply flex md:flex-col lg:flex-row bg-neutral-100 justify-around md:flex-[0.6] lg:flex-[0.8] items-center md:items-stretch lg:items-center lg:min-w-[196px] h-[68px] md:h-auto lg:h-[68px]; button { @apply bg-[var(--secondary)]; @@ -217,7 +217,7 @@ @apply md:gap-4; .card__proposals-item { - @apply flex flex-col justify-between border-solid border-[#D3D5D9] border rounded; + @apply flex flex-col mt-6 justify-between border-solid border-[#D3D5D9] border rounded; .card__grid { @apply mb-2.5 md:mb-0 flex-1 justify-between; diff --git a/decidim-proposals/config/locales/ca-IT.yml b/decidim-proposals/config/locales/ca-IT.yml index d5a91c8acf8f0..548f89df6d409 100644 --- a/decidim-proposals/config/locales/ca-IT.yml +++ b/decidim-proposals/config/locales/ca-IT.yml @@ -145,8 +145,6 @@ ca-IT: values: state_not_published: Sense resposta state_published: Amb resposta - search_placeholder: - id_string_or_title_cont: Cerca %{collection} per ID o títol tooltips: cannot_edit_proposal_info: No es pot editar aquesta proposta perquè ha estat creada per un participant o ha rebut algun vot deleted_proposal_states_info: No es pot eliminar aquest estat de resposta perquè hi ha propostes assignades a aquest estat diff --git a/decidim-proposals/config/locales/ca.yml b/decidim-proposals/config/locales/ca.yml index 915c157cb19f7..6e1280fdf6180 100644 --- a/decidim-proposals/config/locales/ca.yml +++ b/decidim-proposals/config/locales/ca.yml @@ -145,8 +145,6 @@ ca: values: state_not_published: Sense resposta state_published: Amb resposta - search_placeholder: - id_string_or_title_cont: Cerca %{collection} per ID o títol tooltips: cannot_edit_proposal_info: No es pot editar aquesta proposta perquè ha estat creada per un participant o ha rebut algun vot deleted_proposal_states_info: No es pot eliminar aquest estat de resposta perquè hi ha propostes assignades a aquest estat diff --git a/decidim-proposals/config/locales/de.yml b/decidim-proposals/config/locales/de.yml index eca158d33add7..0d58a4e0df184 100644 --- a/decidim-proposals/config/locales/de.yml +++ b/decidim-proposals/config/locales/de.yml @@ -145,8 +145,6 @@ de: values: state_not_published: Unbeantwortet state_published: Beantwortet - search_placeholder: - id_string_or_title_cont: In %{collection} nach ID oder Titel suchen tooltips: cannot_edit_proposal_info: Dieser Vorschlag kann nicht bearbeitet werden, da er von einem Teilnehmenden erstellt wurde oder bereits Stimmen erhalten hat deleted_proposal_states_info: Dieser Vorschlagsstatus kann nicht gelöscht werden, da ihm Vorschläge zugewiesen sind diff --git a/decidim-proposals/config/locales/en.yml b/decidim-proposals/config/locales/en.yml index 126b43b360eff..0b7db59b1814c 100644 --- a/decidim-proposals/config/locales/en.yml +++ b/decidim-proposals/config/locales/en.yml @@ -146,8 +146,6 @@ en: values: state_not_published: Not answered state_published: Answered - search_placeholder: - id_string_or_title_cont: Search %{collection} by ID or title tooltips: cannot_edit_proposal_info: Cannot edit this proposal as it is created by a participant or it has received any vote deleted_proposal_states_info: Cannot delete this proposal state because there are proposals assigned to it diff --git a/decidim-proposals/config/locales/es-MX.yml b/decidim-proposals/config/locales/es-MX.yml index 1466b7653b363..7ff83e15cf56a 100644 --- a/decidim-proposals/config/locales/es-MX.yml +++ b/decidim-proposals/config/locales/es-MX.yml @@ -145,8 +145,6 @@ es-MX: values: state_not_published: Sin respuesta state_published: Respondidas - search_placeholder: - id_string_or_title_cont: Buscar %{collection} por ID o título tooltips: cannot_edit_proposal_info: No se puede editar esta propuesta ya que ha sido creada por un participante o ha recibido algún voto deleted_proposal_states_info: No se puede eliminar este estado de respuesta porque hay propuestas asignadas a este estado diff --git a/decidim-proposals/config/locales/es-PY.yml b/decidim-proposals/config/locales/es-PY.yml index 8b6eeee4d98ba..f67655e4d61b2 100644 --- a/decidim-proposals/config/locales/es-PY.yml +++ b/decidim-proposals/config/locales/es-PY.yml @@ -145,8 +145,6 @@ es-PY: values: state_not_published: Sin respuesta state_published: Respondidas - search_placeholder: - id_string_or_title_cont: Buscar %{collection} por ID o título tooltips: cannot_edit_proposal_info: No se puede editar esta propuesta ya que ha sido creada por un participante o ha recibido algún voto deleted_proposal_states_info: No se puede eliminar este estado de respuesta porque hay propuestas asignadas a este estado diff --git a/decidim-proposals/config/locales/es.yml b/decidim-proposals/config/locales/es.yml index 26950d02aa1fc..0291d775c475e 100644 --- a/decidim-proposals/config/locales/es.yml +++ b/decidim-proposals/config/locales/es.yml @@ -145,8 +145,6 @@ es: values: state_not_published: Sin respuesta state_published: Respondidas - search_placeholder: - id_string_or_title_cont: Buscar %{collection} por ID o título tooltips: cannot_edit_proposal_info: No se puede editar esta propuesta ya que ha sido creada por un participante o ha recibido algún voto deleted_proposal_states_info: No se puede eliminar este estado de respuesta porque hay propuestas asignadas a este estado diff --git a/decidim-proposals/config/locales/eu.yml b/decidim-proposals/config/locales/eu.yml index c391fc40c1c52..6d27b4da114a2 100644 --- a/decidim-proposals/config/locales/eu.yml +++ b/decidim-proposals/config/locales/eu.yml @@ -145,8 +145,6 @@ eu: values: state_not_published: Erantzun gabe state_published: Erantzun da - search_placeholder: - id_string_or_title_cont: Bilatu %{collection} edo ID edo izenburuaren arabera tooltips: cannot_edit_proposal_info: Ezin da editatu proposamen hau parte-hartzaile batek sortua bezala edo botorik jaso badu deleted_proposal_states_info: Ezin da ezabatu proposamen-egoera hau, proposamen batzuk esleitu baitzaizkio @@ -712,7 +710,7 @@ eu: delete: "%{user_name} k desesleitu du ebaluatzaile bat %{proposal_title} proposamenetik" proposal: answer: "%{user_name} parte-hartzaileak %{resource_name} %{space_name} espazioko proposamenari erantzun dio" - create: "%{user_name} -k sortu zuen %{resource_name} proposamena %{space_name} esparruko %{merged_count} proposamenen bat egitetik" + create: "%{user_name} parte-hartzaileak sortu zuen %{resource_name} proposamena %{space_name} esparruko %{merged_count} proposamenen bat egitetik" publish_answer: "%{user_name} parte-hartzaileak argitaratu du %{resource_name} proposamenaren erantzuna %{space_name} espazioan" restore: "%{user_name} parte-hartzailea berreskuratu du %{resource_name} proposamena %{space_name} espazioan" soft_delete: "%{user_name} parte-hartzailea eraman du %{resource_name} proposamena %{space_name} espaziora" diff --git a/decidim-proposals/config/locales/fi-plain.yml b/decidim-proposals/config/locales/fi-plain.yml index e98abde43a7b9..4919dbaa2804c 100644 --- a/decidim-proposals/config/locales/fi-plain.yml +++ b/decidim-proposals/config/locales/fi-plain.yml @@ -145,8 +145,6 @@ fi-pl: values: state_not_published: Ei vastattu state_published: Vastattu - search_placeholder: - id_string_or_title_cont: Hae kohteesta %{collection} ID-numeron tai otsikon perusteella tooltips: cannot_edit_proposal_info: Tätä ehdotusta ei voi muokata, koska se on osallistujan luoma tai sitä on jo äänestetty deleted_proposal_states_info: Tätä ehdotusten tilaa ei voi poistaa, koska kyseinen tila on määritetty joillekin ehdotuksille diff --git a/decidim-proposals/config/locales/fi.yml b/decidim-proposals/config/locales/fi.yml index a335ab69df6ff..249fd01973f8c 100644 --- a/decidim-proposals/config/locales/fi.yml +++ b/decidim-proposals/config/locales/fi.yml @@ -145,8 +145,6 @@ fi: values: state_not_published: Ei vastattu state_published: Vastattu - search_placeholder: - id_string_or_title_cont: Hae kohteesta %{collection} ID-numeron tai otsikon perusteella tooltips: cannot_edit_proposal_info: Tätä ehdotusta ei voi muokata, koska se on osallistujan luoma tai sitä on jo äänestetty deleted_proposal_states_info: Tätä ehdotusten tilaa ei voi poistaa, koska kyseinen tila on määritetty joillekin ehdotuksille diff --git a/decidim-proposals/config/locales/fr-CA.yml b/decidim-proposals/config/locales/fr-CA.yml index e6dd7d6a7de8d..e4f570ccde030 100644 --- a/decidim-proposals/config/locales/fr-CA.yml +++ b/decidim-proposals/config/locales/fr-CA.yml @@ -136,8 +136,6 @@ fr-CA: values: state_not_published: Non répondue state_published: Répondue - search_placeholder: - id_string_or_title_cont: Rechercher %{collection} par ID ou titre tooltips: cannot_edit_proposal_info: Impossible de modifier cette proposition car elle a été créée par un participant ou elle a reçu un vote deleted_proposal_states_info: Impossible de supprimer cet état de proposition car il y a des propositions qui lui sont assignées diff --git a/decidim-proposals/config/locales/fr.yml b/decidim-proposals/config/locales/fr.yml index a520999c0f53c..0987e6c20cc81 100644 --- a/decidim-proposals/config/locales/fr.yml +++ b/decidim-proposals/config/locales/fr.yml @@ -136,8 +136,6 @@ fr: values: state_not_published: Non répondue state_published: Répondue - search_placeholder: - id_string_or_title_cont: Rechercher %{collection} par ID ou titre tooltips: cannot_edit_proposal_info: Impossible de modifier cette proposition car elle a été créée par un participant ou elle a reçu un vote deleted_proposal_states_info: Impossible de supprimer cet état de proposition car il y a des propositions qui lui sont assignées diff --git a/decidim-proposals/config/locales/ja.yml b/decidim-proposals/config/locales/ja.yml index c79dfd51d3b96..23a9d86d77cbc 100644 --- a/decidim-proposals/config/locales/ja.yml +++ b/decidim-proposals/config/locales/ja.yml @@ -141,8 +141,6 @@ ja: values: state_not_published: 未回答 state_published: 回答済み - search_placeholder: - id_string_or_title_cont: '%{collection} をIDまたはタイトルで検索' tooltips: cannot_edit_proposal_info: この提案は参加者によって作成されたか投票されているため編集できません deleted_proposal_states_info: 提案に割り当てられているため、この提案状態は削除できません diff --git a/decidim-proposals/config/locales/sv.yml b/decidim-proposals/config/locales/sv.yml index a68921767e9d1..99befa96a9ba9 100644 --- a/decidim-proposals/config/locales/sv.yml +++ b/decidim-proposals/config/locales/sv.yml @@ -143,8 +143,6 @@ sv: values: state_not_published: Ej besvarade state_published: Besvarade - search_placeholder: - id_string_or_title_cont: Sök %{collection} efter ID eller titel tooltips: cannot_edit_proposal_info: Kan inte redigera detta förslag eftersom det är skapat av en deltagare eller redan har fått någon röst deleted_proposal_states_info: Kan inte ta bort detta tillstånd eftersom det finns förslag som är kopplade till det diff --git a/decidim-proposals/decidim-proposals.gemspec b/decidim-proposals/decidim-proposals.gemspec index be8fa8ae0fe04..c041725f9dfd2 100644 --- a/decidim-proposals/decidim-proposals.gemspec +++ b/decidim-proposals/decidim-proposals.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-proposals" s.summary = "Decidim proposals module" diff --git a/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb b/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb index b02491c3c2bf9..1716becf98168 100644 --- a/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb +++ b/decidim-proposals/lib/decidim/proposals/commentable_proposal.rb @@ -24,12 +24,6 @@ def users_to_notify_on_comment_created followers end - - def user_allowed_to_vote_comment?(user) - return unless can_participate_in_space?(user) - - ActionAuthorizer.new(user, "vote_comment", component, self).authorize.ok? - end end end end diff --git a/decidim-proposals/spec/shared/export_proposals_examples.rb b/decidim-proposals/spec/shared/export_proposals_examples.rb index 426a2ddac5921..f7a9f36da71b9 100644 --- a/decidim-proposals/spec/shared/export_proposals_examples.rb +++ b/decidim-proposals/spec/shared/export_proposals_examples.rb @@ -10,7 +10,7 @@ context "with query" do before do - fill_in "q[id_string_or_title_cont]", with: translated(proposals.last.title) + fill_in "q[title_cont]", with: translated(proposals.last.title) find("button[aria-label='Search']").click end diff --git a/decidim-proposals/spec/system/admin/admin_access_spec.rb b/decidim-proposals/spec/system/admin/admin_access_spec.rb new file mode 100644 index 0000000000000..83a6b2c22e02f --- /dev/null +++ b/decidim-proposals/spec/system/admin/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "proposals" } + let!(:proposal) { create(:proposal, :official, component:) } + let(:title) { "Proposals" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-proposals/spec/system/admin/filter_proposals_spec.rb b/decidim-proposals/spec/system/admin/filter_proposals_spec.rb index 2f8769208f937..2003cd3c4b8ed 100644 --- a/decidim-proposals/spec/system/admin/filter_proposals_spec.rb +++ b/decidim-proposals/spec/system/admin/filter_proposals_spec.rb @@ -212,7 +212,7 @@ def proposal_without_state(token) end end - context "when searching by ID or title" do + context "when searching by title" do let!(:proposal1) { create(:proposal, component:) } let!(:proposal2) { create(:proposal, component:) } let!(:proposal1_title) { ActionView::Base.full_sanitizer.sanitize(translated(proposal1.title)) } @@ -220,12 +220,6 @@ def proposal_without_state(token) before { visit_component_admin } - it "can be searched by ID" do - search_by_text(proposal1.id) - - expect(page).to have_content(proposal1_title) - end - it "can be searched by title" do search_by_text(proposal2_title) diff --git a/decidim-proposals/spec/system/edit_proposal_spec.rb b/decidim-proposals/spec/system/edit_proposal_spec.rb index 5f9ace7a74881..0126c3c1cc8c9 100644 --- a/decidim-proposals/spec/system/edit_proposal_spec.rb +++ b/decidim-proposals/spec/system/edit_proposal_spec.rb @@ -98,7 +98,7 @@ click_on("Edit attachments") within ".upload-modal" do expect(page).to have_content("Has to be an image or a document") - expect(page).to have_content("If it is an image, it preferably be a landscape image that does not have any text. The service crops the image.") + expect(page).to have_content("If it is an image, it preferably be a landscape image that does not have any text. The platform crops the image.") within "[data-filename='city.jpeg']" do find("input[type='text']").set(attachment_image_title) end diff --git a/decidim-proposals/spec/system/proposal_show_spec.rb b/decidim-proposals/spec/system/proposal_show_spec.rb index 2f775e3297852..60e99f5cf1200 100644 --- a/decidim-proposals/spec/system/proposal_show_spec.rb +++ b/decidim-proposals/spec/system/proposal_show_spec.rb @@ -65,6 +65,9 @@ def visit_proposal end it "successfully shows the page" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end expect(page).to have_content("Deleted participant") end end diff --git a/decidim-proposals/spec/system/proposals_spec.rb b/decidim-proposals/spec/system/proposals_spec.rb index 0c483739de399..a3b78bd55fb55 100644 --- a/decidim-proposals/spec/system/proposals_spec.rb +++ b/decidim-proposals/spec/system/proposals_spec.rb @@ -89,6 +89,11 @@ end it "shows the author as official" do + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(official_proposal.title)) + end + expect(page).to have_content("Official proposal") end diff --git a/decidim-proposals/spec/system/proposals_versions_spec.rb b/decidim-proposals/spec/system/proposals_versions_spec.rb index 1d428ad0c8258..34896c771ac05 100644 --- a/decidim-proposals/spec/system/proposals_versions_spec.rb +++ b/decidim-proposals/spec/system/proposals_versions_spec.rb @@ -130,6 +130,11 @@ visit current_path click_on("Version 3 of 3") + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(proposal.reload.title)) + end + within "#diff-for-state" do expect(page).to have_content("State") within ".diff > ul > .ins" do diff --git a/decidim-sortitions/README.md b/decidim-sortitions/README.md deleted file mode 100644 index db4e9be596b65..0000000000000 --- a/decidim-sortitions/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Decidim::Sortitions - -This module makes possible to select among a set of proposals by sortition. - -## Usage - -Simply include it in your Decidim instance. - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'decidim-sortitions' -``` - -And then execute: - -```bash -bundle -``` - -## Import migrations - -After installing the gem you must import and execute the migrations bundled with the gem: - -```bash -bundle exec rails decidim_sortitions:install:migrations -bundle exec rails db:migrate -``` - -## Contributing - -See [Decidim](https://github.com/decidim/decidim). - -## License - -See [Decidim](https://github.com/decidim/decidim). diff --git a/decidim-sortitions/Rakefile b/decidim-sortitions/Rakefile deleted file mode 100644 index 447b5c1bf263a..0000000000000 --- a/decidim-sortitions/Rakefile +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require "decidim/dev/common_rake" diff --git a/decidim-sortitions/app/cells/decidim/sortitions/sortition_cell.rb b/decidim-sortitions/app/cells/decidim/sortitions/sortition_cell.rb deleted file mode 100644 index 5362c6d9effb3..0000000000000 --- a/decidim-sortitions/app/cells/decidim/sortitions/sortition_cell.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -require "cell/partial" - -module Decidim - module Sortitions - # This cell renders the card for an instance of a Sortition - # the default size is the Medium Card (:m) - class SortitionCell < Decidim::ViewModel - def show - cell card_size, model, @options - end - - private - - def card_size - "decidim/sortitions/sortition_l" - end - end - end -end diff --git a/decidim-sortitions/app/cells/decidim/sortitions/sortition_l_cell.rb b/decidim-sortitions/app/cells/decidim/sortitions/sortition_l_cell.rb deleted file mode 100644 index 4efe149f6e30e..0000000000000 --- a/decidim-sortitions/app/cells/decidim/sortitions/sortition_l_cell.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -require "cell/partial" - -module Decidim - module Sortitions - # This cell renders a sortition with its L-size card. - class SortitionLCell < Decidim::CardLCell - include Decidim::Sortitions::Engine.routes.url_helpers - - private - - def has_author? - false - end - - def has_state? - true - end - - def metadata_cell - "decidim/sortitions/sortition_metadata" - end - end - end -end diff --git a/decidim-sortitions/app/cells/decidim/sortitions/sortition_metadata_cell.rb b/decidim-sortitions/app/cells/decidim/sortitions/sortition_metadata_cell.rb deleted file mode 100644 index e963fb00f69e9..0000000000000 --- a/decidim-sortitions/app/cells/decidim/sortitions/sortition_metadata_cell.rb +++ /dev/null @@ -1,66 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # This cell renders the assembly metadata for l card - class SortitionMetadataCell < Decidim::CardMetadataCell - include Decidim::Sortitions::SortitionsHelper - - delegate :state, to: :model - - def initialize(*) - super - - @items.prepend(*sortition_items) - end - - def sortition_items - [count_item, seed_item, badge_item] - end - - def count_item - { - text: data_with_text(proposals_count, t("decidim.sortitions.sortitions.sortition.selected_proposals", count: proposals_count)), - icon: "chat-new-line" - } - end - - def seed_item - { - text: data_with_text(model.seed, t("random_seed", scope: "decidim.sortitions.sortitions.sortition")), - icon: "seedling-line" - } - end - - def badge_item - { - text: content_tag(:span, class: "label #{state_classes}") { badge_name } - } - end - - def has_badge? - false - end - - def badge_name - return t("filters.cancelled", scope: "decidim.sortitions.sortitions") if model.cancelled? - - t("filters.active", scope: "decidim.sortitions.sortitions") - end - - def data_with_text(data, text) - "#{content_tag(:strong) { data }}#{content_tag(:span) { text }}".html_safe - end - - def state_classes - return "alert" if model.cancelled? - - "success" - end - - def proposals_count - @proposals_count = model.proposals.count - end - end - end -end diff --git a/decidim-sortitions/app/commands/decidim/sortitions/admin/create_sortition.rb b/decidim-sortitions/app/commands/decidim/sortitions/admin/create_sortition.rb deleted file mode 100644 index e07abfabc6edb..0000000000000 --- a/decidim-sortitions/app/commands/decidim/sortitions/admin/create_sortition.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # Command that creates a sortition that selects proposals - class CreateSortition < Decidim::Command - # Public: Initializes the command. - # - # form - A form object with the params. - def initialize(form) - @form = form - end - - # Executes the command. Broadcasts these events: - # - # - :ok when everything is valid. - # - :invalid if the form was not valid and we could not proceed. - # - # Returns nothing. - def call - return broadcast(:invalid) if form.invalid? - - ActiveRecord::Base.transaction do - sortition = create_sortition - select_proposals_for(sortition) - send_notification(sortition) - - broadcast(:ok, sortition) - end - end - - private - - attr_reader :form - - def create_sortition - Decidim.traceability.create!( - Sortition, - form.current_user, - component: form.current_component, - title: form.title, - decidim_proposals_component_id: form.decidim_proposals_component_id, - request_timestamp: Time.now.utc, - author: form.current_user, - dice: form.dice, - target_items: form.target_items, - witnesses: form.witnesses, - additional_info: form.additional_info, - selected_proposals: [], - candidate_proposals: [], - taxonomizations: form.taxonomizations - ) - end - - def select_proposals_for(sortition) - draw = Draw.new(sortition.reload) - - sortition.update( - selected_proposals: draw.results, - candidate_proposals: draw.proposals.pluck(:id) - ) - end - - def send_notification(sortition) - Decidim::EventsManager.publish( - event: "decidim.events.sortitions.sortition_created", - event_class: Decidim::Sortitions::CreateSortitionEvent, - resource: sortition, - followers: sortition.participatory_space.followers - ) - end - end - end - end -end diff --git a/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb b/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb deleted file mode 100644 index 31f7b8a89bdcb..0000000000000 --- a/decidim-sortitions/app/commands/decidim/sortitions/admin/destroy_sortition.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # Command that cancels a sortition - class DestroySortition < Decidim::Command - # Public: Initializes the command. - # - # form - A form object with the params. - def initialize(form) - @form = form - end - - # Executes the command. Broadcasts these events: - # - # - :ok when everything is valid. - # - :invalid if the form was not valid and we could not proceed. - # - # Returns nothing. - def call - return broadcast(:invalid) if form.invalid? - - destroy_sortition - broadcast(:ok, sortition) - end - - private - - attr_reader :form - - def destroy_sortition - Decidim.traceability.perform_action!( - :delete, - sortition, - form.current_user - ) do - sortition.update( - cancel_reason: form.cancel_reason, - cancelled_on: Time.now.utc, - cancelled_by_user: form.current_user - ) - end - end - - def sortition - @sortition ||= Sortition.find(form.id) - end - end - end - end -end diff --git a/decidim-sortitions/app/commands/decidim/sortitions/admin/update_sortition.rb b/decidim-sortitions/app/commands/decidim/sortitions/admin/update_sortition.rb deleted file mode 100644 index bd902e265f518..0000000000000 --- a/decidim-sortitions/app/commands/decidim/sortitions/admin/update_sortition.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # Command that creates a sortition that selects proposals - class UpdateSortition < Decidim::Command - # Public: Initializes the command. - # - # form - A form object with the params. - def initialize(form) - @form = form - end - - # Executes the command. Broadcasts these events: - # - # - :ok when everything is valid. - # - :invalid if the form was not valid and we could not proceed. - # - # Returns nothing. - def call - return broadcast(:invalid) if form.invalid? - - update_sortition - broadcast(:ok, sortition) - end - - private - - attr_reader :form - - def update_sortition - Decidim.traceability.update!( - sortition, - form.current_user, - title: form.title, - additional_info: form.additional_info - ) - end - - def sortition - @sortition ||= Sortition.find(form.id) - end - end - end - end -end diff --git a/decidim-sortitions/app/controllers/concerns/decidim/sortitions/orderable.rb b/decidim-sortitions/app/controllers/concerns/decidim/sortitions/orderable.rb deleted file mode 100644 index bd6dbd466d5ab..0000000000000 --- a/decidim-sortitions/app/controllers/concerns/decidim/sortitions/orderable.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module Sortitions - # Common logic to ordering resources - module Orderable - extend ActiveSupport::Concern - - included do - include Decidim::Orderable - - private - - # Available orders based on enabled settings - def available_orders - %w(random recent) - end - - def default_order - "recent" - end - - def reorder(sortitions) - case order - when "random" - sortitions.order_randomly(random_seed) - when "recent" - sortitions.order(created_at: :desc) - end - end - end - end - end -end diff --git a/decidim-sortitions/app/controllers/decidim/sortitions/admin/application_controller.rb b/decidim-sortitions/app/controllers/decidim/sortitions/admin/application_controller.rb deleted file mode 100644 index 931879e941ee4..0000000000000 --- a/decidim-sortitions/app/controllers/decidim/sortitions/admin/application_controller.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # This controller is the abstract class from which all other controllers of - # this engine inherit. - # - # Note that it inherits from `Decidim::Components::BaseController`, which - # override its layout and provide all kinds of useful methods. - class ApplicationController < Decidim::Admin::Components::BaseController - helper_method :sortitions, :sortition - - def sortitions - @sortitions ||= Decidim::Sortitions::FilteredSortitions - .for(current_component) - .order(created_at: :desc) - .page(params[:page]) - .per(Decidim::Sortitions.items_per_page) - end - - def sortition - @sortition ||= sortitions.find(params[:id]) - end - end - end - end -end diff --git a/decidim-sortitions/app/controllers/decidim/sortitions/admin/sortitions_controller.rb b/decidim-sortitions/app/controllers/decidim/sortitions/admin/sortitions_controller.rb deleted file mode 100644 index d141be3116e16..0000000000000 --- a/decidim-sortitions/app/controllers/decidim/sortitions/admin/sortitions_controller.rb +++ /dev/null @@ -1,107 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # Controller responsible of the sortition that selects proposals from - # a participatory space. - class SortitionsController < Admin::ApplicationController - helper Decidim::ApplicationHelper - helper_method :proposal_components - - def index; end - - def show - enforce_permission_to :read, :sortition, sortition: - end - - def edit - enforce_permission_to(:update, :sortition, sortition:) - - @form = edit_sortition_form.from_model(sortition, current_participatory_space:) - end - - def update - enforce_permission_to(:update, :sortition, sortition:) - - @form = edit_sortition_form.from_params(params, current_participatory_space:) - UpdateSortition.call(@form) do - on(:ok) do |_sortition| - flash[:notice] = I18n.t("sortitions.update.success", scope: "decidim.sortitions.admin") - redirect_to action: :index - end - - on(:invalid) do - flash.now[:alert] = I18n.t("sortitions.update.error", scope: "decidim.sortitions.admin") - render :edit, status: :unprocessable_entity - end - end - end - - def new - enforce_permission_to :create, :sortition - - @form = sortition_form.instance(current_participatory_space:) - end - - def create - enforce_permission_to :create, :sortition - - @form = sortition_form.from_params(params, current_participatory_space:) - CreateSortition.call(@form) do - on(:ok) do |sortition| - flash[:notice] = I18n.t("sortitions.create.success", scope: "decidim.sortitions.admin") - redirect_to action: :show, id: sortition.id - end - - on(:invalid) do - flash.now[:alert] = I18n.t("sortitions.create.error", scope: "decidim.sortitions.admin") - render :new, status: :unprocessable_entity - end - end - end - - def confirm_destroy - enforce_permission_to(:destroy, :sortition, sortition:) - - @form = destroy_sortition_form.from_model(sortition, current_participatory_space:) - end - - def destroy - enforce_permission_to(:destroy, :sortition, sortition:) - - @form = destroy_sortition_form.from_params(params, current_participatory_space:) - DestroySortition.call(@form) do - on(:ok) do |_sortition| - flash[:notice] = I18n.t("sortitions.destroy.success", scope: "decidim.sortitions.admin") - redirect_to action: :index - end - - on(:invalid) do - flash.now[:alert] = I18n.t("sortitions.destroy.error", scope: "decidim.sortitions.admin") - render :confirm_destroy, status: :unprocessable_entity - end - end - end - - private - - def sortition_form - form(SortitionForm) - end - - def edit_sortition_form - form(EditSortitionForm) - end - - def destroy_sortition_form - form(DestroySortitionForm) - end - - def proposal_components - ParticipatorySpaceProposalComponents.for(current_participatory_space) - end - end - end - end -end diff --git a/decidim-sortitions/app/controllers/decidim/sortitions/application_controller.rb b/decidim-sortitions/app/controllers/decidim/sortitions/application_controller.rb deleted file mode 100644 index c4cf388be48de..0000000000000 --- a/decidim-sortitions/app/controllers/decidim/sortitions/application_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # This controller is the abstract class from which all other controllers of - # this engine inherit. - # - # Note that it inherits from `Decidim::Components::BaseController`, which - # override its layout and provide all kinds of useful methods. - class ApplicationController < Decidim::Components::BaseController - end - end -end diff --git a/decidim-sortitions/app/controllers/decidim/sortitions/sortitions_controller.rb b/decidim-sortitions/app/controllers/decidim/sortitions/sortitions_controller.rb deleted file mode 100644 index 16bff994db426..0000000000000 --- a/decidim-sortitions/app/controllers/decidim/sortitions/sortitions_controller.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # Exposes the sortition resource so users can view them - class SortitionsController < Decidim::Sortitions::ApplicationController - include FilterResource - include Decidim::Sortitions::Orderable - include Paginable - - helper_method :sortition - - helper Decidim::Proposals::ApplicationHelper - - def index - @sortitions = search - .result - .includes(:taxonomies) - - @sortitions = reorder(@sortitions) - @sortitions = paginate(@sortitions) - end - - def show - raise ActionController::RoutingError, "Not Found" unless sortition - end - - private - - def sortition - search_collection.find_by(id: params[:id]) - end - - def search_collection - Sortition.where(component: current_component) - end - - def default_filter_params - { - search_text_cont: "", - with_any_taxonomies: nil, - with_any_state: "active" - } - end - end - end -end diff --git a/decidim-sortitions/app/events/decidim/sortitions/create_sortition_event.rb b/decidim-sortitions/app/events/decidim/sortitions/create_sortition_event.rb deleted file mode 100644 index 77ef4e07de555..0000000000000 --- a/decidim-sortitions/app/events/decidim/sortitions/create_sortition_event.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class CreateSortitionEvent < Decidim::Events::SimpleEvent - end - end -end diff --git a/decidim-sortitions/app/forms/decidim/sortitions/admin/destroy_sortition_form.rb b/decidim-sortitions/app/forms/decidim/sortitions/admin/destroy_sortition_form.rb deleted file mode 100644 index 5a25c9a7ee1d8..0000000000000 --- a/decidim-sortitions/app/forms/decidim/sortitions/admin/destroy_sortition_form.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - class DestroySortitionForm < Form - include TranslatableAttributes - - mimic :sortition - - translatable_attribute :cancel_reason, Decidim::Attributes::RichText - - validates :cancel_reason, translatable_presence: true - - delegate :current_participatory_space, to: :context - delegate :current_component, to: :context - end - end - end -end diff --git a/decidim-sortitions/app/forms/decidim/sortitions/admin/edit_sortition_form.rb b/decidim-sortitions/app/forms/decidim/sortitions/admin/edit_sortition_form.rb deleted file mode 100644 index a63bd7f58d111..0000000000000 --- a/decidim-sortitions/app/forms/decidim/sortitions/admin/edit_sortition_form.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - class EditSortitionForm < Form - include TranslatableAttributes - - mimic :sortition - - translatable_attribute :title, String - translatable_attribute :additional_info, Decidim::Attributes::RichText - - validates :title, translatable_presence: true - validates :additional_info, translatable_presence: true - - delegate :current_participatory_space, to: :context - delegate :current_component, to: :context - end - end - end -end diff --git a/decidim-sortitions/app/forms/decidim/sortitions/admin/sortition_form.rb b/decidim-sortitions/app/forms/decidim/sortitions/admin/sortition_form.rb deleted file mode 100644 index d7c1d745fd60e..0000000000000 --- a/decidim-sortitions/app/forms/decidim/sortitions/admin/sortition_form.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - class SortitionForm < Form - include Decidim::TranslatableAttributes - include Decidim::HasTaxonomyFormAttributes - - mimic :sortition - - translatable_attribute :title, String - attribute :decidim_proposals_component_id, Integer - attribute :dice, Integer - attribute :target_items, Integer - translatable_attribute :witnesses, Decidim::Attributes::RichText - translatable_attribute :additional_info, Decidim::Attributes::RichText - - validates :title, translatable_presence: true - validates :decidim_proposals_component_id, presence: true - validates :witnesses, translatable_presence: true - validates :additional_info, translatable_presence: true - validates :dice, - presence: true, - numericality: { - only_integer: true, - greater_than_or_equal_to: 1, - less_than_or_equal_to: 6 - } - - validates :target_items, - presence: true, - numericality: { - only_integer: true, - greater_than_or_equal_to: 1 - } - - delegate :current_participatory_space, to: :context - delegate :current_component, to: :context - - def participatory_space_manifest - @participatory_space_manifest ||= current_component.participatory_space.manifest.name - end - end - end - end -end diff --git a/decidim-sortitions/app/helpers/decidim/sortitions/admin/sortitions_helper.rb b/decidim-sortitions/app/helpers/decidim/sortitions/admin/sortitions_helper.rb deleted file mode 100644 index 5738b747c7d33..0000000000000 --- a/decidim-sortitions/app/helpers/decidim/sortitions/admin/sortitions_helper.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - module SortitionsHelper - include Decidim::TranslationsHelper - include Decidim::PaginateHelper - include Decidim::SanitizeHelper - - # Converts a list of components into a list of selectable options - def components_options(components) - components.map do |f| - [translated_attribute(f.name), f.id] - end - end - - def sortition_taxonomies(sortition) - taxonomies = sortition.taxonomies.map { |taxonomy| decidim_sanitize_translated(taxonomy.name) }.join(", ") - return taxonomies if taxonomies.present? - - I18n.t("sortitions.form.all_taxonomies", scope: "decidim.sortitions.admin") - end - end - end - end -end diff --git a/decidim-sortitions/app/helpers/decidim/sortitions/sortitions_helper.rb b/decidim-sortitions/app/helpers/decidim/sortitions/sortitions_helper.rb deleted file mode 100644 index aee3f69e959f4..0000000000000 --- a/decidim-sortitions/app/helpers/decidim/sortitions/sortitions_helper.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module SortitionsHelper - include Decidim::SanitizeHelper - include Decidim::TranslationsHelper - - def proposal_path(proposal) - EngineRouter.main_proxy(proposal.component).proposal_path(proposal) - end - - def component_name - (defined?(current_component) && translated_attribute(current_component&.name).presence) || t("decidim.components.sortitions.name") - end - - # Generates the sortition taxonomy labels - def sortition_taxonomy_labels(sortition) - if sortition.taxonomies.present? - return I18n.t("show.taxonomies", - scope: "decidim.sortitions.sortitions", - taxonomies: sortition.taxonomies.map { |taxonomy| decidim_sanitize_translated(taxonomy.name) }.join(", ")) - end - - I18n.t("show.any_taxonomy", scope: "decidim.sortitions.sortitions") - end - - # Show list of candidate proposals for a sortition. Selected sortition ids will appear with bold font. - def sortition_proposal_candidate_ids(sortition) - result = sortition.candidate_proposals.map do |proposal_id| - if sortition.selected_proposals.include? proposal_id - "#{proposal_id}" - else - proposal_id.to_s - end - end - - result.join(" - ").html_safe - end - - def filter_sections_sortitions - sections = [{ method: :with_any_state, collection: filter_state_values, label: t("decidim.sortitions.sortitions.filters.state"), id: "state" }] - current_component.available_taxonomy_filters.each do |taxonomy_filter| - sections.append(method: "with_any_taxonomies[#{taxonomy_filter.root_taxonomy_id}]", - collection: filter_taxonomy_values_for(taxonomy_filter), - label: decidim_sanitize_translated(taxonomy_filter.name), - id: "taxonomy-#{taxonomy_filter.root_taxonomy_id}") - end - sections.reject { |item| item[:collection].blank? } - end - - def filter_state_values - [ - ["all", t("all", scope: "decidim.sortitions.sortitions.filters")], - ["active", t("active", scope: "decidim.sortitions.sortitions.filters")], - ["cancelled", t("cancelled", scope: "decidim.sortitions.sortitions.filters")] - ] - end - end - end -end diff --git a/decidim-sortitions/app/models/decidim/sortitions/application_record.rb b/decidim-sortitions/app/models/decidim/sortitions/application_record.rb deleted file mode 100644 index b13b03ac11a62..0000000000000 --- a/decidim-sortitions/app/models/decidim/sortitions/application_record.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true - end - end -end diff --git a/decidim-sortitions/app/models/decidim/sortitions/sortition.rb b/decidim-sortitions/app/models/decidim/sortitions/sortition.rb deleted file mode 100644 index dd76e50716957..0000000000000 --- a/decidim-sortitions/app/models/decidim/sortitions/sortition.rb +++ /dev/null @@ -1,104 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # Model that encapsulates the parameters of a sortition - class Sortition < ApplicationRecord - include Decidim::Resourceable - include Decidim::HasCategory - include Decidim::Taxonomizable - include Decidim::Authorable - include Decidim::HasComponent - include Decidim::HasReference - include Decidim::Traceable - include Decidim::Loggable - include Decidim::Comments::CommentableWithComponent - include Decidim::Randomable - include Decidim::TranslatableResource - include Decidim::FilterableResource - - component_manifest_name "sortitions" - - translatable_fields :title, :witnesses, :additional_info, :cancel_reason - - belongs_to :decidim_proposals_component, - class_name: "Decidim::Component" - - belongs_to :cancelled_by_user, - class_name: "Decidim::User", - optional: true - - scope :active, -> { where(cancelled_on: nil) } - scope :cancelled, -> { where.not(cancelled_on: nil) } - - scope_search_multi :with_any_state, [:active, :cancelled] - - def self.log_presenter_class_for(_log) - Decidim::Sortitions::AdminLog::SortitionPresenter - end - - def presenter - Decidim::Sortitions::SortitionPresenter.new(self) - end - - def proposals - Decidim::Proposals::Proposal.where(id: selected_proposals) - end - - def similar_count - Sortition.where(component:) - .where(decidim_proposals_component:) - .with_taxonomies(*taxonomies.map(&:id)) - .where(target_items:) - .count - end - - def seed - request_timestamp.to_i * dice - end - - def cancelled? - cancelled_on.present? - end - - # Public: Overrides the `accepts_new_comments?` Commentable concern method. - def accepts_new_comments? - commentable? - end - - # Public: Overrides the `comments_have_alignment?` Commentable concern method. - def comments_have_alignment? - true - end - - # Public: Overrides the `comments_have_votes?` Commentable concern method. - def comments_have_votes? - true - end - - # Public: Overrides the `allow_resource_permissions?` Resourceable concern method. - def allow_resource_permissions? - true - end - - # Create i18n ransackers for :title, :additional_info and :witnesses. - # Create the :search_text ransacker alias for searching from all of these. - ransacker_i18n_multi :search_text, [:title, :additional_info, :witnesses] - - def self.ransackable_scopes(_auth_object = nil) - [:with_any_state, :with_any_taxonomies] - end - - def self.ransackable_attributes(_auth_object = nil) - %w(additional_info cancel_reason cancelled_by_user_id cancelled_on candidate_proposals comments_count created_at decidim_author_id - decidim_author_type decidim_component_id decidim_proposals_component_id dice id reference request_timestamp search_text selected_proposals - target_items title updated_at witnesses) - end - - def self.ransackable_associations(_auth_object = nil) - %w(author cancelled_by_user taxonomies comment_threads comments component decidim_proposals_component resource_links_from - resource_links_to resource_permission versions) - end - end - end -end diff --git a/decidim-sortitions/app/packs/entrypoints/decidim_sortitions.js b/decidim-sortitions/app/packs/entrypoints/decidim_sortitions.js deleted file mode 100644 index 4714ea2999817..0000000000000 --- a/decidim-sortitions/app/packs/entrypoints/decidim_sortitions.js +++ /dev/null @@ -1,5 +0,0 @@ -// Images -require.context("../images", true) - -// CSS -import "stylesheets/sortitions.scss" diff --git a/decidim-sortitions/app/packs/images/decidim/sortitions/icon.svg b/decidim-sortitions/app/packs/images/decidim/sortitions/icon.svg deleted file mode 100644 index 18a213251e924..0000000000000 --- a/decidim-sortitions/app/packs/images/decidim/sortitions/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/decidim-sortitions/app/packs/stylesheets/sortitions.scss b/decidim-sortitions/app/packs/stylesheets/sortitions.scss deleted file mode 100644 index b33b7ecedc640..0000000000000 --- a/decidim-sortitions/app/packs/stylesheets/sortitions.scss +++ /dev/null @@ -1,31 +0,0 @@ -.sortition { - &__aside-element { - &-item { - @apply border-b border-gray-3 py-4 first:pt-0 last:pb-0 last:border-b-0; - } - - &-item__title { - @apply text-sm block text-gray-2 mb-1; - } - - &-item__text { - @apply text-md block font-semibold text-gray-2; - } - - &-item__numbers { - @apply text-md block text-gray-2; - } - } - - &__aside__count-number { - @apply text-5xl block text-center text-gray-2 font-bold; - } - - &__aside__count-text { - @apply text-gray-2 text-sm block text-center; - } -} - -a.sortition__aside-element-item__title { - @apply text-secondary underline; -} diff --git a/decidim-sortitions/app/permissions/decidim/sortitions/admin/permissions.rb b/decidim-sortitions/app/permissions/decidim/sortitions/admin/permissions.rb deleted file mode 100644 index f6862148055d3..0000000000000 --- a/decidim-sortitions/app/permissions/decidim/sortitions/admin/permissions.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - class Permissions < Decidim::DefaultPermissions - def permissions - return permission_action unless user - - return permission_action if permission_action.scope != :admin - - return permission_action if permission_action.subject != :sortition - - case permission_action.action - when :destroy - permission_action.allow! if sortition.present? && !sortition.cancelled? - when :update - permission_action.allow! if sortition.present? - when :create, :read - permission_action.allow! - end - - permission_action - end - - private - - def sortition - @sortition ||= context.fetch(:sortition, nil) - end - end - end - end -end diff --git a/decidim-sortitions/app/permissions/decidim/sortitions/permissions.rb b/decidim-sortitions/app/permissions/decidim/sortitions/permissions.rb deleted file mode 100644 index 06868f0ef0e6c..0000000000000 --- a/decidim-sortitions/app/permissions/decidim/sortitions/permissions.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class Permissions < Decidim::DefaultPermissions - def permissions - return permission_action unless user - - return Decidim::Sortitions::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin - - permission_action - end - end - end -end diff --git a/decidim-sortitions/app/presenters/decidim/sortitions/admin_log/sortition_presenter.rb b/decidim-sortitions/app/presenters/decidim/sortitions/admin_log/sortition_presenter.rb deleted file mode 100644 index 9b3e58631d184..0000000000000 --- a/decidim-sortitions/app/presenters/decidim/sortitions/admin_log/sortition_presenter.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module AdminLog - # This class holds the logic to present a `Decidim::Sortitions::Sortition` - # for the `AdminLog` log. - # - # Usage should be automatic and you should not need to call this class - # directly, but here is an example: - # - # action_log = Decidim::ActionLog.last - # view_helpers # => this comes from the views - # SortitionPresenter.new(action_log, view_helpers).present - class SortitionPresenter < Decidim::Log::BasePresenter - private - - def action_string - case action - when "create", "delete", "update" - "decidim.sortitions.admin_log.sortition.#{action}" - else - super - end - end - - def diff_fields_mapping - { - cancel_reason: :i18n, - dice: :integer, - request_timestamp: :date, - witnesses: :i18n, - additional_info: :i18n, - title: :i18n, - reference: :string, - decidim_proposals_component_id: :component - } - end - - def i18n_labels_scope - "activemodel.attributes.sortition" - end - - def diff_actions - super + %w(delete) - end - end - end - end -end diff --git a/decidim-sortitions/app/presenters/decidim/sortitions/sortition_presenter.rb b/decidim-sortitions/app/presenters/decidim/sortitions/sortition_presenter.rb deleted file mode 100644 index 7dce97178ed43..0000000000000 --- a/decidim-sortitions/app/presenters/decidim/sortitions/sortition_presenter.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class SortitionPresenter < Decidim::ResourcePresenter - def sortition - __getobj__ - end - - def title(html_escape: false, all_locales: false) - return unless sortition - - super(sortition.title, html_escape, all_locales) - end - end - end -end diff --git a/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposal_components.rb b/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposal_components.rb deleted file mode 100644 index f666fc73db64b..0000000000000 --- a/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposal_components.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # Query that retrieves a list of proposal components - class ParticipatorySpaceProposalComponents < Decidim::Query - attr_reader :participatory_space - - # Sugar syntax. Allow retrieving all proposal components for the - # given participatory space. - def self.for(participatory_space) - new(participatory_space).query - end - - # Initializes the query - def initialize(participatory_space) - @participatory_space = participatory_space - end - - def query - Component - .where(participatory_space:, manifest_name: "proposals") - .published - end - end - end - end -end diff --git a/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposals.rb b/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposals.rb deleted file mode 100644 index c436449f8d629..0000000000000 --- a/decidim-sortitions/app/queries/decidim/sortitions/admin/participatory_space_proposals.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - class ParticipatorySpaceProposals < Decidim::Query - # Sugar syntax. Retrieve all proposals for the given sortition. - def self.for(sortition) - new(sortition).query - end - - # Initializes the class. - # - # sortition - a sortition to select proposals - def initialize(sortition) - @sortition = sortition - @taxonomies = sortition.taxonomies - @request_timestamp = sortition.request_timestamp - end - - # Given a participatory process retrieves its proposals - # - # Returns an ActiveRecord::Relation. - def query - proposals = Decidim::Proposals::Proposal - .not_withdrawn - .published - .not_hidden - .where(decidim_proposals_proposals: { created_at: ...request_timestamp }) - .where(component: sortition.decidim_proposals_component) - proposals = proposals.where.not(id: proposals.only_status(:rejected)) - - return proposals.order(id: :asc) if taxonomies.blank? - - # taxonomization -> taxonomy - proposals.with_taxonomies(*taxonomies.map(&:id)).order(id: :asc) - end - - private - - attr_reader :sortition, :taxonomies, :request_timestamp - end - end - end -end diff --git a/decidim-sortitions/app/queries/decidim/sortitions/filtered_sortitions.rb b/decidim-sortitions/app/queries/decidim/sortitions/filtered_sortitions.rb deleted file mode 100644 index fd5d2f9bf595a..0000000000000 --- a/decidim-sortitions/app/queries/decidim/sortitions/filtered_sortitions.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # A class used to find sortitions filtered by components and a date range - class FilteredSortitions < Decidim::Query - # Syntactic sugar to initialize the class and return the queried objects. - # - # components - An array of Decidim::Component - # start_at - A date to filter resources created after it - # end_at - A date to filter resources created before it. - def self.for(components, start_at = nil, end_at = nil) - new(components, start_at, end_at).query - end - - # Initializes the class. - # - # components - An array of Decidim::Component - # start_at - A date to filter resources created after it - # end_at - A date to filter resources created before it. - def initialize(components, start_at = nil, end_at = nil) - @components = components - @start_at = start_at - @end_at = end_at - end - - # Finds the Proposals scoped to an array of components and filtered - # by a range of dates. - def query - sortitions = Decidim::Sortitions::Sortition.where(component: @components) - sortitions = sortitions.where(created_at: @start_at..) if @start_at.present? - sortitions = sortitions.where(created_at: ..@end_at) if @end_at.present? - sortitions - end - end - end -end diff --git a/decidim-sortitions/app/services/decidim/sortitions/admin/draw.rb b/decidim-sortitions/app/services/decidim/sortitions/admin/draw.rb deleted file mode 100644 index e438153512e4e..0000000000000 --- a/decidim-sortitions/app/services/decidim/sortitions/admin/draw.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - module Admin - # This class represents a draw for selecting proposals. - class Draw - attr_reader :sortition - - # Sugar syntax. Retrieves the list of selected proposals. - def self.for(sortition) - new(sortition).results - end - - # Initializes the draw class. Receives a sortition. - def initialize(sortition) - @sortition = sortition - end - - # Executes the draw and return the selected proposal ids. - def results - proposals.sample(sortition.target_items, random: Random.new(sortition.seed)).pluck(:id) - end - - def proposals - @proposals ||= ParticipatorySpaceProposals.for(sortition).to_a - end - end - end - end -end diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/_form.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/_form.html.erb deleted file mode 100644 index 25489287a47dc..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/_form.html.erb +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
-
-
- <%= form.translated :text_field, :title, autofocus: true, aria: { label: :title } %> -
- -
- <%= form.select :decidim_proposals_component_id, - components_options(proposal_components), - prompt: t(".select_proposal_component") %> -
-
-
-
- - <% if @form.taxonomy_filters&.any? %> -
-
-
-

<%= t(".select_taxonomies") %>

- <% @form.taxonomy_filters.each do |filter| %> -
- <%= filter_taxonomy_items_select_field form, :taxonomies, filter %> -
- <% end %> -
-
-
- <% end %> - -
-
-
-
- <%= form.number_field :target_items, min: 1, step: 1 %> -
- -
- <%= form.translated :editor, :witnesses, lines: 10, toolbar: :content, aria: { label: :witnesses } %> -
- -
- <%= form.translated :editor, :additional_info, lines: 10, aria: { label: :additional_info } %> -
- -
- <%= form.number_field :dice, min: 1, max: 6, step: 1 %> -
-
-
-
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/confirm_destroy.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/confirm_destroy.html.erb deleted file mode 100644 index b84c52b574ba6..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/confirm_destroy.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -<% add_decidim_page_title(t(".title")) %> - -
-

- <%= t(".title") %> -

-
- -
-
- <%= decidim_form_for(@form, html: { class: "form form-defaults confirm_destroy_sortition" }, method: :delete) do |form| %> -
-
-
-
-
- <%= form.translated :editor, :cancel_reason, lines: 10, toolbar: :content, aria: { label: :cancel_reason } %> -
-
-
-
-
- -
-
- <%= form.submit t(".destroy"), data: { confirm: t(".confirm_destroy") }, class: "button button__sm button__secondary" %> -
-
- <% end %> -
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/edit.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/edit.html.erb deleted file mode 100644 index d0358527b7607..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/edit.html.erb +++ /dev/null @@ -1,32 +0,0 @@ -<% add_decidim_page_title(translated_attribute(sortition.title)) %> -
-

- <%= t ".title" %> -

-
-
-
- <%= decidim_form_for(@form, html: { class: "form-defaults form edit_sortition" }) do |form| %> -
-
-
-
-
- <%= form.translated :text_field, :title, autofocus: true, aria: { label: :title } %> -
- -
- <%= form.translated :editor, :additional_info, lines: 10, aria: { label: :additional_info } %> -
-
-
-
-
-
- <%= form.submit t(".update"), class: "button button__sm button__secondary" %> -
-
-
- <% end %> -
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/index.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/index.html.erb deleted file mode 100644 index 77e1e10651261..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/index.html.erb +++ /dev/null @@ -1,91 +0,0 @@ -<% add_decidim_page_title(t(".title")) %> -
-
-

- <%= t(".title") %> - <% if allowed_to? :create, :sortition %> - <%= link_to t("actions.new_sortition", scope: "decidim.sortitions.admin"), new_sortition_path, class: "button button__sm button__secondary" %> - <% end %> - <%= render partial: "decidim/admin/components/resource_action" %> -

-
- -
<%= t("deprecation_warning_html", scope: "decidim.sortitions.admin") %>
- -
- - - - - - - - - - - <% sortitions.each do |sortition| %> - - - - - - - <% end %> - -
<%= t("models.sortition.fields.reference", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.title", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.created_at", scope: "decidim.sortitions.admin") %>
"> - <%= sortition.reference %> - "> - <% if allowed_to? :update, :sortition, sortition: sortition %> - <%= link_to decidim_escape_translated(sortition.title), edit_sortition_path(sortition) %> - <% else %> - <%= decidim_escape_translated(sortition.title) %> - <% end %> - "> - <%= l sortition.created_at, format: :short %> - "> - - -
- -
-
-
-
-<%= decidim_paginate sortitions %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/new.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/new.html.erb deleted file mode 100644 index d57a32493dc62..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/new.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -<% add_decidim_page_title(t(".title")) %> -
-

- <%= t ".title" %> -

-
-
-
- <%= decidim_form_for(@form, html: { class: "form-defaults form new_sortition" }) do |f| %> - <%= render partial: "form", object: f %> -
-
- <%= f.submit t(".create"), data: { confirm: t(".confirm") }, class: "button button__sm button__secondary" %> -
-
- <% end %> -
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/show.html.erb b/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/show.html.erb deleted file mode 100644 index 18add8ae23136..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/admin/sortitions/show.html.erb +++ /dev/null @@ -1,52 +0,0 @@ -<% add_decidim_page_title(translated_attribute(sortition.title)) %> -
-
-

- <%= decidim_escape_translated(sortition.title) %> -

-
-
- - - - - - - - - - - - - - - - - - - - - - - -
<%= t("models.sortition.fields.request_timestamp", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.dice", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.target_items", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.taxonomies", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.decidim_proposals_component", scope: "decidim.sortitions.admin") %><%= t("models.sortition.fields.seed", scope: "decidim.sortitions.admin") %>
<%= l sortition.request_timestamp, format: :long %><%= sortition.dice %><%= sortition.target_items %><%= sortition_taxonomies sortition %><%= translated_attribute sortition.decidim_proposals_component.name %><%= sortition.seed %>
-
-
- - - - - - - - - <% sortition.proposals.each do |proposal| %> - - - - - <% end %> - -
<%= t ".selected_proposals" %>
<%= decidim_html_escape(present(proposal).title).html_safe %>
-
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_count.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_count.html.erb deleted file mode 100644 index 751caf9872db1..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_count.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t(".proposals_count", count: proposals.count) %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_linked_sortitions.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_linked_sortitions.html.erb deleted file mode 100644 index af624f2addb25..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_linked_sortitions.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -
- <% resources.each do |sortition| %> -
-
- <%= link_to resource_locator(sortition).path do %> - <%= icon "proposals", class: "card--list__icon", remove_icon_class: true %> - <% end %> -
- <%= link_to resource_locator(sortition).path, class: "card__link" do %> -
<%= decidim_escape_translated(sortition.title) %>
- <% end %> -
- - <%= image_tag present(sortition.author).avatar_url %> - - - <%= sortition.author.name %> - -
-
-
-
- - <%= sortition.selected_proposals.size %> - <%= t(".selected_proposals", count: proposal.selected_proposals.size) %> -
-
- <% end %> -
diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_proposal.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_proposal.html.erb deleted file mode 100644 index 04692b7c4dbcb..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_proposal.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= card_for proposal, url_extra_params: { included_in: sortition.to_gid } %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_results_count.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_results_count.html.erb deleted file mode 100644 index eea6586761e8d..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_results_count.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -
- - <%= sortition.selected_proposals.count %> - - - <%= t(".count", count: sortition.selected_proposals.count) %> - -
diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition.html.erb deleted file mode 100644 index 6045fd9f04c28..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= card_for sortition %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_author.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_author.html.erb deleted file mode 100644 index 23b62a738f5cf..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_author.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -
-
- - <%= image_tag present(sortition.author).avatar_url %> - - - <% if sortition.author&.deleted? %> - - <%= t(".deleted") %> - - <% else %> - <%= sortition.author.name %> - <% end %> - - <%= l sortition.created_at, format: :decidim_short %> -
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_cancel_author.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_cancel_author.html.erb deleted file mode 100644 index bab9a58be200a..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortition_cancel_author.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -
-
- - <%= image_tag present(sortition.cancelled_by_user).avatar_url %> - - - <% if sortition.cancelled_by_user&.deleted? %> - - <%= t(".deleted") %> - - <% else %> - <%= sortition.cancelled_by_user.name %> - <% end %> - - <%= l sortition.cancelled_on, format: :decidim_short %> -
-
diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortitions.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortitions.html.erb deleted file mode 100644 index 1b11c51a35efe..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/_sortitions.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -<% if @sortitions.any? %> -

<%= t("count", scope: "decidim.sortitions.sortitions.sortitions_count", count: @sortitions.total_count) %>

- - <%= order_selector available_orders, i18n_scope: "decidim.sortitions.sortitions.orders" %> - -
- <%= render @sortitions %> -
- - <%= decidim_paginate @sortitions %> -<% else %> - <%= cell "decidim/announcement", t("empty", scope: "decidim.sortitions.sortitions.index") %> -<% end %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.html.erb deleted file mode 100644 index 6d61bbc0b71c6..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.html.erb +++ /dev/null @@ -1,22 +0,0 @@ -<% add_decidim_meta_tags( - description: translated_attribute(current_component.participatory_space.try(:description)), - title: t("decidim.components.pagination.page_title", - component_name: component_name, - current_page: @sortitions.current_page, - total_pages: @sortitions.total_pages ), - url: sortitions_url, - resource: current_component) %> - -<% content_for :aside do %> -

<%= component_name %>

- - <%= render layout: "decidim/shared/filters", locals: { filter_sections: filter_sections_sortitions, search_variable: :search_text_cont, skip_to_id: "sortitions" } do %> - <%= hidden_field_tag :order, order, id: nil, class: "order_filter" %> - <% end %> -<% end %> - -<%= render layout: "layouts/decidim/shared/layout_two_col" do %> -
- <%= render partial: "sortitions" %> -
-<% end %> diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.js.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.js.erb deleted file mode 100644 index 9134fea0d2c4d..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/index.js.erb +++ /dev/null @@ -1,5 +0,0 @@ -var $sortitions = $('#sortitions'); -var $orderFilterInput = $('.order_filter'); - -$sortitions.html('<%= j(render partial: "sortitions").strip.html_safe %>'); -$orderFilterInput.val('<%= order %>'); diff --git a/decidim-sortitions/app/views/decidim/sortitions/sortitions/show.html.erb b/decidim-sortitions/app/views/decidim/sortitions/sortitions/show.html.erb deleted file mode 100644 index 51761aa0e7bda..0000000000000 --- a/decidim-sortitions/app/views/decidim/sortitions/sortitions/show.html.erb +++ /dev/null @@ -1,145 +0,0 @@ -<% add_decidim_meta_tags( - description: decidim_sanitize_editor(translated_attribute(sortition.additional_info)), - title: decidim_escape_translated(sortition.title), - url: sortition_url(sortition.to_param), - resource: sortition) %> - -<% -edit_link( - resource_locator(sortition).edit, - :update, - :sortition, - sortition: -) -%> - -<%= append_javascript_pack_tag "decidim_sortitions" %> -<%= append_stylesheet_pack_tag "decidim_sortitions" %> - -<%= render layout: "layouts/decidim/shared/layout_item", locals: { back_path: :sortitions, commentable: sortition } do %> - <%= cell("decidim/announcement", t("introduction", scope: "decidim.sortitions.sortitions.show", reference: sortition.id, target_items: sortition.target_items), callout_class: "secondary") %> - -
-

- <%= decidim_escape_translated(sortition.title) %> -

-
- <%= cell "decidim/author", present(sortition.author), context_actions: [:date], from: sortition, layout: :compact %> - <% if sortition.author&.deleted? %> - - <%= t("deleted", scope: "decidim.sortitions.sortitions.sortition_author") %> - - <% end %> -
-
-
-
- <%= decidim_sanitize_editor_admin translated_attribute sortition.additional_info %> -
-
-
-

- <%= t("witnesses", scope: "decidim.sortitions.sortitions.show") %> -

-
- <%= decidim_sanitize_editor translated_attribute sortition.witnesses %> -
-
- - <% if sortition&.proposals %> -
-

- <%= t("proposals_selected_by_sortition", scope: "decidim.sortitions.sortitions.show") %> -

-
- <%= render partial: "proposal", collection: sortition.proposals %> -
-
- <% end %> - - <% if sortition.cancelled? %> -
-

- <%= t("cancelled", scope: "decidim.sortitions.sortitions.show") %> -

-
- <%= cell "decidim/author", present(sortition.cancelled_by_user), context_actions: [:cancelled_on], from: sortition, layout: :compact %> - <% if sortition.cancelled_by_user&.deleted? %> - - <%= t("deleted", scope: "decidim.sortitions.sortitions.sortition_author") %> - - <% end %> -
- <%= cell("decidim/announcement", decidim_sanitize_editor(translated_attribute(sortition.cancel_reason)), callout_class: "alert") %> -
- <% end %> - -
- <%= cell "decidim/comments_button", nil %> - -
- <%= cell "decidim/share_widget", sortition %> -
-
- - <% content_for :aside do %> -
- <%= render partial: "results_count", locals: { sortition: } %> -
-
-
- <%= t("sortition_reproducibility_details", scope: "decidim.sortitions.sortitions.show") %> -
-
-
- - <%= t("dice_result", scope: "decidim.sortitions.sortitions.show") %> - - - <%= sortition.dice %>º - -
-
- - <%= t("time_seed", scope: "decidim.sortitions.sortitions.show") %> - - - <%= sortition.request_timestamp.to_i %> - -
-
- - <%= t("mathematical_result", scope: "decidim.sortitions.sortitions.show") %> - - - <%= sortition.seed %> - -
-
- <%= link_to t("algorithm", scope: "decidim.sortitions.sortitions.show"), Decidim::Sortitions.sortition_algorithm, class: "text-secondary sortition__aside-element-item__title underline" %> -
-
-
-
-
- <%= t("candidate_proposal_ids", scope: "decidim.sortitions.sortitions.show") %> -
-
-
- - <%= t("candidate_proposals_info", scope: "decidim.sortitions.sortitions.show", taxonomy_labels: sortition_taxonomy_labels(sortition)) %> - - - <%= sortition_proposal_candidate_ids sortition %> - -
-
-
- <% end %> - <% content_for :item_footer do %> - <%= comments_for sortition %> - - <% end %> -<% end %> diff --git a/decidim-sortitions/bin/rails b/decidim-sortitions/bin/rails deleted file mode 100755 index 7765ef4833ae0..0000000000000 --- a/decidim-sortitions/bin/rails +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# This command will automatically be run when you run "rails" with Rails gems -# installed from the root of your application. - -ENGINE_ROOT = File.expand_path("..", __dir__) -ENGINE_PATH = File.expand_path("../lib/decidim/sortitions/engine", __dir__) - -# Set up gems listed in the Gemfile. -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __dir__) -require "bundler/setup" - -require "rails/all" -require "rails/engine/commands" diff --git a/decidim-sortitions/config/assets.rb b/decidim-sortitions/config/assets.rb deleted file mode 100644 index d4a499e57edf8..0000000000000 --- a/decidim-sortitions/config/assets.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -base_path = File.expand_path("..", __dir__) - -Decidim::Shakapacker.register_path("#{base_path}/app/packs") -Decidim::Shakapacker.register_entrypoints( - decidim_sortitions: "#{base_path}/app/packs/entrypoints/decidim_sortitions.js" -) diff --git a/decidim-sortitions/config/locales/am-ET.yml b/decidim-sortitions/config/locales/am-ET.yml deleted file mode 100644 index 9e7679c0df56d..0000000000000 --- a/decidim-sortitions/config/locales/am-ET.yml +++ /dev/null @@ -1 +0,0 @@ -am: diff --git a/decidim-sortitions/config/locales/ar-SA.yml b/decidim-sortitions/config/locales/ar-SA.yml deleted file mode 100644 index 0cba9b0ee4d25..0000000000000 --- a/decidim-sortitions/config/locales/ar-SA.yml +++ /dev/null @@ -1,175 +0,0 @@ -ar: - activemodel: - attributes: - sortition: - additional_info: معلومات التصنيف - decidim_category_id: فئات مجموعة المقترحات التي تريد تطبيق السحب عليها - decidim_proposals_component_id: مجموعة المقترحات - dice: نتيجة يموت لفة. قم بلف قالب من 6 جوانب ، أو ابحث عن طريقة عشوائية أخرى لإنشاء رقم من 1 إلى 6 ، وأدخل هنا الرقم الناتج أمام بعض الشهود. هذا يساهم في جودة وضمانات عشوائية النتيجة - target_items: عدد المقترحات التي سيتم اختيارها (يشير إلى عدد المقترحات التي تريد تحديدها عن طريق رسم الكثير من مجموعة المقترحات التي اخترتها سابقًا) - title: عنوان - witnesses: شهود عيان - models: - decidim/sortitions/create_sortition_event: Sortition - activerecord: - models: - decidim/sortitions/sortition: - zero: Sortitions - one: Sortition - two: Sortitions - few: Sortitions - many: Sortitions - other: Sortitions - decidim: - components: - sortitions: - name: Sortitions - settings: - global: - comments_enabled: تم تمكين التعليقات - events: - sortitions: - sortition_created: - email_intro: تمت إضافة التصنيف "%{resource_title}" إلى "%{participatory_space_title}" الذي تتابعه. - email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{participatory_space_title}". يمكنك إلغاء تتبعه من الرابط السابق. - email_subject: تمت إضافة تصنيف جديد إلى %{participatory_space_title} - notification_title: تمت إضافة التصنيف %{resource_title} إلى %{participatory_space_title} - pages: - home: - statistics: - sortitions_count: Sortitions - participatory_processes: - statistics: - sortitions_count: Sortitions - sortitions: - admin: - actions: - destroy: إلغاء الفرز - edit: تعديل - new: فرز جديد - show: تفاصيل الفرز - models: - sortition: - fields: - category: الفئة - created_at: تاريخ الإنشاء - decidim_proposals_component: مكون الاقتراحات - dice: حجر النرد - reference: مرجع - request_timestamp: رسم الوقت - seed: بذرة - target_items: عناصر للاختيار - title: عنوان - name: - zero: Sortitions - one: Sortition - two: Sortitions - few: Sortitions - many: Sortitions - other: Sortitions - sortitions: - confirm_destroy: - confirm_destroy: هل أنت متأكد أنك تريد إلغاء هذا التصنيف؟ - destroy: إلغاء التصنيف - title: إلغاء التصنيف - create: - error: كانت هناك مشكلة في إنشاء فرز جديد. - success: تم إنشاء التصنيف بنجاح - destroy: - error: لا يمكن إلغاء التصنيف. - success: تم الغاء التصنيف بنجاح - edit: - title: تحديث المعلومات حول الفرز - update: تحديث - form: - all_categories: جميع الفئات - select_proposal_component: حدد مجموعة المقترحات - title: ترتيب جديد للمقترحات - index: - title: Sortitions - new: - confirm: بالضغط على الزر التالي ، سوف يسجل Decidim التاريخ والوقت (بدقة من الثواني) وجنبا إلى جنب مع لفة النرد ، سيتم استخدام هذه المعلومات لإنشاء اختيار عشوائي. لن يكون الإجراء قابلاً للرجوع إليه ، بمجرد النقر فوق الزر سيتم نشر نتيجة هذا السحب مع البيانات التي تم إدخالها في هذا النموذج ولا يمكن تعديلها ، يرجى التحقق من المحتوى بعناية - create: إنشاء - title: فرز جديد - show: - selected_proposals: مقترحات مختارة للقرعة - update: - error: حدثت مشكلة أثناء تحديث التصنيف. - success: تم تحديث التصنيف بنجاح - admin_log: - sortition: - create: "%{user_name} خلق %{resource_name} التصنيف في %{space_name}" - delete: "%{user_name} ألغى التصنيف %{resource_name} في %{space_name}" - update: "%{user_name} تحديث %{resource_name} التصنيف في %{space_name}" - sortitions: - count: - proposals_count: - zero: "%{count} مقترحات" - one: اقتراح واحد - two: "%{count} مقترحات" - few: "%{count} مقترحات" - many: "%{count} مقترحات" - other: "%{count} مقترحات" - filters: - active: نشيط - all: الكل - cancelled: ألغيت - category: الفئة - category_prompt: اختر تصنيف - search: بحث - state: الحالة - filters_small_view: - close_modal: إغلاق مشروط - filter: منقي - filter_by: مصنف بواسطة - unfold: كشف - linked_sortitions: - selected_proposals: مقترحات مختارة - orders: - label: 'ترتيب الفرز حسب:' - random: عشوائية - recent: الأخيرة - results_count: - count: - zero: مقترحات مختارة - one: الاقتراح المحدد - two: مقترحات مختارة - few: مقترحات مختارة - many: مقترحات مختارة - other: مقترحات مختارة - show: - algorithm: رمز خوارزمية التصنيف - any_category: من جميع الفئات - cancelled: فرز الملغاة - candidate_proposal_ids: ترتيب المقترحات الترتيب ومعرفات - candidate_proposals_info: 'تم تنفيذ التصنيف بين المقترحات التالية (%{category_label}) ، مع المعرفات التالية (بالخط العريض للمقترحات المختارة) ' - category: من %{category} الفئة - dice_result: "(1) نتيجة النرد" - introduction: 'تحتوي هذه الصفحة على نتائج الفرز %{reference}. من خلال هذا sortition، %{target_items} تم اختيارها عشوائيا عدد من النتائج ومع التوزيع الاحتمالي على قدم المساواة من مجموعة من المقترحات المعروضة رفع الصوت عاليا. جنبًا إلى جنب مع النتائج ، توفر المعلومات المعروضة على هذه الصفحة جميع المعلومات المطلوبة لزيادة الضمانات وإعادة إنتاج النتائج. المفتاح لجودة هذا الفرز هو العشوائية المزدوجة التي يوفرها المتداول من الزهر (التحقق من قبل الشهود) والوقت الدقيق للترتيب الذي يوفر مدخلات لخوارزمية يولد اختيار عشوائي. إن البذر الزمني للفرز دقيق للغاية (بالثواني) بحيث يستحيل على البشر التحكم فيه ، مما يوفر مدخلات مزدوجة "لا يمكن السيطرة عليها" لضمان نتيجة عادلة. ' - mathematical_result: النتيجة (1) × (2) - proposals_selected_by_sortition: مقترحات مختارة من قبل الفرز - sortition_reproducibility_details: تفاصيل استنساخ الفرز - time_seed: "(2) الوقت البذور" - witnesses: شهود عيان - sortition: - random_seed: البذور عشوائي - selected_proposals: - zero: مقترحات مختارة - one: تم اختيار الاقتراح - two: مقترحات مختارة - few: مقترحات مختارة - many: مقترحات مختارة - other: مقترحات مختارة - view: رأي - sortition_author: - deleted: مشارك محذوف - sortition_cancel_author: - deleted: مشارك محذوف - sortitions_count: - count: - zero: "%{count} التصنيف" - one: 1 التصنيف - two: "%{count} التصنيف" - few: "%{count} التصنيف" - many: "%{count} التصنيف" - other: "%{count} التصنيف" diff --git a/decidim-sortitions/config/locales/ar.yml b/decidim-sortitions/config/locales/ar.yml deleted file mode 100644 index e74011ef36735..0000000000000 --- a/decidim-sortitions/config/locales/ar.yml +++ /dev/null @@ -1,139 +0,0 @@ -ar: - activemodel: - attributes: - sortition: - additional_info: معلومات التصنيف - decidim_proposals_component_id: مجموعة المقترحات - dice: نتيجة يموت لفة. قم بلف قالب من 6 جوانب ، أو ابحث عن طريقة عشوائية أخرى لإنشاء رقم من 1 إلى 6 ، وأدخل هنا الرقم الناتج أمام بعض الشهود. هذا يساهم في جودة وضمانات عشوائية النتيجة - target_items: عدد المقترحات التي سيتم اختيارها (يشير إلى عدد المقترحات التي تريد تحديدها عن طريق رسم الكثير من مجموعة المقترحات التي اخترتها سابقًا) - title: عنوان - witnesses: شهود عيان - models: - decidim/sortitions/create_sortition_event: Sortition - activerecord: - models: - decidim/sortitions/sortition: - zero: Sortitions - one: Sortition - two: Sortitions - few: Sortitions - many: Sortitions - other: Sortitions - decidim: - components: - sortitions: - name: Sortitions - settings: - global: - comments_enabled: تم تمكين التعليقات - events: - sortitions: - sortition_created: - email_intro: تمت إضافة التصنيف "%{resource_title}" إلى "%{participatory_space_title}" الذي تتابعه. - email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{participatory_space_title}". يمكنك إلغاء تتبعه من الرابط السابق. - email_subject: تمت إضافة تصنيف جديد إلى %{participatory_space_title} - notification_title: تمت إضافة التصنيف %{resource_title} إلى %{participatory_space_title} - sortitions: - admin: - actions: - destroy: إلغاء الفرز - edit: تعديل - show: تفاصيل الفرز - models: - sortition: - fields: - created_at: تاريخ الإنشاء - decidim_proposals_component: مكون الاقتراحات - dice: حجر النرد - reference: مرجع - request_timestamp: رسم الوقت - seed: بذرة - target_items: عناصر للاختيار - title: عنوان - sortitions: - confirm_destroy: - confirm_destroy: هل أنت متأكد أنك تريد إلغاء هذا التصنيف؟ - destroy: إلغاء التصنيف - title: إلغاء التصنيف - create: - error: كانت هناك مشكلة في إنشاء فرز جديد. - edit: - title: تحديث المعلومات حول الفرز - update: تحديث - form: - select_proposal_component: حدد مجموعة المقترحات - index: - title: Sortitions - new: - create: إنشاء - title: فرز جديد - show: - selected_proposals: مقترحات مختارة للقرعة - update: - error: حدثت مشكلة أثناء تحديث التصنيف. - admin_log: - sortition: - create: "%{user_name} خلق %{resource_name} التصنيف في %{space_name}" - delete: "%{user_name} ألغى التصنيف %{resource_name} في %{space_name}" - update: "%{user_name} تحديث %{resource_name} التصنيف في %{space_name}" - sortitions: - count: - proposals_count: - zero: "%{count} مقترحات" - one: اقتراح واحد - two: "%{count} مقترحات" - few: "%{count} مقترحات" - many: "%{count} مقترحات" - other: "%{count} مقترحات" - filters: - active: نشيط - all: الكل - cancelled: ألغيت - category: الفئة - state: الحالة - linked_sortitions: - selected_proposals: مقترحات مختارة - orders: - label: 'ترتيب الفرز حسب:' - random: عشوائية - recent: الأخيرة - results_count: - count: - zero: مقترحات مختارة - one: الاقتراح المحدد - two: مقترحات مختارة - few: مقترحات مختارة - many: مقترحات مختارة - other: مقترحات مختارة - show: - algorithm: رمز خوارزمية التصنيف - cancelled: فرز الملغاة - candidate_proposal_ids: ترتيب المقترحات الترتيب ومعرفات - dice_result: (1) نتيجة النرد - introduction: 'تحتوي هذه الصفحة على نتائج الفرز %{reference}. من خلال هذا sortition، %{target_items} تم اختيارها عشوائيا عدد من النتائج ومع التوزيع الاحتمالي على قدم المساواة من مجموعة من المقترحات المعروضة رفع الصوت عاليا. جنبًا إلى جنب مع النتائج ، توفر المعلومات المعروضة على هذه الصفحة جميع المعلومات المطلوبة لزيادة الضمانات وإعادة إنتاج النتائج. المفتاح لجودة هذا الفرز هو العشوائية المزدوجة التي يوفرها المتداول من الزهر (التحقق من قبل الشهود) والوقت الدقيق للترتيب الذي يوفر مدخلات لخوارزمية يولد اختيار عشوائي. إن البذر الزمني للفرز دقيق للغاية (بالثواني) بحيث يستحيل على البشر التحكم فيه ، مما يوفر مدخلات مزدوجة "لا يمكن السيطرة عليها" لضمان نتيجة عادلة. ' - mathematical_result: النتيجة (1) × (2) - proposals_selected_by_sortition: مقترحات مختارة من قبل الفرز - sortition_reproducibility_details: تفاصيل استنساخ الفرز - time_seed: (2) الوقت البذور - witnesses: شهود عيان - sortition: - random_seed: البذور عشوائي - selected_proposals: - zero: مقترحات مختارة - one: تم اختيار الاقتراح - two: مقترحات مختارة - few: مقترحات مختارة - many: مقترحات مختارة - other: مقترحات مختارة - sortition_author: - deleted: مشارك محذوف - sortition_cancel_author: - deleted: مشارك محذوف - sortitions_count: - count: - zero: "%{count} التصنيف" - one: 1 التصنيف - two: "%{count} التصنيف" - few: "%{count} التصنيف" - many: "%{count} التصنيف" - other: "%{count} التصنيف" diff --git a/decidim-sortitions/config/locales/bg-BG.yml b/decidim-sortitions/config/locales/bg-BG.yml deleted file mode 100644 index d55e72dd1d977..0000000000000 --- a/decidim-sortitions/config/locales/bg-BG.yml +++ /dev/null @@ -1,7 +0,0 @@ -bg: - activemodel: - attributes: - sortition: - additional_info: Сортиране на информация - decidim_category_id: Категории от набора от предложения, в които искате да приложите жребий - decidim_proposals_component_id: Предложенията са зададени diff --git a/decidim-sortitions/config/locales/bg.yml b/decidim-sortitions/config/locales/bg.yml deleted file mode 100644 index 487895ad302aa..0000000000000 --- a/decidim-sortitions/config/locales/bg.yml +++ /dev/null @@ -1,133 +0,0 @@ -bg: - activemodel: - attributes: - sortition: - additional_info: Информация за сортировката - decidim_proposals_component_id: Предложенията са зададени - dice: Резултат от хвърлянето на зара. Хвърлете 6-странен зар или потърсете друг произволен начин за генериране на число от 1 до 6 и въведете тук полученото число пред няколко свидетели. Това допринася за качеството и гаранции за случайността на резултата - target_items: Брой на предложенията, които да бъдат избрани (указва броя на предложенията, които искате да бъдат избрани чрез хвърляне на жребий от групата предложения, които сте избрали по-рано) - title: Заглавие - witnesses: Свидетели - models: - decidim/sortitions/create_sortition_event: Сортиране - activerecord: - models: - decidim/sortitions/sortition: - one: Сортиране - other: Сортирания - decidim: - components: - sortitions: - actions: - comment: Коментар - name: Сортирания - settings: - global: - comments_enabled: Коментарите са разрешени - comments_max_length: Максимална дължина на коментарите (Оставете 0 за стойност по подразбиране) - events: - sortitions: - sortition_created: - email_intro: Сортировката „%{resource_title}“ беше добавена към пространството за участие „%{participatory_space_title}“, което следвате. - email_outro: Получавате това известие, защото следвате "%{participatory_space_title}". Може да премахнете следването чрез предходния линк. - email_subject: Беше добавена нова сортировка в(ъв) %{participatory_space_title} - notification_title: Сортировката %{resource_title} беше добавена в(ъв) %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Отмяна на сортировката - edit: Редактирай - new_sortition: Нова сортировка - show: Детайли за сортировката - models: - sortition: - fields: - created_at: Дата на създаване - decidim_proposals_component: Компонент Предложения - dice: Зар - reference: Препоръка - request_timestamp: Време за теглене на жребий - seed: Seed - target_items: Елементи за селектиране - title: Заглавие - sortitions: - confirm_destroy: - confirm_destroy: Наистина ли искате да отмените тази сортировка? - destroy: Отмяна на сортировка - title: Отменяне на сортировката - create: - error: Възникна проблем при създаването на нова сортировка. - success: Сортировката беше създадена успешно. - destroy: - error: Сортировката не може бъде отменена. - success: Сортировката беше отменена успешно. - edit: - title: Актуализирайте информацията за сортировката - update: Актуализация - form: - select_proposal_component: Изберете набора от предложения - index: - title: Сортировки - new: - confirm: Когато натиснете бутона „Напред“, системата ще запише датата и часа (с точност до секунди) и заедно с хвърлянето на зара тази информация ще се използва за генериране на избор на случаен принцип. Действието няма да може да бъде отменено — когато щракнете върху бутона, резултатът от жребия ще бъде публикуван заедно с въведените в този формуляр данни и няма да подлежи на промяна. Моля, прегледайте съдържанието внимателно. - create: Създаване - title: Нова сортировка - show: - selected_proposals: Избрани предложения за жребия - update: - error: Възникна проблем при актуализирането на сортировката. - success: Сортировката беше актуализирана успешно. - admin_log: - sortition: - create: "%{user_name} създаде сортировка %{resource_name} в пространството %{space_name}" - delete: "%{user_name} отмени сортировката %{resource_name} в пространството %{space_name}" - update: "%{user_name} актуализира сортировката %{resource_name} в пространството %{space_name}" - sortitions: - count: - proposals_count: - one: 1 предложение - other: "%{count} предложения" - filters: - active: Активно - all: Всички - cancelled: Отменено - category: Категория - state: Статус - index: - empty: Все още няма сортировки. - linked_sortitions: - selected_proposals: Избрани предложения - orders: - label: 'Подреждане на сортировките по:' - random: Случаен - recent: Скорошни - results_count: - count: - one: Избрано предложение - other: Избрани предложения - show: - algorithm: Код на алгоритъма за жребия в сортировката - cancelled: Отменена сортировка - candidate_proposal_ids: Ред и ID номерата на предложенията в сортировката - dice_result: Резултат от жребия - introduction: 'Тази страница съдържа резултатите от сортирането %{reference}. Чрез това сортиране, %{target_items} брой резултати са избрани на случаен принцип и с равно вероятностно разпределение от набора от предложения, показани по-долу. Заедно с резултатите, информацията, показана на тази страница, предоставя цялата информация, необходима за максимизиране на гаранциите и за възпроизвеждане на резултатите. Ключът към качеството на това сортиране е двойната случайност, осигурена от хвърлянето на зарове (потвърдено от свидетели) и точното време на сортирането, което осигурява вход за алгоритъм, който генерира случаен избор. Времето за начало за сортирането е толкова точно (секунди), че е невъзможно да се контролира от хора, като по този начин се осигурява двоен „неконтролируем“ вход, за да се гарантира справедлив резултат. ' - mathematical_result: Резулатат (Зарове х Разбъркване) - proposals_selected_by_sortition: Избрани чрез (жребий) сортировка предложения - sortition_reproducibility_details: Подробности за възпроизвеждане на сортировката - time_seed: Време за разбъркване - witnesses: Свидетели - sortition: - random_seed: Случаен подбор - selected_proposals: - one: избрано предложение - other: избрани предложения - sortition_author: - deleted: Изтрит участник - sortition_cancel_author: - deleted: Изтрит участник - sortitions_count: - count: - one: 1 сортировка - other: "%{count} сортировки" - statistics: - sortitions_count: Сортировки diff --git a/decidim-sortitions/config/locales/bn-BD.yml b/decidim-sortitions/config/locales/bn-BD.yml deleted file mode 100644 index 152c698290639..0000000000000 --- a/decidim-sortitions/config/locales/bn-BD.yml +++ /dev/null @@ -1 +0,0 @@ -bn: diff --git a/decidim-sortitions/config/locales/bs-BA.yml b/decidim-sortitions/config/locales/bs-BA.yml deleted file mode 100644 index e9e174462a158..0000000000000 --- a/decidim-sortitions/config/locales/bs-BA.yml +++ /dev/null @@ -1 +0,0 @@ -bs: diff --git a/decidim-sortitions/config/locales/ca-IT.yml b/decidim-sortitions/config/locales/ca-IT.yml deleted file mode 100644 index e31f53512f582..0000000000000 --- a/decidim-sortitions/config/locales/ca-IT.yml +++ /dev/null @@ -1,147 +0,0 @@ -ca-IT: - activemodel: - attributes: - sortition: - additional_info: Informació del sorteig - decidim_proposals_component_id: Propostes establertes - dice: Resultat de la tirada de daus. Tira un dau de sis cares o busca alguna altra manera de generar un número de l'u al sis i introdueix-lo aquí davant d'algunes testimonies. Això contribueix en la qualitat i garantia de l'aletorietat del resultat - target_items: Nombre de propostes a seleccionar (indica el nombre de propostes que vols seleccionar mitjançant el sorteig del grup de propostes que hàgiu triat prèviament) - title: Títol - witnesses: Testimonis - models: - decidim/sortitions/create_sortition_event: Sorteig - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteig - other: Sortejos - decidim: - components: - sortitions: - actions: - comment: Comentar - name: Sortejos - settings: - global: - clear_all: Netejar-ho tot - comments_enabled: Comentaris habilitats - comments_max_length: Longitud màxima dels comentaris (deixa 0 si vols mantenir la configuració per defecte) - define_taxonomy_filters: Si us plau, defineix algunes filtres per aquest espai de participació abans de fer servir aquesta configuració. - no_taxonomy_filters_found: No s'han trobat filtres de taxonomia. - taxonomy_filters: Seleccionar filtres pel component - taxonomy_filters_add: Afegir un filtre - events: - sortitions: - sortition_created: - email_intro: El sorteig "%{resource_title}" s'ha afegit a "%{participatory_space_title}" que segueixes. - email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de seguir-lo des de l'enllaç anterior. - email_subject: Nou sorteig afegit a %{participatory_space_title} - notification_title: El sorteig %{resource_title} s'ha afegit a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancel·la el sorteig - edit: Edita - new_sortition: Afegir sorteig - show: Detalls del sorteig - title: Accions - deprecation_warning_html: "⚠️ Avís de Desús/Obsolescència. El mòdul de sorteigs s'eliminarà a Decidim v.0.32. Si us plau, planifiqueu en conseqüència i considereu solucions alternatives per a la selecció d'elements a l'atzar." - models: - sortition: - fields: - created_at: Data de creació - decidim_proposals_component: Component de Propostes - dice: Dau - reference: Referència - request_timestamp: Temps de dibuixar - seed: Llavor - target_items: Elements a seleccionar - taxonomies: Taxonomies - title: Títol - sortitions: - confirm_destroy: - confirm_destroy: Segur que vols cancel·lar aquest sorteig? - destroy: Cancel·lar el sorteig - title: Cancel·lació del sorteig - create: - error: S'ha produït un error en crear un nou sorteig. - success: El sorteig s'ha creat correctament. - destroy: - error: No es pot cancel·lar el sorteig. - success: El sorteig s'ha cancel·lat correctament. - edit: - title: Actualitza la informació sobre el sorteig - update: Actualitzar - form: - all_taxonomies: Totes les taxonomies - select_proposal_component: Selecciona el grup de propostes - select_taxonomies: Taxonomies del conjunt de propostes del qual vols aplicar per dibuixar. Deixar buit per aplicar a totes les propostes de la taxonomia. - index: - title: Sortejos - new: - confirm: Pressionant el següent botó, la plataforma registrarà la data i l'hora (amb precisió de segons) i, juntament amb la tirada de daus, aquesta informació s'utilitzarà per generar una selecció aleatòria. L'acció serà irreversible, una vegada que es faci clic al botó, es publicarà el resultat d'aquest sorteig, juntament amb les dades introduïdes en aquest formulari i que no es poden modificar. Si us plau, comprova el contingut acuradament. - create: Crear - title: Nou sorteig - show: - selected_proposals: Propostes seleccionades per al sorteig - update: - error: S'ha produït un error en actualitzar el sorteig. - success: El sorteig s'ha actualitzat correctament. - admin_log: - sortition: - create: "%{user_name} ha creat el sorteig %{resource_name} a %{space_name}" - delete: "%{user_name} ha cancel·lat el sorteig %{resource_name} a %{space_name}" - update: "%{user_name} ha actualitzat el sorteig %{resource_name} a %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} propostes" - filters: - active: Actius - all: Tots - cancelled: Cancel·lat - category: Categoria - state: Estat - index: - empty: Encara no hi ha cap sorteig. - linked_sortitions: - selected_proposals: Propostes seleccionades - orders: - label: 'Ordena els sortejos per:' - random: Aleatori - recent: Recent - results_count: - count: - one: proposta seleccionada - other: propostes seleccionades - show: - algorithm: Codi d'algoritme del sorteig - any_taxonomy: de totes les taxonomies - cancelled: Sorteig cancel·lat - candidate_proposal_ids: Ordre i IDs de les propostes del sorteig - candidate_proposals_info: 'La resolució es va dur a terme entre les següents propostes (%{taxonomy_labels}), amb les següents IDs (en negreta, les propostes seleccionades) ' - dice_result: (1) Resultat de la tirada de daus - introduction: 'Aquesta pàgina conté els resultats del sorteig %{reference}. Mitjançant aquest sorteig, %{target_items} nombre de resultats han estat seleccionats aleatòriament i amb una distribució de probabilitat igual al conjunt de propostes que es mostra a continuació. Juntament amb els resultats, la informació que es mostra en aquesta pàgina proporciona tota la informació necessària per maximitzar les garanties i reproduir els resultats. La clau per a la qualitat d''aquest sorteig és l''aleatorietat doble proporcionada per una tirada d''un dau (verificat pels testimonis) i el temps precís de l''assentament que proporciona entrada per a un algorisme que genera una selecció aleatòria. El llindar de temps per a l''assaig és tan precís (segons) que és impossible de controlar pels humans, oferint així una doble entrada "incontrolable" per garantir un resultat just. ' - mathematical_result: Resultat (1) x (2) - proposals_selected_by_sortition: Propostes seleccionades pel sorteig - sortition_reproducibility_details: Detalls de la reproductibilitat del sorteig - taxonomies: de les taxonomies %{taxonomies} - time_seed: (2) Llavor de temps - witnesses: Testimonis - sortition: - random_seed: Llavor aleatòria - selected_proposals: - one: proposta seleccionada - other: propostes seleccionades - sortition_author: - deleted: Participant eliminada - sortition_cancel_author: - deleted: Participant eliminada - sortitions_count: - count: - one: 1 sorteig - other: "%{count} classificacions" - statistics: - sortitions_count: Sortejos - sortitions_count_tooltip: El nombre de seleccions aleatòries realitzades per a la presa de decisions. diff --git a/decidim-sortitions/config/locales/ca.yml b/decidim-sortitions/config/locales/ca.yml deleted file mode 100644 index 55e8ba5d8c9bd..0000000000000 --- a/decidim-sortitions/config/locales/ca.yml +++ /dev/null @@ -1,147 +0,0 @@ -ca: - activemodel: - attributes: - sortition: - additional_info: Informació del sorteig - decidim_proposals_component_id: Propostes establertes - dice: Resultat de la tirada de daus. Tira un dau de sis cares o busca alguna altra manera de generar un número de l'u al sis i introdueix-lo aquí davant d'algunes testimonies. Això contribueix en la qualitat i garantia de l'aletorietat del resultat - target_items: Nombre de propostes a seleccionar (indica el nombre de propostes que vols seleccionar mitjançant el sorteig del grup de propostes que hàgiu triat prèviament) - title: Títol - witnesses: Testimonis - models: - decidim/sortitions/create_sortition_event: Sorteig - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteig - other: Sortejos - decidim: - components: - sortitions: - actions: - comment: Comentar - name: Sortejos - settings: - global: - clear_all: Netejar-ho tot - comments_enabled: Comentaris habilitats - comments_max_length: Longitud màxima dels comentaris (deixa 0 si vols mantenir la configuració per defecte) - define_taxonomy_filters: Si us plau, defineix algunes filtres per aquest espai de participació abans de fer servir aquesta configuració. - no_taxonomy_filters_found: No s'han trobat filtres de taxonomia. - taxonomy_filters: Seleccionar filtres pel component - taxonomy_filters_add: Afegir un filtre - events: - sortitions: - sortition_created: - email_intro: El sorteig "%{resource_title}" s'ha afegit a "%{participatory_space_title}" que segueixes. - email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de seguir-lo des de l'enllaç anterior. - email_subject: Nou sorteig afegit a %{participatory_space_title} - notification_title: El sorteig %{resource_title} s'ha afegit a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancel·la el sorteig - edit: Edita - new_sortition: Afegir sorteig - show: Detalls del sorteig - title: Accions - deprecation_warning_html: "⚠️ Avís de Desús/Obsolescència. El mòdul de sorteigs s'eliminarà a Decidim v.0.32. Si us plau, planifiqueu en conseqüència i considereu solucions alternatives per a la selecció d'elements a l'atzar." - models: - sortition: - fields: - created_at: Data de creació - decidim_proposals_component: Component de Propostes - dice: Dau - reference: Referència - request_timestamp: Temps de dibuixar - seed: Llavor - target_items: Elements a seleccionar - taxonomies: Taxonomies - title: Títol - sortitions: - confirm_destroy: - confirm_destroy: Segur que vols cancel·lar aquest sorteig? - destroy: Cancel·lar el sorteig - title: Cancel·lació del sorteig - create: - error: S'ha produït un error en crear un nou sorteig. - success: El sorteig s'ha creat correctament. - destroy: - error: No es pot cancel·lar el sorteig. - success: El sorteig s'ha cancel·lat correctament. - edit: - title: Actualitza la informació sobre el sorteig - update: Actualitzar - form: - all_taxonomies: Totes les taxonomies - select_proposal_component: Selecciona el grup de propostes - select_taxonomies: Taxonomies del conjunt de propostes del qual vols aplicar per dibuixar. Deixar buit per aplicar a totes les propostes de la taxonomia. - index: - title: Sortejos - new: - confirm: Pressionant el següent botó, la plataforma registrarà la data i l'hora (amb precisió de segons) i, juntament amb la tirada de daus, aquesta informació s'utilitzarà per generar una selecció aleatòria. L'acció serà irreversible, una vegada que es faci clic al botó, es publicarà el resultat d'aquest sorteig, juntament amb les dades introduïdes en aquest formulari i que no es poden modificar. Si us plau, comprova el contingut acuradament. - create: Crear - title: Nou sorteig - show: - selected_proposals: Propostes seleccionades per al sorteig - update: - error: S'ha produït un error en actualitzar el sorteig. - success: El sorteig s'ha actualitzat correctament. - admin_log: - sortition: - create: "%{user_name} ha creat el sorteig %{resource_name} a %{space_name}" - delete: "%{user_name} ha cancel·lat el sorteig %{resource_name} a %{space_name}" - update: "%{user_name} ha actualitzat el sorteig %{resource_name} a %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} propostes" - filters: - active: Actius - all: Tots - cancelled: Cancel·lat - category: Categoria - state: Estat - index: - empty: Encara no hi ha cap sorteig. - linked_sortitions: - selected_proposals: Propostes seleccionades - orders: - label: 'Ordena els sortejos per:' - random: Aleatori - recent: Recent - results_count: - count: - one: proposta seleccionada - other: propostes seleccionades - show: - algorithm: Codi d'algoritme del sorteig - any_taxonomy: de totes les taxonomies - cancelled: Sorteig cancel·lat - candidate_proposal_ids: Ordre i IDs de les propostes del sorteig - candidate_proposals_info: 'La resolució es va dur a terme entre les següents propostes (%{taxonomy_labels}), amb les següents IDs (en negreta, les propostes seleccionades) ' - dice_result: (1) Resultat de la tirada de daus - introduction: 'Aquesta pàgina conté els resultats del sorteig %{reference}. Mitjançant aquest sorteig, %{target_items} nombre de resultats han estat seleccionats aleatòriament i amb una distribució de probabilitat igual al conjunt de propostes que es mostra a continuació. Juntament amb els resultats, la informació que es mostra en aquesta pàgina proporciona tota la informació necessària per maximitzar les garanties i reproduir els resultats. La clau per a la qualitat d''aquest sorteig és l''aleatorietat doble proporcionada per una tirada d''un dau (verificat pels testimonis) i el temps precís de l''assentament que proporciona entrada per a un algorisme que genera una selecció aleatòria. El llindar de temps per a l''assaig és tan precís (segons) que és impossible de controlar pels humans, oferint així una doble entrada "incontrolable" per garantir un resultat just. ' - mathematical_result: Resultat (1) x (2) - proposals_selected_by_sortition: Propostes seleccionades pel sorteig - sortition_reproducibility_details: Detalls de la reproductibilitat del sorteig - taxonomies: de les taxonomies %{taxonomies} - time_seed: (2) Llavor de temps - witnesses: Testimonis - sortition: - random_seed: Llavor aleatòria - selected_proposals: - one: proposta seleccionada - other: propostes seleccionades - sortition_author: - deleted: Participant eliminada - sortition_cancel_author: - deleted: Participant eliminada - sortitions_count: - count: - one: 1 sorteig - other: "%{count} classificacions" - statistics: - sortitions_count: Sortejos - sortitions_count_tooltip: El nombre de seleccions aleatòries realitzades per a la presa de decisions. diff --git a/decidim-sortitions/config/locales/cs-CZ.yml b/decidim-sortitions/config/locales/cs-CZ.yml deleted file mode 100644 index 0954df19f0593..0000000000000 --- a/decidim-sortitions/config/locales/cs-CZ.yml +++ /dev/null @@ -1,163 +0,0 @@ -cs: - activemodel: - attributes: - sortition: - additional_info: Informace o sortimentu - decidim_category_id: Kategorie sady návrhů, ve kterých chcete použít remízu - decidim_proposals_component_id: Návrhy jsou nastaveny - dice: Výsledek válce. Otočte šestistrannou zápustku nebo vyhledejte jiný náhodný způsob, jak vygenerovat číslo od 1 do 6, a zadejte zde výsledné číslo před některými svědky. To přispívá ke kvalitě a zárukám náhodnosti výsledku - target_items: Počet návrhů, které mají být vybrány (udává počet návrhů, které chcete vybrat, čerpáním ze skupiny návrhů, které jste předtím vybrali) - title: Titul - witnesses: Svědkové - models: - decidim/sortitions/create_sortition_event: Sortiment - activerecord: - models: - decidim/sortitions/sortition: - one: Sortiment - few: Sortitions - many: Sortitions - other: Sortitions - decidim: - components: - sortitions: - name: Sortitions - settings: - global: - comments_enabled: Komentáře povoleny - events: - sortitions: - sortition_created: - email_intro: Řádek "%{resource_title}" byl přidán k "%{participatory_space_title}", který sledujete. - email_outro: Toto oznámení jste obdrželi, protože jste sledovali "%{participatory_space_title}". Můžete jej odhlásit od předchozího odkazu. - email_subject: Nová sortie byla přidána k číslu %{participatory_space_title} - notification_title: Výsledek %{resource_title} byl přidán k %{participatory_space_title} - pages: - home: - statistics: - sortitions_count: Sortitions - participatory_processes: - statistics: - sortitions_count: Sortitions - sortitions: - admin: - actions: - destroy: Zrušit výběr - edit: Upravit - new: Nové rozvržení - show: Podrobnosti o sortimentu - models: - sortition: - fields: - category: Kategorie - created_at: Datum vzniku - decidim_proposals_component: Součást návrhů - dice: Kostky - reference: Odkaz - request_timestamp: Doba kreslení - seed: Semínko - target_items: Položky, které chcete vybrat - title: Titul - name: - one: Sortiment - few: Sortitions - many: Sortitions - other: Sortitions - sortitions: - confirm_destroy: - confirm_destroy: Opravdu chcete tuto nabídku zrušit? - destroy: Zrušit výběr - title: Zrušení výběrového řízení - create: - error: Při vytváření nového rozvržení došlo k chybě. - success: Sorta byla úspěšně vytvořena - destroy: - error: Výběr nelze zrušit. - success: Sorta byla úspěšně zrušena - edit: - title: Aktualizujte informace o sortimentu - update: Aktualizace - form: - all_categories: Všechny kategorie - select_proposal_component: Vyberte návrhy - title: Nové návrhy na návrhy - index: - title: Sortitions - new: - confirm: Stisknutím dalšího tlačítka Decidim zaznamenáte datum a čas (s přesností na sekundy) a společně s kolečkem o kostkách budou tyto informace použity pro generování náhodného výběru. Akce bude nevratná, po kliknutí na tlačítko se výsledky této kresby zveřejní společně s údaji uvedenými v tomto formuláři a nelze je změnit, zkontrolujte prosím pozorně obsah - create: Vytvořit - title: Nové rozvržení - show: - selected_proposals: Návrhy vybrané pro kreslení - update: - error: Při aktualizaci výběru došlo k chybě. - success: Sortifikace byla úspěšně aktualizována - admin_log: - sortition: - create: "%{user_name} vytvořil %{resource_name} sortit v %{space_name}" - delete: "%{user_name} zrušil %{resource_name} sortit v %{space_name}" - update: "%{user_name} aktualizoval %{resource_name} sorotu v %{space_name}" - sortitions: - count: - proposals_count: - one: 1 - few: "%{count} návrhů" - many: "%{count} návrhů" - other: "%{count} návrhů" - filters: - active: Aktivní - all: Všechno - cancelled: Zrušeno - category: Kategorie - category_prompt: Vyberte kategorii - search: Vyhledávání - state: Stát - filters_small_view: - close_modal: Zavřít modální - filter: Filtr - filter_by: Filtrovat podle - unfold: Rozvinout - linked_sortitions: - selected_proposals: Vybrané návrhy - orders: - label: 'Objednat sortitions podle:' - random: Náhodný - recent: Nedávno - results_count: - count: - one: vybraný návrh - few: vybrané návrhy - many: vybrané návrhy - other: vybrané návrhy - show: - algorithm: Kód algoritmu Sortition - any_category: ze všech kategorií - cancelled: Zrušený výběr - candidate_proposal_ids: Sortimentní objednávky a ID - candidate_proposals_info: 'Rozbor byl proveden mezi následujícími návrhy (%{category_label}), s následujícími ID (označené tučně vybranými návrhy) ' - category: z kategorie %{category} - dice_result: "(1) Výsledek kostky" - introduction: 'Tato stránka obsahuje výsledky výběru %{reference}. Prostřednictvím tohoto výběru bylo vybráno %{target_items} počet výsledků náhodně a se stejným rozdělením pravděpodobnosti ze souboru návrhů zobrazených níže. Spolu s výsledky informace zobrazené na této stránce poskytují všechny informace potřebné pro maximalizaci záruk a reprodukci výsledků. Klíčem k kvalitě tohoto rozvratu je dvojitá náhodnost, kterou poskytuje vázání kostky (ověřené svědky) a přesný čas výběru, který poskytuje vstup pro algoritmus, který generuje náhodný výběr. Časové osivo pro sortiment je tak přesné (sekundy), že není možné ovládat lidi, a tak poskytnout dvojitý "nekontrolovatelný" vstup, který zaručí spravedlivý výsledek. ' - mathematical_result: Výsledek (1) x (2) - proposals_selected_by_sortition: Návrhy vybrané výběrem - sortition_reproducibility_details: Sortifikace reprodukovatelnosti - time_seed: "(2) Časové osivo" - witnesses: Svědkové - sortition: - random_seed: Náhodné osivo - selected_proposals: - one: vybraný návrh - few: vybraných návrhů - many: vybraných návrhů - other: vybraných návrhů - view: Pohled - sortition_author: - deleted: Vymazaný uživatel - sortition_cancel_author: - deleted: Vymazaný uživatel - sortitions_count: - count: - one: 1 sortie - few: "%{count} sortitions" - many: "%{count} sortitions" - other: "%{count} sortitions" diff --git a/decidim-sortitions/config/locales/cs.yml b/decidim-sortitions/config/locales/cs.yml deleted file mode 100644 index ec5ea35c0348b..0000000000000 --- a/decidim-sortitions/config/locales/cs.yml +++ /dev/null @@ -1,155 +0,0 @@ -cs: - activemodel: - attributes: - sortition: - additional_info: Informace o volbě losem - decidim_proposals_component_id: Návrhy jsou nastaveny - dice: Výsledek hodu kostkou. Hoďte šestistrannou kostkou nebo najděte jiný náhodný způsob, jak získat číslo od 1 do 6, a výsledné číslo sem před svědky vložte. To přispěje ke kvalitě a zaručí nahodilost výsledku - target_items: Počet návrhů, které mají být vybrány (udává počet návrhů, které chcete vybrat, čerpáním ze skupiny návrhů, které jste předtím vybrali) - title: Titul - witnesses: Svědkové - models: - decidim/sortitions/create_sortition_event: Losování - activerecord: - models: - decidim/sortitions/sortition: - one: Losování - few: Losování - many: Losování - other: Losování - decidim: - components: - sortitions: - actions: - comment: Komentář - name: Losování - settings: - global: - clear_all: Vymazat vše - comments_enabled: Komentáře povoleny - comments_max_length: Maximální délka komentáře (ponechte 0 pro výchozí hodnotu) - define_taxonomy_filters: Před použitím tohoto nastavení prosím definujte některé filtry pro tento participační prostor. - no_taxonomy_filters_found: Nebyly nalezeny žádné filtry taxonomie. - taxonomy_filters: Vyberte filtry pro komponentu - taxonomy_filters_add: Přidat filtr - events: - sortitions: - sortition_created: - email_intro: Losování "%{resource_title}" bylo přidáno k "%{participatory_space_title}", který sledujete. - email_outro: Toto oznámení jste obdrželi, protože sledujete "%{participatory_space_title}". Můžete sledování odhlásit na předchozím odkazu. - email_subject: Nové losování bylo přidáno k %{participatory_space_title} - notification_title: Losování %{resource_title} bylo přidáno k %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Zrušit losování - edit: Upravit - new_sortition: Nové losování - show: Detaily losování - title: Akce - models: - sortition: - fields: - created_at: Datum vytvoření - decidim_proposals_component: Součást návrhů - dice: Kostky - reference: Odkaz - request_timestamp: Čas vržení kostek - seed: Založení - target_items: Položky k výběru - taxonomies: Taxonomie - title: Název - sortitions: - confirm_destroy: - confirm_destroy: Opravdu chcete zrušit toto losování? - destroy: Zrušit losování - title: Zrušení losování - create: - error: Při vytváření nového losování došlo k chybě. - success: Losování bylo úspěšně vytvořeno. - destroy: - error: Nelze zrušit losování. - success: Losování bylo úspěšně zrušeno. - edit: - title: Aktualizovat informace o volbě losem - update: Aktualizace - form: - all_taxonomies: Všechny taxonomie - select_proposal_component: Vyberte sadu návrhů - select_taxonomies: Taxonomie sady návrhů, ve kterých chcete losování použít. Chcete-li použít losování na všechny návrhy v dané taxonomii, ponechte prázdné. - index: - title: Losování - new: - confirm: Stisknutím tlačítka Další bude platforma zaznamenávat datum a čas (s přesností sekund) společně s hodem kostkou, tyto informace budou použity k vytvoření náhodného výběru. Akce bude nevratná, po kliknutí na tlačítko bude výsledek tohoto losu publikován, spolu s údaji zadanými v tomto formuláři a nelze je změnit, pečlivě zkontrolujte obsah. - create: Vytvořit - title: Nové losování - show: - selected_proposals: Návrhy vybrané pro losování - update: - error: Při aktualizaci losování došlo k chybě. - success: Losování úspěšně aktualizováno. - admin_log: - sortition: - create: "%{user_name} vytvořil %{resource_name} losování v %{space_name}" - delete: "%{user_name} zrušil losování %{resource_name} v %{space_name}" - update: "%{user_name} aktualizoval losování %{resource_name} v %{space_name}" - sortitions: - count: - proposals_count: - one: návrh - few: "%{count} návrhů" - many: "%{count} návrhů" - other: "%{count} návrhů" - filters: - active: Aktivní - all: Vše - cancelled: Zrušeno - category: Kategorie - state: Stav - index: - empty: Zatím zde nejsou žádné roztřídění. - linked_sortitions: - selected_proposals: Vybrané návrhy - orders: - label: 'Řazení losování podle:' - random: Náhodně - recent: Nedávné - results_count: - count: - one: vybraný návrh - few: vybrané návrhy - many: vybrané návrhy - other: vybrané návrhy - show: - algorithm: Kód algoritmu losování - any_taxonomy: ze všech taxonomií - cancelled: Zrušené losování - candidate_proposal_ids: Pořadí a ID návrhů k losování - candidate_proposals_info: 'Losování bylo provedeno mezi následujícími návrhy (%{taxonomy_labels}), s následujícími ID (označené tučně vybrané návrhy) ' - dice_result: (1) Výsledek hodu kostkou - introduction: "Tato stránka obsahuje výsledky losování %{reference}. Prostřednictvím tohoto losování bylo vybráno %{target_items} výsledků náhodně a se stejným rozdělením pravděpodobnosti ze souboru návrhů zobrazených níže. \n\nSpolu s výsledky informace zobrazené na této stránce poskytují všechny informace potřebné pro maximalizaci záruk a reprodukci výsledků. Klíčem ke kvalitě tohoto losování je dvojitá náhodnost, kterou poskytuje hod kostkou (ověřený svědky) a přesný čas výběru, který poskytuje vstup pro algoritmus, který generuje náhodný výběr. \n\nČasový základ pro losování je tak přesný (na sekundy), že není možné ovládat lidi, a tak lze poskytnout dvojitý \"nekontrolovatelný\" vstup, který zaručí spravedlivý výsledek. " - mathematical_result: Výsledek (1) x (2) - proposals_selected_by_sortition: Návrhy vybrané losováním - sortition_reproducibility_details: Detaily reprodukovatelnosti losování - taxonomies: z taxonomií %{taxonomies} - time_seed: (2) Časový základ - witnesses: Svědci - sortition: - random_seed: Náhodný časový základ - selected_proposals: - one: vybraný návrh - few: vybraných návrhů - many: vybraných návrhů - other: vybraných návrhů - sortition_author: - deleted: Odstraněný uživatel - sortition_cancel_author: - deleted: Odstraněný uživatel - sortitions_count: - count: - one: 1 losování - few: "%{count} losování" - many: "%{count} losování" - other: "%{count} losování" - statistics: - sortitions_count: Losování diff --git a/decidim-sortitions/config/locales/da-DK.yml b/decidim-sortitions/config/locales/da-DK.yml deleted file mode 100644 index 347c94d5e3836..0000000000000 --- a/decidim-sortitions/config/locales/da-DK.yml +++ /dev/null @@ -1 +0,0 @@ -da: diff --git a/decidim-sortitions/config/locales/da.yml b/decidim-sortitions/config/locales/da.yml deleted file mode 100644 index 347c94d5e3836..0000000000000 --- a/decidim-sortitions/config/locales/da.yml +++ /dev/null @@ -1 +0,0 @@ -da: diff --git a/decidim-sortitions/config/locales/de.yml b/decidim-sortitions/config/locales/de.yml deleted file mode 100644 index 364448a5f673a..0000000000000 --- a/decidim-sortitions/config/locales/de.yml +++ /dev/null @@ -1,145 +0,0 @@ -de: - activemodel: - attributes: - sortition: - additional_info: Sortierinformationen - decidim_proposals_component_id: Vorschläge festgelegt - dice: Ergebnis des Würfelwurfs. Wirf einen 6-seitigen Würfel oder suche nach einem anderen zufälligen Weg, um eine Zahl von 1 bis 6 zu erzeugen, und gib die resultierende Zahl vor einigen Zeugen ein. Dies trägt zur Qualität und zur Gewährleistung der Zufälligkeit des Ergebnisses bei - target_items: Anzahl der auszuwählenden Vorschläge (gibt die Anzahl der Vorschläge an, die Sie auswählen möchten, indem Sie viele der Vorschläge auswählen, die Sie zuvor ausgewählt haben) - title: Titel - witnesses: Zeugen - models: - decidim/sortitions/create_sortition_event: Sortierung - activerecord: - models: - decidim/sortitions/sortition: - one: Sortierung - other: Sortierungen - decidim: - components: - sortitions: - actions: - comment: Kommentieren - name: Sortierungen - settings: - global: - clear_all: Alle löschen - comments_enabled: Kommentare aktiviert - comments_max_length: Maximale Länge der Kommentare (0 für Standardwert) - define_taxonomy_filters: Bitte definieren Sie einige Filter für diesen partizipativen Bereich, bevor Sie diese Einstellung verwenden. - no_taxonomy_filters_found: Keine Klassifizierungsfilter gefunden. - taxonomy_filters: Filter für die Komponente auswählen - taxonomy_filters_add: Filter hinzufügen - events: - sortitions: - sortition_created: - email_intro: Die Auslosung "%{resource_title}" wurde zu "%{participatory_space_title}" hinzugefügt, dem Sie folgen. - email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie "%{participatory_space_title}" folgen. Falls Sie keine solchen Benachrichtigungen mehr erhalten möchten, besuchen Sie den obigen Link. - email_subject: Neue Sortierung wurde zu %{participatory_space_title}hinzugefügt - notification_title: Die Auslosung %{resource_title} wurde zu %{participatory_space_title} hinzugefügt - sortitions: - admin: - actions: - destroy: Brechen Sie die Sortierung ab - edit: Bearbeiten - new_sortition: Neue Sortierung - show: Sortierdetails - title: Aktionen - models: - sortition: - fields: - created_at: Erstellungsdatum - decidim_proposals_component: Vorschlagskomponente - dice: Würfel - reference: Referenz - request_timestamp: Zeit zeichnen - seed: Samen - target_items: Zu wählende Elemente - taxonomies: Klassifizierungen - title: Titel - sortitions: - confirm_destroy: - confirm_destroy: Möchten Sie diese Sortierung wirklich abbrechen? - destroy: Sortierung abbrechen - title: Stornierung der Sortierung - create: - error: Beim Erstellen einer neuen Datei ist ein Fehler aufgetreten. - success: Die Sortierung wurde erfolgreich erstellt. - destroy: - error: Die Sortierung kann nicht abgebrochen werden. - success: Die Sortierung wurde erfolgreich abgebrochen. - edit: - title: Informationen zur Sortierung aktualisieren - update: Aktualisieren - form: - all_taxonomies: Alle Klassifizierungen - select_proposal_component: Wählen Sie die Vorschläge aus - select_taxonomies: Klassifizierungen der Vorschlagsauswahl, auf die die Auslosung angewendet wird. Lassen Sie das Feld leer, um die Ziehung auf alle Vorschläge dieser Klassifizierung anzuwenden. - index: - title: Sortierungen - new: - confirm: Durch Drücken des nächsten Knopfes zeichnet Decidim das Datum und die Zeit (mit der Genauigkeit von Sekunden) auf und zusammen mit dem Würfelwurf wird diese Information verwendet, um eine zufällige Auswahl zu erzeugen. Die Aktion ist unumkehrbar. Sobald die Schaltfläche angeklickt wird, wird das Ergebnis dieser Verlosung veröffentlicht, zusammen mit den in diesem Formular eingegebenen Daten und kann nicht geändert werden. Überprüfen Sie deshalb bitte den Inhalt sorgfältig. - create: Erstellen - title: Neue Sortierung - show: - selected_proposals: Vorschläge für die Auslosung ausgewählt - update: - error: Beim Aktualisieren der Sortierung ist ein Fehler aufgetreten. - success: Die Sortierung wurde erfolgreich aktualisiert. - admin_log: - sortition: - create: "%{user_name} erstellt die %{resource_name} Sortierung in %{space_name}" - delete: "%{user_name} hat die %{resource_name} Sortierung in %{space_name}abgebrochen" - update: "%{user_name} hat die %{resource_name} Sortierung in %{space_name}aktualisiert" - sortitions: - count: - proposals_count: - one: 1 Vorschlag - other: "%{count} Vorschläge" - filters: - active: Aktiv - all: Alle - cancelled: Abgebrochen - category: Kategorie - state: Status - index: - empty: Es gibt noch keine Sortierungen. - linked_sortitions: - selected_proposals: Ausgewählte Vorschläge - orders: - label: 'Sortieren nach:' - random: Zufällig - recent: Kürzlich hinzugefügt - results_count: - count: - one: ausgewählter Vorschlag - other: ausgewählte Vorschläge - show: - algorithm: Sortieralgorithmuscode - any_taxonomy: alle Klassifizierungen - cancelled: Stornierte Sortierung - candidate_proposal_ids: Reihenfolge der Sortierungsvorschläge und IDs - candidate_proposals_info: 'Die Auslosung wurde unter den folgenden Vorschlägen (%{taxonomy_labels}) durchgeführt, mit den folgenden IDs (fett gedruckt sind die ausgewählten Vorschläge) ' - dice_result: (1) Würfelergebnis - introduction: 'Diese Seite enthält die Ergebnisse der Sortierung %{reference}. Durch diese Sortierung wurde %{target_items} Anzahl von Ergebnissen zufällig und mit einer gleichen Wahrscheinlichkeitsverteilung aus dem unten angezeigten Satz von Vorschlägen ausgewählt. Zusammen mit den Ergebnissen bieten die auf dieser Seite angezeigten Informationen alle Informationen, die erforderlich sind, um die Garantien zu maximieren und die Ergebnisse zu reproduzieren. Der Schlüssel zur Qualität dieser Sortierung ist die doppelte Zufälligkeit, die durch das Rollen eines Würfels (verifiziert durch Zeugen) und den genauen Zeitpunkt der Sortierung bereitgestellt wird, der eine Eingabe für einen Algorithmus liefert, der eine zufällige Auswahl erzeugt. Der Zeitsaat für die Sortierung ist so genau (Sekunden), dass es unmöglich ist, von Menschen kontrolliert zu werden, wodurch eine doppelte "unkontrollierbare" Eingabe bereitgestellt wird, um ein faires Ergebnis zu garantieren. ' - mathematical_result: Ergebnis (1) x (2) - proposals_selected_by_sortition: Vorschläge nach der Sortierung ausgewählt - sortition_reproducibility_details: Einzelheiten der Sortierreproduzierbarkeit - taxonomies: von den Klassifizierungen %{taxonomies} - time_seed: (2) Zeit Samen - witnesses: Zeugen - sortition: - random_seed: Zufallssamen - selected_proposals: - one: Vorschlag ausgewählt - other: Vorschläge ausgewählt - sortition_author: - deleted: Gelöschter Benutzer - sortition_cancel_author: - deleted: Gelöschter Benutzer - sortitions_count: - count: - one: 1 Sortierung - other: "%{count} Sortierungen" - statistics: - sortitions_count: Sortierungen diff --git a/decidim-sortitions/config/locales/el-GR.yml b/decidim-sortitions/config/locales/el-GR.yml deleted file mode 100644 index 419ec705c3e6d..0000000000000 --- a/decidim-sortitions/config/locales/el-GR.yml +++ /dev/null @@ -1 +0,0 @@ -el: diff --git a/decidim-sortitions/config/locales/el.yml b/decidim-sortitions/config/locales/el.yml deleted file mode 100644 index 8c7f4fc58fcfa..0000000000000 --- a/decidim-sortitions/config/locales/el.yml +++ /dev/null @@ -1,130 +0,0 @@ -el: - activemodel: - attributes: - sortition: - additional_info: Πληροφορίες κλήρωσης - decidim_proposals_component_id: Σύνολο προτάσεων - dice: Αποτέλεσμα ζαριάς. Ρίξτε ένα ζάρι 6 πλευρών ή αναζητήστε έναν άλλο τυχαίο τρόπο για να δημιουργήσετε έναν αριθμό από το 1 έως το 6 και εισαγάγετε εδώ τον αριθμό που προκύπτει ενώπιον μερικών μαρτύρων. Αυτό συμβάλλει στην ποιότητα και εξασφαλίζει την τυχαιότητα του αποτελέσματος - target_items: Αριθμός προτάσεων προς επιλογή (δηλώνει τον αριθμό των προτάσεων που θέλετε να επιλεγούν με κλήρωση της ομάδας προτάσεων που έχετε επιλέξει προηγουμένως) - title: Τίτλος - witnesses: Μάρτυρες - models: - decidim/sortitions/create_sortition_event: Κλήρωση - activerecord: - models: - decidim/sortitions/sortition: - one: Κλήρωση - other: Κληρώσεις - decidim: - components: - sortitions: - actions: - comment: Σχόλιο - name: Κληρώσεις - settings: - global: - comments_enabled: Τα σχόλια ενεργοποιήθηκαν - comments_max_length: Μέγιστο μέγεθος σχολίων (Αφήστε το 0 για την προκαθορισμένη τιμή) - events: - sortitions: - sortition_created: - email_intro: Η κλήρωση «%{resource_title}» προστέθηκε στον χώρο συμμετοχής «%{participatory_space_title}» που ακολουθείτε. - email_outro: Λάβατε αυτήν την ειδοποίηση επειδή ακολουθείτε τον χώρο συμμετοχής «%{participatory_space_title}». Μπορείτε να σταματήσετε να τον ακολουθείτε από τον προηγούμενο σύνδεσμο. - email_subject: Προστέθηκε νέα κλήρωση στον χώρο συμμετοχής %{participatory_space_title} - notification_title: Η κλήρωση %{resource_title} προστέθηκε στον χώρο συμμετοχής %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Ακύρωση της κλήρωσης - edit: Επεξεργασία - show: Λεπτομέρειες κλήρωσης - models: - sortition: - fields: - created_at: Ημερομηνία δημιουργίας - decidim_proposals_component: Στοιχείο προτάσεων - dice: Ζάρι - reference: Αναφορά - request_timestamp: Ώρα κλήρωσης - seed: Κατάταξη - target_items: Στοιχεία προς επιλογή - title: Τίτλος - sortitions: - confirm_destroy: - confirm_destroy: Είστε βέβαιοι ότι θέλετε να ακυρώσετε αυτήν την κλήρωση; - destroy: Ακύρωση κλήρωσης - title: Ακύρωση της κλήρωσης - create: - error: Υπήρξε ένα πρόβλημα κατά τη δημιουργία μιας νέας κλήρωσης. - success: Η κλήρωση δημιουργήθηκε με επιτυχία. - destroy: - error: Δεν είναι δυνατή η ακύρωση της κλήρωσης. - success: Η κλήρωση ακυρώθηκε με επιτυχία. - edit: - title: Ενημερώστε τις πληροφορίες σχετικά με την κλήρωση - update: Ενημέρωση - form: - select_proposal_component: Επιλέξτε το σύνολο προτάσεων - index: - title: Κληρώσεις - new: - confirm: Πατώντας το επόμενο κουμπί, το Decidim θα καταγράψει την ημερομηνία και την ώρα (με ακρίβεια δευτερολέπτων) και μαζί με τη ζαριά, αυτές οι πληροφορίες θα χρησιμοποιηθούν για τη δημιουργία μιας τυχαίας επιλογής. Η ενέργεια θα είναι μη αναστρέψιμη, μόλις πατήσετε το κουμπί, θα δημοσιευτεί το αποτέλεσμα αυτής της κλήρωσης, μαζί με τα δεδομένα που έχουν εισαχθεί σε αυτήν τη φόρμα και δεν μπορούν να τροποποιηθούν, ελέγξτε προσεκτικά το περιεχόμενο. - create: Δημιουργία - title: Νέα κλήρωση - show: - selected_proposals: Επιλέχθηκαν προτάσεις για κλήρωση - update: - error: Υπήρξε ένα πρόβλημα κατά την ενημέρωση της κλήρωσης. - success: Η κλήρωση ενημερώθηκε με επιτυχία. - admin_log: - sortition: - create: "Ο χρήστης %{user_name} δημιούργησε την κλήρωση %{resource_name} στον χώρο %{space_name}" - delete: "Ο χρήστης %{user_name} ακύρωσε την κλήρωση %{resource_name} στον χώρο %{space_name}" - update: "Ο χρήστης %{user_name} ενημέρωσε την κλήρωση %{resource_name} στον χώρο %{space_name}" - sortitions: - count: - proposals_count: - one: 1 πρόταση - other: "%{count} προτάσεις" - filters: - active: Ενεργές - all: Όλα - cancelled: Ακυρώθηκε - category: Κατηγορία - state: Κατάσταση - linked_sortitions: - selected_proposals: Επιλεγμένες προτάσεις - orders: - label: 'Ταξινόμηση κληρώσεων κατά:' - random: Τυχαία - recent: Πρόσφατα - results_count: - count: - one: επιλεγμένη πρόταση - other: επιλεγμένες προτάσεις - show: - algorithm: Κωδικός αλγορίθμου κλήρωσης - cancelled: Ακυρωμένη κλήρωση - candidate_proposal_ids: Ταξινόμηση προτάσεων κληρώσεων και αναγνωριστικά - dice_result: (1) Αποτέλεσμα ζαριάς - introduction: 'Αυτή η σελίδα περιέχει τα αποτελέσματα της κλήρωσης %{reference}. Μέσω αυτής της κλήρωσης, ο αριθμός %{target_items} των αποτελεσμάτων επιλέχθηκε τυχαία και με ίση πιθανότητα κατανομής από το σύνολο των προτάσεων που εμφανίζονται παρακάτω. Μαζί με τα αποτελέσματα, οι πληροφορίες που εμφανίζονται σε αυτήν τη σελίδα παρέχουν όλες τις πληροφορίες που απαιτούνται για τη μεγιστοποίηση των εγγυήσεων και την αναπαραγωγή των αποτελεσμάτων. Το κλειδί για την ποιότητα αυτής της κλήρωσης είναι η διπλή τυχαιότητα που παρέχεται από το ρίξιμο του ζαριού (επαληθευμένο από μάρτυρες) και τον ακριβή χρόνο της κλήρωσης που παρέχει δεδομένα για έναν αλγόριθμο που δημιουργεί μια τυχαία επιλογή. Η χρονική κατάταξη για την κλήρωση είναι τόσο ακριβής (δευτερόλεπτα), που είναι αδύνατο να ελεγχθεί από ανθρώπους, παρέχοντας έτσι μια διπλή «μη ελεγχόμενη» εισαγωγή δεδομένων για να εξασφαλιστεί ένα δίκαιο αποτέλεσμα.' - mathematical_result: Αποτέλεσμα (1) x (2) - proposals_selected_by_sortition: Προτάσεις που επιλέχθηκαν βάσει κλήρωσης - sortition_reproducibility_details: Λεπτομέρειες δυνατότητας αναπαραγωγής κλήρωσης - time_seed: (2) Χρονική κατάταξη - witnesses: Μάρτυρες - sortition: - random_seed: Τυχαία κατάταξη - selected_proposals: - one: επιλεγμένη πρόταση - other: επιλεγμένες προτάσεις - sortition_author: - deleted: Διαγραμμένος συμμετέχων - sortition_cancel_author: - deleted: Διαγραμμένος συμμετέχων - sortitions_count: - count: - one: 1 κλήρωση - other: "%{count} κληρώσεις" - statistics: - sortitions_count: Κληρώσεις diff --git a/decidim-sortitions/config/locales/en.yml b/decidim-sortitions/config/locales/en.yml deleted file mode 100644 index a65bb38a15928..0000000000000 --- a/decidim-sortitions/config/locales/en.yml +++ /dev/null @@ -1,148 +0,0 @@ ---- -en: - activemodel: - attributes: - sortition: - additional_info: Sortition information - decidim_proposals_component_id: Proposals set - dice: Result of die roll. Roll a 6-sided die, or look for another random way to generate a number from 1 to 6, and enter here the resulting number in front of some witnesses. This contributes to the quality and guarantees of the randomness of the result - target_items: Number of proposals to be selected (indicates the number of proposals you want to be selected by drawing lots of the group of proposals you have previously chosen) - title: Title - witnesses: Witnesses - models: - decidim/sortitions/create_sortition_event: Sortition - activerecord: - models: - decidim/sortitions/sortition: - one: Sortition - other: Sortitions - decidim: - components: - sortitions: - actions: - comment: Comment - name: Sortitions - settings: - global: - clear_all: Clear all - comments_enabled: Comments enabled - comments_max_length: Comments max length (Leave 0 for default value) - define_taxonomy_filters: Please define some filters for this participatory space before using this setting. - no_taxonomy_filters_found: No taxonomy filters found. - taxonomy_filters: Select filters for the component - taxonomy_filters_add: Add filter - events: - sortitions: - sortition_created: - email_intro: The sortition "%{resource_title}" has been added to "%{participatory_space_title}" that you are following. - email_outro: You have received this notification because you are following "%{participatory_space_title}". You can unfollow it from the previous link. - email_subject: New sortition added to %{participatory_space_title} - notification_title: The sortition %{resource_title} has been added to %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancel the sortition - edit: Edit - new_sortition: New sortition - show: Sortition details - title: Actions - deprecation_warning_html: "⚠️ Deprecation Notice. The Sortitions module will be removed in Decidim v0.32. Please plan accordingly and consider alternative solutions for participant or proposal selection." - models: - sortition: - fields: - created_at: Creation date - decidim_proposals_component: Proposals component - dice: Dice - reference: Reference - request_timestamp: Draw time - seed: Seed - target_items: Items to select - taxonomies: Taxonomies - title: Title - sortitions: - confirm_destroy: - confirm_destroy: Are you sure you want to cancel this sortition? - destroy: Cancel sortition - title: Cancellation of the sortition - create: - error: There was a problem creating a new sortition. - success: Sortition successfully created. - destroy: - error: Cannot cancel the sortition. - success: Sortition successfully cancelled. - edit: - title: Update the information about the sortition - update: Update - form: - all_taxonomies: All taxonomies - select_proposal_component: Select the proposals set - select_taxonomies: Taxonomies of the set of proposals in which you want to apply the draw. Leave empty to apply the draw to all proposals on that taxonomy. - index: - title: Sortitions - new: - confirm: By pressing the next button the platform will record the date and time (with precision of seconds) and together with the dice roll, this information will be used to generate a random selection. The action will be irreversible, once the button is clicked the result of this draw will be published, together with the data entered in this form and cannot be modified, please check the content carefully. - create: Create - title: New sortition - show: - selected_proposals: Proposals selected for draw - update: - error: There was a problem updating the sortition. - success: Sortition successfully updated. - admin_log: - sortition: - create: "%{user_name} created the %{resource_name} sortition in %{space_name}" - delete: "%{user_name} cancelled the %{resource_name} sortition in %{space_name}" - update: "%{user_name} updated the %{resource_name} sortition in %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposal - other: "%{count} proposals" - filters: - active: Active - all: All - cancelled: Cancelled - category: Category - state: Status - index: - empty: There are no sortitions yet. - linked_sortitions: - selected_proposals: Selected proposals - orders: - label: 'Order sortitions by:' - random: Random - recent: Recent - results_count: - count: - one: Selected proposal - other: Selected proposals - show: - algorithm: Sortition's algorithm code - any_taxonomy: from all taxonomies - cancelled: Cancelled sortition - candidate_proposal_ids: Sortition proposals order and IDs - candidate_proposals_info: 'The sortition was carried out among the following proposals (%{taxonomy_labels}), with the following IDs (in bold the selected proposals) ' - dice_result: Dice result - introduction: 'This page contains the results of the sortition %{reference}. By means of this sortition, %{target_items} number of results have been selected randomly and with an equal probability distribution from the set of proposals displayed bellow. Together with the results, the information displayed on this page provides all the information required to maximize guarantees and to reproduce the results. The key to the quality of this sortition is the double randomness provided by a the rolling of a dice(verified by witnesses) and the precise time of the sortition that provides input for an algorithm that generates a random selection. The time-seed for the sortition is so accurate (seconds) that it is impossible to control by humans thus providing a double "uncontrollable" input to guarantee a fair result. ' - mathematical_result: Result (Dice x Seed) - proposals_selected_by_sortition: Proposals selected by sortition - sortition_reproducibility_details: Sortition reproducibility - taxonomies: from the %{taxonomies} taxonomies - time_seed: Time seed - witnesses: Witnesses - sortition: - random_seed: Random seed - selected_proposals: - one: proposal selected - other: proposals selected - sortition_author: - deleted: Deleted participant - sortition_cancel_author: - deleted: Deleted participant - sortitions_count: - count: - one: 1 sortition - other: "%{count} sortitions" - statistics: - sortitions_count: Sortitions - sortitions_count_tooltip: The number of random selections carried out for decision-making. diff --git a/decidim-sortitions/config/locales/eo-UY.yml b/decidim-sortitions/config/locales/eo-UY.yml deleted file mode 100644 index 7599814048735..0000000000000 --- a/decidim-sortitions/config/locales/eo-UY.yml +++ /dev/null @@ -1 +0,0 @@ -eo: diff --git a/decidim-sortitions/config/locales/eo.yml b/decidim-sortitions/config/locales/eo.yml deleted file mode 100644 index 7599814048735..0000000000000 --- a/decidim-sortitions/config/locales/eo.yml +++ /dev/null @@ -1 +0,0 @@ -eo: diff --git a/decidim-sortitions/config/locales/es-MX.yml b/decidim-sortitions/config/locales/es-MX.yml deleted file mode 100644 index 0cd9024d52751..0000000000000 --- a/decidim-sortitions/config/locales/es-MX.yml +++ /dev/null @@ -1,147 +0,0 @@ -es-MX: - activemodel: - attributes: - sortition: - additional_info: Información de clasificación - decidim_proposals_component_id: Propuestas - dice: Resultado de la tirada de dados. Tira un dado de 6 caras, o busca otra forma aleatoria de generar un número del 1 al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado - target_items: Número de propuestas que se seleccionarán (indica el número de propuestas que desea seleccionar dibujando un montón del grupo de propuestas que ha elegido previamente) - title: Título - witnesses: Testigos - models: - decidim/sortitions/create_sortition_event: Sorteo - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteo - other: Sorteos - decidim: - components: - sortitions: - actions: - comment: Comentar - name: Sorteos - settings: - global: - clear_all: Limpiarlo todo - comments_enabled: Comentarios habilitados - comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto) - define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración. - no_taxonomy_filters_found: No se han encontrado filtros de taxonomía. - taxonomy_filters: Seleccionar filtros para el componente - taxonomy_filters_add: Añadir un filtro - events: - sortitions: - sortition_created: - email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo. - email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior. - email_subject: Nuevo sorteo añadida a %{participatory_space_title} - notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancelar el sorteo - edit: Editar - new_sortition: Añadir sorteo - show: Detalles de la clasificación - title: Acciones - deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar." - models: - sortition: - fields: - created_at: Fecha de creación - decidim_proposals_component: Componente Propuestas - dice: Dado - reference: Referencia - request_timestamp: Tiempo de dibujar - seed: Semilla - target_items: Artículos para seleccionar - taxonomies: Taxonomías - title: Título - sortitions: - confirm_destroy: - confirm_destroy: '¿Seguro que quieres cancelar este sorteo?' - destroy: Cancelar el sorteo - title: Cancelar el sorteo - create: - error: Se produjo un error al crear un nuevo sorteo. - success: Sorteo creado correctamente. - destroy: - error: No se puede cancelar el sorteo. - success: Sorteo cancelado correctamente. - edit: - title: Actualiza la información sobre el sorteo - update: Actualizar - form: - all_taxonomies: Todas las taxonomías - select_proposal_component: Seleccione el conjunto de propuestas - select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía. - index: - title: Sorteos - new: - confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente. - create: Crear - title: Nuevo sorteo - show: - selected_proposals: Propuestas seleccionadas para sorteo - update: - error: Se produjo un error al actualizar el sorteo. - success: Sorteo actualizado correctamente. - admin_log: - sortition: - create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}" - delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}" - update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}" - sortitions: - count: - proposals_count: - one: 1 propuesta - other: "%{count} propuestas" - filters: - active: Activo - all: Todas - cancelled: Cancelado - category: Categoría - state: Estado - index: - empty: Aún no hay ningún sorteo. - linked_sortitions: - selected_proposals: Propuestas seleccionadas - orders: - label: 'Ordena los sorteos por:' - random: Aleatorio - recent: Reciente - results_count: - count: - one: propuesta seleccionada - other: propuestas seleccionadas - show: - algorithm: Código de algoritmo del sorteo - any_taxonomy: de todas las taxonomías - cancelled: Cancelación de la clasificación - candidate_proposal_ids: Orden de propuestas de clasificación e ID - candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) ' - dice_result: (1) resultado de los dados - introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propuestas seleccionadas por clasificación - sortition_reproducibility_details: Detalles de reproducibilidad del sorteo - taxonomies: de las taxonomías %{taxonomies} - time_seed: (2) Tiempo de semilla - witnesses: Testigos - sortition: - random_seed: Semilla aleatoria - selected_proposals: - one: 1 propuesta seleccionada - other: '%{count} propuestas seleccionadas' - sortition_author: - deleted: Usuario eliminado - sortition_cancel_author: - deleted: Usuario eliminado - sortitions_count: - count: - one: 1 sorteo - other: "%{count} clasificaciones" - statistics: - sortitions_count: Sorteos - sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones. diff --git a/decidim-sortitions/config/locales/es-PY.yml b/decidim-sortitions/config/locales/es-PY.yml deleted file mode 100644 index aad229f5a9e95..0000000000000 --- a/decidim-sortitions/config/locales/es-PY.yml +++ /dev/null @@ -1,147 +0,0 @@ -es-PY: - activemodel: - attributes: - sortition: - additional_info: Información de clasificación - decidim_proposals_component_id: Propuestas - dice: Resultado de la tirada de dados. Tira un dado de 6 caras, o busca otra forma aleatoria de generar un número del 1 al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado - target_items: Número de propuestas que se seleccionarán (indica el número de propuestas que desea seleccionar dibujando un montón del grupo de propuestas que ha elegido previamente) - title: Título - witnesses: Testigos - models: - decidim/sortitions/create_sortition_event: Sorteo - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteo - other: Sorteos - decidim: - components: - sortitions: - actions: - comment: Comentar - name: Sorteos - settings: - global: - clear_all: Limpiarlo todo - comments_enabled: Comentarios habilitados - comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto) - define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración. - no_taxonomy_filters_found: No se han encontrado filtros de taxonomía. - taxonomy_filters: Seleccionar filtros para el componente - taxonomy_filters_add: Añadir un filtro - events: - sortitions: - sortition_created: - email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo. - email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior. - email_subject: Nuevo sorteo añadida a %{participatory_space_title} - notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancelar el sorteo - edit: Editar - new_sortition: Añadir sorteo - show: Detalles de la clasificación - title: Acciones - deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar." - models: - sortition: - fields: - created_at: Fecha de creación - decidim_proposals_component: Componente Propuestas - dice: Dado - reference: Referencia - request_timestamp: Tiempo de dibujar - seed: Semilla - target_items: Artículos para seleccionar - taxonomies: Taxonomías - title: Título - sortitions: - confirm_destroy: - confirm_destroy: '¿Seguro que quieres cancelar este sorteo?' - destroy: Cancelar el sorteo - title: Cancelar el sorteo - create: - error: Se produjo un error al crear un nuevo sorteo. - success: Sorteo creado correctamente. - destroy: - error: No se puede cancelar el sorteo. - success: Sorteo cancelado correctamente. - edit: - title: Actualiza la información sobre el sorteo - update: Actualizar - form: - all_taxonomies: Todas las taxonomías - select_proposal_component: Seleccione el conjunto de propuestas - select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía. - index: - title: Sorteos - new: - confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente. - create: Crear - title: Nuevo sorteo - show: - selected_proposals: Propuestas seleccionadas para sorteo - update: - error: Se produjo un error al actualizar el sorteo. - success: Sorteo actualizado correctamente. - admin_log: - sortition: - create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}" - delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}" - update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}" - sortitions: - count: - proposals_count: - one: 1 propuesta - other: "%{count} propuestas" - filters: - active: Activo - all: Todas - cancelled: Cancelado - category: Categoría - state: Estado - index: - empty: Aún no hay ningún sorteo. - linked_sortitions: - selected_proposals: Propuestas seleccionadas - orders: - label: 'Ordena los sorteos por:' - random: Aleatorio - recent: Reciente - results_count: - count: - one: propuesta seleccionada - other: propuestas seleccionadas - show: - algorithm: Código de algoritmo del sorteo - any_taxonomy: de todas las taxonomías - cancelled: Cancelación de la clasificación - candidate_proposal_ids: Orden de propuestas de clasificación e ID - candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) ' - dice_result: (1) resultado de los dados - introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propuestas seleccionadas por clasificación - sortition_reproducibility_details: Detalles de reproducibilidad del sorteo - taxonomies: de las taxonomías %{taxonomies} - time_seed: (2) Tiempo de semilla - witnesses: Testigos - sortition: - random_seed: Semilla aleatoria - selected_proposals: - one: 1 propuesta seleccionada - other: '%{count} propuestas seleccionadas' - sortition_author: - deleted: Usuario eliminado - sortition_cancel_author: - deleted: Usuario eliminado - sortitions_count: - count: - one: 1 sorteo - other: "%{count} clasificaciones" - statistics: - sortitions_count: Sorteos - sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones. diff --git a/decidim-sortitions/config/locales/es.yml b/decidim-sortitions/config/locales/es.yml deleted file mode 100644 index 13aa0914368d4..0000000000000 --- a/decidim-sortitions/config/locales/es.yml +++ /dev/null @@ -1,147 +0,0 @@ -es: - activemodel: - attributes: - sortition: - additional_info: Información del sorteo - decidim_proposals_component_id: Propuestas establecidas - dice: Resultado de la tirada de dados. Tira un dado de seis caras, o busca otra forma aleatoria de generar un número del uno al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado - target_items: Número de propuestas a seleccionar (indica el número de propuestas que deseas seleccionar a través del sorteo del grupo de propuestas que hayas seleccionado previamente) - title: Título - witnesses: Testigos - models: - decidim/sortitions/create_sortition_event: Sorteo - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteo - other: Sorteos - decidim: - components: - sortitions: - actions: - comment: Comentar - name: Sorteos - settings: - global: - clear_all: Limpiarlo todo - comments_enabled: Comentarios habilitados - comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto) - define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración. - no_taxonomy_filters_found: No se han encontrado filtros de taxonomía. - taxonomy_filters: Seleccionar filtros para el componente - taxonomy_filters_add: Añadir un filtro - events: - sortitions: - sortition_created: - email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo. - email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior. - email_subject: Nuevo sorteo añadida a %{participatory_space_title} - notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancela el sorteo - edit: Editar - new_sortition: Añadir sorteo - show: Detalles del sorteo - title: Acciones - deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar." - models: - sortition: - fields: - created_at: Fecha de creación - decidim_proposals_component: Componente de Propuestas - dice: Dado - reference: Referencia - request_timestamp: Tiempo de dibujar - seed: Semilla - target_items: Elementos a seleccionar - taxonomies: Taxonomías - title: Título - sortitions: - confirm_destroy: - confirm_destroy: '¿Segura que quieres cancelar este sorteo?' - destroy: Cancelar el sorteo - title: Cancelación del sorteo - create: - error: Se ha producido un error al crear un nuevo sorteo. - success: Sorteo creado correctamente. - destroy: - error: No se puede cancelar el sorteo. - success: Sorteo cancelado correctamente. - edit: - title: Actualiza la información sobre el sorteo - update: Actualizar - form: - all_taxonomies: Todas las taxonomías - select_proposal_component: Selecciona el conjunto de propuestas - select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía. - index: - title: Sorteos - new: - confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente. - create: Crear - title: Nuevo sorteo - show: - selected_proposals: Propuestas seleccionadas para sorteo - update: - error: Se ha producido un error al actualizar el sorteo. - success: Sorteo actualizado correctamente. - admin_log: - sortition: - create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}" - delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}" - update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}" - sortitions: - count: - proposals_count: - one: 1 propuesta - other: "%{count} propuestas" - filters: - active: Activo - all: Todas - cancelled: Cancelado - category: Categoría - state: Estado - index: - empty: Aún no hay ningún sorteo. - linked_sortitions: - selected_proposals: Propuestas seleccionadas - orders: - label: 'Ordena los sorteos por:' - random: Aleatorio - recent: Reciente - results_count: - count: - one: Propuesta seleccionada - other: Propuestas seleccionadas - show: - algorithm: Código de algoritmo del sorteo - any_taxonomy: de todas las taxonomías - cancelled: Sorteo cancelado - candidate_proposal_ids: Orden e IDs de las propuestas del sorteo - candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) ' - dice_result: (1) resultado de los dados - introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propuestas seleccionadas por sorteo - sortition_reproducibility_details: Detalles de reproducibilidad del sorteo - taxonomies: de las taxonomías %{taxonomies} - time_seed: (2) Semilla de tiempo - witnesses: Testimonios - sortition: - random_seed: Semilla aleatoria - selected_proposals: - one: 1 propuesta seleccionada - other: propuestas seleccionadas - sortition_author: - deleted: Participante eliminada - sortition_cancel_author: - deleted: Participante eliminada - sortitions_count: - count: - one: 1 sorteo - other: "%{count} clasificaciones" - statistics: - sortitions_count: Sorteos - sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones. diff --git a/decidim-sortitions/config/locales/et-EE.yml b/decidim-sortitions/config/locales/et-EE.yml deleted file mode 100644 index e020c4ffc443d..0000000000000 --- a/decidim-sortitions/config/locales/et-EE.yml +++ /dev/null @@ -1 +0,0 @@ -et: diff --git a/decidim-sortitions/config/locales/et.yml b/decidim-sortitions/config/locales/et.yml deleted file mode 100644 index e020c4ffc443d..0000000000000 --- a/decidim-sortitions/config/locales/et.yml +++ /dev/null @@ -1 +0,0 @@ -et: diff --git a/decidim-sortitions/config/locales/eu.yml b/decidim-sortitions/config/locales/eu.yml deleted file mode 100644 index fbadd3cdf7009..0000000000000 --- a/decidim-sortitions/config/locales/eu.yml +++ /dev/null @@ -1,147 +0,0 @@ -eu: - activemodel: - attributes: - sortition: - additional_info: Zozketari buruzko informazioa - decidim_proposals_component_id: Proposamen taldea - dice: Dadoen emaitza. Bota 6 aldeko dado bat edo bilatu beste eraren bat 1etik 6ra bitarteko ausazko zenbaki bat sortzeko eta sartu hemen zenbaki hori hainbat lekukoren aurrean. Horrek emaitzen ausazkotasunaren kalitatea eta bermea lagunduko ditu - target_items: Aukeratu nahi duzun proposamen kopurua (adierazitako proposamen taldetik zozketaren bidez aukeratu nahi duzun proposamen kopurua ezarri) - title: Izenburua - witnesses: Lekukoak - models: - decidim/sortitions/create_sortition_event: Zozketa - activerecord: - models: - decidim/sortitions/sortition: - one: Zozketa - other: Zozketak - decidim: - components: - sortitions: - actions: - comment: Egin iruzkina - name: Zozketak - settings: - global: - clear_all: Garbitu dena - comments_enabled: Iruzkinak gaituta - comments_max_length: Iruzkinen gehieneko luzera (utzi 0 lehenetsita konfigurazioa mantendu nahi baduzu) - define_taxonomy_filters: Mesedez, zehaztu iragazki batzuk partaidetza-espazio honetarako eszenatoki hau erabili aurretik. - no_taxonomy_filters_found: Ez da taxonomia-iragazkirik aurkitu. - taxonomy_filters: Aukeratu iragazkiak osagairako - taxonomy_filters_add: Erantsi iragazkia - events: - sortitions: - sortition_created: - email_intro: '"%{resource_title}" zozketa jarraitzen ari zaren "%{participatory_space_title}" espazioan gehitu da.' - email_outro: Jakinarazpen hau jaso duzu "%{participatory_space_title}" jarraitzen ari zarelako. Aurreko estekan sartu jarraitzeari uzteko. - email_subject: Beste zozketa bat gehitu da %{participatory_space_title} espaziora - notification_title: %{resource_title} zozketa %{participatory_space_title} espaziora gehitu da - sortitions: - admin: - actions: - destroy: Zozketa bertan behera utzi - edit: Editatu - new_sortition: Beste zozketa bat - show: Zozketaren xehetasunak - title: Ekintzak - deprecation_warning_html: "⚠️ Deprezazioaren Oharra. Zozketen modulua ezabatuko da Decidim v0.32an. Mesedez, planifikatu eta pentsatu irtenbide alternatiboak parte-hartzailearentzat edo proposamenak hautatzeko." - models: - sortition: - fields: - created_at: Sortze data - decidim_proposals_component: Proposamenen osagaia - dice: Dadoa - reference: Erreferentzia - request_timestamp: Zozketa-denbora - seed: Hazia - target_items: Aukeratzeko datu-eremuak - taxonomies: Taxonomiak - title: Izenburua - sortitions: - confirm_destroy: - confirm_destroy: Ziur al zaude zozketa hau bertan behera utzi nahi duzula? - destroy: Zozketa bertan behera utzi - title: Zozketa bertan behera uztea - create: - error: Arazo bat gertatu da zozketa berri bat sortzean. - success: Zozketa ondo sortu da. - destroy: - error: Zozketa ezin da bertan behera utzi. - success: Zozketa bertan behera utzi da. - edit: - title: Eguneratu zozketari buruzko informazioa - update: Eguneratu - form: - all_taxonomies: Taxonomia guztiak - select_proposal_component: Aukeratu proposamenen multzoa - select_taxonomies: Zozketa aplikatu nahi den proposamen multzoaren taxonomiak. Utzi hutsik zozketa taxonomia horri buruzko proposamen guztiei aplikatzeko. - index: - title: Zozketak - new: - confirm: Botoia sakatzean plataformak egun eta ordua (segundu gutxi batzuk gora behera) eta dadoak botatzean ateratako zenbakia gorde egingo ditu ausazko hautaketa bat egiteko. Botoia sakatu ondoren ez dago atzera egiterik eta zozketaren emaitzak zein txantiloi honetan sartutako datuak argitaratuko dira eta ezin izango dira aldatu. Beraz, mesedez, arretaz jarraitu. - create: Sortu - title: Zozketa berria - show: - selected_proposals: Zozketatzeko aukeratutako proposamenak - update: - error: Arazo bat sortu da zozketa eguneratzean. - success: Zozketa zuzen eguneratu da. - admin_log: - sortition: - create: "%{user_name} parte-hartzaileak %{resource_name} zozketa sortu du %{space_name} espazioan" - delete: "%{user_name} parte-hartzaileak %{resource_name} zozketa bertan behera utzi du %{space_name} espazioan" - update: "%{user_name} parte-hartzaileak %{resource_name} zozketa eguneratu du %{space_name} espazioan" - sortitions: - count: - proposals_count: - one: proposamen 1 - other: "Proposamen bat" - filters: - active: Aktiboak - all: Guztiak - cancelled: Bertan behera - category: Kategoria - state: Egoera - index: - empty: Oraindik ez dago sailkapenik. - linked_sortitions: - selected_proposals: Aukeratutako proposamenak - orders: - label: 'Zozketak honen arabera ordenatu:' - random: Ausazko ordena - recent: Berrienetatik zaharrenetara - results_count: - count: - one: Hautatutako proposamena - other: Hautatutako proposamenak - show: - algorithm: Zozketaren algoritmoaren kodea - any_taxonomy: taxonomia guztietatik - cancelled: Bertan behera utzitako zozketak - candidate_proposal_ids: Zozketako proposamenen hurrenkera eta IDak - candidate_proposals_info: 'Zozketa honako proposamenen artean egin zen (%{taxonomy_labels}), honako identifikazio-agiri hauekin (letra lodiz hautatutako proposamenak) ' - dice_result: Dadoen emaitza - introduction: 'Orrialde honek %{reference} zozketaren emaitzak ditu. Zozketa honen bidez, %{target_items} emaitza kopurua ausaz eta banaketa probabilistiko berdinarekin aukeratu dira proposamen multzotik. Orri honek, emaitzak ezezik, berme guztiak izateko behar den informazioa ere jaso du. Zozketa honen kalitateak bi gako ditu. Alde batetik, dadoa hainbat lekukoren aurrean bota dela. Bestetik, zozketaren une zehatzean sortu den algoritmoak eman duen ausazko hautaketa. Sailkapenerako hazi-denbora hain da zehatza (segunduak) gizakiak ezin baitu hori kontrolatu. Honi esker, bidezko emaitza bermatzen duen sarrera bikoitz "kontrolaezina" sortzen da. ' - mathematical_result: Emaitza (Dadoa x Hazia) - proposals_selected_by_sortition: Zozketa bidez aukeratutako proposamenak - sortition_reproducibility_details: Zozketaren errepikagarritasuna - taxonomies: '%{taxonomies} taxonomietatik' - time_seed: Denbora hazia - witnesses: Lekukoak - sortition: - random_seed: Ausazkotasun hazia - selected_proposals: - one: aukeratutako proposamena - other: aukeratutako proposamenak - sortition_author: - deleted: Ezabatutako parte-hartailea - sortition_cancel_author: - deleted: Ezabatutako parte-hartzailea - sortitions_count: - count: - one: Zozketa 1 - other: "%{count} zozketa" - statistics: - sortitions_count: Zozketak - sortitions_count_tooltip: Erabakiak hartzeko egindako ausazko selekzioen kopurua. diff --git a/decidim-sortitions/config/locales/fa-IR.yml b/decidim-sortitions/config/locales/fa-IR.yml deleted file mode 100644 index 88215f82cbd5d..0000000000000 --- a/decidim-sortitions/config/locales/fa-IR.yml +++ /dev/null @@ -1 +0,0 @@ -fa: diff --git a/decidim-sortitions/config/locales/fi-pl.yml b/decidim-sortitions/config/locales/fi-pl.yml deleted file mode 100644 index 582c646ef1d0f..0000000000000 --- a/decidim-sortitions/config/locales/fi-pl.yml +++ /dev/null @@ -1,151 +0,0 @@ -fi-pl: - activemodel: - attributes: - sortition: - additional_info: Satunnaistamistiedot - decidim_category_id: Ehdotettujen ehdotusten luokat, joissa haluat tehdä satunnaisvalinnan - decidim_proposals_component_id: Ehdotukset asetettu - dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden - target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusryhmästä) - title: Otsikko - witnesses: Todistajat - models: - decidim/sortitions/create_sortition_event: Satunnaistaminen - activerecord: - models: - decidim/sortitions/sortition: - one: Satunnaistaminen - other: Satunnaistamiset - decidim: - components: - sortitions: - name: Satunnaistamiset - settings: - global: - comments_enabled: Kommentointi sallittu - events: - sortitions: - sortition_created: - email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat. - email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta. - email_subject: Uusi satunnaistaminen lisättiin kohteeseen %{participatory_space_title} - notification_title: Satunnaistaminen %{resource_title} on lisätty kohteeseen %{participatory_space_title} - pages: - home: - statistics: - sortitions_count: Satunnaistamiset - participatory_processes: - statistics: - sortitions_count: Satunnaistamisia - sortitions: - admin: - actions: - destroy: Peruuta satunnaistaminen - edit: Muokkaa - new: Uusi satunnaistaminen - show: Satunnaistamisen yksityiskohdat - models: - sortition: - fields: - category: Luokka - created_at: Luomispäivä - decidim_proposals_component: Ehdotusten osa - dice: Noppa - reference: Viite - request_timestamp: Satunnaistamisen aika - seed: Jako - target_items: Valittavat kohteet - title: Otsikko - name: - one: Satunnaistaminen - other: Satunnaistamiset - sortitions: - confirm_destroy: - confirm_destroy: Haluatko varmasti peruuttaa tämän satunnaistamisen? - destroy: Peruuta satunnaistaminen - title: Satunnaistamisen peruuttaminen - create: - error: Uuden satunnaisvalinnan luomisessa tapahtui virhe. - success: Satunnaisvalinta onnistuneesti luotu - destroy: - error: Satunnaisvalintaa ei voi peruuttaa. - success: Satunnaisvalinta onnistuneesti peruutettu - edit: - title: Päivitä satunnaisvalinnan tiedot - update: Päivitä - form: - all_categories: Kaikki luokat - select_proposal_component: Valitse asetetut ehdotukset - title: Uusi satunnaisvalinta ehdotuksille - index: - title: Satunnaisvalinnat - new: - confirm: Painamalla seuraavaa painiketta Decidim tallentaa päivämäärän ja kellonajan (sekuntien tarkkuudella) ja yhdessä nopan heiton kanssa näitä tietoja käytetään satunnaisvalinnan luomiseen. Toimenpide on peruuttamaton, kun painiketta painetaan valinnan tulos julkaistaan ​​yhdessä tämän lomakkeen tietojen kanssa eikä sitä voi muuttaa, tarkista sisältö huolellisesti - create: Luo - title: Uusi satunnaisvalinta - show: - selected_proposals: Valintaan valitut ehdotukset - update: - error: Satunnaisvalinnan päivittämisessä tapahtui virhe. - success: Satunnaisvalinta onnistuneesti päivitetty - admin_log: - sortition: - create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}" - delete: "%{user_name} peruutti satunnaisvalinnan %{resource_name} kohdassa %{space_name}" - update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}" - sortitions: - count: - proposals_count: - one: 1 ehdotus - other: "%{count} ehdotusta" - filters: - active: Aktiivinen - all: Kaikki - cancelled: Peruttu - category: Aihepiiri - category_prompt: Valitse aihepiiri - search: Hae - state: Tila - filters_small_view: - close_modal: Sulje ikkuna - filter: Rajaa - filter_by: Rajaa hakua - unfold: Avaa - linked_sortitions: - selected_proposals: Valitut ehdotukset - orders: - label: 'Järjestä satunnaisvalinnat:' - random: Satunnainen - recent: Viimeisimmät - results_count: - count: - one: valittu ehdotus - other: valitut ehdotukset - show: - algorithm: Satunnaisvalinnan algoritmikoodi - any_category: kaikista aihepiireistä - cancelled: Peruttu satunnaisvalinta - candidate_proposal_ids: Satunnaisvalintaehdotusten järjestys ja tunnukset - candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{category_label}) välillä, seuraavilla tunnuksilla (lihavoituna valitut ehdotukset) ' - category: aihepiiristä %{category} - dice_result: "(1) Noppatulos" - introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. ' - mathematical_result: Tulos (1) x (2) - proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa - sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot - time_seed: "(2) Aikajako" - witnesses: Todistajat - sortition: - random_seed: Satunnainen jako - selected_proposals: - one: ehdotus valittu - other: '%{count} ehdotusta valittu' - view: Näytä - sortition_author: - deleted: Poistettu käyttäjä - sortition_cancel_author: - deleted: Poistettu käyttäjä - sortitions_count: - count: - one: 1 satunnaisvalinta - other: "%{count} satunnaisvalintaa" diff --git a/decidim-sortitions/config/locales/fi-plain.yml b/decidim-sortitions/config/locales/fi-plain.yml deleted file mode 100644 index c47ccdc985d82..0000000000000 --- a/decidim-sortitions/config/locales/fi-plain.yml +++ /dev/null @@ -1,147 +0,0 @@ -fi-pl: - activemodel: - attributes: - sortition: - additional_info: Satunnaistamistiedot - decidim_proposals_component_id: Ehdotukset asetettu - dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden - target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusryhmästä) - title: Otsikko - witnesses: Todistajat - models: - decidim/sortitions/create_sortition_event: Satunnaistaminen - activerecord: - models: - decidim/sortitions/sortition: - one: Satunnaistaminen - other: Satunnaistamiset - decidim: - components: - sortitions: - actions: - comment: Kommentoi - name: Satunnaistamiset - settings: - global: - clear_all: Tyhjennä kaikki - comments_enabled: Kommentointi sallittu - comments_max_length: Kommenttien maksimipituus (jätä arvoksi 0 käyttääksesi oletusarvoa) - define_taxonomy_filters: Määritä osallistumistilalle suodattimia ennen kuin käytät tätä asetusta. - no_taxonomy_filters_found: Luokittelusuodattimia ei löytynyt. - taxonomy_filters: Valitse suodattimet komponentille - taxonomy_filters_add: Lisää suodatin - events: - sortitions: - sortition_created: - email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat. - email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta. - email_subject: Uusi satunnaistaminen lisättiin kohteeseen %{participatory_space_title} - notification_title: Satunnaistaminen %{resource_title} on lisätty kohteeseen %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Peruuta satunnaistaminen - edit: Muokkaa - new_sortition: Uusi satunnaisvalinta - show: Satunnaistamisen yksityiskohdat - title: Toiminnot - deprecation_warning_html: "⚠️ Poistamisilmoitus Satunnaisvalinta-moduuli poistetaan Decidim-alustan versiossa 0.32. Suunnittele toimintatapasi tämän mukaisesti ja harkitse vaihtoehtoisia tapoja osallistujien tai ehdotusten valitsemiseksi." - models: - sortition: - fields: - created_at: Luomispäivä - decidim_proposals_component: Ehdotusten osa - dice: Noppa - reference: Viite - request_timestamp: Satunnaistamisen aika - seed: Jako - target_items: Valittavat kohteet - taxonomies: Luokittelut - title: Otsikko - sortitions: - confirm_destroy: - confirm_destroy: Haluatko varmasti peruuttaa tämän satunnaistamisen? - destroy: Peruuta satunnaistaminen - title: Satunnaistamisen peruuttaminen - create: - error: Uuden satunnaisvalinnan luomisessa tapahtui virhe. - success: Satunnaisvalinnan luonti onnistui. - destroy: - error: Satunnaisvalintaa ei voi peruuttaa. - success: Satunnaisvalinnan peruuttaminen onnistui. - edit: - title: Päivitä satunnaisvalinnan tiedot - update: Päivitä - form: - all_taxonomies: Kaikki luokittelut - select_proposal_component: Valitse asetetut ehdotukset - select_taxonomies: Luokittelut niille ehdotuksille, jotka haluat sisällyttää satunnaisvalintaan. Jätä tyhjäksi, mikäli haluat kaikki ehdotukset kullekin luokittelulle. - index: - title: Satunnaisvalinnat - new: - confirm: Kun painat painiketta, palvelin tallentaa päivämäärän ja kellonajan (sekunnin tarkkuudella) ja näitä tietoja käytetään yhdessä nopanheiton kanssa satunnaisen valinnan luomiseen. Toimintoa ei voi peruuttaa. Kun painiketta painetaan, arvonnan tulos julkaistaan tähän lomakkeeseen syötettyjen tietojen kanssa. Tietoja ei voi muuttaa jälkikäteen, joten tarkista sisältö huolellisesti. - create: Luo - title: Uusi satunnaisvalinta - show: - selected_proposals: Valintaan valitut ehdotukset - update: - error: Satunnaisvalinnan päivittämisessä tapahtui virhe. - success: Satunnaisvalinnan päivitys onnistui. - admin_log: - sortition: - create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}" - delete: "%{user_name} peruutti satunnaisvalinnan %{resource_name} kohdassa %{space_name}" - update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}" - sortitions: - count: - proposals_count: - one: 1 ehdotus - other: "%{count} ehdotusta" - filters: - active: Aktiivinen - all: Kaikki - cancelled: Peruttu - category: Aihepiiri - state: Tila - index: - empty: Satunnaisvalintoja ei vielä ole. - linked_sortitions: - selected_proposals: Valitut ehdotukset - orders: - label: 'Järjestä satunnaisvalinnat:' - random: Satunnainen - recent: Viimeisimmät - results_count: - count: - one: valittu ehdotus - other: valitut ehdotukset - show: - algorithm: Satunnaisvalinnan algoritmikoodi - any_taxonomy: kaikista luokitteluista - cancelled: Peruttu satunnaisvalinta - candidate_proposal_ids: Satunnaisvalintaehdotusten järjestys ja tunnukset - candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{taxonomy_labels}) välillä, seuraavilla tunnisteilla (valitut ehdotukset lihavoituna) ' - dice_result: (1) Noppatulos - introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. ' - mathematical_result: Tulos (1) x (2) - proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa - sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot - taxonomies: luokitteluista %{taxonomies} - time_seed: (2) Aikajako - witnesses: Todistajat - sortition: - random_seed: Satunnainen jako - selected_proposals: - one: ehdotus valittu - other: '%{count} ehdotusta valittu' - sortition_author: - deleted: Poistettu käyttäjä - sortition_cancel_author: - deleted: Poistettu käyttäjä - sortitions_count: - count: - one: 1 satunnaisvalinta - other: "%{count} satunnaisvalintaa" - statistics: - sortitions_count: Satunnaistamista - sortitions_count_tooltip: Päätöksentekoa varten tehtyjen satunnaisvalintojen lukumäärä. diff --git a/decidim-sortitions/config/locales/fi.yml b/decidim-sortitions/config/locales/fi.yml deleted file mode 100644 index 9e010bc524dcf..0000000000000 --- a/decidim-sortitions/config/locales/fi.yml +++ /dev/null @@ -1,147 +0,0 @@ -fi: - activemodel: - attributes: - sortition: - additional_info: Satunnaisvalinnan tiedot - decidim_proposals_component_id: Ehdotusten joukko - dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden - target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusjoukosta) - title: Otsikko - witnesses: Todistajat - models: - decidim/sortitions/create_sortition_event: Satunnaisvalinta - activerecord: - models: - decidim/sortitions/sortition: - one: Satunnaisvalinta - other: Satunnaisvalinnat - decidim: - components: - sortitions: - actions: - comment: Kommentoi - name: Satunnaisvalinnat - settings: - global: - clear_all: Tyhjennä kaikki - comments_enabled: Kommentointi sallittu - comments_max_length: Kommenttien maksimipituus (jätä arvoksi 0 käyttääksesi oletusarvoa) - define_taxonomy_filters: Määritä osallistumistilalle suodattimia ennen kuin käytät tätä asetusta. - no_taxonomy_filters_found: Luokittelusuodattimia ei löytynyt. - taxonomy_filters: Valitse suodattimet komponentille - taxonomy_filters_add: Lisää suodatin - events: - sortitions: - sortition_created: - email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat. - email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta. - email_subject: Uusi satunnaisvalinta lisättiin kohteeseen %{participatory_space_title} - notification_title: Satunnaisvalinta %{resource_title} on lisätty kohteeseen %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Peru satunnaisvalinta - edit: Muokkaa - new_sortition: Uusi satunnaisvalinta - show: Satunnaisvalinnan tarkemmat tiedot - title: Toiminnot - deprecation_warning_html: "⚠️ Poistamisilmoitus Satunnaisvalinta-moduuli poistetaan Decidim-alustan versiossa 0.32. Suunnittele toimintatapasi tämän mukaisesti ja harkitse vaihtoehtoisia tapoja osallistujien tai ehdotusten valitsemiseksi." - models: - sortition: - fields: - created_at: Luomispäivä - decidim_proposals_component: Ehdotusten osa - dice: Noppa - reference: Viite - request_timestamp: Satunnaistamisen aika - seed: Jako - target_items: Valittavat kohteet - taxonomies: Luokittelut - title: Otsikko - sortitions: - confirm_destroy: - confirm_destroy: Haluatko varmasti perua tämän satunnaisvalinnan? - destroy: Peru satunnaisvalinta - title: Satunnaisvalinnan peruminen - create: - error: Uuden satunnaisvalinnan luonti epäonnistui. - success: Satunnaisvalinnan luonti onnistui. - destroy: - error: Satunnaisvalintaa ei voi perua. - success: Satunnaisvalinnan peruminen onnistui. - edit: - title: Päivitä satunnaisvalinnan tiedot - update: Päivitä - form: - all_taxonomies: Kaikki luokittelut - select_proposal_component: Valitse asetetut ehdotukset - select_taxonomies: Luokittelut niille ehdotuksille, jotka haluat sisällyttää satunnaisvalintaan. Jätä tyhjäksi, mikäli haluat kaikki ehdotukset kullekin luokittelulle. - index: - title: Satunnaisvalinnat - new: - confirm: Kun painat painiketta, palvelin tallentaa päivämäärän ja kellonajan (sekunnin tarkkuudella) ja näitä tietoja käytetään yhdessä nopanheiton tuloksen kanssa satunnaisen valinnan luomiseen. Toimintoa ei voi perua. Kun painiketta painetaan, arvonnan tulos julkaistaan tähän lomakkeeseen syötettyjen tietojen kanssa. Tietoja ei voi muuttaa jälkikäteen, joten tarkista sisältö huolellisesti. - create: Luo - title: Uusi satunnaisvalinta - show: - selected_proposals: Valintaan valitut ehdotukset - update: - error: Satunnaisvalinnan päivitys epäonnistui. - success: Satunnaisvalinnan päivitys onnistui. - admin_log: - sortition: - create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}" - delete: "%{user_name} perui satunnaisvalinnan %{resource_name} tilassa %{space_name}" - update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}" - sortitions: - count: - proposals_count: - one: 1 ehdotus - other: "%{count} ehdotusta" - filters: - active: Aktiivinen - all: Kaikki - cancelled: Peruttu - category: Aihepiiri - state: Tila - index: - empty: Satunnaisvalintoja ei vielä ole. - linked_sortitions: - selected_proposals: Valitut ehdotukset - orders: - label: 'Järjestä satunnaisvalinnat:' - random: Satunnainen - recent: Viimeisimmät - results_count: - count: - one: Valittu ehdotus - other: Valitut ehdotukset - show: - algorithm: Satunnaisvalinnan algoritmikoodi - any_taxonomy: kaikista luokitteluista - cancelled: Peruttu satunnaisvalinta - candidate_proposal_ids: Satunnaisvalinnan ehdotusten järjestys ja tunnukset - candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{taxonomy_labels}) välillä, seuraavilla tunnisteilla (valitut ehdotukset lihavoituna) ' - dice_result: Nopanheiton tulos - introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. ' - mathematical_result: Tulos (nopanheitto x satunnaisarvo) - proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa - sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot - taxonomies: luokitteluista %{taxonomies} - time_seed: Aikasyöte - witnesses: Todistajat - sortition: - random_seed: Satunnainen jako - selected_proposals: - one: ehdotus valittu - other: ehdotuksia valittu - sortition_author: - deleted: Poistettu käyttäjä - sortition_cancel_author: - deleted: Poistettu käyttäjä - sortitions_count: - count: - one: 1 satunnaisvalinta - other: "%{count} satunnaisvalintaa" - statistics: - sortitions_count: Satunnaisvalintaa - sortitions_count_tooltip: Päätöksentekoa varten tehtyjen satunnaisvalintojen lukumäärä. diff --git a/decidim-sortitions/config/locales/fr-CA.yml b/decidim-sortitions/config/locales/fr-CA.yml deleted file mode 100644 index 93c4b405e36df..0000000000000 --- a/decidim-sortitions/config/locales/fr-CA.yml +++ /dev/null @@ -1,139 +0,0 @@ -fr-CA: - activemodel: - attributes: - sortition: - additional_info: Information sur le tirage au sort - decidim_proposals_component_id: Ensemble de propositions - dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat. - target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment) - title: Titre - witnesses: Témoins - models: - decidim/sortitions/create_sortition_event: Tirage au sort - activerecord: - models: - decidim/sortitions/sortition: - one: Tirage au sort - other: Tirages au sort - decidim: - components: - sortitions: - actions: - comment: Commenter - name: Tirages au sort - settings: - global: - clear_all: Effacer tout - comments_enabled: Commentaires activés - comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut) - taxonomy_filters: Sélectionner les filtres pour le composant - taxonomy_filters_add: Ajouter un filtre - events: - sortitions: - sortition_created: - email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez. - email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Vous pouvez à tout moment ne plus suivre cet espace participatif en cliquant sur le lien précédent. - email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title} - notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Annuler le tirage au sort - edit: Éditer - new_sortition: Nouveau tirage au sort - show: Détails du tirage au sort - title: Actions - deprecation_warning_html: "⚠️ Avis de dépréciation. Le module « Tirages au sort » sera supprimé dans Decidim v0.32. Veuillez planifier en conséquence et envisager des solutions alternatives pour la sélection des participants ou des propositions." - models: - sortition: - fields: - created_at: Date de création - decidim_proposals_component: Module de propositions - dice: Dé - reference: Référence - request_timestamp: Date et heure - seed: Valeur aléatoire - target_items: Éléments à sélectionner - title: Titre - sortitions: - confirm_destroy: - confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ? - destroy: Annuler le tirage au sort - title: Annulation du tirage au sort - create: - error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort. - success: Le tirage au sort a été créé avec succès. - destroy: - error: Impossible d'annuler le tirage au sort. - success: Le tirage au sort a été annulé avec succès. - edit: - title: Mettre à jour les informations sur le tirage au sort - update: Mettre à jour - form: - select_proposal_component: Sélectionnez un ensemble de propositions - index: - title: Tirages au sort - new: - confirm: En appuyant sur le bouton suivant, la plateforme enregistra la date et l'heure (à la seconde près) et, avec le résultat du dé, cette information sera utilisée pour générer une sélection aléatoire. L'action sera irréversible, une fois le bouton cliqué, le résultat de ce tirage sera publié, ainsi que les données saisies dans ce formulaire et ne pourront pas être modifiées, veuillez vérifier attentivement le contenu. - create: Créer - title: Nouveau tirage au sort - show: - selected_proposals: Propositions sélectionnées pour le tirage au sort - update: - error: Une erreur est survenue lors de la mise à jour du tirage au sort. - success: Le tirage au sort a bien été mis à jour. - admin_log: - sortition: - create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}" - delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}" - update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposition - other: "%{count} propositions" - filters: - active: Actif - all: Tout - cancelled: Annulé - category: Catégorie - state: État - index: - empty: Il n'y a pas encore de tirage au sort. - linked_sortitions: - selected_proposals: Propositions sélectionnées - orders: - label: 'Trier les tirages au sort par :' - random: Aléatoire - recent: Récent - results_count: - count: - one: proposition sélectionnée - other: propositions sélectionnées - show: - algorithm: Code de l'algorithme de tirage au sort - cancelled: Tirage au sort annulé - candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants - dice_result: (1) Résultat du tirage de dé - introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. ' - mathematical_result: Résultat (1) x (2) - proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort - sortition_reproducibility_details: Détails de reproductibilité du tirage au sort - time_seed: (2) Date et Heure - witnesses: Témoins - sortition: - random_seed: Valeur aléatoire - selected_proposals: - one: proposition sélectionnée - other: '%{count} propositions sélectionnées' - sortition_author: - deleted: Utilisateur supprimé - sortition_cancel_author: - deleted: Utilisateur supprimé - sortitions_count: - count: - one: 1 tirage au sort - other: "%{count} tirages au sort" - statistics: - sortitions_count: Tirages au sort - sortitions_count_tooltip: Le nombre de tirages au sort réalisés dans le cadre du processus décisionnel. diff --git a/decidim-sortitions/config/locales/fr-LU.yml b/decidim-sortitions/config/locales/fr-LU.yml deleted file mode 100644 index e9754d879f35c..0000000000000 --- a/decidim-sortitions/config/locales/fr-LU.yml +++ /dev/null @@ -1,146 +0,0 @@ -fr-LU: - activemodel: - attributes: - sortition: - additional_info: Information sur le tirage au sort - decidim_category_id: Catégories des propositions sur lesquelles vous souhaitez appliquer le tirage au sort - decidim_proposals_component_id: Ensemble de propositions - dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat. - target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment) - title: Titre - witnesses: Témoins - models: - decidim/sortitions/create_sortition_event: Tirage au sort - activerecord: - models: - decidim/sortitions/sortition: - one: Tirage au sort - other: Tirages au sort - decidim: - components: - sortitions: - name: Tirages au sort - settings: - global: - comments_enabled: Commentaires activés - comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut) - events: - sortitions: - sortition_created: - email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez. - email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Vous pouvez à tout moment ne plus suivre cet espace participatif en cliquant sur le lien précédent. - email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title} - notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Annuler le tirage au sort - edit: Éditer - new: Nouveau tirage au sort - show: Détails du tirage au sort - models: - sortition: - fields: - category: Catégorie - created_at: Date de création - decidim_proposals_component: Module de propositions - dice: Dé - reference: Référence - request_timestamp: Date et heure - seed: Valeur aléatoire - target_items: Éléments à sélectionner - title: Titre - name: - one: Tirage au sort - other: Tirages au sort - sortitions: - confirm_destroy: - confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ? - destroy: Annuler le tirage au sort - title: Annulation du tirage au sort - create: - error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort. - success: Le tirage au sort a été créé avec succès - destroy: - error: Impossible d'annuler le tirage au sort. - success: Le tirage au sort a été annulé avec succès - edit: - title: Mettre à jour les informations sur le tirage au sort - update: Mettre à jour - form: - all_categories: Toutes les catégories - select_proposal_component: Sélectionnez un ensemble de propositions - title: Nouveau tirage au sort de propositions - index: - title: Tirages au sort - new: - confirm: 'En appuyant sur le bouton suivant, Decidim enregistrera la date et l''heure à la seconde près et, en association avec le résultat du tirage de dé, générera un choix aléatoire. Cette action est irréversible : une fois que vous aurez cliqué sur le bouton, le résultat du tirage ainsi que les données saisies dans le formulaire seront publiés et ne pourront pas être modifiés. Veillez donc bien à vérifier les informations renseignées en amont' - create: Créer - title: Nouveau tirage au sort - show: - selected_proposals: Propositions sélectionnées pour le tirage au sort - update: - error: Une erreur est survenue lors de la mise à jour du tirage au sort. - success: Le tirage au sort a bien été mis à jour - admin_log: - sortition: - create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}" - delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}" - update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposition - other: "%{count} propositions" - filters: - active: Actif - all: Tout - cancelled: Annulé - category: Catégorie - category_prompt: Sélectionner une catégorie - search: Rechercher - state: État - filters_small_view: - close_modal: Fermer la fenêtre de dialogue - filter: Filtrer - filter_by: Filtrer par - unfold: Dérouler - linked_sortitions: - selected_proposals: Propositions sélectionnées - orders: - label: 'Trier les tirages au sort par :' - random: Aléatoire - recent: Récent - results_count: - count: - one: proposition sélectionnée - other: propositions sélectionnées - show: - algorithm: Code de l'algorithme de tirage au sort - any_category: toutes les catégories - back: Retour à la liste - cancelled: Tirage au sort annulé - candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants - candidate_proposals_info: 'Le tirage au sort a été effectué parmi les propositions suivantes (%{category_label}), avec les identifiants suivants (en gras les propositions sélectionnées) ' - category: de la catégorie %{category} - dice_result: "(1) Résultat du tirage de dé" - introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. ' - mathematical_result: Résultat (1) x (2) - proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort - sortition_reproducibility_details: Détails de reproductibilité du tirage au sort - time_seed: "(2) Date et Heure" - witnesses: Témoins - sortition: - random_seed: Valeur aléatoire - selected_proposals: - one: proposition sélectionnée - other: '%{count} propositions sélectionnées' - view: Voir - sortition_author: - deleted: Utilisateur supprimé - sortition_cancel_author: - deleted: Utilisateur supprimé - sortitions_count: - count: - one: 1 tirage au sort - other: "%{count} tirages au sort" diff --git a/decidim-sortitions/config/locales/fr.yml b/decidim-sortitions/config/locales/fr.yml deleted file mode 100644 index 5a5ada6c73507..0000000000000 --- a/decidim-sortitions/config/locales/fr.yml +++ /dev/null @@ -1,139 +0,0 @@ -fr: - activemodel: - attributes: - sortition: - additional_info: Information sur le tirage au sort - decidim_proposals_component_id: Ensemble de propositions - dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat. - target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment) - title: Titre - witnesses: Témoins - models: - decidim/sortitions/create_sortition_event: Tirage au sort - activerecord: - models: - decidim/sortitions/sortition: - one: Tirage au sort - other: Tirages au sort - decidim: - components: - sortitions: - actions: - comment: Commenter - name: Tirages au sort - settings: - global: - clear_all: Effacer tout - comments_enabled: Commentaires activés - comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut) - taxonomy_filters: Sélectionner les filtres pour le composant - taxonomy_filters_add: Ajouter un filtre - events: - sortitions: - sortition_created: - email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez. - email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Si vous souhaitez vous désabonner des notifications, connectez-vous à la plateforme, puis rendez-vous dans l'onglet “Mon compte” > “Paramètres des notifications”. - email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title} - notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Annuler le tirage au sort - edit: Éditer - new_sortition: Nouveau tirage au sort - show: Détails du tirage au sort - title: Actions - deprecation_warning_html: "⚠️ Avis de dépréciation. Le module « Tirages au sort » sera supprimé dans Decidim v0.32. Veuillez planifier en conséquence et envisager des solutions alternatives pour la sélection des participants ou des propositions." - models: - sortition: - fields: - created_at: Date de création - decidim_proposals_component: Module de propositions - dice: Dé - reference: Référence - request_timestamp: Date et heure - seed: Valeur aléatoire - target_items: Éléments à sélectionner - title: Titre - sortitions: - confirm_destroy: - confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ? - destroy: Annuler le tirage au sort - title: Annulation du tirage au sort - create: - error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort. - success: Le tirage au sort a été créé avec succès. - destroy: - error: Impossible d'annuler le tirage au sort. - success: Le tirage au sort a été annulé avec succès. - edit: - title: Mettre à jour les informations sur le tirage au sort - update: Mettre à jour - form: - select_proposal_component: Sélectionnez un ensemble de propositions - index: - title: Tirages au sort - new: - confirm: En appuyant sur le bouton suivant, la plateforme enregistra la date et l'heure (à la seconde près) et, avec le résultat du dé, cette information sera utilisée pour générer une sélection aléatoire. L'action sera irréversible, une fois le bouton cliqué, le résultat de ce tirage sera publié, ainsi que les données saisies dans ce formulaire et ne pourront pas être modifiées, veuillez vérifier attentivement le contenu. - create: Créer - title: Nouveau tirage au sort - show: - selected_proposals: Propositions sélectionnées pour le tirage au sort - update: - error: Une erreur est survenue lors de la mise à jour du tirage au sort. - success: Le tirage au sort a bien été mis à jour. - admin_log: - sortition: - create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}" - delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}" - update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposition - other: "%{count} propositions" - filters: - active: Actif - all: Tout - cancelled: Annulé - category: Catégorie - state: État - index: - empty: Il n'y a pas encore de tirage au sort. - linked_sortitions: - selected_proposals: Propositions sélectionnées - orders: - label: 'Trier les tirages au sort par :' - random: Aléatoire - recent: Récent - results_count: - count: - one: proposition sélectionnée - other: propositions sélectionnées - show: - algorithm: Code de l'algorithme de tirage au sort - cancelled: Tirage au sort annulé - candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants - dice_result: Résultat des dés - introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. ' - mathematical_result: Résultat (Dé x Horodatage) - proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort - sortition_reproducibility_details: Détails de reproductibilité du tirage au sort - time_seed: Horodatage - witnesses: Témoins - sortition: - random_seed: Valeur aléatoire - selected_proposals: - one: proposition sélectionnée - other: '%{count} propositions sélectionnées' - sortition_author: - deleted: Utilisateur supprimé - sortition_cancel_author: - deleted: Utilisateur supprimé - sortitions_count: - count: - one: 1 tirage au sort - other: "%{count} tirages au sort" - statistics: - sortitions_count: Tirages au sort - sortitions_count_tooltip: Le nombre de tirages au sort réalisés dans le cadre du processus décisionnel. diff --git a/decidim-sortitions/config/locales/ga-IE.yml b/decidim-sortitions/config/locales/ga-IE.yml deleted file mode 100644 index 058e4781ae365..0000000000000 --- a/decidim-sortitions/config/locales/ga-IE.yml +++ /dev/null @@ -1,34 +0,0 @@ -ga: - activemodel: - attributes: - sortition: - title: Teideal - decidim: - components: - sortitions: - actions: - comment: Tabhair Trácht - sortitions: - admin: - actions: - edit: Eagar - models: - sortition: - fields: - dice: Dísle - seed: Síol - title: Teideal - sortitions: - edit: - update: Nuashonraigh - new: - create: Cruthaigh - sortitions: - filters: - active: Gníomhach - all: Uile - category: Catagóir - state: Stádas - orders: - random: Randamach - recent: Is Déanaí diff --git a/decidim-sortitions/config/locales/gl.yml b/decidim-sortitions/config/locales/gl.yml deleted file mode 100644 index 0a824730ec7cb..0000000000000 --- a/decidim-sortitions/config/locales/gl.yml +++ /dev/null @@ -1,124 +0,0 @@ -gl: - activemodel: - attributes: - sortition: - additional_info: Información de sorteo - decidim_proposals_component_id: Propostas establecidas - dice: Resultado da rolda. Move unha morea de 6 caras ou busque outra forma aleatoria de xerar un número do 1 ao 6 e insira aquí o número resultante diante dalgunhas testemuñas. Isto contribúe á calidade e garantías da aleatoriedade do resultado - target_items: Número de propostas que se seleccionarán (indica a cantidade de propostas que desexa seleccionar trazando o grupo de propostas que escolleu previamente) - title: Título - witnesses: Testemuñas - models: - decidim/sortitions/create_sortition_event: Sortición - activerecord: - models: - decidim/sortitions/sortition: - one: Sortición - other: Edicións - decidim: - components: - sortitions: - actions: - comment: Comentario - name: Edicións - settings: - global: - comments_enabled: Comentarios habilitados - comments_max_length: Lonxitude máxima dos comentarios (0 para valor predefinido) - events: - sortitions: - sortition_created: - email_intro: O sorteo "%{resource_title}" engadiuse a "%{participatory_space_title}" que estás seguindo. - email_outro: Recibiches esta notificación porque estás seguindo "%{participatory_space_title}". Podes deixar de seguir desde a ligazón anterior. - email_subject: Nova xeración engadida a %{participatory_space_title} - notification_title: A clasificación %{resource_title} engadiuse a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancelar o sorteo - edit: Editar - show: Detalles de clasificación - models: - sortition: - fields: - created_at: Data de creación - decidim_proposals_component: Componente de propostas - dice: Dado - reference: Referencia - request_timestamp: Gravar tempo - seed: Semente - target_items: Elementos a seleccionar - title: Título - sortitions: - confirm_destroy: - confirm_destroy: Estás seguro de que queres cancelar este sortition? - destroy: Cancelar sortition - title: Cancelación do sortition - create: - error: Produciuse un erro ao crear unha nova xeración. - edit: - title: Actualiza a información sobre a clasificación - update: Actualización - form: - select_proposal_component: Selecciona as propostas definidas - index: - title: Edicións - new: - create: Crear - title: Nova xeración - show: - selected_proposals: Propostas seleccionadas para o sorteo - update: - error: Produciuse un erro ao actualizar o sorteo. - admin_log: - sortition: - create: "%{user_name} creou o sorteo %{resource_name} en %{space_name}" - delete: "%{user_name} cancelou o sorteo %{resource_name} en %{space_name}" - update: "%{user_name} actualizou o sorteo %{resource_name} en %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} propostas" - filters: - active: Activo - all: Todo - cancelled: Cancelada - category: Categoría - state: Estado - linked_sortitions: - selected_proposals: Propostas seleccionadas - orders: - label: 'Solicitar sortións por:' - random: Aleatorio - recent: Recentes - results_count: - count: - one: proposta seleccionada - other: propostas seleccionadas - show: - algorithm: Codigo de algoritmo de Sortition - cancelled: Cancelada sortition - candidate_proposal_ids: Orde de propostas de clasificación e ID - dice_result: (1) resultado de dados - introduction: 'Esta páxina contén os resultados da clasificación %{reference}. Mediante esta clasificación, %{target_items} número de resultados foron seleccionados aleatoriamente e cunha distribución de probabilidade igual ao conxunto de propostas que se amosan debaixo. Xunto cos resultados, a información que se mostra nesta páxina proporciona toda a información necesaria para maximizar as garantías e reproducir os resultados. A clave para a calidade desta xeración é a aleatoriedade dobre proporcionada por un rolo dun dado (verificado por testemuñas) eo tempo preciso da xeración que proporciona entrada para un algoritmo que xera unha selección aleatoria. A semente de tempo para a xeración é tan precisa (segundos) que é imposible de controlar por parte dos seres humanos proporcionando así unha entrada dobre "incontrolable" para garantir un resultado xusto. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propostas seleccionadas por sortition - sortition_reproducibility_details: Detalles de reproducibilidade de sorteo - time_seed: (2) Semente de tempo - witnesses: Testemuñas - sortition: - random_seed: Semente aleatoria - selected_proposals: - one: 1 proposta seleccionada - other: '%{count} propostas seleccionadas' - sortition_author: - deleted: Usuario eliminado - sortition_cancel_author: - deleted: Usuario eliminado - sortitions_count: - count: - one: 1 sortition - other: "%{count} sortións" - statistics: - sortitions_count: Sorteos diff --git a/decidim-sortitions/config/locales/gn-PY.yml b/decidim-sortitions/config/locales/gn-PY.yml deleted file mode 100644 index bd442b0ad85de..0000000000000 --- a/decidim-sortitions/config/locales/gn-PY.yml +++ /dev/null @@ -1 +0,0 @@ -gn: diff --git a/decidim-sortitions/config/locales/he-IL.yml b/decidim-sortitions/config/locales/he-IL.yml deleted file mode 100644 index af6fa60a73f2c..0000000000000 --- a/decidim-sortitions/config/locales/he-IL.yml +++ /dev/null @@ -1 +0,0 @@ -he: diff --git a/decidim-sortitions/config/locales/hr-HR.yml b/decidim-sortitions/config/locales/hr-HR.yml deleted file mode 100644 index f67f33c7e0cfc..0000000000000 --- a/decidim-sortitions/config/locales/hr-HR.yml +++ /dev/null @@ -1 +0,0 @@ -hr: diff --git a/decidim-sortitions/config/locales/hr.yml b/decidim-sortitions/config/locales/hr.yml deleted file mode 100644 index f67f33c7e0cfc..0000000000000 --- a/decidim-sortitions/config/locales/hr.yml +++ /dev/null @@ -1 +0,0 @@ -hr: diff --git a/decidim-sortitions/config/locales/hu.yml b/decidim-sortitions/config/locales/hu.yml deleted file mode 100644 index 0cb03da01591f..0000000000000 --- a/decidim-sortitions/config/locales/hu.yml +++ /dev/null @@ -1,119 +0,0 @@ -hu: - activemodel: - attributes: - sortition: - additional_info: Sorsolás információk - decidim_proposals_component_id: Beállított javaslatok - dice: Dobókocka feldobása. Használj hat oldalú dobókockát vagy találj más megoldást arra, hogy egy véletlen számot produkálj 1 és 6 között. Szemtanúk előtt írd be ide a számot. Ez a módszer garantálja majd a kimenet tényleges véletlenszerűségét - target_items: Kijelölni kívánt javaslatok száma (azt jelzi, hogy hány javaslatot szeretnél kiválasztani a már korábban kijelölt ajánlatok csoportja alapján) - title: Cím - witnesses: Tanúk - models: - decidim/sortitions/create_sortition_event: Sorsolás - activerecord: - models: - decidim/sortitions/sortition: - one: Sorsolás - other: Sorsolások - decidim: - components: - sortitions: - name: Sorsolások - settings: - global: - comments_enabled: Megjegyzések engedélyezve - events: - sortitions: - sortition_created: - email_intro: 'A(z) "%{resource_title}" sorsolást hozzáadtuk ehhez: "%{participatory_space_title}" (követed).' - email_outro: 'Ezt az értesítést azért kaptad, mert ezt követed: "%{participatory_space_title}". Leiratkozás az előző link segítségével.' - email_subject: 'Új sorsolás hozzáadva ehhez: %{participatory_space_title}' - notification_title: 'A(z) %{resource_title} sorsolás hozzáadva ehhez: %{participatory_space_title}' - sortitions: - admin: - actions: - destroy: Sorsolás törlése - edit: Szerkesztés - show: Sorsolás részletei - models: - sortition: - fields: - created_at: Létrehozás dátuma - decidim_proposals_component: Javaslatok elem - dice: Dobókocka - reference: Referencia - request_timestamp: Időzítés - seed: Kezdőérték - target_items: Kijelölni kívánt elemek - title: Cím - sortitions: - confirm_destroy: - confirm_destroy: Biztosan törölni szeretnéd ezt a sorsolást? - destroy: Sorsolás törlése - title: Sorsolás törlése - create: - error: Hiba történt egy új sorsolás létrehozásakor. - edit: - title: Sorsolással kapcsolatos információk frissítése - update: Frissítés - form: - select_proposal_component: Válassz beállított javaslatokat - index: - title: Sorsolások - new: - create: Létrehozás - title: Új sorsolás - show: - selected_proposals: Sorsolásra kiválasztott javaslatok - update: - error: Hiba történt a sorsolás frissítése során. - admin_log: - sortition: - create: "%{user_name} létrehozta a(z) %{resource_name} sorsolást itt: %{space_name}" - delete: "%{user_name} törölte a(z) %{resource_name} sorsolást itt: %{space_name}" - update: "%{user_name} frissítette a(z) %{resource_name} sorsolást itt: %{space_name}" - sortitions: - count: - proposals_count: - one: 1 javaslat - other: "%{count} javaslat" - filters: - active: Aktív - all: Összes - cancelled: Törölve - category: Kategória - state: Állapot - linked_sortitions: - selected_proposals: Kiválasztott javaslatok - orders: - label: 'Sorsolások rendezése:' - random: Véletlenszerű - recent: Legutóbbi - results_count: - count: - one: kiválasztott javaslat - other: kiválasztott javaslatok - show: - algorithm: Sorsolás algoritmus kódja - cancelled: Törölt sorsolás - candidate_proposal_ids: Sorsolásos javaslatok sorrendje és azonosítói - dice_result: (1) dobókocka eredmény - introduction: 'Ez az oldal a következő sorsolás eredményeit tartalmazza: %{reference}. A módszer segítségével %{target_items} véletlenszerű eredményt kaptunk az alábbi javaslatokhoz, az egyenlő valószínűségi eloszlás elvét követve. Az oldalon található adatok - az eredményekkel együtt - minden olyan információt tartalmaznak, amelyek garantálják az eljárás megbízhatóságát és reprodukálhatóságát. Ennek a sorsolásos módszernek az egyik erőssége a kétlépcsős véletlenszerűségben rejlik, amelyet egyfelől a dobókocka feldobása, másfelől a sorsolás pontos időpontjának rögzítése biztosít. Ez utóbbiak ráadásul olyannyira pontosak, hogy azt emberek nem tudják ellenőrizni. Ez a dupla véletlenszerűség garantálja tehát a megbízható eredményeket. ' - mathematical_result: Eredmény (1) x (2) - proposals_selected_by_sortition: Sorsolással kiválasztott javaslatok - sortition_reproducibility_details: Sorsolás reprodukálhatósági részletek - time_seed: (2) Időmag - witnesses: Tanúk - sortition: - random_seed: Véletlen mag - selected_proposals: - one: kiválasztott javaslat - other: kiválasztott javaslatok - sortition_author: - deleted: Törölt felhasználó - sortition_cancel_author: - deleted: Törölt felhasználó - sortitions_count: - count: - one: 1 sorsolás - other: "%{count} sorsolás" diff --git a/decidim-sortitions/config/locales/id-ID.yml b/decidim-sortitions/config/locales/id-ID.yml deleted file mode 100644 index dc503b3df844a..0000000000000 --- a/decidim-sortitions/config/locales/id-ID.yml +++ /dev/null @@ -1,114 +0,0 @@ -id: - activemodel: - attributes: - sortition: - additional_info: Informasi penyortiran - decidim_proposals_component_id: Proposal ditetapkan - dice: Hasil die roll. Gulung dadu 6 sisi, atau cari cara acak lain untuk menghasilkan angka dari 1 hingga 6, dan masukkan di sini angka yang dihasilkan di depan beberapa saksi. Ini berkontribusi pada kualitas dan jaminan keacakan hasil - target_items: Jumlah proposal yang akan dipilih (menunjukkan jumlah proposal yang ingin Anda pilih dengan menggambar banyak kelompok proposal yang telah Anda pilih sebelumnya) - title: Judul - witnesses: Saksi - models: - decidim/sortitions/create_sortition_event: Undian - activerecord: - models: - decidim/sortitions/sortition: - other: Sortasi - decidim: - components: - sortitions: - name: Sortasi - settings: - global: - comments_enabled: Komentar diaktifkan - events: - sortitions: - sortition_created: - email_intro: Sortasi "%{resource_title}" telah ditambahkan ke "%{participatory_space_title}" yang Anda ikuti. - email_outro: Anda telah menerima pemberitahuan ini karena Anda mengikuti "%{participatory_space_title}". Anda dapat berhenti mengikutinya dari tautan sebelumnya. - email_subject: Sortasi baru ditambahkan ke %{participatory_space_title} - notification_title: Sortasi %{resource_title} telah ditambahkan ke %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Batalkan penyortiran - edit: Edit - show: Detail penyortiran - models: - sortition: - fields: - created_at: Tanggal pembuatan - decidim_proposals_component: Komponen proposal - dice: Dadu - reference: Referensi - request_timestamp: Luangkan waktu - seed: Benih - target_items: Item untuk dipilih - title: Judul - sortitions: - confirm_destroy: - confirm_destroy: Apakah Anda yakin ingin membatalkan penyortiran ini? - destroy: Batalkan penyortiran - title: Pembatalan penyortiran - create: - error: Terjadi masalah saat membuat penyortiran baru. - edit: - title: Perbarui informasi tentang penyortiran - update: Memperbarui - form: - select_proposal_component: Pilih set proposal - index: - title: Sortasi - new: - create: Membuat - title: Pemilahan baru - show: - selected_proposals: Proposal dipilih untuk pengundian - update: - error: Terjadi masalah saat memperbarui penyortiran. - admin_log: - sortition: - create: "%{user_name} menciptakan %{resource_name} sortasi dalam %{space_name}" - delete: "%{user_name} membatalkan %{resource_name} penyortiran dalam %{space_name}" - update: "%{user_name} memperbarui penyortiran %{resource_name} dalam %{space_name}" - sortitions: - count: - proposals_count: - other: "%{count} proposal" - filters: - active: Aktif - all: Semua - cancelled: Dibatalkan - category: Kategori - state: Status - linked_sortitions: - selected_proposals: Usulan yang dipilih - orders: - label: 'Urutkan penyortiran menurut:' - random: Acak - recent: Baru - results_count: - count: - other: proposal yang dipilih - show: - algorithm: Kode algoritma penyortiran - cancelled: Pengurutan yang dibatalkan - candidate_proposal_ids: Urutan proposal pengurutan dan ID - dice_result: (1) Hasil dadu - introduction: 'Halaman ini berisi hasil sortasi %{reference}. Melalui penyortiran ini, %{target_items} jumlah hasil telah dipilih secara acak dan dengan distribusi probabilitas yang sama dari sekumpulan proposal yang ditampilkan di bawah. Bersama dengan hasilnya, informasi yang ditampilkan pada halaman ini memberikan semua informasi yang diperlukan untuk memaksimalkan jaminan dan mereproduksi hasil. Kunci kualitas penyortiran ini adalah keacakan ganda yang diberikan oleh pengguliran dadu (diverifikasi oleh saksi) dan waktu penyisihan yang tepat yang memberikan input untuk suatu algoritma yang menghasilkan seleksi acak. Benih waktu untuk penyortiran sangat akurat (detik) sehingga tidak mungkin dikendalikan oleh manusia sehingga memberikan input ganda "tidak terkendali" untuk menjamin hasil yang adil. ' - mathematical_result: Hasil (1) x (2) - proposals_selected_by_sortition: Proposal dipilih berdasarkan penyortiran - sortition_reproducibility_details: Rincian reproduksibilitas penyortiran - time_seed: (2) Benih waktu - witnesses: Saksi - sortition: - random_seed: Benih acak - selected_proposals: - other: proposal yang dipilih - sortition_author: - deleted: Peserta yang dihapus - sortition_cancel_author: - deleted: Peserta yang dihapus - sortitions_count: - count: - other: "%{count} penyortiran" diff --git a/decidim-sortitions/config/locales/is-IS.yml b/decidim-sortitions/config/locales/is-IS.yml deleted file mode 100644 index a08fa4381e064..0000000000000 --- a/decidim-sortitions/config/locales/is-IS.yml +++ /dev/null @@ -1,96 +0,0 @@ -is-IS: - activemodel: - attributes: - sortition: - additional_info: Flokkunarupplýsingar - decidim_proposals_component_id: Tillögur settar - target_items: Fjöldi tillagna til að velja (gefur til kynna fjölda tillagna sem þú vilt velja með því að teikna mikið af þeim hópi tillagna sem þú hefur áður valið) - title: Titill - witnesses: Vottar - decidim: - components: - sortitions: - name: Flokkanir - settings: - global: - comments_enabled: Athugasemdir virkt - events: - sortitions: - sortition_created: - email_intro: Flokkunin "%{resource_title}" hefur verið bætt við "%{participatory_space_title}" sem þú fylgist með. - email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með "%{participatory_space_title}". Þú getur sleppt því frá fyrri tengilinn. - email_subject: Ný flokkun bætt við %{participatory_space_title} - notification_title: Flokkunin %{resource_title} hefur verið bætt við %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Hætta við flokkunina - edit: Breyta - show: Uppsetningarupplýsingar - models: - sortition: - fields: - created_at: Sköpunardegi - decidim_proposals_component: Tillögur hluti - dice: Dice - reference: Tilvísun - request_timestamp: Teikna tíma - seed: Fræ - target_items: Atriði til að velja - title: Titill - sortitions: - confirm_destroy: - confirm_destroy: Ertu viss um að þú viljir hætta við þessa flokkun? - destroy: Hætta við flokkun - title: Afpöntun á flokkuninni - edit: - title: Uppfærðu upplýsingar um flokkunina - update: Uppfæra - form: - select_proposal_component: Veldu tillögur settar - index: - title: Flokkanir - new: - create: Búa til - title: Ný flokkun - show: - selected_proposals: Tillögur valdar fyrir teikningu - admin_log: - sortition: - create: "%{user_name} búið til %{resource_name} flokkun í %{space_name}" - delete: "%{user_name} hætt %{resource_name} flokkun í %{space_name}" - update: "%{user_name} uppfært %{resource_name} flokkun í %{space_name}" - sortitions: - count: - proposals_count: - one: 1 tillaga - other: "%{count} tillögur" - filters: - active: Virkur - all: Allt - cancelled: Hætt við - category: Flokkur - linked_sortitions: - selected_proposals: Valdar tillögur - orders: - label: 'Order flokkun eftir:' - random: Handahófi - recent: Nýleg - results_count: - count: - one: valið tillaga - other: valin tillögur - show: - cancelled: Hætt við flokkun - candidate_proposal_ids: Flokkun tillögur röð og auðkenni - dice_result: (1) Dice niðurstaða - introduction: 'Þessi síða inniheldur niðurstöður flokkunarinnar %{reference}. Með þessari flokkun hafa %{target_items} fjöldi niðurstaðna verið valin af handahófi og með jöfn líkindadreifingu frá settum tillögum sem birtast á skjánum. Í sambandi við niðurstöðurnar eru upplýsingar sem birtar eru á þessari síðu allar nauðsynlegar upplýsingar til að hámarka ábyrgðir og endurskapa niðurstöðurnar. Lykillinn að gæðum þessa flokks er tvöfalt handahófi sem er gefin út af túlkun (staðfest af vitni) og nákvæman tíma flokkunarinnar sem gefur inntak fyrir reiknirit sem býr til handahófi val. Tímasæðið fyrir flokkunina er svo nákvæm (sekúndur) að það er ómögulegt að stjórna af mönnum og gefur þannig tvöfalt "óráðanlegt" inntak til að tryggja sanngjarna afleiðingu. ' - mathematical_result: Niðurstaða (1) x (2) - proposals_selected_by_sortition: Tillögur valdar af flokkun - sortition_reproducibility_details: Flokkunarleiðbeiningar upplýsingar - time_seed: (2) Tími fræ - witnesses: Vottar - sortitions_count: - count: - one: 1 flokkun - other: "%{count} flokkanir" diff --git a/decidim-sortitions/config/locales/is.yml b/decidim-sortitions/config/locales/is.yml deleted file mode 100644 index d922a52fe1510..0000000000000 --- a/decidim-sortitions/config/locales/is.yml +++ /dev/null @@ -1,122 +0,0 @@ -is: - activemodel: - attributes: - sortition: - additional_info: Flokkunarupplýsingar - decidim_category_id: Flokkar af settum tillögum sem þú vilt sækja um teikninguna - decidim_proposals_component_id: Tillögur settar - target_items: Fjöldi tillagna til að velja (gefur til kynna fjölda tillagna sem þú vilt velja með því að teikna mikið af þeim hópi tillagna sem þú hefur áður valið) - title: Titill - witnesses: Vottar - decidim: - components: - sortitions: - name: Flokkanir - settings: - global: - comments_enabled: Athugasemdir virkt - events: - sortitions: - sortition_created: - email_intro: Flokkunin "%{resource_title}" hefur verið bætt við "%{participatory_space_title}" sem þú fylgist með. - email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með "%{participatory_space_title}". Þú getur sleppt því frá fyrri tengilinn. - email_subject: Ný flokkun bætt við %{participatory_space_title} - notification_title: Flokkunin %{resource_title} hefur verið bætt við %{participatory_space_title} - participatory_processes: - statistics: - sortitions_count: Flokkanir - sortitions: - admin: - actions: - destroy: Hætta við flokkunina - edit: Breyta - show: Uppsetningarupplýsingar - models: - sortition: - fields: - category: Flokkur - created_at: Sköpunardegi - decidim_proposals_component: Tillögur hluti - dice: Dice - reference: Tilvísun - request_timestamp: Teikna tíma - seed: Fræ - target_items: Atriði til að velja - title: Titill - name: - one: Flokkun - other: Flokkanir - sortitions: - confirm_destroy: - confirm_destroy: Ertu viss um að þú viljir hætta við þessa flokkun? - destroy: Hætta við flokkun - title: Afpöntun á flokkuninni - create: - success: Flokkun búin til - destroy: - error: Ekki er hægt að hætta við flokkunina. - success: Flokkun tókst að hætta við - edit: - title: Uppfærðu upplýsingar um flokkunina - update: Uppfæra - form: - all_categories: Allir flokkar - select_proposal_component: Veldu tillögur settar - title: Ný flokkun fyrir tillögur - index: - title: Flokkanir - new: - confirm: Með því að ýta á næstu hnappinn mun Decidim skrá dagsetningu og tíma (með nákvæmni sekúndna) og ásamt dice rúlla, verða þessar upplýsingar notaðar til að búa til handahófi val. Aðgerðin verður óafturkræf, þegar hnappurinn er smelltur verður niðurstaðan af þessari teikningu birt, ásamt þeim gögnum sem slegnar eru inn á þessu eyðublaði og ekki hægt að breyta, vinsamlegast athugaðu efnið vandlega - create: Búa til - title: Ný flokkun - show: - selected_proposals: Tillögur valdar fyrir teikningu - admin_log: - sortition: - create: "%{user_name} búið til %{resource_name} flokkun í %{space_name}" - delete: "%{user_name} hætt %{resource_name} flokkun í %{space_name}" - update: "%{user_name} uppfært %{resource_name} flokkun í %{space_name}" - sortitions: - count: - proposals_count: - one: 1 tillaga - other: "%{count} tillögur" - filters: - active: Virkur - all: Allt - cancelled: Hætt við - category: Flokkur - category_prompt: Veldu flokk - search: Leita - filters_small_view: - close_modal: Loka mát - filter: Sía - filter_by: Sía eftir - unfold: Fella út - linked_sortitions: - selected_proposals: Valdar tillögur - orders: - label: 'Order flokkun eftir:' - random: Handahófi - recent: Nýleg - results_count: - count: - one: valið tillaga - other: valin tillögur - show: - any_category: frá öllum flokkum - cancelled: Hætt við flokkun - candidate_proposal_ids: Flokkun tillögur röð og auðkenni - candidate_proposals_info: 'Flokkunin var gerð meðal eftirfarandi tillagna (%{category_label}), með eftirfarandi auðkenni (með feitletruðu völdum tillögum) ' - category: frá %{category} flokki - dice_result: "(1) Dice niðurstaða" - introduction: 'Þessi síða inniheldur niðurstöður flokkunarinnar %{reference}. Með þessari flokkun hafa %{target_items} fjöldi niðurstaðna verið valin af handahófi og með jöfn líkindadreifingu frá settum tillögum sem birtast á skjánum. Í sambandi við niðurstöðurnar eru upplýsingar sem birtar eru á þessari síðu allar nauðsynlegar upplýsingar til að hámarka ábyrgðir og endurskapa niðurstöðurnar. Lykillinn að gæðum þessa flokks er tvöfalt handahófi sem er gefin út af túlkun (staðfest af vitni) og nákvæman tíma flokkunarinnar sem gefur inntak fyrir reiknirit sem býr til handahófi val. Tímasæðið fyrir flokkunina er svo nákvæm (sekúndur) að það er ómögulegt að stjórna af mönnum og gefur þannig tvöfalt "óráðanlegt" inntak til að tryggja sanngjarna afleiðingu. ' - mathematical_result: Niðurstaða (1) x (2) - proposals_selected_by_sortition: Tillögur valdar af flokkun - sortition_reproducibility_details: Flokkunarleiðbeiningar upplýsingar - time_seed: "(2) Tími fræ" - witnesses: Vottar - sortitions_count: - count: - one: 1 flokkun - other: "%{count} flokkanir" diff --git a/decidim-sortitions/config/locales/it.yml b/decidim-sortitions/config/locales/it.yml deleted file mode 100644 index 5d583cd998b1b..0000000000000 --- a/decidim-sortitions/config/locales/it.yml +++ /dev/null @@ -1,124 +0,0 @@ -it: - activemodel: - attributes: - sortition: - additional_info: Informazioni di ordinamento - decidim_proposals_component_id: Proposte impostate - dice: Risultato del tiro di dado. Tira un dado a 6 facce, o cerca un altro modo casuale per generare un numero da 1 a 6, e inserisci qui il numero risultante davanti ad alcuni testimoni. Ciò contribuisce alla qualità e alle garanzie della casualità del risultato - target_items: Numero di proposte da selezionare (indica il numero di proposte che si desidera selezionare tracciando lotti del gruppo di proposte che si è scelto in precedenza) - title: Titolo - witnesses: Testimoni - models: - decidim/sortitions/create_sortition_event: sortition - activerecord: - models: - decidim/sortitions/sortition: - one: sortition - other: Sorteggi - decidim: - components: - sortitions: - actions: - comment: Commenta - name: Sorteggi - settings: - global: - comments_enabled: Commenti abilitati - comments_max_length: Lunghezza massima dei commenti (Lasciare 0 per il valore predefinito) - events: - sortitions: - sortition_created: - email_intro: L'ordinamento "%{resource_title}" è stato aggiunto a "%{participatory_space_title}" che stai seguendo. - email_outro: Hai ricevuto questa notifica perché stai seguendo "%{participatory_space_title}". Puoi smettere di seguirlo dal link precedente. - email_subject: Nuova sortizione aggiunta a %{participatory_space_title} - notification_title: Il sorteggio %{resource_title} è stato aggiunto a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Annulla la sortizione - edit: Modifica - show: Dettagli di ordinamento - models: - sortition: - fields: - created_at: Data di creazione - decidim_proposals_component: Componente delle proposte - dice: Dado - reference: Riferimento - request_timestamp: Disegna il tempo - seed: seme - target_items: Articoli da selezionare - title: Titolo - sortitions: - confirm_destroy: - confirm_destroy: Sei sicuro di voler cancellare questa selezione? - destroy: Annulla la scelta - title: Annullamento della sortizione - create: - error: Si è verificato un errore durante la creazione di una nuova sortizione. - edit: - title: Aggiorna le informazioni sulla sortizione - update: Aggiornare - form: - select_proposal_component: Seleziona il set di proposte - index: - title: Sorteggi - new: - create: Creare - title: Nuova sortizione - show: - selected_proposals: Proposte selezionate per l'estrazione - update: - error: Si è verificato un errore durante l'aggiornamento della sortizione. - admin_log: - sortition: - create: "%{user_name} ha creato il sorteggio %{resource_name} in %{space_name}" - delete: "%{user_name} ha annullato il sorteggio %{resource_name} in %{space_name}" - update: "%{user_name} ha aggiornato il sorteggio %{resource_name} in %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} proposte" - filters: - active: Attivo - all: Tutti - cancelled: Annullato - category: Categoria - state: Stato - linked_sortitions: - selected_proposals: Proposte selezionate - orders: - label: 'Ordina i sorteggi per:' - random: Casuale - recent: Recente - results_count: - count: - one: proposta selezionata - other: proposte selezionate - show: - algorithm: Il codice dell'algoritmo di sorteggio - cancelled: Ordinamento annullato - candidate_proposal_ids: Ordine e ID delle proposte da sorteggiare - dice_result: (1) Risultato dei dadi - introduction: 'Questa pagina contiene i risultati del sorteggio %{reference}. Per mezzo di questo sorteggio, %{target_items} risultati sono stati selezionati casualmente e con una distribuzione di probabilità uguale dall''insieme di proposte visualizzate sotto. Insieme ai risultati, le informazioni visualizzate in questa pagina forniscono tutte le informazioni necessarie per massimizzare le garanzie e riprodurre i risultati. La chiave per la qualità di questo sorteggio è la doppia casualità fornita da un lancio di un dado (verificato da testimoni) e il tempo preciso del sorteggio, che fornisce l''input per un algoritmo che genera una selezione casuale. L''origine del tempo per il sorteggio è così preciso (secondi) che è impossibile controllarlo per gli umani, fornendo così un doppio input "incontrollabile" per garantire un risultato equo. ' - mathematical_result: Risultato (1) x (2) - proposals_selected_by_sortition: Proposte selezionate per il sorteggio - sortition_reproducibility_details: Dettagli di riproducibilità del sorteggio - time_seed: (2) seme temporale - witnesses: Testimoni - sortition: - random_seed: Seme casuale - selected_proposals: - one: 1 proposta selezionata - other: '%{count} proposte selezionate' - sortition_author: - deleted: Utente eliminato - sortition_cancel_author: - deleted: Utente eliminato - sortitions_count: - count: - one: 1 sorteggio - other: "%{count} sorteggi" - statistics: - sortitions_count: Sorteggi diff --git a/decidim-sortitions/config/locales/ja.yml b/decidim-sortitions/config/locales/ja.yml deleted file mode 100644 index d0a12981aebe8..0000000000000 --- a/decidim-sortitions/config/locales/ja.yml +++ /dev/null @@ -1,142 +0,0 @@ -ja: - activemodel: - attributes: - sortition: - additional_info: 並べ替え情報 - decidim_proposals_component_id: 提案セット - dice: ダイロールの結果。 6面ダイをロールするか、1から6まで数字を生成する別のランダムな方法を探します そして目撃者の前にナンバーを入力します。 これにより、品質と結果のランダム性を保証します - target_items: 選択される提案の数 (選択した提案のグループをたくさん描画して選択したい提案の数を示します) - title: タイトル - witnesses: 目撃者 - models: - decidim/sortitions/create_sortition_event: 並べ替え - activerecord: - models: - decidim/sortitions/sortition: - other: 並べ替え - decidim: - components: - sortitions: - actions: - comment: コメント - name: 並べ替え - settings: - global: - clear_all: すべてクリア - comments_enabled: コメントを有効にする - comments_max_length: コメント最大長 (デフォルト値は 0 のまま) - define_taxonomy_filters: この設定を使用する前に、参加型スペースのフィルターをいくつか定義してください。 - no_taxonomy_filters_found: タクソノミーフィルタが見つかりません。 - taxonomy_filters: コンポーネントのフィルタを選択 - taxonomy_filters_add: フィルターを追加 - events: - sortitions: - sortition_created: - email_intro: あなたがフォローしている「%{resource_title}」にソート「%{participatory_space_title}」が追加されました。 - email_outro: '「%{participatory_space_title}」をフォローしているため、この通知を受け取りました。前のリンクからこの通知をアンフォローすることができます。' - email_subject: '%{participatory_space_title} に新しいソートが追加されました' - notification_title: ソート %{resource_title} が %{participatory_space_title} に追加されました - sortitions: - admin: - actions: - destroy: 並べ替えをキャンセル - edit: 編集 - new_sortition: 新しいソート順 - show: 並べ替えの詳細 - title: アクション - deprecation_warning_html: "⚠️ 非推奨通知。SortitionsモジュールはDecidim v0.32で削除される予定です。これに先立ち、適切な代替策を検討し、参加者や提案の選定方法について代替ソリューションを準備してください。" - models: - sortition: - fields: - created_at: 作成日 - decidim_proposals_component: 提案コンポーネント - dice: ダイス - reference: 参照 - request_timestamp: ドロー時間 - seed: Seed - target_items: 選択するアイテム - taxonomies: タクソノミー - title: タイトル - sortitions: - confirm_destroy: - confirm_destroy: この並べ替えをキャンセルしてもよろしいですか? - destroy: 並べ替えをキャンセル - title: 並べ替えのキャンセル - create: - error: 新しいソートの作成中に問題が発生しました。 - success: ソートは正常に作成されました。 - destroy: - error: ソートをキャンセルできません。 - success: ソートは正常にキャンセルされました。 - edit: - title: 並べ替えに関する情報を更新する - update: 更新 - form: - all_taxonomies: すべてのタクソノミー - select_proposal_component: 提案セットを選択 - select_taxonomies: 抽選を適用したい提案のセットに関連するタクソノミー。空のままにすると、そのタクソノミー内のすべての提案に抽選が適用されます。 - index: - title: 並べ替え - new: - confirm: 次のボタンを押すと、プラットフォームは日付と時刻(秒の精度で) を記録し、サイコロロールと一緒になります。 この情報はランダムな選択を生成するために使用されます。アクションは元に戻せません。ボタンをクリックすると、この描画の結果が公開されます。 このフォームに入力されたデータと一緒に変更することはできません。慎重に内容を確認してください。 - create: 作成 - title: 新しいソート順 - show: - selected_proposals: ドローのために選択された提案 - update: - error: ソートの更新に問題がありました。 - success: ソートが正常に更新されました。 - admin_log: - sortition: - create: "%{user_name} が %{resource_name} で %{space_name}ソートを作成しました" - delete: "%{user_name} が %{resource_name} で %{space_name}ソートを取り消しました" - update: "%{user_name} が %{resource_name} のソートを %{space_name}で更新しました" - sortitions: - count: - proposals_count: - other: "%{count} の提案" - filters: - active: アクティブ - all: すべて - cancelled: キャンセルしました - category: カテゴリ - state: ステータス - index: - empty: まだ並べ替えがありません。 - linked_sortitions: - selected_proposals: 選択された提案 - orders: - label: '並べ替え順:' - random: ランダム - recent: 最近のもの - results_count: - count: - other: 選択された提案 - show: - algorithm: 並べ替えのアルゴリズム コード - any_taxonomy: すべてのタクソノミーから - cancelled: キャンセルされた並べ替え - candidate_proposal_ids: 並べ替え提案の順序とID - candidate_proposals_info: '抽選は次の提案(%{taxonomy_labels})の中で実施され、以下の ID の提案が対象となりました(太字が選ばれた提案) ' - dice_result: (1)サイコロ結果 - introduction: 'このページには、ソート %{reference} の結果が含まれています。このソートにより、%{target_items} の数の結果が、以下に表示されている提案の集合から同確率でランダムに選択されています。結果とともにこのページに表示される情報は、保証を最大化し、結果を再現するために必要なすべての情報を提供します。このソートの品質の鍵となるのは、転がるサイコロ(目撃者による検証) による二重のランダム性と、ランダムな選択を生成するアルゴリズムの入力となるソートの正確な時間です。ソートのタイムシードは、人間がコントロールすることが不可能な正確さ(秒単位) を持っているため、公平な結果を保証するための二重の「コントロール不可能な」入力を提供しています。 ' - mathematical_result: 結果 (1) x (2) - proposals_selected_by_sortition: 並べ替えによって選択された提案 - sortition_reproducibility_details: 並べ替え再現性の詳細 - taxonomies: '%{taxonomies} タクソノミーから' - time_seed: (2) 時間の種 - witnesses: 目撃者 - sortition: - random_seed: 乱数のシード - selected_proposals: - other: 提案を選択しました - sortition_author: - deleted: 退会者 - sortition_cancel_author: - deleted: 退会者 - sortitions_count: - count: - other: "%{count} ソート数" - statistics: - sortitions_count: 並べ替え - sortitions_count_tooltip: 意思決定のために実施されたランダム抽選の数です。 diff --git a/decidim-sortitions/config/locales/ka-GE.yml b/decidim-sortitions/config/locales/ka-GE.yml deleted file mode 100644 index 57a95cb04703c..0000000000000 --- a/decidim-sortitions/config/locales/ka-GE.yml +++ /dev/null @@ -1 +0,0 @@ -ka: diff --git a/decidim-sortitions/config/locales/kaa.yml b/decidim-sortitions/config/locales/kaa.yml deleted file mode 100644 index 455cb565ea313..0000000000000 --- a/decidim-sortitions/config/locales/kaa.yml +++ /dev/null @@ -1 +0,0 @@ -kaa: diff --git a/decidim-sortitions/config/locales/ko-KR.yml b/decidim-sortitions/config/locales/ko-KR.yml deleted file mode 100644 index 8a7b3b861deda..0000000000000 --- a/decidim-sortitions/config/locales/ko-KR.yml +++ /dev/null @@ -1 +0,0 @@ -ko: diff --git a/decidim-sortitions/config/locales/ko.yml b/decidim-sortitions/config/locales/ko.yml deleted file mode 100644 index 8a7b3b861deda..0000000000000 --- a/decidim-sortitions/config/locales/ko.yml +++ /dev/null @@ -1 +0,0 @@ -ko: diff --git a/decidim-sortitions/config/locales/lb-LU.yml b/decidim-sortitions/config/locales/lb-LU.yml deleted file mode 100644 index 823df018114f4..0000000000000 --- a/decidim-sortitions/config/locales/lb-LU.yml +++ /dev/null @@ -1 +0,0 @@ -lb: diff --git a/decidim-sortitions/config/locales/lb.yml b/decidim-sortitions/config/locales/lb.yml deleted file mode 100644 index 823df018114f4..0000000000000 --- a/decidim-sortitions/config/locales/lb.yml +++ /dev/null @@ -1 +0,0 @@ -lb: diff --git a/decidim-sortitions/config/locales/lo-LA.yml b/decidim-sortitions/config/locales/lo-LA.yml deleted file mode 100644 index 27a02bfece429..0000000000000 --- a/decidim-sortitions/config/locales/lo-LA.yml +++ /dev/null @@ -1 +0,0 @@ -lo: diff --git a/decidim-sortitions/config/locales/lt-LT.yml b/decidim-sortitions/config/locales/lt-LT.yml deleted file mode 100644 index 6c5cb837ac8c1..0000000000000 --- a/decidim-sortitions/config/locales/lt-LT.yml +++ /dev/null @@ -1 +0,0 @@ -lt: diff --git a/decidim-sortitions/config/locales/lt.yml b/decidim-sortitions/config/locales/lt.yml deleted file mode 100644 index 12b73c8e5bb7a..0000000000000 --- a/decidim-sortitions/config/locales/lt.yml +++ /dev/null @@ -1,140 +0,0 @@ -lt: - activemodel: - attributes: - sortition: - additional_info: Informacija apie sprendimą burtų keliu - decidim_proposals_component_id: Pasiūlymų rinkinys - dice: Kauliukų ridenimo rezultatai. Riskite šešiasienį kauliuką arba raskite kitą būdą, kaip atsitiktinai išridenti skaičių nuo 1 iki 6. Gautą skaičių užrašykite prie liudytojų. Tai padeda kokybei ir užtikrina atsitiktinį rezultatą - target_items: Pasirinktinų pasiūlymų skaičius (tai yra pasiūlymų, kuriuos norite atrinkti burtų keliu iš anksčiau pasirinktos pasiūlymų grupės, skaičius) - title: Pavadinimas - witnesses: Liudytojai - models: - decidim/sortitions/create_sortition_event: Sprendimas burtų keliu - activerecord: - models: - decidim/sortitions/sortition: - one: Sprendimas burtų keliu - few: Sprendimai burtų keliu - many: Sprendimai burtų keliu - other: Sprendimai burtų keliu - decidim: - components: - sortitions: - actions: - comment: Komentuoti - name: Sprendimai burtų keliu - settings: - global: - comments_enabled: Komentarai įjungti - comments_max_length: Maksimalus komentarų ilgis (Palikite 0 kaip numatytą vertę) - events: - sortitions: - sortition_created: - email_intro: Erdvėje „%{participatory_space_title}“, kurią sekate, pridėta sprendimo burtų keliu funkcija „%{resource_title}“. - email_outro: Gavote šį pranešimą nes sekate %{participatory_space_title}. Galite nebesekti paspaudę and ankstesnės nuorodos. - email_subject: '%{participatory_space_title} pridėtas nauja sprendimo burtų keliu funkcija' - notification_title: '%{participatory_space_title} pridėta %{resource_title} sprendimo burtų keliu funkcija' - sortitions: - admin: - actions: - destroy: Atšaukti sprendimą burtų keliu - edit: Redaguoti - show: Išsami informacija apie sprendimą burtų keliu - models: - sortition: - fields: - created_at: Sukūrimo data - decidim_proposals_component: Pasiūlymų komponentas - dice: Kauliukai - reference: Nuoroda - request_timestamp: Sprendimo burtų keliu laikas - seed: Generavimo raktas - target_items: Pasirinktini elementai - title: Pavadinimas - sortitions: - confirm_destroy: - confirm_destroy: Ar tikrai norite atšauti šį sprendimą burtų keliu? - destroy: Atšaukti sprendimą burtų keliu - title: Sprendimo burtų keliu atšaukimas - create: - error: Rengiant naują sprendimą burtų keliu iškilo problema. - success: Sprendimas burtų keliu sukurtas. - destroy: - error: Negalima atšaukti sprendimo burtų keliu. - success: Sprendimas burtų keliu atšauktas. - edit: - title: Atnaujinti informaciją apie sprendimo burtų keliu galimybę - update: Atnaujinti - form: - select_proposal_component: Pasirinkti pasiūlymų rinkinį - index: - title: Sprendimai burtų keliu - new: - confirm: Spustelėjus mygtuką, data ir laikas bus užregistruoti (sekundžių tikslumu). Kartu su kauliuko metimu ši informacija bus naudojama atsitiktinei atrankai vykdyti. Spustelėjus mygtuką, veiksmas bus negrįžtamas, o jo rezultatas bus paskelbtas kartu su šioje formoje įrašytais duomenimis ir jų nebus galima keisti, taigi, atidžiai patikrinkite turinį. - create: Sukurti - title: Nauja galimybė spręsti burtų keliu - show: - selected_proposals: Pasirinkti pasiūlymai sprendimui burtų keliu priimti - update: - error: Atnaujinant galimybę spręsti burtų keliu iškilo problema. - success: Galimybė spręsti burtų keliu atnaujinta. - admin_log: - sortition: - create: "%{user_name} sukūrė %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje" - delete: "%{user_name} atšaukė %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje" - update: "%{user_name} atnaujino %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje" - sortitions: - count: - proposals_count: - one: 1 pasiūlymas - few: "%{count} pasiūlymai" - many: "%{count} pasiūlymai" - other: "%{count} pasiūlymai" - filters: - active: Aktyvūs - all: Visos - cancelled: Atšaukti - category: Kategorija - state: Būsena - linked_sortitions: - selected_proposals: Pasirinkti pasiūlymai - orders: - label: 'Galimybių spręsti burtų keliu rikiavimo kriterijai:' - random: Atsitiktinai - recent: Naujausi - results_count: - count: - one: pasirinktas pasiūlymas - few: pasirinkti pasiūlymai - many: pasirinkti pasiūlymai - other: pasirinkti pasiūlymai - show: - algorithm: Galimybės spręsti burtų keliu algoritmo kodas - cancelled: Galimybė spręsti burtų keliu atšaukta - candidate_proposal_ids: Pasiūlymų, dėl kurių sprendžiama burtų keliu, rikiavimo kriterijai ir ID - dice_result: 1) Kauliuko metimo rezultatai - introduction: 'Šiame puslapyje pateikiami sprendimo burtų keliu %{reference} rezultatai. Naudojantis šia galimybe spręsti burtų keliu, iš rodomų pasiūlymų rinkinio atsitiktine tvarka pasirenkamas rezultatų skaičius %{target_items}, esant vienodai pasiskirstymo tikimybei. Kartu su rezultatais šiame puslapyje pateikiamoje informacijoje nurodoma viskas, ko reikia siekiant kuo labiau padidinti garantijas ir atkurti rezultatus. Šios galimybės spręsti burtų keliu pagrindas – dvigubas atsitiktinumas, kurį užtikrina kauliuko ridenimas (jį patvirtina liudytojai) ir tikslus sprendimo burtų keliu laikas, – informacija, įvedama į atsitiktinės atrankos vykdymo algoritmą. Sprendimo burtų keliu pradžia yra tokia tiksli (sekundės), kad žmogus šio proceso kontroliuoti negali, taigi, tai dvigubas nekontroliuojamas veiksmas sąžiningam rezultatui užtikrinti. ' - mathematical_result: Rezultatas (1) x (2) - proposals_selected_by_sortition: Pasiūlymai pasirinkti burtų keliu - sortition_reproducibility_details: Rūšiavimo atkuriamumo detalės - time_seed: (2) Time seed - witnesses: Liudytojai - sortition: - random_seed: Atsitiktinė vertė - selected_proposals: - one: pasiūlymas pasirinktas - few: pasiūlymai pasirinkti - many: pasiūlymai pasirinkti - other: pasiūlymai pasirinkti - sortition_author: - deleted: Ištrintas dalyvis - sortition_cancel_author: - deleted: Ištrintas dalyvis - sortitions_count: - count: - one: 1 pasirinkimas burtų keliu - few: "%{count} pasirinkimai burtų keliu" - many: "%{count} pasirinkimų burtų keliu" - other: "%{count} pasirinkimai burtų keliu" - statistics: - sortitions_count: Pasirinkimai burtų keliu diff --git a/decidim-sortitions/config/locales/lv.yml b/decidim-sortitions/config/locales/lv.yml deleted file mode 100644 index 3a0e204747106..0000000000000 --- a/decidim-sortitions/config/locales/lv.yml +++ /dev/null @@ -1,124 +0,0 @@ -lv: - activemodel: - attributes: - sortition: - additional_info: Izlozes informācija - decidim_proposals_component_id: Priekšlikumu kopas - dice: Kauliņa metiena rezultāts. Metiet kauliņu kuba formā ar sešām skaldnēm vai meklējiet citu veidu, kā iegūt nejauši izvēlētu skaitli no 1 līdz 6, un ievadiet iegūto skaitli dažu liecinieku klātbūtnē. Šādi tiek uzlabota procesa kvalitāte un garantēta rezultāta nejaušība. - target_items: Atlasāmo priekšlikumu skaits (norāda priekšlikumu skaitu, kuru vēlaties atlasīt, izlozējot no iepriekš izvēlēto priekšlikumu kopas) - title: Nosaukums - witnesses: Liecinieki - models: - decidim/sortitions/create_sortition_event: Izloze - activerecord: - models: - decidim/sortitions/sortition: - zero: Izlozes - one: Izloze - other: Izlozes - decidim: - components: - sortitions: - name: Izlozes - settings: - global: - comments_enabled: Komentāri ir iespējoti - events: - sortitions: - sortition_created: - email_intro: Izloze "%{resource_title}" ir pievienota telpai "%{participatory_space_title}", kam jūs sekojat. - email_outro: Jūs saņēmāt šo paziņojumu, jo sekojat "%{participatory_space_title}". Jūs varat atsekot tai no iepriekšējās saites. - email_subject: Jauna izloze pievienota telpai %{participatory_space_title} - notification_title: Izloze %{resource_title} ir pievienota telpai%{participatory_space_title} - sortitions: - admin: - actions: - destroy: Atcelt izlozi - edit: Labot - show: Izlozes detaļas - models: - sortition: - fields: - created_at: Izveides datums - decidim_proposals_component: Priekšlikumu komponents - dice: Metamais kauliņš - reference: Atsauce - request_timestamp: Mešanas laiks - seed: Sēkla - target_items: Elementi, ko izvēlēties - title: Nosaukums - sortitions: - confirm_destroy: - confirm_destroy: Vai tiešām vēlaties atcelt šo izlozi? - destroy: Atcelt izlozi - title: Izlozes atcelšana - create: - error: Jaunas izlozes izveides laikā radās problēma. - edit: - title: Atjaunināt informāciju par izlozi - update: Atjaunināt - form: - select_proposal_component: Atlasiet piedāvājumu kopu - index: - title: Izlozes - new: - create: Izveidot - title: Jauna izloze - show: - selected_proposals: Priekšlikumi, kas atlasīti izlozei - update: - error: Izlozes atjaunināšanas laikā radās problēma. - admin_log: - sortition: - create: "%{user_name} izveidoja %{resource_name} izlozi telpā %{space_name}." - delete: "%{user_name} atcēla %{resource_name} izlozi telpā %{space_name}." - update: "%{user_name} atjaunināja %{resource_name} izlozi telpā %{space_name}." - sortitions: - count: - proposals_count: - zero: "%{count} priekšlikumi" - one: 1 priekšlikums - other: "%{count} priekšlikumi" - filters: - active: Aktīvas - all: Visi - cancelled: Atcelts - category: Kategorija - state: Statuss - linked_sortitions: - selected_proposals: Atlasītie priekšlikumi - orders: - label: 'Šķirot izlozes pēc:' - random: Nejauši - recent: Nesenie - results_count: - count: - zero: atlasītie priekšlikumi - one: atlasītā priekšlikuma - other: atlasītie priekšlikumi - show: - algorithm: Izlozes algoritma kods - cancelled: Atcelta izloze - candidate_proposal_ids: Izlozes priekšlikumu secība un ID - dice_result: (1.) Rezultāts, metot kauliņu - introduction: 'Šajā lapā ir izlozes %{reference} rezultāti. Izmantojot šo izlozi %{target_items}, rezultātu skaits ir izvēlēts nejauši un ar vienādu varbūtības sadalījumu starp turpmāk esošajām priekšlikumu kopām. Kopā ar rezultātiem šajā lapā esošā informācija sniedz visus datus, lai nodrošinātu maksimālas garantijas un iespējamību atkārtot rezultātus. Izlozes kvalitātes atslēga ir dubultā nejaušība, ko rada metamā kauliņa izmantošana (liecinieku klātbūtnē) un precīzā izlozes laika ievade algoritmā, kas veic nejaušo izvēli. Laika vērtība izlozē ir tik precīza (sekundes), ka to nevar kontrolēt cilvēki, tādējādi divreiz sniedzot „nekontrolējamu” ievades informāciju, kas garantē taisnīgu rezultātu.' - mathematical_result: Rezultāts (1) x (2) - proposals_selected_by_sortition: Izlozes atlasītie priekšlikumi - sortition_reproducibility_details: Izlozes reproducējamības informācija - time_seed: (2) Laika vērtība - witnesses: Liecinieki - sortition: - random_seed: Nejaušā vērtība - selected_proposals: - zero: atlasītie priekšlikumi - one: atlasītais priekšlikums - other: atlasītie priekšlikumi - sortition_author: - deleted: Dzēsts dalībnieks - sortition_cancel_author: - deleted: Dzēsts dalībnieks - sortitions_count: - count: - zero: "%{count} izlozes" - one: 1 izloze - other: "%{count} izlozes" diff --git a/decidim-sortitions/config/locales/mt-MT.yml b/decidim-sortitions/config/locales/mt-MT.yml deleted file mode 100644 index f7aabc7149a9b..0000000000000 --- a/decidim-sortitions/config/locales/mt-MT.yml +++ /dev/null @@ -1 +0,0 @@ -mt: diff --git a/decidim-sortitions/config/locales/mt.yml b/decidim-sortitions/config/locales/mt.yml deleted file mode 100644 index f7aabc7149a9b..0000000000000 --- a/decidim-sortitions/config/locales/mt.yml +++ /dev/null @@ -1 +0,0 @@ -mt: diff --git a/decidim-sortitions/config/locales/nl.yml b/decidim-sortitions/config/locales/nl.yml deleted file mode 100644 index 454bbe35c9bb3..0000000000000 --- a/decidim-sortitions/config/locales/nl.yml +++ /dev/null @@ -1,124 +0,0 @@ -nl: - activemodel: - attributes: - sortition: - additional_info: Informatie over de loting - decidim_proposals_component_id: Voorstellen geplaatst - dice: Resultaat van de worp. Rol een 6-zijdige dobbelsteen uit, of zoek naar een andere willekeurige manier om een ​​getal van 1 tot 6 te genereren, en voer hier het resulterende getal in voor sommige getuigen. Dit draagt ​​bij aan de kwaliteit en garanties van de willekeurigheid van het resultaat - target_items: Aantal voorstellen dat moet worden geselecteerd (geeft het aantal voorstellen aan dat je wil selecteren door groepsvoorstellen te selecteren die je eerder hebt gekozen) - title: Titel - witnesses: getuigen - models: - decidim/sortitions/create_sortition_event: toss - activerecord: - models: - decidim/sortitions/sortition: - one: toss - other: Sortitions - decidim: - components: - sortitions: - actions: - comment: Reactie - name: Loting - settings: - global: - comments_enabled: Reacties ingeschakeld - comments_max_length: Commentaar maximale lengte (laat 0 voor standaard waarde) - events: - sortitions: - sortition_created: - email_intro: De loting "%{resource_title}" is toegevoegd aan "%{participatory_space_title}" dat je volgt. - email_outro: Je hebt deze melding ontvangen omdat je "%{participatory_space_title}" volgt. Ontvolgen kan door te klikken op de voorgaande link. - email_subject: Nieuwe loting toegevoegd aan %{participatory_space_title} - notification_title: De loting %{resource_title} is toegevoegd aan %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Annuleer de loting - edit: Bewerk - show: Details van de loting - models: - sortition: - fields: - created_at: Aangemaakt op - decidim_proposals_component: Voorstellen component - dice: Dobbelsteen - reference: Referentie - request_timestamp: Tekentijd - seed: Zaad - target_items: Te selecteren items - title: Titel - sortitions: - confirm_destroy: - confirm_destroy: Weet je zeker dat je deze loting wilt annuleren? - destroy: Annuleer de loting - title: Annulatie van de loting - create: - error: Er is een fout opgetreden bij het maken van een nieuwe loting. - edit: - title: Update de informatie over de loting - update: Bijwerken - form: - select_proposal_component: Selecteer de voorgestelde set - index: - title: Lotingen - new: - create: Aanmaken - title: Nieuwe loting - show: - selected_proposals: Voorstellen geselecteerd voor trekking - update: - error: Er is een fout opgetreden bij het bijwerken van de loting. - admin_log: - sortition: - create: "%{user_name} heeft de %{resource_name} loting gemaakt in %{space_name}" - delete: "%{user_name} heeft de %{resource_name} loting geannuleerd in %{space_name}" - update: "%{user_name} heeft de %{resource_name} loting bijgewerkt in %{space_name}" - sortitions: - count: - proposals_count: - one: 1 voorstel - other: "%{count} voorstellen" - filters: - active: Actief - all: Alle - cancelled: Geannuleerd - category: Categorie - state: Staat - linked_sortitions: - selected_proposals: Geselecteerde voorstellen - orders: - label: 'Lotingen ordenen op:' - random: Willekeurig - recent: recent - results_count: - count: - one: geselecteerd voorstel - other: geselecteerde voorstellen - show: - algorithm: De algoritme-code van de loting - cancelled: Geannuleerde loting - candidate_proposal_ids: Sorteervolgorde orders en ID's - dice_result: (1) Resultaat dobbelsteen - introduction: 'Deze pagina bevat de resultaten van de loting %{reference}. Door middel van deze loting is het %{target_items} aantal resultaten willekeurig geselecteerd en met een gelijke kansverdeling uit de set weergegeven voorstellen. Samen met de resultaten biedt de informatie die op deze pagina wordt weergegeven alle informatie die nodig is om garanties te maximaliseren en de resultaten te reproduceren. De sleutel tot de kwaliteit van deze loting is de dubbele willekeurigheid die wordt geboden door het rollen van een dobbelsteen (geverifieerd door getuigen) en de precieze tijd van de loting die input levert voor een algoritme dat een willekeurige selectie genereert. Het tijdsbestek voor de loting is zo nauwkeurig (seconden) dat het onmogelijk is om door mensen te controleren en biedt dus een dubbele "oncontroleerbare" invoer om een ​​rechtvaardig resultaat te garanderen. ' - mathematical_result: Resultaat (1) x (2) - proposals_selected_by_sortition: Voorstellen geselecteerd door loting - sortition_reproducibility_details: Loting reproduceerbaarheidsdetails - time_seed: (2) Tijdzaad - witnesses: getuigen - sortition: - random_seed: Willekeurig zaad - selected_proposals: - one: 1 voorstel geselecteerd - other: '%{count} voorstellen geselecteerd' - sortition_author: - deleted: Verwijder gebruiker - sortition_cancel_author: - deleted: Verwijderde gebruiker - sortitions_count: - count: - one: 1 loting - other: "%{count} lotingen" - statistics: - sortitions_count: Lotingen diff --git a/decidim-sortitions/config/locales/no.yml b/decidim-sortitions/config/locales/no.yml deleted file mode 100644 index 8368c6ef646dc..0000000000000 --- a/decidim-sortitions/config/locales/no.yml +++ /dev/null @@ -1,124 +0,0 @@ -"no": - activemodel: - attributes: - sortition: - additional_info: Sorterings informasjon - decidim_proposals_component_id: Forslag satt - dice: Resultat av terningkast. Rull en 6-sidet terning, eller finn en annen tilfeldig måte å generere et tall fra 1 til 6, og legg inn det resulterende tallet foran noen vitner. Dette bidrar til kvaliteten og garanterer tilfeldigheten til resultatet - target_items: Antall forslag som skal velges (indikerer antall forslag du vil skal bli valgt ved å trekke mange av gruppen av forslag du har valgt tidligere) - title: Tittel - witnesses: Tilbaketrukket - models: - decidim/sortitions/create_sortition_event: Sortering - activerecord: - models: - decidim/sortitions/sortition: - one: Sortering - other: Sorteringer - decidim: - components: - sortitions: - actions: - comment: Kommenter - name: Sorteringer - settings: - global: - comments_enabled: Kommentarer aktivert - comments_max_length: Maks lengde på kommentarer (Sett 0 for standardverdi) - events: - sortitions: - sortition_created: - email_intro: Sorteringen "%{resource_title}" er blitt lagt til "%{participatory_space_title}" som du følger. - email_outro: Du har mottatt denne varslingen fordi du følger "%{participatory_space_title}". Du kan slutte å følge den fra den forrige lenken. - email_subject: Ny sortering lagt til %{participatory_space_title} - notification_title: Sorteringen %{resource_title} har blitt lagt til %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Avbryt sorteringen - edit: Editar - show: Sorterings detaljer - models: - sortition: - fields: - created_at: Opprettelsesdato - decidim_proposals_component: Forslags komponent - dice: Terning - reference: Referanse - request_timestamp: Uavgjort tid - seed: Seed - target_items: Gjenstander å velge - title: Tittel - sortitions: - confirm_destroy: - confirm_destroy: Er du sikker på at du vil avbryte denne sorteringen? - destroy: Avbryt sortering - title: Avbryting av sorteringen - create: - error: Det oppstod et problem med å lage en ny sortering. - edit: - title: Oppdater informasjonen om sorteringen - update: Oppdater - form: - select_proposal_component: Velg forslagets set - index: - title: Sorteringer - new: - create: Opprett - title: Ny sortering - show: - selected_proposals: Forslag valgt for trekning - update: - error: Det oppstod et problem med å oppdatere sorteringen. - admin_log: - sortition: - create: "%{user_name} opprettet %{resource_name} sorteringen i %{space_name}" - delete: "%{user_name} kansellerte %{resource_name} sorteringen i %{space_name}" - update: "%{user_name} oppdaterte %{resource_name} sorteringen i %{space_name}" - sortitions: - count: - proposals_count: - one: 1 forslag - other: "%{count} forslag" - filters: - active: Aktiv - all: Alle - cancelled: Avbrutt - category: Kategori - state: Status - linked_sortitions: - selected_proposals: Utvalgte forslag - orders: - label: 'Sorter sorteringer etter:' - random: Tilfeldig - recent: Nylig - results_count: - count: - one: valgt forslag - other: utvalgte forslag - show: - algorithm: Sorterings algoritmekode - cancelled: Avbrutt sortering - candidate_proposal_ids: Sorterings forslags ordre og IDer - dice_result: (1) Terning resultat - introduction: 'Denne siden inneholder resultatene av sorteringen %{reference}. Ved hjelp av denne sorteringen er %{target_items} antall resultater valgt tilfeldig og med en lik sannsynlighetsfordeling fra settet av forslag som blir vist nedenfor. Sammen med resultatene gir informasjonen som vises på denne siden all nødvendig informasjon for å maksimere garantier og for å reprodusere resultatene. Nøkkelen til kvaliteten på denne sorteringen er dobbelt tilfeldighet gitt ved rulling av terninger (bekreftet av vitner) og den nøyaktige tiden for sorteringen som gir input til en algoritme som genererer et tilfeldig utvalg. Tids-seedet for sorteringen er så nøyaktig (sekunder) at det er umulig å kontrollere av mennesker og gir dermed et dobbelt "ukontrollerbart" input for å garantere et rettferdig resultat. ' - mathematical_result: Resultat (1) x (2) - proposals_selected_by_sortition: Forslag valgt etter sortering - sortition_reproducibility_details: Detaljer for sorterings reproduksjonbarhet - time_seed: (2) Tids seed - witnesses: Tilbaketrukket - sortition: - random_seed: Tilfeldig seed - selected_proposals: - one: forslag valgt - other: forslag valgt - sortition_author: - deleted: Slettet deltaker - sortition_cancel_author: - deleted: Slettet deltaker - sortitions_count: - count: - one: 1 sortering - other: "%{count} sorteringer" - statistics: - sortitions_count: Sorteringer diff --git a/decidim-sortitions/config/locales/oc-FR.yml b/decidim-sortitions/config/locales/oc-FR.yml deleted file mode 100644 index 325b348894124..0000000000000 --- a/decidim-sortitions/config/locales/oc-FR.yml +++ /dev/null @@ -1 +0,0 @@ -oc: diff --git a/decidim-sortitions/config/locales/om-ET.yml b/decidim-sortitions/config/locales/om-ET.yml deleted file mode 100644 index 05e2e89c3a879..0000000000000 --- a/decidim-sortitions/config/locales/om-ET.yml +++ /dev/null @@ -1 +0,0 @@ -om: diff --git a/decidim-sortitions/config/locales/pl.yml b/decidim-sortitions/config/locales/pl.yml deleted file mode 100644 index dad0ac6e8a001..0000000000000 --- a/decidim-sortitions/config/locales/pl.yml +++ /dev/null @@ -1,143 +0,0 @@ -pl: - activemodel: - attributes: - sortition: - additional_info: Informacje o wyborze losowym - decidim_proposals_component_id: Zestaw propozycji - dice: Wynik rzutu kostką. Rzuć kostką 6-ścienną lub poszukaj innego losowego sposobu na wygenerowanie liczby od 1 do 6, a następnie wprowadź liczbę, która była wynikiem losowania w obecności świadków. Daje to gwarancję jakości i bezstronności wyniku losowości - target_items: Liczba wniosków, które mają zostać wybrane (wskazuje liczbę propozycji, które mają zostać wybrane spośród wskazanych wcześniej propozycji) - title: Tytuł - witnesses: Świadkowie - models: - decidim/sortitions/create_sortition_event: Wybór losowy - activerecord: - models: - decidim/sortitions/sortition: - one: Wybór losowy - few: Wyborów losowych - many: Wybory losowe - other: Wybory losowe - decidim: - components: - sortitions: - actions: - comment: Skomentuj - name: Wybory losowe - settings: - global: - comments_enabled: Komentarze włączone - comments_max_length: Maksymalna długość komentarzy (Pozostaw 0 dla wartości domyślnej) - events: - sortitions: - sortition_created: - email_intro: Wybór losowy "%{resource_title}" został dodany do "%{participatory_space_title}", którą obserwujesz. - email_outro: Otrzymałeś to powiadomienie, ponieważ obserwujesz "%{participatory_space_title}". Możesz przestać ją obserwować po kliknięciu w poprzedni link. - email_subject: Dodano nowy wybór losowy do %{participatory_space_title} - notification_title: Wybór losowy %{resource_title} został dodany do %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Anuluj wybór losowy - edit: Edytuj - new_sortition: Nowy wybór przez losowanie - show: Szczegóły dotyczące wyboru losowego - models: - sortition: - fields: - created_at: Data utworzenia - decidim_proposals_component: Komponent propozycji - dice: Kostka do gry - reference: Odniesienie - request_timestamp: Czas losowania - seed: Ziarno - target_items: Elementy wyboru - title: Tytuł - sortitions: - confirm_destroy: - confirm_destroy: Czy na pewno chcesz anulować ten wybór losowy? - destroy: Anuluj wybór losowy - title: Anulowanie wyboru losowego - create: - error: Wystąpił błąd podczas tworzenia nowego wyboru losowego. - success: Wybór losowy został utworzony. - destroy: - error: Nie można anulować wyboru przez losowanie. - success: Wybór losowy został anulowany. - edit: - title: Zaktualizuj informacje o wyborze losowym - update: Aktualizuj - form: - select_proposal_component: Wybierz zestaw propozycji - index: - title: Wybór losowy - new: - confirm: Naciśnięcie przycisku dalej sprawi, że platforma zapisze datę i godzinę (z dokładnością do sekund) wraz z wynikiem rzutu kostką. Informacje te zostaną wykorzystane do dokonania losowego wyboru. Nie można cofnąć tej operacji; po kliknięciu przycisku wynik losowania zostanie opublikowany wraz z danymi wpisanymi w formularzu i nie będzie można modyfikować jego treści. Prosimy o uważne sprawdzenie jego treści. - create: Utwórz - title: Nowy wybór losowy - show: - selected_proposals: Propozycje wskazane do losowania - update: - error: Wystąpił błąd podczas aktualizacji wyboru losowego. - success: Wybór losowy został zaktualizowany. - admin_log: - sortition: - create: "%{user_name} utworzył(a) wybór losowy %{resource_name} w %{space_name}" - delete: "%{user_name} anulował(a) wybór losowy %{resource_name} w %{space_name}" - update: "%{user_name} zaktualizował(a) wybór losowy %{resource_name} w %{space_name}" - sortitions: - count: - proposals_count: - one: 1 propozycja - few: "%{count} propozycji" - many: "%{count} propozycji" - other: "%{count} propozycji" - filters: - active: Aktualne - all: Wszystko - cancelled: Anulowane - category: Kategoria - state: Status - index: - empty: Nie ma jeszcze żadnych wyborów przez losowanie. - linked_sortitions: - selected_proposals: Wybrane propozycje - orders: - label: 'Sortuj według:' - random: Losowo - recent: Najnowsze - results_count: - count: - one: wybrana propozycja - few: wybrane propozycje - many: wybranych propozycji - other: wybranych propozycji - show: - algorithm: Kod algorytmu wyboru losowego - cancelled: Anulowane wybory losowe - candidate_proposal_ids: Kolejność i identyfikatory propozycji wyboru losowego - dice_result: (1) Wynik rzutu kością - introduction: 'Ta strona zawiera %{reference} wyniki wyboru losowego. Za pomocą tego losowania wybrano %{target_items} wyników w sposób losowy i z równym prawdopodobieństwem spośród propozycji przedstawionych poniżej. Wraz z wynikami, informacje wyświetlane na tej stronie stanowią zestaw kompletnych informacji wymagane do zmaksymalizowania gwarancji losowości i możliwości odtworzenia wyników. Kluczem do jakości tego wyboru losowego jest podwójna losowość zapewniona przez rzut kością (zweryfikowany przez świadków) i dokładny czas utworzenia wyboru losowego, który zapewnia dane wejściowe dla algorytmu generującego losowy selekcję. Ziarno czasu wyboru losowego jest tak dokładne (sekundy), że jego wygenerowanie nie podlega kontroli człowieka, zapewniając w ten sposób podwójne "niekontrolowane" dane wejściowe w celu zagwarantowania sprawiedliwego wyniku. ' - mathematical_result: Wynik (1) x (2) - proposals_selected_by_sortition: Propozycje wybrane w ramach wyboru losowego - sortition_reproducibility_details: Szczegóły odtwarzalności wyboru losowego - time_seed: (2) Ziarno czasu - witnesses: Świadkowie - sortition: - random_seed: Losowe ziarno - selected_proposals: - one: wybrana propozycja - few: wybrane propozycje - many: wybranych propozycji - other: wybranych propozycji - sortition_author: - deleted: Usunięty użytkownik - sortition_cancel_author: - deleted: Usunięty użytkownik - sortitions_count: - count: - one: 1 wybór losowy - few: "%{count} wyborów losowych" - many: "%{count} wybory losowe" - other: "%{count} wybory losowe" - statistics: - sortitions_count: Wybory przez losowanie diff --git a/decidim-sortitions/config/locales/pt-BR.yml b/decidim-sortitions/config/locales/pt-BR.yml deleted file mode 100644 index 08a14ece60484..0000000000000 --- a/decidim-sortitions/config/locales/pt-BR.yml +++ /dev/null @@ -1,133 +0,0 @@ -pt-BR: - activemodel: - attributes: - sortition: - additional_info: Informação de classificação - decidim_proposals_component_id: Conjunto de propostas - dice: Resultado do rolo de matriz Role um dado de 6 lados, ou procure outro modo aleatório de gerar um número de 1 a 6, e insira aqui o número resultante na frente de algumas testemunhas. Isto contribui para a qualidade e garantias da aleatoriedade do resultado - target_items: Número de propostas a serem selecionadas (indica o número de propostas que você deseja selecionar sorteando o grupo de propostas que você escolheu anteriormente) - title: Título - witnesses: Testemunhas - models: - decidim/sortitions/create_sortition_event: Classificação - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteio - other: Sorteios - decidim: - components: - sortitions: - actions: - comment: Comentário - name: Sorteios - settings: - global: - comments_enabled: Comentários ativados - comments_max_length: Tamanho máximo de comentários (deixe 0 para o valor padrão) - events: - sortitions: - sortition_created: - email_intro: A classificação "%{resource_title}" foi adicionada a "%{participatory_space_title}" que você está seguindo. - email_outro: Você recebeu esta notificação porque está seguindo "%{participatory_space_title}". Você pode deixar de segui-lo no link anterior. - email_subject: Nova classificação adicionada a %{participatory_space_title} - notification_title: A classificação %{resource_title} foi adicionada a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancelar a classificação - edit: Editar - new_sortition: Novo Sorteio - show: Detalhes da classificação - models: - sortition: - fields: - created_at: Data de criação - decidim_proposals_component: Componente de propostas - dice: Dados - reference: Referência - request_timestamp: Tempo de sorteio - seed: Semente - target_items: Itens para selecionar - title: Título - sortitions: - confirm_destroy: - confirm_destroy: Deseja mesmo cancelar este sorteio? - destroy: Cancelar ordenação - title: Cancelamento da classificação - create: - error: Ocorreu um erro ao criar uma nova classificação. - success: Sorteio criado com sucesso. - destroy: - error: Não é possível cancelar o sorteio. - success: Sorteio cancelado com sucesso. - edit: - title: Atualizar as informações sobre a classificação - update: Atualizar - form: - select_proposal_component: Selecione o conjunto de propostas - index: - title: Sorteios - new: - confirm: Pressionando o botão de seguinte, a plataforma registrará a data e a hora (com precisão de segundos) e junto com os dados rolados, esta informação será usada para gerar uma seleção aleatória. A ação será irreversível, uma vez que o botão for clicado o resultado desse sorteio será publicado, juntamente com os dados inseridos neste formulário e não podem ser modificados, por favor, verifique o conteúdo com cuidado. - create: Criar - title: Nova classificação - show: - selected_proposals: Propostas selecionadas para sorteio - update: - error: Houve um erro ao atualizar a classificação. - success: Sorteio atualizado com sucesso. - admin_log: - sortition: - create: "%{user_name} criou a classificação %{resource_name} em %{space_name}" - delete: "%{user_name} cancelou a classificação %{resource_name} em %{space_name}" - update: "%{user_name} atualizou a classificação %{resource_name} em %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} propostas" - filters: - active: Ativo - all: Todos - cancelled: Cancelado - category: Categoria - state: Estado - index: - empty: Ainda não há sorteios ainda. - linked_sortitions: - selected_proposals: Propostas selecionadas - orders: - label: 'Ordenar ordenações por:' - random: Aleatório - recent: Recente - results_count: - count: - one: proposta selecionada - other: propostas selecionadas - show: - algorithm: Código de Algoritmo da Classificação - cancelled: Sortição cancelada - candidate_proposal_ids: Ordem de propostas de classificação e IDs - dice_result: (1) resultado dado - introduction: 'Esta página contém os resultados da ordenação %{reference}. Por meio dessa classificação, %{target_items} número de resultados foram selecionados aleatoriamente e com uma distribuição de probabilidade igual ao conjunto de propostas exibidas abaixo. Juntamente com os resultados, as informações exibidas nesta página fornecem todas as informações necessárias para maximizar as garantias e reproduzir os resultados. A chave para a qualidade dessa classificação é a dupla aleatoriedade fornecida pela rolagem de dados (verificada por testemunhas) e o tempo preciso da classificação que fornece dados para um algoritmo que gera uma seleção aleatória. A semente do tempo para a classificação é tão precisa (segundos) que é impossível controlar pelos humanos, fornecendo assim uma entrada dupla "incontrolável" para garantir um resultado justo. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propostas selecionadas por classificação - sortition_reproducibility_details: Detalhes de reprodutibilidade de ordenação - time_seed: (2) semente do tempo - witnesses: Testemunhas - sortition: - random_seed: Semente aleatória - selected_proposals: - one: 1 proposta selecionada - other: '%{count} propostas selecionadas' - sortition_author: - deleted: Usuário excluído - sortition_cancel_author: - deleted: Usuário excluído - sortitions_count: - count: - one: 1 ordenação - other: "%{count} ordenações" - statistics: - sortitions_count: Sorteios diff --git a/decidim-sortitions/config/locales/pt.yml b/decidim-sortitions/config/locales/pt.yml deleted file mode 100644 index 7753d692afe48..0000000000000 --- a/decidim-sortitions/config/locales/pt.yml +++ /dev/null @@ -1,124 +0,0 @@ -pt: - activemodel: - attributes: - sortition: - additional_info: Informação de sorteio - decidim_proposals_component_id: Conjunto de propostas - dice: Resultado do jogo de dados. Lance um dado de 6 lados, ou procure outro modo aleatório de gerar um número de 1 a 6, e insira aqui o número resultante, em frente a algumas testemunhas. Isto contribui para a qualidade e garantias da aleatoriedade do resultado - target_items: Número de propostas a serem selecionadas (indica o número de propostas que pretende selecionar sorteando o grupo de propostas que escolheu anteriormente) - title: Título - witnesses: Testemunhas - models: - decidim/sortitions/create_sortition_event: Sorteio - activerecord: - models: - decidim/sortitions/sortition: - one: Sorteio - other: Sorteios - decidim: - components: - sortitions: - actions: - comment: Comentários - name: Sorteios - settings: - global: - comments_enabled: Comentários ativados - comments_max_length: Comprimento máximo dos comentários (Deixar 0 para o valor predefinido) - events: - sortitions: - sortition_created: - email_intro: A classificação "%{resource_title}" foi adicionada a "%{participatory_space_title}" que você segue. - email_outro: Recebeu esta notificação porque segue "%{participatory_space_title}". Pode deixar de segui-lo a partir da hiperligação anterior. - email_subject: Novo sorteio adicionado a %{participatory_space_title} - notification_title: A classificação %{resource_title} foi adicionada a %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Cancelar o sorteio - edit: Editar - show: Detalhes do sorteio - models: - sortition: - fields: - created_at: Data de criação - decidim_proposals_component: Componente de propostas - dice: Dados - reference: Referência - request_timestamp: Data do sorteio - seed: Semente - target_items: Itens para selecionar - title: Título - sortitions: - confirm_destroy: - confirm_destroy: Tem a certeza de que pretende cancelar este sorteio? - destroy: Cancelar sorteio - title: Cancelamento do sorteio - create: - error: Ocorreu um problema ao criar um novo sorteio. - edit: - title: Atualizar as informações sobre o sorteio - update: Atualizar - form: - select_proposal_component: Selecionar o conjunto de propostas - index: - title: Sorteios - new: - create: Criar - title: Novo sorteio - show: - selected_proposals: Propostas selecionadas para sorteio - update: - error: Ocorreu um problema ao atualizar o sorteio. - admin_log: - sortition: - create: "%{user_name} criou o sorteio %{resource_name} em %{space_name}" - delete: "%{user_name} cancelou o sorteio %{resource_name} em %{space_name}" - update: "%{user_name} atualizou o sorteio %{resource_name} em %{space_name}" - sortitions: - count: - proposals_count: - one: 1 proposta - other: "%{count} propostas" - filters: - active: Ativo - all: Todos - cancelled: Cancelado - category: Categoria - state: Estado - linked_sortitions: - selected_proposals: Propostas selecionadas - orders: - label: 'Ordenar sorteios por:' - random: Aleatória - recent: Recente - results_count: - count: - one: proposta selecionada - other: propostas selecionadas - show: - algorithm: Código de algoritmo do sorteio - cancelled: Sorteio cancelado - candidate_proposal_ids: IDs e ordem dos sorteios de propostas - dice_result: (1) resultado dos dados - introduction: 'Esta página contém os resultados da ordenação %{reference}. Por meio dessa classificação, %{target_items} número de resultados foram selecionados aleatoriamente e com uma distribuição de probabilidade igual ao conjunto de propostas exibidas abaixo. Juntamente com os resultados, as informações exibidas nesta página fornecem todas as informações necessárias para maximizar as garantias e reproduzir os resultados. A chave para a qualidade dessa classificação é a dupla aleatoriedade fornecida pela rolagem de dados (verificada por testemunhas) e o tempo preciso da classificação que fornece dados para um algoritmo que gera uma seleção aleatória. A semente do tempo para a classificação é tão precisa (segundos) que é impossível controlar pelos humanos, fornecendo assim uma entrada dupla "incontrolável" para garantir um resultado justo. ' - mathematical_result: Resultado (1) x (2) - proposals_selected_by_sortition: Propostas selecionadas por sorteio - sortition_reproducibility_details: Detalhes da reprodutibilidade do sorteio - time_seed: (2) Semente do tempo - witnesses: Testemunhas - sortition: - random_seed: Semente aleatória - selected_proposals: - one: proposta selecionada - other: propostas selecionadas - sortition_author: - deleted: Participante eliminado - sortition_cancel_author: - deleted: Participante eliminado - sortitions_count: - count: - one: 1 sorteio - other: "%{count} sorteios" - statistics: - sortitions_count: Sorteios diff --git a/decidim-sortitions/config/locales/ro-RO.yml b/decidim-sortitions/config/locales/ro-RO.yml deleted file mode 100644 index 06aa972a115bf..0000000000000 --- a/decidim-sortitions/config/locales/ro-RO.yml +++ /dev/null @@ -1,146 +0,0 @@ -ro: - activemodel: - attributes: - sortition: - additional_info: Informații privind tragerea la sorți - decidim_proposals_component_id: Set de propuneri - dice: Rezultat pe baza aruncării cu zarul. Folosește un zar cu 6 fețe sau caută o altă modalitate aleatorie de a genera un număr de la 1 la 6 și introdu aici numărul rezultat în fața unor martori. Acest lucru contribuie la calitatea și garanția unui rezultat aleatoriu - target_items: Numărul de propuneri de selectat (indică numărul de propuneri pe care dorești să fie selectat prin tragere la sorți a grupului de propuneri pe care le-ai ales anterior) - title: Titlu - witnesses: Martori - models: - decidim/sortitions/create_sortition_event: Tragere la sorți - activerecord: - models: - decidim/sortitions/sortition: - one: Tragere la sorți - few: Trageri la sorți - other: Trageri la sorți - decidim: - components: - sortitions: - actions: - comment: Comentează - name: Trageri la sorți - settings: - global: - clear_all: Ștergeți toate - comments_enabled: Comentarii activate - comments_max_length: Lungimea maximă a comentariilor (Lasă 0 pentru valoarea implicită) - define_taxonomy_filters: Vă rugăm să definiți niște filtre pentru acest spațiu participativ înainte de a utiliza această setare. - no_taxonomy_filters_found: Nici un filtru de taxonomie găsit. - taxonomy_filters: Selectați filtrele pentru componentă - taxonomy_filters_add: Adaugați filtru - events: - sortitions: - sortition_created: - email_intro: Tragerea la sorți "%{resource_title}" a fost adăugată la "%{participatory_space_title}”, spațiu pe care îl urmărești. - email_outro: Ai primit această notificare deoarece urmărești „%{participatory_space_title}”. Poți anula abonarea de la link-ul anterior. - email_subject: O nouă tragere la sorți a fost adăugată la %{participatory_space_title} - notification_title: Tragerea la sorți %{resource_title} a fost adăugată la %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Anulează tragerea la sorți - edit: Editează - show: Detalii privind tragerea la sorți - title: Acțiuni - models: - sortition: - fields: - created_at: Data creării - decidim_proposals_component: Componenta propuneri - dice: Zar - reference: Referință - request_timestamp: Ora tragerii la sorți - seed: Valoare aleatorie - target_items: Articole de selectat - taxonomies: Taxonomii - title: Titlu - sortitions: - confirm_destroy: - confirm_destroy: Sigur dorești să anulezi această tragere la sorți? - destroy: Anulează tragerea la sorți - title: Anularea tragerii la sorți - create: - error: A apărut o problemă la crearea unei noi trageri la sorți. - success: Tragerea la sorți a fost creată cu succes. - destroy: - error: Nu se poate anula tragerea la sorți. - success: Tragerea la sorți a fost anulată cu succes. - edit: - title: Actualizează informațiile despre tragerea la sorți - update: Actualizează - form: - all_taxonomies: Toate taxonomiile - select_proposal_component: Selectează setul de propuneri - select_taxonomies: Taxonomii ale setului de propuneri în care doriți să aplicați extragerea. Lăsați gol pentru a aplica tragerea la toate propunerile privind taxonomia respectivă. - index: - title: Trageri la sorți - new: - create: Creează - title: Tragere la sorți nouă - show: - selected_proposals: Propuneri selectate pentru tragerea la sorți - update: - error: A apărut o eroare la actualizarea tragerii la sorți. - success: Tragerea la sorți a fost actualizată cu succes. - admin_log: - sortition: - create: "%{user_name} a creat tragerea la sorți %{resource_name} în %{space_name}" - delete: "%{user_name} a anulat tragerea la sorți %{resource_name} în %{space_name}" - update: "%{user_name} a actualizat tragerea la sorți %{resource_name} în %{space_name}" - sortitions: - count: - proposals_count: - one: 1 propunere - few: "%{count} propuneri" - other: "%{count} propuneri" - filters: - active: Active - all: Toate - cancelled: Anulate - category: Categorie - state: Stadiu - linked_sortitions: - selected_proposals: Propuneri selectate - orders: - label: 'Ordonează tragerile la sorți după:' - random: Aleator - recent: Recente - results_count: - count: - one: propunere selectată - few: propuneri selectate - other: propuneri selectate - show: - algorithm: Codul algoritmului tragerii la sorți - any_taxonomy: din toate taxonomiile - cancelled: Tragere la sorți anulată - candidate_proposal_ids: Ordinea și ID-ul propunerilor din tragerea la sorți - dice_result: (1) Rezultatul aruncării zarului - introduction: 'Această pagină conține rezultatele tragerii la sorți %{reference}. Prin intermediul acestei trageri la sorți, un număr de %{target_items} rezultate au fost selectate în mod aleatoriu și cu o distribuție egală a probabilității, din setul de propuneri afișate mai jos. Împreună cu rezultatele, informațiile afișate pe această pagină oferă toate informațiile necesare pentru o garanție maximă și pentru a reproduce rezultatele. Cheia pentru calitatea acestei trageri la sorți este caracterul aleatoriu dublu asigurat de aruncarea zarului (verificată de martori) și de ora exactă a tragerii la sorți, care oferă input pentru un algoritm care generează o selecție aleatorie. Valoarea inițială a timpului pentru tragerea la sorți este atât de precisă (secunde) încât este imposibil de controlat de către om, asigurându-se astfel un dublu input „incontrolabil” pentru a se garanta un rezultat echitabil. ' - mathematical_result: Rezultatul (1) x (2) - proposals_selected_by_sortition: Propuneri selectate prin tragere la sorți - sortition_reproducibility_details: Detalii privind replicarea tragerii la sorți - taxonomies: din %{taxonomies} taxonomii - time_seed: (2) Data și ora - witnesses: Martori - sortition: - random_seed: Valoare inițială aleatorie - selected_proposals: - one: propunere selectată - few: propuneri selectate - other: propuneri selectate - sortition_author: - deleted: Participant șters - sortition_cancel_author: - deleted: Participant șters - sortitions_count: - count: - one: 1 tragere la sorți - few: "%{count} trageri la sorți" - other: "%{count} trageri la sorți" - statistics: - sortitions_count: Trageri la sorți - sortitions_count_tooltip: Numărul de selecții aleatorii efectuate pentru luarea deciziilor. diff --git a/decidim-sortitions/config/locales/ru.yml b/decidim-sortitions/config/locales/ru.yml deleted file mode 100644 index 1b0eba6ad4c00..0000000000000 --- a/decidim-sortitions/config/locales/ru.yml +++ /dev/null @@ -1,129 +0,0 @@ -ru: - activemodel: - attributes: - sortition: - additional_info: Сведения о жеребьевке - decidim_proposals_component_id: Набор предложений - dice: Результат броска кубика. В присутствии свидетелей бросьте шестигранный кубик, или найдите еще какой-нибудь способ получить случайное число от 1 до 6, и введите его здесь. Это способствует качеству и гарантирует случайность результата - target_items: Количество предложений, которые нужно выбрать (указывает количество предложений, которые вы хотите выбрать жеребьевкой из набора предложений, который вы отобрали до этого) - title: Название - witnesses: Свидетели - models: - decidim/sortitions/create_sortition_event: Жеребьевка - activerecord: - models: - decidim/sortitions/sortition: - one: Жеребьевка - few: Жеребьевки - many: Жеребьевок - other: Жеребьевок - decidim: - components: - sortitions: - name: Жеребьевки - settings: - global: - comments_enabled: Комментарии включены - events: - sortitions: - sortition_created: - email_intro: В "%{participatory_space_title}", за которым вы следите, добавлена жеребьевка "%{resource_title}". - email_outro: Вы получили это уведомление, потому что вы следите за «%{participatory_space_title}». Вы можете перестать за ним следить, перейдя по приведенной выше ссылке. - email_subject: В %{participatory_space_title} добавлена новая жеребьевка - notification_title: В %{participatory_space_title} была добавлена жеребьевка %{resource_title} - sortitions: - admin: - actions: - destroy: Отменить жеребьевку - edit: Редактировать - show: Подробности жеребьевки - models: - sortition: - fields: - created_at: Дата создания - decidim_proposals_component: Составляющая предложений - dice: Игральный кубик - reference: Ссылка на источник - request_timestamp: Время жеребьевки - seed: Начальное число - target_items: Элементы для выбора - title: Название - sortitions: - confirm_destroy: - confirm_destroy: Вы действительно хотите отменить эту жеребьевку? - destroy: Отменить жеребьевку - title: Отмена жеребьевки - create: - error: При попытке создать новую жеребьевку произошла ошибка. - edit: - title: Обновить сведения о жеребьевке - update: Обновить - form: - select_proposal_component: Выберите набор предложений - index: - title: Жеребьевки - new: - create: Создать - title: Добавить жеребьевку - show: - selected_proposals: Предложения, выбранные для жеребьевки - update: - error: При попытке обновить эту жеребьевку произошла ошибка. - admin_log: - sortition: - create: "%{user_name} создал жеребьевку %{resource_name} в %{space_name}" - delete: "%{user_name} отменил жеребьевку %{resource_name} в %{space_name}" - update: "%{user_name} обновил жеребьевку %{resource_name} в %{space_name}" - sortitions: - count: - proposals_count: - one: 1 предложение - few: "%{count} предложения" - many: "%{count} предложений" - other: "%{count} предложений" - filters: - active: Действующие - all: Все - cancelled: Отмененные - category: Категория - state: Cостояние - linked_sortitions: - selected_proposals: Выбранные предложения - orders: - label: 'Упорядочить жеребьевки по:' - random: Произвольно - recent: Недавние - results_count: - count: - one: выбранное предложение - few: выбранных предложения - many: выбранных предложений - other: выбранных предложений - show: - algorithm: Код алгоритма жеребьевки - cancelled: Отмененная жеребьевка - candidate_proposal_ids: Порядок и названия предложений для жеребьевки - dice_result: (1) Результат броска кубика - introduction: 'На этой странице показан итог жеребьевки %{reference}. С помощью этой жеребьевки было выбрано случайным образом %{target_items} предложений с равным распределением вероятности из числа предложений, перечисленных ниже. Вместе с итогом, сведения, которые отражены на этой странице, содержат все, что необходимо для наибольших гарантий и для воспроизведения итога. Ключ к качеству этой жеребьевки - это двойная случайность, обеспеченная путем бросания игрального кубика (проверенного свидетелями) и точного времени жеребьевки, введенного в алгоритм, который производит случайную подборку. Задействованное в качестве начального числа жеребьевки время настолько точно (секунды), что люди его не способны контролировать. Таким образом благодаря двойному "неконтролируемому" введениюу данных обеспечивается справедливый итог. ' - mathematical_result: Произведение (1) x (2) - proposals_selected_by_sortition: Предложения, отобранные жеребьевкой - sortition_reproducibility_details: Сведения о воспроизводимости жеребьевки - time_seed: (2) Время как начальное число - witnesses: Свидетели - sortition: - random_seed: Случайное начальное число - selected_proposals: - one: предложение выбрано - few: предложения выбрано - many: предложений выбрано - other: предложений выбрано - sortition_author: - deleted: Удаленный участник - sortition_cancel_author: - deleted: Удаленный участник - sortitions_count: - count: - one: 1 жеребьевка - few: "%{count} жеребьевки" - many: "%{count} жеребьевок" - other: "%{count} жеребьевок" diff --git a/decidim-sortitions/config/locales/si-LK.yml b/decidim-sortitions/config/locales/si-LK.yml deleted file mode 100644 index b0b50956edd26..0000000000000 --- a/decidim-sortitions/config/locales/si-LK.yml +++ /dev/null @@ -1 +0,0 @@ -si: diff --git a/decidim-sortitions/config/locales/sk-SK.yml b/decidim-sortitions/config/locales/sk-SK.yml deleted file mode 100644 index 48cd011d56e4e..0000000000000 --- a/decidim-sortitions/config/locales/sk-SK.yml +++ /dev/null @@ -1,164 +0,0 @@ -sk: - activemodel: - attributes: - sortition: - additional_info: Informácie o voľbe losovaním - decidim_category_id: Kategórie sady návrhov, v ktorých chcete použiť remízu - decidim_proposals_component_id: Návrhy sú nastavené - dice: Výsledok hodu kockou. Hoďte 6-strananou kockou alebo vyhľadajte iný náhodný spôsob, ako vygenerovať číslo od 1 do 6, a zadajte tu výsledné číslo pred niekoľkými svedkami. To prispieva ku kvalite a záruke náhodnosti výsledku. - target_items: Počet návrhov, ktoré majú byť vybrané (udáva počet návrhov, ktoré chcete vybrať zo skupiny návrhov, ktoré ste predtým vybrali) - title: Názov - witnesses: Svedkovia - models: - decidim/sortitions/create_sortition_event: Voľba losovaním - activerecord: - models: - decidim/sortitions/sortition: - one: Voľba losovaním - few: Voľby losovaním - many: Voľby losovaním - other: Voľby losovaním - decidim: - components: - sortitions: - name: Voľby losovaním - settings: - global: - comments_enabled: Komentáre povolené - events: - sortitions: - sortition_created: - email_intro: Vvoľba losovaním "%{resource_title}" bola pridaná ku "%{participatory_space_title}", ktorý sledujete. - email_outro: Toto oznámenie ste dostali, pretože sledujete "%{participatory_space_title}". Môžete ho odhlásiť od predchádzajúceho odkazu. - email_subject: Nová voľba losovaním bola pridaná ku %{participatory_space_title} - notification_title: Vvoľba losovaním %{resource_title} bola pridaná ku %{participatory_space_title} - pages: - home: - statistics: - sortitions_count: Voľby losovaním - participatory_processes: - statistics: - sortitions_count: Voľby losovaním - sortitions: - admin: - actions: - destroy: Zrušiť voľbu losovaním - edit: Upraviť - new: Nová voľba losovaním - show: Podrobnosti o voľbe losovaním - models: - sortition: - fields: - category: Kategória - created_at: Dátum vzniku - decidim_proposals_component: Súčasť návrhov - dice: Kocky - reference: Odkazy - request_timestamp: Doba kreslenie - seed: Semienko - target_items: Položky, ktoré chcete vybrať - title: Titul - name: - one: Voľba losovaním - few: Voľby losovaním - many: Voľby losovaním - other: Voľby losovaním - sortitions: - confirm_destroy: - confirm_destroy: Naozaj chcete túto voľbu zrušiť? - destroy: Zrušiť voľbu - title: Zrušenie voľby losovaním - create: - error: Pri vytváraní novej voľby došlo k chybe. - success: Voľba losovaním bola úspešne vytvorená - destroy: - error: Voľbu nemožno zrušiť. - success: Voľba bola úspešne zrušená - edit: - title: Aktualizujte informácie o voľbe losovaním - update: Aktualizácia - form: - all_categories: Všetky kategórie - select_proposal_component: Vyberte sadu návrhov - title: Nové návrhy na návrhy - index: - title: Voľby losovaním - new: - confirm: Stlačením ďalšieho tlačidla Decidim zaznamená dátum a čas (s presnosťou na sekundy) a spoločne s hodom kockami budú tieto informácie použité pre generovanie náhodného výberu. Akcia bude nevratná, po kliknutí na tlačidlo sa výsledky tejto kresby uverejní s údajmi uvedenými v tomto formulári a nemožno ich zmeniť, skontrolujte prosím pozorne obsah - create: Vytvoriť - title: Nové rozvrhnutie - show: - selected_proposals: Návrhy vybrané pre kreslenie - update: - error: Pri aktualizácii výberu došlo k chybe. - success: Sortifikace bola úspešne aktualizovaná - admin_log: - sortition: - create: "%{user_name} vytvoril %{resource_name} voľbu v priestore %{space_name}" - delete: "%{user_name} zrušil %{resource_name} voľbu v priestore %{space_name}" - update: "%{user_name} aktualizoval %{resource_name} voľbu v priestore %{space_name}" - sortitions: - count: - proposals_count: - one: 1 návrh - few: "%{count} návrhov" - many: "%{count} návrhov" - other: "%{count} návrhov" - filters: - active: Aktívne - all: Všetko - cancelled: Zrušil - category: Kategória - category_prompt: Vyberte kategóriu - search: Vyhľadávanie - state: Štát - filters_small_view: - close_modal: Zatvoriť modálne - filter: Filtrovať - filter_by: Filtrovať podľa - unfold: Rozbaliť - linked_sortitions: - selected_proposals: Vybrané návrhy - orders: - label: 'Objednať sortitions podľa:' - random: Náhodný - recent: Nedávno - results_count: - count: - one: vybraný návrh - few: vybrané návrhy - many: vybrané návrhy - other: vybrané návrhy - show: - algorithm: Kód algoritmu Sortition - any_category: zo všetkých kategórií - back: Späť na zoznam - cancelled: Zrušené výber - candidate_proposal_ids: žrebovacie volbaní objednávky a ID - candidate_proposals_info: 'Rozbor bol vykonaný medzi nasledujúcimi návrhmi (%{category_label}), s nasledujúcimi ID (označené tučne vybranými návrhy)' - category: z kategórie %{category} - dice_result: "(1) Výsledok hodu kockou" - introduction: 'Táto stránka obsahuje výsledky voľby losovaním %{referencie}. Prostredníctvom tohto výberu bolo vybratých %{target_items} výsledkov náhodne a s rovnakým rozložením pravdepodobnosti zo súboru návrhov zobrazených nižšie. Spolu s výsledkami informácie zobrazenými na tejto stránke poskytujú všetky informácie potrebné pre maximalizáciu záruk a reprodukciu výsledkov. Kľúčom ku kvalite tejto voľby je dvojitá náhodnosť, ktorú poskytuje hod kockou (overený svedkami) a presný čas výberu, ktorý poskytuje vstup pre algoritmus, ktorý generuje náhodný výber. Časový údaj pre voľbu je tak presný (sekundy), že nie je možné ovládať ho ľudsky, a tak poskytuje dvojitý, "nekontrolovateľný" vstup, ktorý zaručí spravodlivý výsledok. ' - mathematical_result: Výsledok (1) x (2) - proposals_selected_by_sortition: Návrhy vybrané výberom - sortition_reproducibility_details: Detaily reprodukcie voľby losovaním - time_seed: "(2) Časový údaj" - witnesses: Svedkovia - sortition: - random_seed: Náhodne generovaný prvok - selected_proposals: - one: vybraný návrh - few: vybraných návrhov - many: vybraných návrhov - other: vybraných návrhov - view: Pohľad - sortition_author: - deleted: Vymazaný užívateľ - sortition_cancel_author: - deleted: Vymazaný užívateľ - sortitions_count: - count: - one: 1 sortie - few: "%{count} sortitions" - many: "%{count} sortitions" - other: "%{count} sortitions" diff --git a/decidim-sortitions/config/locales/sk.yml b/decidim-sortitions/config/locales/sk.yml deleted file mode 100644 index e231a5d7a4752..0000000000000 --- a/decidim-sortitions/config/locales/sk.yml +++ /dev/null @@ -1,129 +0,0 @@ -sk: - activemodel: - attributes: - sortition: - additional_info: Informácie o voľbe losovaním - decidim_proposals_component_id: Návrhy sú nastavené - dice: Výsledok hodu kockou. Hoďte 6-strananou kockou alebo vyhľadajte iný náhodný spôsob, ako vygenerovať číslo od 1 do 6, a zadajte tu výsledné číslo pred niekoľkými svedkami. To prispieva ku kvalite a záruke náhodnosti výsledku. - target_items: Počet návrhov, ktoré majú byť vybrané (udáva počet návrhov, ktoré chcete vybrať zo skupiny návrhov, ktoré ste predtým vybrali) - title: Názov - witnesses: Svedkovia - models: - decidim/sortitions/create_sortition_event: Voľba losovaním - activerecord: - models: - decidim/sortitions/sortition: - one: Voľba losovaním - few: Voľby losovaním - many: Voľby losovaním - other: Voľby losovaním - decidim: - components: - sortitions: - name: Voľby losovaním - settings: - global: - comments_enabled: Komentáre povolené - events: - sortitions: - sortition_created: - email_intro: Vvoľba losovaním "%{resource_title}" bola pridaná ku "%{participatory_space_title}", ktorý sledujete. - email_outro: Toto oznámenie ste dostali, pretože sledujete "%{participatory_space_title}". Môžete ho odhlásiť od predchádzajúceho odkazu. - email_subject: Nová voľba losovaním bola pridaná ku %{participatory_space_title} - notification_title: Vvoľba losovaním %{resource_title} bola pridaná ku %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Zrušiť voľbu losovaním - edit: Upraviť - show: Podrobnosti o voľbe losovaním - models: - sortition: - fields: - created_at: Dátum vzniku - decidim_proposals_component: Súčasť návrhov - dice: Kocky - reference: Odkazy - request_timestamp: Doba kreslenie - seed: Semienko - target_items: Položky, ktoré chcete vybrať - title: Titul - sortitions: - confirm_destroy: - confirm_destroy: Naozaj chcete túto voľbu zrušiť? - destroy: Zrušiť voľbu - title: Zrušenie voľby losovaním - create: - error: Pri vytváraní novej voľby došlo k chybe. - edit: - title: Aktualizujte informácie o voľbe losovaním - update: Aktualizácia - form: - select_proposal_component: Vyberte sadu návrhov - index: - title: Voľby losovaním - new: - create: Vytvoriť - title: Nové rozvrhnutie - show: - selected_proposals: Návrhy vybrané pre kreslenie - update: - error: Pri aktualizácii výberu došlo k chybe. - admin_log: - sortition: - create: "%{user_name} vytvoril %{resource_name} voľbu v priestore %{space_name}" - delete: "%{user_name} zrušil %{resource_name} voľbu v priestore %{space_name}" - update: "%{user_name} aktualizoval %{resource_name} voľbu v priestore %{space_name}" - sortitions: - count: - proposals_count: - one: 1 návrh - few: "%{count} návrhov" - many: "%{count} návrhov" - other: "%{count} návrhov" - filters: - active: Aktívne - all: Všetko - cancelled: Zrušil - category: Kategória - state: Štát - linked_sortitions: - selected_proposals: Vybrané návrhy - orders: - label: 'Objednať sortitions podľa:' - random: Náhodný - recent: Nedávno - results_count: - count: - one: vybraný návrh - few: vybrané návrhy - many: vybrané návrhy - other: vybrané návrhy - show: - algorithm: Kód algoritmu Sortition - cancelled: Zrušené výber - candidate_proposal_ids: žrebovacie volbaní objednávky a ID - dice_result: (1) Výsledok hodu kockou - introduction: 'Táto stránka obsahuje výsledky voľby losovaním %{referencie}. Prostredníctvom tohto výberu bolo vybratých %{target_items} výsledkov náhodne a s rovnakým rozložením pravdepodobnosti zo súboru návrhov zobrazených nižšie. Spolu s výsledkami informácie zobrazenými na tejto stránke poskytujú všetky informácie potrebné pre maximalizáciu záruk a reprodukciu výsledkov. Kľúčom ku kvalite tejto voľby je dvojitá náhodnosť, ktorú poskytuje hod kockou (overený svedkami) a presný čas výberu, ktorý poskytuje vstup pre algoritmus, ktorý generuje náhodný výber. Časový údaj pre voľbu je tak presný (sekundy), že nie je možné ovládať ho ľudsky, a tak poskytuje dvojitý, "nekontrolovateľný" vstup, ktorý zaručí spravodlivý výsledok. ' - mathematical_result: Výsledok (1) x (2) - proposals_selected_by_sortition: Návrhy vybrané výberom - sortition_reproducibility_details: Detaily reprodukcie voľby losovaním - time_seed: (2) Časový údaj - witnesses: Svedkovia - sortition: - random_seed: Náhodne generovaný prvok - selected_proposals: - one: vybraný návrh - few: vybraných návrhov - many: vybraných návrhov - other: vybraných návrhov - sortition_author: - deleted: Vymazaný užívateľ - sortition_cancel_author: - deleted: Vymazaný užívateľ - sortitions_count: - count: - one: 1 sortie - few: "%{count} sortitions" - many: "%{count} sortitions" - other: "%{count} sortitions" diff --git a/decidim-sortitions/config/locales/sl.yml b/decidim-sortitions/config/locales/sl.yml deleted file mode 100644 index 34b3a4a594c92..0000000000000 --- a/decidim-sortitions/config/locales/sl.yml +++ /dev/null @@ -1,5 +0,0 @@ -sl: - activemodel: - attributes: - sortition: - title: Naziv diff --git a/decidim-sortitions/config/locales/so-SO.yml b/decidim-sortitions/config/locales/so-SO.yml deleted file mode 100644 index 11720879bac3d..0000000000000 --- a/decidim-sortitions/config/locales/so-SO.yml +++ /dev/null @@ -1 +0,0 @@ -so: diff --git a/decidim-sortitions/config/locales/sq-AL.yml b/decidim-sortitions/config/locales/sq-AL.yml deleted file mode 100644 index 44ddadc95a8f3..0000000000000 --- a/decidim-sortitions/config/locales/sq-AL.yml +++ /dev/null @@ -1 +0,0 @@ -sq: diff --git a/decidim-sortitions/config/locales/sr-CS.yml b/decidim-sortitions/config/locales/sr-CS.yml deleted file mode 100644 index 9e26af81914fc..0000000000000 --- a/decidim-sortitions/config/locales/sr-CS.yml +++ /dev/null @@ -1 +0,0 @@ -sr: diff --git a/decidim-sortitions/config/locales/sv.yml b/decidim-sortitions/config/locales/sv.yml deleted file mode 100644 index d8cb4c51d4430..0000000000000 --- a/decidim-sortitions/config/locales/sv.yml +++ /dev/null @@ -1,135 +0,0 @@ -sv: - activemodel: - attributes: - sortition: - additional_info: Information om lottningen - decidim_proposals_component_id: Förslagen - dice: Tärningskast. Slå en sexsidig tärning inför vittnen, eller använd ett annat sätt att slumpmässigt skapa ett tal från 1 till 6, och skriv in resultatet. Detta bidrar till kvalitén och garanterar resultatets slumpmässighet - target_items: Antal förslag som ska väljas (anger hur många förslag som ska väljas genom lottdragning från den utvalda gruppen av förslag) - title: Titel - witnesses: Vittnen - models: - decidim/sortitions/create_sortition_event: Lottning - activerecord: - models: - decidim/sortitions/sortition: - one: Lottning - other: Lottningar - decidim: - components: - sortitions: - actions: - comment: Kommentera - name: Lottningar - settings: - global: - comments_enabled: Aktivera kommentarer - comments_max_length: Maximal kommentarslängd (ange 0 för att använda standardvärdet) - events: - sortitions: - sortition_created: - email_intro: Tilldelningen "%{resource_title}" har lagts till i "%{participatory_space_title}" som du följer. - email_outro: Du har fått det här meddelandet eftersom du följer "%{participatory_space_title}". Du kan sluta att följa det via föregående länk. - email_subject: Ny tilldelning har lagts till i %{participatory_space_title} - notification_title: Tilldelningen %{resource_title} har lagts till i %{participatory_space_title} - sortitions: - admin: - actions: - destroy: Avbryt tilldelningen - edit: Redigera - new_sortition: Ny lottning - show: Detaljer om tilldelningen - title: Handlingar - models: - sortition: - fields: - created_at: Skapelsedatum - decidim_proposals_component: Förslagskomponent - dice: Tärningar - reference: Referens - request_timestamp: Lottningstid - seed: Frö - target_items: Objekt att välja - title: Titel - sortitions: - confirm_destroy: - confirm_destroy: Vill du avbryta tilldelningen? - destroy: Avbryt tilldelningen - title: Avbryta tilldelningen - create: - error: Det gick inte att skapa en ny tilldelning. - success: Lottningen har skapats. - destroy: - error: Det går inte att avbryta lottningen. - success: Lottningen har avbrutits. - edit: - title: Uppdatera informationen om tilldelningen - update: Uppdatera - form: - select_proposal_component: Välj förslagen som ska behandlas - index: - title: Lottningar - new: - confirm: När du trycker på knappen Nästa registrerar Decidim datum och tid (till och med sekunder) och tillsammans med tärningskastet används denna information för att generera ett slumpmässigt val. Åtgärden är oåterkallelig. När du har tryckt på knappen publiceras resultatet av dragningen tillsammans med de uppgifter som angetts i detta formulär och kan inte ändras. Gå igenom innehållet noggrant. - create: Skapa - title: Ny tilldelning - show: - selected_proposals: Förslag som valts för lottning - update: - error: Det gick inte att uppdatera tilldelningen. - success: Lottningen har uppdaterats. - admin_log: - sortition: - create: "%{user_name} skapade tilldelningen %{resource_name} i %{space_name}" - delete: "%{user_name} avbröt tilldelningen %{resource_name} i %{space_name}" - update: "%{user_name} uppdaterade tilldelningen %{resource_name} i %{space_name}" - sortitions: - count: - proposals_count: - one: 1 förslag - other: "%{count} förslag" - filters: - active: Pågående - all: Alla - cancelled: Avbrutna - category: Kategori - state: Status - index: - empty: Det finns inga lottningar än. - linked_sortitions: - selected_proposals: Utvalda förslag - orders: - label: 'Sortera tilldelningar efter:' - random: Slumpmässigt - recent: Senaste - results_count: - count: - one: Valt förslaget - other: Valda förslag - show: - algorithm: Tilldelningens algoritmkod - cancelled: Avbruten tilldelning - candidate_proposal_ids: Förslagens ordning och ID i tilldelningen - dice_result: Tärningsresultat - introduction: 'Den här sidan innehåller resultaten från tilldelningen %{reference}. Med hjälp av tilldelningen har %{target_items} resultat valts ut slumpmässigt och med lika stor sannolikhet från listan med förslag nedan. Tillsammans med resultaten, innehåller informationen på denna sida allt som krävs för att garantera och återskapa resultaten. Nyckeln till kvalitén på tilldelningen är den dubblerade slumpmässigheten från ett bevittnat tärningskast samt den exakta tiden för tilldelningen, som matas in i en algoritm som genererar det slumpmässiga urvalet. Tidsfröet för tilldelningen är så exakt (sekunder) att den är omöjlig att styras av människor, vilket ger en dubblerad "okontrollerad" indata, i syfte att att garantera ett rättvist resultat. ' - mathematical_result: Resultat (tärning x dragning) - proposals_selected_by_sortition: Förslag valda genom tilldelning - sortition_reproducibility_details: Detaljer för att reproducera lottningens resultat - time_seed: (2) Tidsfrö - witnesses: Vittnen - sortition: - random_seed: Slumpmässigt frö - selected_proposals: - one: 1 valt förslag - other: '%{count} utvalda förslag' - sortition_author: - deleted: Raderad deltagare - sortition_cancel_author: - deleted: Raderad deltagare - sortitions_count: - count: - one: 1 tilldelning - other: "%{count} tilldelningar" - statistics: - sortitions_count: Lottningar - sortitions_count_tooltip: Antalet slumpmässiga val som görs för beslutsfattandet. diff --git a/decidim-sortitions/config/locales/sw-KE.yml b/decidim-sortitions/config/locales/sw-KE.yml deleted file mode 100644 index 7bf73465b1380..0000000000000 --- a/decidim-sortitions/config/locales/sw-KE.yml +++ /dev/null @@ -1 +0,0 @@ -sw: diff --git a/decidim-sortitions/config/locales/th-TH.yml b/decidim-sortitions/config/locales/th-TH.yml deleted file mode 100644 index a4431912a8299..0000000000000 --- a/decidim-sortitions/config/locales/th-TH.yml +++ /dev/null @@ -1 +0,0 @@ -th: diff --git a/decidim-sortitions/config/locales/ti-ER.yml b/decidim-sortitions/config/locales/ti-ER.yml deleted file mode 100644 index 39bcd22920e44..0000000000000 --- a/decidim-sortitions/config/locales/ti-ER.yml +++ /dev/null @@ -1 +0,0 @@ -ti: diff --git a/decidim-sortitions/config/locales/tr-TR.yml b/decidim-sortitions/config/locales/tr-TR.yml deleted file mode 100644 index d047cbed91ccb..0000000000000 --- a/decidim-sortitions/config/locales/tr-TR.yml +++ /dev/null @@ -1,123 +0,0 @@ -tr: - activemodel: - attributes: - sortition: - additional_info: Sıralama bilgileri - decidim_proposals_component_id: Teklif seti - dice: Kalıp rulosunun sonucu. 6 kenarlı bir zarı yuvarlayın veya 1'den 6'ya kadar bir sayı oluşturmak için başka bir rastgele yol arayın ve sonuçta elde edilen sayıyı bazı tanıkların önüne girin. Bu, sonucun rasgeleliğinin kalitesine ve garantilerine katkıda bulunur - target_items: Seçilecek teklif sayısı (daha önce seçmiş olduğunuz teklif grubunun çoğunu çizerek, seçmek istediğiniz teklif sayısını gösterir) - title: Başlık - witnesses: Tanıklar - models: - decidim/sortitions/create_sortition_event: Sıralama - activerecord: - models: - decidim/sortitions/sortition: - one: Sıralama - other: Sıralama - decidim: - components: - sortitions: - name: Sıralama - settings: - global: - comments_enabled: Yorumlar etkin - comments_max_length: Maksimum yorum uzunluğu (Varsayılan değer için 0 bırakın) - events: - sortitions: - sortition_created: - email_intro: '"%{resource_title}" sıralaması takip ettiğiniz "%{participatory_space_title}" listesine eklendi.' - email_outro: Bu bildirimi, "%{participatory_space_title}" adlı kişiyi takip ettiğiniz için aldınız. Önceki bağlantıdan takibini bırakabilirsiniz. - email_subject: '%{participatory_space_title} alanına yeni sıralama eklendi' - notification_title: %{resource_title} sıralaması %{participatory_space_title} alanına eklendi - sortitions: - admin: - actions: - destroy: Sıralamayı iptal et - edit: Düzenle - new_sortition: Yeni Sıralama - show: Sıralama detayları - models: - sortition: - fields: - created_at: Oluşturulma tarihi - decidim_proposals_component: Teklifler bileşeni - dice: Zar - reference: Referans - request_timestamp: Beraberlik süresi - seed: Çekirdek - target_items: Seçilecek öğeler - title: Başlık - sortitions: - confirm_destroy: - confirm_destroy: Bu sıralamayı iptal etmek istediğinize emin misiniz? - destroy: Sıralamayı iptal et - title: Sıralamanın iptali - create: - error: Yeni bir sıralama oluştururken bir sorun oluştu. - edit: - title: Sıralama hakkındaki bilgileri güncelleyin - update: Güncelle - form: - select_proposal_component: Teklif kümesini seçin - index: - title: Sıralama - new: - create: Oluştur - title: Yeni sıralama - show: - selected_proposals: Çekiliş için seçilen teklifler - update: - error: Sıralama güncellenirken bir sorun oluştu. - admin_log: - sortition: - create: "%{user_name}, %{space_name} %{resource_name} sıralamayı yarattı" - delete: "%{user_name}, %{space_name} %{resource_name} sıralamayı iptal etti" - update: "%{user_name}, %{space_name} içindeki %{resource_name} sıralamasını güncelledi" - sortitions: - count: - proposals_count: - one: 1 teklif - other: "%{count} teklif" - filters: - active: Aktif - all: Tümü - cancelled: İptal edildi - category: Kategori - state: Statü - index: - empty: Henüz bir sıralama yok. - linked_sortitions: - selected_proposals: Seçili teklifler - orders: - label: 'Sıralama ölçütü:' - random: Rastgele - recent: En son - results_count: - count: - one: seçilen teklif - other: seçilen teklifler - show: - algorithm: Sıralamanın algoritma kodu - cancelled: İptal edilen sıralama - candidate_proposal_ids: Sıralama tekliflerinin sırası ve ID'si - dice_result: (1) Zar sonucu - introduction: 'Bu sayfa, %{reference} sıralamasının sonuçlarını içerir. Bu sıralama sayesinde, %{target_items} sonuç sayısı rasgele ve aşağıda gösterilen teklif kümesinden eşit olasılık dağılımıyla seçilmiştir. Sonuçlarla birlikte, bu sayfada görüntülenen bilgiler, garantileri en üst düzeye çıkarmak ve sonuçları yeniden üretmek için gereken tüm bilgileri sağlar. Bu sınıflandırmanın kalitesinin anahtarı, bir zarın yuvarlanmasıyla sağlanan (tanıklar tarafından doğrulanan) çift rastlantısallık ve rasgele bir seçim oluşturan bir algoritma için girdi sağlayan sıralamanın kesin zamanıdır. Ayırma için zaman-tohum o kadar doğrudur (saniye) ki, insanlar tarafından kontrol edilmesi imkansızdır, böylece adil bir sonucu garantilemek için çift "kontrol edilemez" bir girdi sağlar. ' - mathematical_result: Sonuç (1) x (2) - proposals_selected_by_sortition: Sıralamaya göre seçilen teklifler - sortition_reproducibility_details: Sıralama yeniden üretilebilirlik ayrıntıları - time_seed: (2) Zaman tohumu - witnesses: Tanıklar - sortition: - random_seed: Rastgele tohum - selected_proposals: - one: teklif seçildi - other: teklif seçildi - sortition_author: - deleted: Silinmiş katılımcı - sortition_cancel_author: - deleted: Silinmiş katılımcı - sortitions_count: - count: - one: 1 sıralama - other: "%{count} sıralama" diff --git a/decidim-sortitions/config/locales/uk.yml b/decidim-sortitions/config/locales/uk.yml deleted file mode 100644 index 32863b696edf0..0000000000000 --- a/decidim-sortitions/config/locales/uk.yml +++ /dev/null @@ -1,129 +0,0 @@ -uk: - activemodel: - attributes: - sortition: - additional_info: Жеребкування відомостей - decidim_proposals_component_id: Набір пропозицій - dice: Вислід жеребкування. У присутності свідків киньте шостигранну гральну кістку, або знайдіть якийсь інший спосіб одержати випадкове число від 1 до 6, і введіть тут. Це сприяє якості та гарантує випадковість висліду - target_items: Кількість пропозицій, що підлягають відбору (вказує кількість пропозицій, які потрібно обрати, кинувши жереб по тій сукупності пропозицій, яку ви обрали раніше) - title: Назва - witnesses: Свідки - models: - decidim/sortitions/create_sortition_event: Жеребкування - activerecord: - models: - decidim/sortitions/sortition: - one: Жеребкування - few: Жеребкування - many: Жеребкувань - other: Жеребкувань - decidim: - components: - sortitions: - name: Жеребкування - settings: - global: - comments_enabled: Коментарі увімкнено - events: - sortitions: - sortition_created: - email_intro: До "%{participatory_space_title}", за яким ви стежите, було додане жеребкування "%{resource_title}". - email_outro: Ви отримали це сповіщення, тому що ви стежите за "%{participatory_space_title}". Ви можете припинити стежити за ним, перейшовши за наведеним вище посиланням. - email_subject: До %{participatory_space_title} додано нове жеребкування - notification_title: До %{participatory_space_title} була додано жеребкування %{resource_title} - sortitions: - admin: - actions: - destroy: Скасувати жеребкування - edit: Редагувати - show: Подробиці жеребкування - models: - sortition: - fields: - created_at: Дата створення - decidim_proposals_component: Складова пропозицій - dice: Гральна кістка - reference: Посилання на джерело - request_timestamp: Час кидання жеребу - seed: Початкове число - target_items: Наймення до вибору - title: Назва - sortitions: - confirm_destroy: - confirm_destroy: Ви дійсно бажаєте скасувати це жеребкування? - destroy: Скасувати жеребкування - title: Скасування жеребкування - create: - error: При спробі створити нове жеребкування сталася помилка. - edit: - title: Оновити відомості про жеребкування - update: Оновити - form: - select_proposal_component: Оберіть набір пропозицій - index: - title: Жеребкування - new: - create: Створити - title: Додати жеребкування - show: - selected_proposals: Пропозиції, відібрані для жеребкування - update: - error: При спробі оновити жеребкування сталася помилка. - admin_log: - sortition: - create: "%{user_name} створив жеребкування %{resource_name} у %{space_name}" - delete: "%{user_name} скасував жеребкування %{resource_name} у %{space_name}" - update: "%{user_name} оновив жеребкування %{resource_name} у %{space_name}" - sortitions: - count: - proposals_count: - one: 1 пропозиція - few: "%{count} пропозиції" - many: "%{count} пропозицій" - other: "%{count} пропозицій" - filters: - active: Діючі - all: Усі - cancelled: Скасовані - category: Категорія - state: Стан - linked_sortitions: - selected_proposals: Вибрані пропозиції - orders: - label: 'Впорядкувати жеребкування за ознакою:' - random: Довільно - recent: Нещодавні - results_count: - count: - one: вибрана пропозиція - few: вибрані пропозиції - many: вибраних пропозицій - other: вибраних пропозицій - show: - algorithm: Код алгоритму жеребкування - cancelled: Скасоване жеребкування - candidate_proposal_ids: Порядок та назви жеребкованих пропозицій - dice_result: (1) Вислід кидання гральної кістки - introduction: 'На цій сторінці показані висліди жеребкування %{reference}. За допомогою цього жеребкування було обрано випадковим чином %{target_items} пропозицій з рівним розподілом імовірності з числа пропозицій, перелічених нижче. Разом з вислідами, відомості, які відображені на цій сторінці, містять все, що необхідно для щонайбільших гарантій та для відтворення вислідів. Ключ до якості цього жеребкування - це подвійна випадковість, забезпечена шляхом кидання гральної кістки (засвідченого свідками) і точного часу жеребкування, введеного до алгоритму, який виробляє випадкову добірку. Задіяний як початкове число час жеребкування настільки точний (секунди), що люди нездатні його контролювати. Таким чином завдяки подвійним "неконтрольованим" входовим даним забезпечується справедливий вислід. ' - mathematical_result: Добуток (1) x (2) - proposals_selected_by_sortition: Пропозиції, обрані киданням жеребу - sortition_reproducibility_details: Подробиці щодо відтворюваності жеребкування - time_seed: (2) Час як початкове число - witnesses: Свідки - sortition: - random_seed: Випадкове початкове число - selected_proposals: - one: обрана пропозиція - few: обрані пропозиції - many: обраних пропозицій - other: обраних пропозицій - sortition_author: - deleted: Видалений учасник - sortition_cancel_author: - deleted: Видалений учасник - sortitions_count: - count: - one: 1 жеребкування - few: "%{count} жеребкування" - many: "%{count} жеребкувань" - other: "%{count} жеребкувань" diff --git a/decidim-sortitions/config/locales/val-ES.yml b/decidim-sortitions/config/locales/val-ES.yml deleted file mode 100644 index fa70518d04b9b..0000000000000 --- a/decidim-sortitions/config/locales/val-ES.yml +++ /dev/null @@ -1 +0,0 @@ -val: diff --git a/decidim-sortitions/config/locales/vi-VN.yml b/decidim-sortitions/config/locales/vi-VN.yml deleted file mode 100644 index 326506f0b1a36..0000000000000 --- a/decidim-sortitions/config/locales/vi-VN.yml +++ /dev/null @@ -1 +0,0 @@ -vi: diff --git a/decidim-sortitions/config/locales/vi.yml b/decidim-sortitions/config/locales/vi.yml deleted file mode 100644 index 326506f0b1a36..0000000000000 --- a/decidim-sortitions/config/locales/vi.yml +++ /dev/null @@ -1 +0,0 @@ -vi: diff --git a/decidim-sortitions/config/locales/zh-CN.yml b/decidim-sortitions/config/locales/zh-CN.yml deleted file mode 100644 index bf8b2e6fd03e9..0000000000000 --- a/decidim-sortitions/config/locales/zh-CN.yml +++ /dev/null @@ -1,115 +0,0 @@ -zh-CN: - activemodel: - attributes: - sortition: - additional_info: 排序信息 - decidim_proposals_component_id: 提案集 - dice: 死亡登记的结果。 旋转一个6边的死亡或寻找另一个随机的方法生成一个从1到6之间的数字。 然后在这里当着一些证人的面输入由此产生的号码。 这有助于提高结果的质量并保证结果的随机性 - target_items: 要选择的建议数量 (表示您想要选择的建议的数量,您先前选择的建议群组) - title: 标题 - witnesses: 证人 - models: - decidim/sortitions/create_sortition_event: 排序方式 - activerecord: - models: - decidim/sortitions/sortition: - other: 联谊会 - decidim: - components: - sortitions: - name: 联谊会 - settings: - global: - comments_enabled: 评论已启用 - comments_max_length: 评论最大长度 (默认值留0) - events: - sortitions: - sortition_created: - email_intro: 对不起,%{resource_title}" 已添加到您关注的"%{participatory_space_title}"。 - email_outro: 您收到此通知是因为您正在关注 "%{participatory_space_title}"。您可以从上一个链接取消关注它。 - email_subject: 新的排序添加到 %{participatory_space_title} - notification_title: 吸附 %{resource_title} 已被添加到 %{participatory_space_title} - sortitions: - admin: - actions: - destroy: 取消排序方式 - edit: 编辑 - show: 排序详情 - models: - sortition: - fields: - created_at: 创建日期 - decidim_proposals_component: 二. 提议的构成部分 - dice: 爱好 - reference: 参考 - request_timestamp: 绘制时间 - seed: 种子 - target_items: 要选择的项目 - title: 标题 - sortitions: - confirm_destroy: - confirm_destroy: 您确定要取消这个分类吗? - destroy: 取消排序方式 - title: 取消吸附性 - create: - error: 出现了一个问题,造成了新的怨恨。 - edit: - title: 更新有关分类的信息 - update: 更新 - form: - select_proposal_component: 选择提案集 - index: - title: 联谊会 - new: - create: 创建 - title: 新的排序方式 - show: - selected_proposals: 选择绘图提案 - update: - error: 有一个问题是更新厌恶。 - admin_log: - sortition: - create: "%{user_name} 在 %{resource_name} 中创建了 %{space_name} 个排序。" - delete: "%{user_name} 取消了 %{resource_name} 在 %{space_name} 中的排序。" - update: "%{user_name} 更新了 %{resource_name} 个排序在 %{space_name}" - sortitions: - count: - proposals_count: - other: "%{count} 个提议" - filters: - active: 已启用 - all: 所有的 - cancelled: 已取消 - category: 类别 - state: 状态 - linked_sortitions: - selected_proposals: 选定的建议 - orders: - label: '排序方式:' - random: 随机播放 - recent: 最近的 - results_count: - count: - other: 选定的建议 - show: - algorithm: 排序算法 - cancelled: 取消排序方式 - candidate_proposal_ids: 排序建议订单和 ID - dice_result: (1) 致残结果 - introduction: '此页面包含排序 %{reference}的结果。 通过这种道歉, 已经随机选择了 %{target_items} 个结果,并且显示在下面的一组建议中同样的概率分布。 本页所显示的信息连同结果,提供了最大限度保证和复制结果所需的所有信息。 这种区分的质量的关键是由证人核实的法官滚动所提供的双倍随机性和为产生随机选择的算法提供输入的吸附确切时间。 难度的时间种子非常精确(秒),人类无法控制,因此提供了双个“无法控制的”输入以保证结果的公允。 ' - mathematical_result: 结果(1) x (2) - proposals_selected_by_sortition: 按排序选择的提议 - sortition_reproducibility_details: 排序详细信息 - time_seed: (2) 时间种子 - witnesses: 证人 - sortition: - random_seed: 随机种子 - selected_proposals: - other: 建议已选择 - sortition_author: - deleted: 删除参与者 - sortition_cancel_author: - deleted: 删除参与者 - sortitions_count: - count: - other: "%{count} 排序方式" diff --git a/decidim-sortitions/config/locales/zh-TW.yml b/decidim-sortitions/config/locales/zh-TW.yml deleted file mode 100644 index de4108f11eacf..0000000000000 --- a/decidim-sortitions/config/locales/zh-TW.yml +++ /dev/null @@ -1,125 +0,0 @@ -zh-TW: - activemodel: - attributes: - sortition: - additional_info: 隨機抽籤資訊 - decidim_proposals_component_id: 提案集合 - dice: 擲骰子的結果。擲一顆六面骰子,或尋找其他隨機產生1到6之間的數字的方法,然後在一些證人面前輸入結果的數字。這有助於確保結果的品質和隨機性的保證。 - target_items: 被選出提案的數量(表示您希望在您之前選擇的提案組中通過抽籤選出的提案數量) - title: 標題 - witnesses: 見證人 - models: - decidim/sortitions/create_sortition_event: 抽籤 - activerecord: - models: - decidim/sortitions/sortition: - other: 抽籤 - decidim: - components: - sortitions: - actions: - comment: 留言 - name: 抽籤 - settings: - global: - comments_enabled: 啟用評論功能 - comments_max_length: 評論字數最大長度(若要使用預設值請輸入0) - events: - sortitions: - sortition_created: - email_intro: 您正在關注的 "%{participatory_space_title}" 中新增了抽籤 "%{resource_title}" - email_outro: 您收到了此通知,是因為您正在關注 "%{participatory_space_title}"。您可以通過前面的鏈接取消關注它。 - email_subject: '%{participatory_space_title}" 中新增了一個新的抽籤。' - notification_title: '%{participatory_space_title}」中已新增了%{resource_title}的抽籤。' - sortitions: - admin: - actions: - destroy: 取消選民隨機抽籤 - edit: 編輯 - show: 抽籤詳細資料 - models: - sortition: - fields: - created_at: 創建日期 - decidim_proposals_component: 提案組成 - dice: 骰子 - reference: 參考 - request_timestamp: 抽籤時間 - seed: 種子碼 - target_items: 選擇項目 - title: 標題 - sortitions: - confirm_destroy: - confirm_destroy: 您確定要取消此選項嗎? - destroy: 取消抽籤 - title: 取消抽籤 - create: - error: 建立新抽籤時出現問題。 - success: 抽籤已成功建立。 - destroy: - error: 無法取消抽籤。 - success: 抽籤取消成功。 - edit: - title: 更新抽籤資訊 - update: 更新 - form: - select_proposal_component: 選擇提案集 - index: - title: 抽籤 - new: - confirm: 當您按下「下一步」按鈕時,平台將會記錄日期和時間(秒級精度),並與擲骰子結果一起使用以生成隨機選擇。此操作是不可逆轉的,一旦按下按鈕,抽籤結果將會與此表單中輸入的資料一起發佈,並且無法更改,請仔細檢查內容。 - create: 建立 - title: 新的抽籤 - show: - selected_proposals: 已選擇的提案以進行抽籤 - update: - error: 更新抽籤時發生問題。 - success: 抽籤成功更新. - admin_log: - sortition: - create: "%{user_name} 在 %{space_name} 中創建了 %{resource_name} 抽籤" - delete: "%{user_name} 在 %{space_name} 中取消了 %{resource_name} 抽籤" - update: "%{user_name} 在 %{space_name} 中更新了 %{resource_name} 抽籤" - sortitions: - count: - proposals_count: - other: "%{count} 個提案" - filters: - active: 啟用中 - all: 全部 - cancelled: 已取消 - category: 類別 - state: 狀態 - linked_sortitions: - selected_proposals: 選擇的提案 - orders: - label: '抽籤排序方式:' - random: 隨機 - recent: 最近 - results_count: - count: - other: 選擇的提案 - show: - algorithm: 抽籤排序算法 - cancelled: 取消的抽籤 - candidate_proposal_ids: 隨機抽籤提案的順序和 ID - dice_result: (1) 骰子結果 - introduction: '本頁面包含了抽籤 %{reference} 的結果。透過這個抽籤,從下面顯示的提案集合中隨機且以等機率隨機選出了 %{target_items} 個結果。除了顯示的結果外,此頁面的資訊提供了最大化保證並重現結果所需的所有資訊。此抽籤質量的關鍵在於雙重隨機性,一方面是由證人驗證的擲骰子結果,另一方面是精確的抽籤時間提供的算法輸入以產生隨機選擇。抽籤的時間種子如此精確(秒級),以至於人類無法控制,從而提供雙重「不可控制」輸入,以保證公平結果。 ' - mathematical_result: 結果 (1) x (2) - proposals_selected_by_sortition: 通過抽籤選中的提案 - sortition_reproducibility_details: 抽籤可重複性詳情 - time_seed: (2) 時間種子 - witnesses: 見證人 - sortition: - random_seed: 隨機種子 - selected_proposals: - other: 選中的提案 - sortition_author: - deleted: 已刪除的參與者 - sortition_cancel_author: - deleted: 已刪除的參與者 - sortitions_count: - count: - other: "%{count} 個抽籤" - statistics: - sortitions_count: 抽籤 diff --git a/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb deleted file mode 100644 index 19bfe2db8d705..0000000000000 --- a/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -class CreateDecidimModuleSortitionsSortitions < ActiveRecord::Migration[5.1] - def change - create_table :decidim_module_sortitions_sortitions do |t| - t.references :decidim_feature, index: { name: "index_sortitions__on_feature" } - - t.references :decidim_category, - foreign_key: true, - index: { name: "index_sortitions__on_category" } - - t.integer :decidim_proposals_feature_id, - index: { name: "index_sortitions__on_proposals_feature" } - - t.integer :dice, null: false - t.integer :target_items, null: false - t.timestamp :request_timestamp, null: false - t.jsonb :selected_proposals - - t.timestamps - end - end -end diff --git a/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb b/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb deleted file mode 100644 index a3b2ef7f7812c..0000000000000 --- a/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class AddWitnessesToSortitions < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :witnesses, :jsonb - end -end diff --git a/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb b/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb deleted file mode 100644 index 0aee60a72aa23..0000000000000 --- a/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class AddAdditionalInfoToSortitions < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :additional_info, :jsonb - end -end diff --git a/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb b/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb deleted file mode 100644 index ffc972f9fe03e..0000000000000 --- a/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class AddAuthorToSortitions < ActiveRecord::Migration[5.1] - def change - add_reference :decidim_module_sortitions_sortitions, :decidim_author, index: true - end -end diff --git a/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb b/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb deleted file mode 100644 index b29b2d4d41208..0000000000000 --- a/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -class AddReferenceToSortitions < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :reference, :string - change_column_null :decidim_module_sortitions_sortitions, :reference, false - end -end diff --git a/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb b/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb deleted file mode 100644 index 299fd504769ed..0000000000000 --- a/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class AddTitleToSortition < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :title, :jsonb - end -end diff --git a/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb b/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb deleted file mode 100644 index 8cbfc6316752c..0000000000000 --- a/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -class DropDecidimCategoryIdFromSortitions < ActiveRecord::Migration[5.1] - def up - remove_column :decidim_module_sortitions_sortitions, :decidim_category_id - end - - def down - add_reference :decidim_module_sortitions_sortitions, :decidim_category, - foreign_key: true, - index: { name: "index_sortitions__on_category" } - end -end diff --git a/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb b/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb deleted file mode 100644 index bccf74556c2a4..0000000000000 --- a/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class AddCancelDataToSortition < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :cancel_reason, :jsonb - add_column :decidim_module_sortitions_sortitions, :cancelled_on, :datetime - add_column :decidim_module_sortitions_sortitions, :cancelled_by_user_id, :integer, index: true - end -end diff --git a/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb b/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb deleted file mode 100644 index b5bf9cc595ca5..0000000000000 --- a/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class MakeSortitionReferenceNullable < ActiveRecord::Migration[5.1] - def change - change_column_null :decidim_module_sortitions_sortitions, :reference, true - end -end diff --git a/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb b/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb deleted file mode 100644 index fd0aaf9325262..0000000000000 --- a/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class AddCandidateProposalsToSortitions < ActiveRecord::Migration[5.1] - def change - add_column :decidim_module_sortitions_sortitions, :candidate_proposals, :jsonb - end -end diff --git a/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb b/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb deleted file mode 100644 index c7fa2e7681c89..0000000000000 --- a/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class RenameSortitionsTable < ActiveRecord::Migration[5.1] - def change - rename_table :decidim_module_sortitions_sortitions, :decidim_sortitions_sortitions - end -end diff --git a/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb b/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb deleted file mode 100644 index 2e04a85ac829a..0000000000000 --- a/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -class FixSortitionsFeature < ActiveRecord::Migration[5.1] - def up - rename_column :decidim_sortitions_sortitions, :decidim_feature_id, :decidim_component_id - end - - def down - rename_column :decidim_sortitions_sortitions, :decidim_component_id, :decidim_feature_id - end -end diff --git a/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb b/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb deleted file mode 100644 index b621e817d193b..0000000000000 --- a/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -class FixSortitionsProposalFeature < ActiveRecord::Migration[5.1] - def up - rename_column :decidim_sortitions_sortitions, :decidim_proposals_feature_id, :decidim_proposals_component_id - end - - def down - rename_column :decidim_sortitions_sortitions, :decidim_proposals_component_id, :decidim_proposals_feature_id - end -end diff --git a/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb b/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb deleted file mode 100644 index 927c2a20e2e07..0000000000000 --- a/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -class MakeSortitionsAuthorsPolymorphic < ActiveRecord::Migration[5.2] - class User < ApplicationRecord - self.table_name = :decidim_users - self.inheritance_column = nil # disable the default inheritance - - default_scope { where(type: "Decidim::User") } - end - - class Sortition < ApplicationRecord - include Decidim::HasComponent - - self.table_name = :decidim_sortitions_sortitions - end - - def change - add_column :decidim_sortitions_sortitions, :decidim_author_type, :string - - Sortition.find_each do |sortition| - author = User.find_by(id: sortition.decidim_author_id) if sortition.decidim_author_id.present? - author ||= sortition.organization - sortition.update!( - decidim_author_type: author.is_a?(User) ? author.type : "Decidim::Organization", - decidim_author_id: author.id - ) - end - - add_index :decidim_sortitions_sortitions, - [:decidim_author_id, :decidim_author_type], - name: "index_decidim_sortitions_sortitions_on_decidim_author" - change_column_null :decidim_sortitions_sortitions, :decidim_author_id, false - change_column_null :decidim_sortitions_sortitions, :decidim_author_type, false - end -end diff --git a/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb deleted file mode 100644 index dceeb5ba0c384..0000000000000 --- a/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class IndexForeignKeysInDecidimSortitionsSortitions < ActiveRecord::Migration[5.2] - def change - add_index :decidim_sortitions_sortitions, :cancelled_by_user_id - end -end diff --git a/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb b/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb deleted file mode 100644 index ca601d76a19d4..0000000000000 --- a/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class AddCommentableCounterCacheToSortitions < ActiveRecord::Migration[5.2] - def change - add_column :decidim_sortitions_sortitions, :comments_count, :integer, null: false, default: 0, index: true - Decidim::Sortitions::Sortition.reset_column_information - Decidim::Sortitions::Sortition.find_each(&:update_comments_count) - end -end diff --git a/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb deleted file mode 100644 index 575349c071f1c..0000000000000 --- a/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -class AddDeletedAtToDecidimSortitionsSortitions < ActiveRecord::Migration[7.0] - def change - add_column :decidim_sortitions_sortitions, :deleted_at, :datetime - add_index :decidim_sortitions_sortitions, :deleted_at - end -end diff --git a/decidim-sortitions/decidim-sortitions.gemspec b/decidim-sortitions/decidim-sortitions.gemspec deleted file mode 100644 index c2e128382a621..0000000000000 --- a/decidim-sortitions/decidim-sortitions.gemspec +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -$LOAD_PATH.push File.expand_path("lib", __dir__) - -require "decidim/sortitions/version" - -Gem::Specification.new do |s| - s.version = Decidim::Sortitions.version - s.authors = ["Juan Salvador Perez Garcia"] - s.email = ["jsperezg@gmail.com"] - s.license = "AGPL-3.0-or-later" - s.homepage = "https://decidim.org" - s.metadata = { - "bug_tracker_uri" => "https://github.com/decidim/decidim/issues", - "documentation_uri" => "https://docs.decidim.org/", - "funding_uri" => "https://opencollective.com/decidim", - "homepage_uri" => "https://decidim.org", - "source_code_uri" => "https://github.com/decidim/decidim" - } - s.required_ruby_version = "~> 3.3.0" - - s.name = "decidim-sortitions" - s.summary = "Decidim sortitions module" - s.description = "This module makes possible to select amount a set of proposal by sortition" - - s.files = Dir.chdir(__dir__) do - `git ls-files -z`.split("\x0").select do |f| - (File.expand_path(f) == __FILE__) || - f.start_with?(*%w(app/ config/ db/ lib/ Rakefile README.md)) - end - end - - s.add_dependency "decidim-admin", Decidim::Sortitions.version - s.add_dependency "decidim-comments", Decidim::Sortitions.version - s.add_dependency "decidim-core", Decidim::Sortitions.version - s.add_dependency "decidim-proposals", Decidim::Sortitions.version - - s.add_development_dependency "decidim-assemblies", Decidim::Sortitions.version - s.add_development_dependency "decidim-dev", Decidim::Sortitions.version - s.add_development_dependency "decidim-participatory_processes", Decidim::Sortitions.version -end diff --git a/decidim-sortitions/lib/decidim/api/sortition_type.rb b/decidim-sortitions/lib/decidim/api/sortition_type.rb deleted file mode 100644 index d6a8513a627bf..0000000000000 --- a/decidim-sortitions/lib/decidim/api/sortition_type.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class SortitionType < Decidim::Api::Types::BaseObject - implements Decidim::Core::AuthorableInterface - implements Decidim::Comments::CommentableInterface - implements Decidim::Core::TaxonomizableInterface - implements Decidim::Core::TimestampsInterface - implements Decidim::Core::ReferableInterface - - description "A sortition" - - field :additional_info, Decidim::Core::TranslatedFieldType, "The additional info for this sortition", null: true - field :cancel_reason, Decidim::Core::TranslatedFieldType, "The cancel reason for this sortition", null: true - field :cancelled_by_user, Decidim::Core::UserType, "Who cancelled this sortition", null: true - field :cancelled_on, Decidim::Core::DateType, "When this sortition was cancelled", null: true - field :candidate_proposals, [GraphQL::Types::Int, { null: true }], "The candidate proposal for this sortition", null: true - field :dice, GraphQL::Types::Int, "The dice for this sortition", null: true - field :id, GraphQL::Types::ID, "The internal ID for this sortition", null: false - field :proposals, [Decidim::Proposals::ProposalType, { null: true }], "The selected proposal for this sortition", null: true - field :request_timestamp, Decidim::Core::DateTimeType, "The request time stamp for this request", null: true - field :selected_proposals, [GraphQL::Types::Int, { null: true }], "The selected proposal ids for this sortition", null: true - field :target_items, GraphQL::Types::Int, "The target items for this sortition", null: true - field :title, Decidim::Core::TranslatedFieldType, "The title for this sortition", null: true - field :url, GraphQL::Types::String, "The URL for this sortition", null: false - field :witnesses, Decidim::Core::TranslatedFieldType, "The witnesses for this sortition", null: true - - def url - Decidim::ResourceLocatorPresenter.new(object).url - end - - def self.authorized?(object, context) - context[:sortition] = object - - super - end - end - end -end diff --git a/decidim-sortitions/lib/decidim/api/sortitions_type.rb b/decidim-sortitions/lib/decidim/api/sortitions_type.rb deleted file mode 100644 index 450588da45040..0000000000000 --- a/decidim-sortitions/lib/decidim/api/sortitions_type.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - class SortitionsType < Decidim::Core::ComponentType - graphql_name "Sortitions" - description "A sortition component of a participatory space." - - field :sortition, Decidim::Sortitions::SortitionType, "A single Sortition object", null: true do - argument :id, GraphQL::Types::ID, "The id of the Sortition requested", required: true - end - field :sortitions, Decidim::Sortitions::SortitionType.connection_type, "A collection of Sortitions", null: true, connection: true - - def sortitions - Sortition.where(component: object).includes(:component) - end - - def sortition(**args) - Sortition.where(component: object).find_by(id: args[:id]) - end - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions.rb b/decidim-sortitions/lib/decidim/sortitions.rb deleted file mode 100644 index ca4becd39833c..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require "decidim/sortitions/admin" -require "decidim/sortitions/api" -require "decidim/sortitions/engine" -require "decidim/sortitions/admin_engine" -require "decidim/sortitions/component" - -module Decidim - # Base module for this engine. - module Sortitions - include ActiveSupport::Configurable - - # Public setting that defines how many elements will be shown - # per page inside the administration view. - config_accessor :items_per_page do - 15 - end - - # Link to algorithm used for the sortition - config_accessor :sortition_algorithm do - "https://ruby-doc.org/core-2.4.0/Random.html" - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/admin.rb b/decidim-sortitions/lib/decidim/sortitions/admin.rb deleted file mode 100644 index 3f72eb81dc3c4..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/admin.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # This module contains all the domain logic associated to Decidim's Sortitions - # component admin panel. - module Admin - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb b/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb deleted file mode 100644 index 8fc2fa2d055a8..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - # This is the engine that runs on the administration interface of `decidim_sortitions`. - # It mostly handles rendering the created projects associated to a participatory - # process. - class AdminEngine < ::Rails::Engine - isolate_namespace Decidim::Sortitions::Admin - - paths["db/migrate"] = nil - paths["lib/tasks"] = nil - - routes do - resources :sortitions do - get "confirm_destroy", on: :member - end - - root to: "sortitions#index" - end - - def load_seed - nil - end - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/api.rb b/decidim-sortitions/lib/decidim/sortitions/api.rb deleted file mode 100644 index b00b54dd2cfe3..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/api.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - autoload :SortitionType, "decidim/api/sortition_type" - autoload :SortitionsType, "decidim/api/sortitions_type" - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/component.rb b/decidim-sortitions/lib/decidim/sortitions/component.rb deleted file mode 100644 index b3ac3f74ae08b..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/component.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -Decidim.register_component(:sortitions) do |component| - component.engine = Decidim::Sortitions::Engine - component.admin_engine = Decidim::Sortitions::AdminEngine - component.icon = "media/images/decidim_sortitions.svg" - component.icon_key = "billiards-line" - # component.stylesheet = "decidim/sortitions/sortitions" - component.permissions_class_name = "Decidim::Sortitions::Permissions" - component.query_type = "Decidim::Sortitions::SortitionsType" - - component.on(:before_destroy) do |instance| - raise StandardError, "Cannot remove this component" if Decidim::Sortitions::Sortition.where(component: instance).any? - end - - # These actions permissions can be configured in the admin panel - component.actions = %w(comment) - - component.settings(:global) do |settings| - settings.attribute :taxonomy_filters, type: :taxonomy_filters - settings.attribute :comments_enabled, type: :boolean, default: true - settings.attribute :comments_max_length, type: :integer, required: true - end - - # Register an optional resource that can be referenced from other resources. - component.register_resource(:sortition) do |resource| - resource.model_class_name = "Decidim::Sortitions::Sortition" - resource.template = "decidim/sortitions/sortitions/linked_sortitions" - resource.card = "decidim/sortitions/sortition" - resource.actions = %w(comment) - end - - component.register_stat :sortitions_count, - primary: true, - priority: Decidim::StatsRegistry::MEDIUM_PRIORITY, - icon_name: "team-line", - tooltip_key: "sortitions_count_tooltip" do |components, start_at, end_at| - Decidim::Sortitions::FilteredSortitions.for(components, start_at, end_at).count - end - - component.seeds do |participatory_space| - require "decidim/sortitions/seeds" - - Decidim::Sortitions::Seeds.new(participatory_space:).call - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/engine.rb b/decidim-sortitions/lib/decidim/sortitions/engine.rb deleted file mode 100644 index dca924120facc..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/engine.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require "rails" -require "active_support/all" - -require "decidim/core" - -module Decidim - module Sortitions - # Decidim's Sortitions Rails Engine. - class Engine < ::Rails::Engine - isolate_namespace Decidim::Sortitions - - routes do - resources :sortitions, only: [:index, :show] - scope "/sortitions" do - root to: "sortitions#index" - end - get "/", to: redirect("sortitions", status: 301) - end - - initializer "decidim_sortitions.register_icons" do - Decidim.icons.register(name: "seedling-line", icon: "seedling-line", category: "system", description: "", engine: :sortitions) - end - - initializer "decidim_sortitions.data_migrate", after: "decidim_core.data_migrate" do - DataMigrate.configure do |config| - config.data_migrations_path << root.join("db/data").to_s - end - end - - initializer "decidim_sortitions.add_cells_view_paths" do - Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Sortitions::Engine.root}/app/cells") - Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Sortitions::Engine.root}/app/views") # for proposal partials - end - - initializer "decidim_sortitions.shakapacker.assets_path" do - Decidim.register_assets_path File.expand_path("app/packs", root) - end - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/seeds.rb b/decidim-sortitions/lib/decidim/sortitions/seeds.rb deleted file mode 100644 index 036ecac4f0bad..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/seeds.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require "decidim/components/namer" - -module Decidim - module Sortitions - class Seeds - attr_reader :participatory_space - - def initialize(participatory_space:) - @participatory_space = participatory_space - end - - def call - Decidim::Component.create!( - name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :sortitions).i18n_name, - manifest_name: :sortitions, - published_at: Time.current, - participatory_space: - ) - end - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/test/factories.rb b/decidim-sortitions/lib/decidim/sortitions/test/factories.rb deleted file mode 100644 index fc73f0e329651..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/test/factories.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require "decidim/components/namer" -require "decidim/faker/localized" -require "decidim/core/test/factories" -require "decidim/participatory_processes/test/factories" - -FactoryBot.define do - factory :sortition_component, parent: :component do - transient do - skip_injection { false } - end - name { generate_component_name(participatory_space.organization.available_locales, :sortitions, skip_injection:) } - manifest_name { :sortitions } - participatory_space { create(:participatory_process, :with_steps, organization:, skip_injection:) } - end - - factory :sortition, class: "Decidim::Sortitions::Sortition" do - transient do - skip_injection { false } - end - component { create(:sortition_component, skip_injection:) } - decidim_proposals_component { create(:proposal_component, organization: component.organization, skip_injection:) } - - title { generate_localized_title(:sortition_title, skip_injection:) } - author do - create(:user, :admin, organization: component.organization) if component - end - - dice { Faker::Number.between(from: 1, to: 6).to_i } - target_items { Faker::Number.between(from: 1, to: 5).to_i } - request_timestamp { Time.now.utc } - witnesses { generate_localized_description(:sortition_witnesses, skip_injection:) } - additional_info { generate_localized_description(:sortition_additional_info, skip_injection:) } - selected_proposals { create_list(:proposal, target_items, component: decidim_proposals_component, skip_injection:).pluck(:id) } - candidate_proposals { selected_proposals } - - trait :cancelled do - cancelled_on { Time.now.utc } - cancel_reason { generate_localized_description(:sortition_cancel_reason, skip_injection:) } - cancelled_by_user { create(:user, :admin, organization: component.organization, skip_injection:) if component } - end - end -end diff --git a/decidim-sortitions/lib/decidim/sortitions/version.rb b/decidim-sortitions/lib/decidim/sortitions/version.rb deleted file mode 100644 index 519a8ac06de96..0000000000000 --- a/decidim-sortitions/lib/decidim/sortitions/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Sortitions - def self.version - "0.32.0.dev" - end - end -end diff --git a/decidim-sortitions/lib/tasks/decidim/.keep b/decidim-sortitions/lib/tasks/decidim/.keep deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb deleted file mode 100644 index 771472961c67a..0000000000000 --- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb +++ /dev/null @@ -1,288 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe CreateSortition do - let(:organization) { create(:organization) } - let(:author) { create(:user, :admin, organization:) } - let(:participatory_process) { create(:participatory_process, organization:) } - let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) } - let(:dice) { ::Faker::Number.between(from: 1, to: 6) } - let(:target_items) { ::Faker::Number.number(digits: 2) } - let(:witnesses) { Decidim::Faker::Localized.wrapped("

", "

") { Decidim::Faker::Localized.sentence(word_count: 4) } } - let(:additional_info) { Decidim::Faker::Localized.wrapped("

", "

") { Decidim::Faker::Localized.sentence(word_count: 4) } } - let(:title) { Decidim::Faker::Localized.sentence(word_count: 3) } - let(:taxonomy) { create(:taxonomy, :with_parent, organization:) } - let(:taxonomies) { [] } - let(:params) do - { - decidim_proposals_component_id: proposal_component.id, - taxonomies:, - dice:, - title:, - target_items:, - witnesses:, - additional_info: - } - end - - let(:sortition_component) { create(:sortition_component, participatory_space: participatory_process) } - - let(:context) do - { - current_component: sortition_component, - current_user: author - } - end - - let(:form) { SortitionForm.from_params(sortition: params).with_context(context) } - let(:command) { described_class.new(form) } - - describe "when the form is not valid" do - before do - allow(form).to receive(:invalid?).and_return(true) - end - - it "broadcasts invalid" do - expect { command.call }.to broadcast(:invalid) - end - - it "does not create the sortition" do - expect do - command.call - end.not_to(change { Sortition.where(component: sortition_component).count }) - end - end - - describe "when the form is valid" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - before do - allow(form).to receive(:invalid?).and_return(false) - end - - it "broadcasts ok" do - expect { command.call }.to broadcast(:ok) - end - - it "creates a sortition" do - expect do - command.call - end.to change { Sortition.where(component: sortition_component).count }.by(1) - end - - it "traces the action", versioning: true do - expect(Decidim.traceability) - .to receive(:create!) - .with(Sortition, author, kind_of(Hash)) - .and_call_original - - expect { command.call }.to change(Decidim::ActionLog, :count) - action_log = Decidim::ActionLog.last - expect(action_log.version).to be_present - end - - it "the created sortition contains a list of selected proposals" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).not_to be_empty - end - - it "the created sortition contains a list of candidate proposals" do - command.call - sortition = Sortition.where(component: sortition_component).last - - expect(sortition.candidate_proposals).not_to be_empty - end - - it "has no taxonomies" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.taxonomies).to be_blank - end - - context "when restricted to a taxonomy without proposals" do - let!(:taxonomies) { [taxonomy.id] } - - it "has taxonomies" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.taxonomies).to eq([taxonomy]) - end - - it "the created sortition has not proposals" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to be_empty - end - end - - context "when proposals has been moderated" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :hidden, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to be_empty - end - end - - context "when proposals are rejected" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :rejected, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to be_empty - end - end - - context "when proposals are withdrawn" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :withdrawn, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to be_empty - end - end - - context "when proposals are draft" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :draft, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to be_empty - end - end - - context "when restricted to taxonomies with proposals" do - let!(:taxonomies) { [taxonomy.id] } - let!(:proposal) { create(:proposal, component: proposal_component, taxonomies: [taxonomy]) } - - it "the created sortition contains proposals" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).not_to be_empty - expect(sortition.selected_proposals.first).to eq(proposal.id) - end - - context "when proposals has been moderated" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :hidden, - taxonomies: [taxonomy], - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to eq([proposal.id]) - end - end - - context "when proposals are rejected" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :rejected, - taxonomies: [taxonomy], - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to eq([proposal.id]) - end - end - - context "when proposals are withdrawn" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :withdrawn, - taxonomies: [taxonomy], - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to eq([proposal.id]) - end - end - - context "when proposals are draft" do - let!(:proposals) do - create_list(:proposal, target_items.to_i, - :draft, - taxonomies: [taxonomy], - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - - it "returns empty" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.selected_proposals).to eq([proposal.id]) - end - end - end - - it "has a reference" do - command.call - sortition = Sortition.where(component: sortition_component).last - expect(sortition.reference).not_to be_blank - end - - it "sends a notification to the participatory space followers" do - follower = create(:user, organization:) - create(:follow, followable: participatory_process, user: follower) - - expect(Decidim::EventsManager) - .to receive(:publish) - .with( - event: "decidim.events.sortitions.sortition_created", - event_class: Decidim::Sortitions::CreateSortitionEvent, - resource: kind_of(Sortition), - followers: [follower] - ) - - command.call - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb deleted file mode 100644 index e90f6dc58dd8a..0000000000000 --- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe DestroySortition do - let(:organization) { create(:organization) } - let(:admin) { create(:user, :admin, organization:) } - let(:participatory_process) { create(:participatory_process, organization:) } - let(:sortition_component) { create(:sortition_component, participatory_space: participatory_process) } - let(:sortition) { create(:sortition, component: sortition_component) } - let(:cancel_reason) do - Decidim::Faker::Localized.wrapped("

", "

") { Decidim::Faker::Localized.sentence(word_count: 4) } - end - - let(:params) do - { - id: sortition.id, - sortition: { - cancel_reason: - } - } - end - - let(:context) do - { - current_component: sortition_component, - current_user: admin - } - end - - let(:form) { DestroySortitionForm.from_params(sortition: params).with_context(context) } - let(:command) { described_class.new(form) } - - describe "when the form is not valid" do - before do - allow(form).to receive(:invalid?).and_return(true) - end - - it "broadcasts invalid" do - expect { command.call }.to broadcast(:invalid) - end - - it "does not cancel the sortition" do - command.call - sortition.reload - expect(sortition).not_to be_cancelled - end - end - - describe "when the form is valid" do - before do - allow(form).to receive(:invalid?).and_return(false) - end - - it "broadcasts ok" do - expect { command.call }.to broadcast(:ok) - end - - it "Cancels the sortition" do - command.call - sortition.reload - expect(sortition).to be_cancelled - end - - it "traces the action", versioning: true do - expect(Decidim.traceability) - .to receive(:perform_action!) - .with(:delete, sortition, admin) - .and_call_original - - expect { command.call }.to change(Decidim::ActionLog, :count) - action_log = Decidim::ActionLog.last - expect(action_log.version).to be_present - end - - it "Data from the user who cancelled the sortition is stored" do - command.call - sortition.reload - expect(sortition.cancelled_by_user).to eq(admin) - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb deleted file mode 100644 index bb19188fcb37a..0000000000000 --- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe UpdateSortition do - let(:additional_info) { Decidim::Faker::Localized.wrapped("

", "

") { Decidim::Faker::Localized.sentence(word_count: 4) }.except("machine_translations") } - let(:title) { Decidim::Faker::Localized.sentence(word_count: 3).except(:machine_translations) } - let(:sortition) { create(:sortition) } - let(:user) { create(:user, :admin, :confirmed) } - let(:params) do - { - id: sortition.id, - sortition: { - title:, - additional_info: - } - } - end - - let(:context) do - { - current_user: user, - current_component: sortition.component - } - end - - let(:form) { EditSortitionForm.from_params(params).with_context(context) } - let(:command) { described_class.new(form) } - - describe "when the form is not valid" do - before do - allow(form).to receive(:invalid?).and_return(true) - end - - it "broadcasts invalid" do - expect { command.call }.to broadcast(:invalid) - end - end - - describe "when the form is valid" do - before do - allow(form).to receive(:invalid?).and_return(false) - end - - it "broadcasts ok" do - expect { command.call }.to broadcast(:ok) - end - - it "Updates the title" do - command.call - sortition.reload - expect(sortition.title.except("machine_translations")).to eq(title) - end - - it "Updates the additional info" do - command.call - sortition.reload - expect(sortition.additional_info.except("machine_translations")).to eq(additional_info) - end - - it "traces the action", versioning: true do - expect(Decidim.traceability) - .to receive(:update!) - .with(sortition, user, kind_of(Hash)) - .and_call_original - - expect { command.call }.to change(Decidim::ActionLog, :count) - action_log = Decidim::ActionLog.last - expect(action_log.version).to be_present - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb b/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb deleted file mode 100644 index 28b3d418177bd..0000000000000 --- a/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb +++ /dev/null @@ -1,235 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe SortitionsController do - let(:component) { sortition.component } - let(:sortition) { create(:sortition) } - let(:user) { create(:user, :confirmed, :admin, organization: component.organization) } - - before do - request.env["decidim.current_organization"] = component.organization - request.env["decidim.current_component"] = component - sign_in user, scope: :user - end - - describe "show" do - let(:sortition) { create(:sortition) } - let(:params) do - { - component_id: sortition.component.id, - participatory_process_slug: sortition.component.participatory_space.slug, - id: sortition.id - } - end - - it "renders the show template" do - get(:show, params:) - expect(response).to render_template(:show) - end - end - - describe "new" do - let(:params) do - { participatory_process_slug: component.participatory_space.slug } - end - - it "renders the new template" do - get(:new, params:) - expect(response).to render_template(:new) - end - end - - describe "create" do - let(:decidim_taxonomy_ids) { nil } - let(:dice) { ::Faker::Number.between(from: 1, to: 6) } - let(:target_items) { ::Faker::Number.between(from: 1, to: 10) } - let(:params) do - { - participatory_process_slug: sortition.component.participatory_space.slug, - sortition: { - decidim_proposals_component_id:, - decidim_taxonomy_ids:, - dice:, - target_items:, - title: { - en: "Title", - es: "Título", - ca: "Títol" - }, - witnesses: { - en: "Witnesses", - es: "Testigos", - ca: "Testimonis" - }, - additional_info: { - en: "Additional information", - es: "Información adicional", - ca: "Informació adicional" - } - } - } - end - - context "with invalid params" do - let(:decidim_proposals_component_id) { nil } - - it "renders the new template" do - post(:create, params:) - expect(response).to render_template(:new) - end - end - - context "with valid params" do - let(:proposal_component) { create(:proposal_component, participatory_space: component.participatory_space) } - let(:decidim_proposals_component_id) { proposal_component.id } - - it "redirects to show newly created sortition" do - expect(controller).to receive(:redirect_to) do |params| - expect(params).to eq(action: :show, id: Sortition.last.id) - end - - post :create, params: - end - - it "Sortition author is the current user" do - expect(controller).to receive(:redirect_to) do |params| - expect(params).to eq(action: :show, id: Sortition.last.id) - end - - post(:create, params:) - expect(Sortition.last.author).to eq(user) - end - end - end - - describe "confirm_destroy" do - let(:sortition) { create(:sortition) } - let(:params) do - { - component_id: sortition.component.id, - participatory_process_slug: sortition.component.participatory_space.slug, - id: sortition.id - } - end - - it "renders the confirm_destroy template" do - get(:confirm_destroy, params:) - expect(response).to render_template(:confirm_destroy) - end - end - - describe "destroy" do - let(:cancel_reason) do - { - en: "Cancel reason", - es: "Motivo de la cancelación", - ca: "Motiu de la cancelació" - } - end - let(:params) do - { - participatory_process_slug: component.participatory_space.slug, - id: sortition.id, - sortition: { - cancel_reason: - } - } - end - - context "with invalid params" do - let(:cancel_reason) do - { - en: "", - es: "", - ca: "" - } - end - - it "renders the confirm_destroy template" do - delete(:destroy, params:) - expect(response).to render_template(:confirm_destroy) - end - end - - context "with valid params" do - it "redirects to sortitions list newly created sortition" do - expect(controller).to receive(:redirect_to).with(action: :index) - - delete :destroy, params: - end - end - end - - describe "edit" do - let(:sortition) { create(:sortition) } - let(:params) do - { - participatory_process_slug: component.participatory_space.slug, - component_id: sortition.component.id, - id: sortition.id - } - end - - it "renders the edit template" do - get(:edit, params:) - expect(response).to render_template(:edit) - end - end - - describe "update" do - let(:title) do - { - en: "Title", - es: "Título", - ca: "Títol" - } - end - let(:additional_info) do - { - en: "Additional info", - es: "Información adicional", - ca: "Informació adicional" - } - end - let(:params) do - { - participatory_process_slug: component.participatory_space.slug, - id: sortition.id, - sortition: { - title:, - additional_info: - } - } - end - - context "with invalid params" do - let(:title) do - { - en: "", - es: "", - ca: "" - } - end - - it "renders the edit template" do - patch(:update, params:) - expect(response).to render_template(:edit) - end - end - - context "with valid params" do - it "redirects to sortitions list newly created sortition" do - expect(controller).to receive(:redirect_to).with(action: :index) - - patch :update, params: - end - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb b/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb deleted file mode 100644 index baaf06426e70b..0000000000000 --- a/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Sortitions::CreateSortitionEvent do - let(:resource) { create(:sortition) } - let(:notification_title) { "The sortition #{resource_title} has been added to #{participatory_space_title}" } - let(:email_outro) { "You have received this notification because you are following \"#{participatory_space_title}\". You can unfollow it from the previous link." } - let(:email_intro) { "The sortition \"#{resource_title}\" has been added to \"#{participatory_space_title}\" that you are following." } - let(:email_subject) { "New sortition added to #{decidim_sanitize_translated(participatory_space.title)}" } - let(:event_name) { "decidim.events.sortitions.sortition_created" } - - include_context "when a simple event" - it_behaves_like "a simple event" - it_behaves_like "a simple event email" - it_behaves_like "a simple event notification" -end diff --git a/decidim-sortitions/spec/factories.rb b/decidim-sortitions/spec/factories.rb deleted file mode 100644 index c6e793fb624ce..0000000000000 --- a/decidim-sortitions/spec/factories.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true - -require "decidim/core/test/factories" -require "decidim/proposals/test/factories" -require "decidim/sortitions/test/factories" -require "decidim/comments/test/factories" diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb deleted file mode 100644 index 1bd768281fd1a..0000000000000 --- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe DestroySortitionForm do - subject { form } - - let(:organization) { build(:organization) } - - let(:cancel_reason) do - { - en: "Cancel reason", - es: "Motivo de la cancelación", - ca: "Motiu de la cancelació" - } - end - let(:params) do - { - sortition: { - cancel_reason_en: cancel_reason[:en], - cancel_reason_es: cancel_reason[:es], - cancel_reason_ca: cancel_reason[:ca] - } - } - end - - let(:form) { described_class.from_params(params).with_context(current_organization: organization) } - - context "when everything is OK" do - it { is_expected.to be_valid } - end - - context "when no cancel_reason" do - let(:cancel_reason) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - end - end - end -end diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb deleted file mode 100644 index 25f8beb8e9926..0000000000000 --- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe EditSortitionForm do - subject { form } - - let(:organization) { build(:organization) } - - let(:title) do - { - en: "Title", - es: "Título", - ca: "Títol" - } - end - let(:additional_info) do - { - en: "Additional info", - es: "Información adicional", - ca: "Informació adicional" - } - end - let(:params) do - { - sortition: { - title_en: title[:en], - title_es: title[:es], - title_ca: title[:ca], - additional_info_en: additional_info[:en], - additional_info_es: additional_info[:es], - additional_info_ca: additional_info[:ca] - } - } - end - - let(:form) { described_class.from_params(params).with_context(current_organization: organization) } - - context "when everything is OK" do - it { is_expected.to be_valid } - end - - context "when no title" do - let(:title) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - - context "when no additional info" do - let(:additional_info) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - end - end - end -end diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb deleted file mode 100644 index 8106681245c44..0000000000000 --- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb +++ /dev/null @@ -1,128 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe SortitionForm do - subject(:form) { described_class.from_params(params).with_context(context) } - - let(:organization) { create(:organization) } - let(:context) do - { - current_organization: organization, - current_component:, - current_participatory_space: participatory_process - } - end - let(:participatory_process) { create(:participatory_process, organization:) } - let(:current_component) { create(:component, participatory_space: participatory_process, manifest_name: "sortitions") } - - let(:decidim_proposals_component_id) { ::Faker::Number.number(digits: 10) } - let(:dice) { ::Faker::Number.between(from: 1, to: 6) } - let(:target_items) { ::Faker::Number.number(digits: 2) } - let(:taxonomies) { [] } - let(:title) do - { - en: "Title", - es: "Título", - ca: "Títol" - } - end - let(:witnesses) do - { - en: "Witnesses", - es: "Testigos", - ca: "Testimonis" - } - end - let(:additional_info) do - { - en: "Additional info", - es: "Información adicional", - ca: "Informació adicional" - } - end - let(:params) do - { - sortition: { - decidim_proposals_component_id:, - taxonomies:, - dice:, - target_items:, - title_en: title[:en], - title_es: title[:es], - title_ca: title[:ca], - witnesses_en: witnesses[:en], - witnesses_es: witnesses[:es], - witnesses_ca: witnesses[:ca], - additional_info_en: additional_info[:en], - additional_info_es: additional_info[:es], - additional_info_ca: additional_info[:ca] - } - } - end - - context "when everything is OK" do - it { is_expected.to be_valid } - end - - context "when there is no proposals component selected" do - let(:decidim_proposals_component_id) { nil } - - it { is_expected.to be_invalid } - end - - describe "taxonomies" do - let(:component) { current_component } - let(:participatory_space) { participatory_process } - - it_behaves_like "a taxonomizable resource" - end - - context "when there is no dice value selected" do - let(:dice) { nil } - - it { is_expected.to be_invalid } - end - - context "when dice value is invalid" do - let(:dice) { "7" } - - it { is_expected.to be_invalid } - end - - context "when there is no target items value selected" do - let(:target_items) { nil } - - it { is_expected.to be_invalid } - end - - context "when target items value is invalid" do - let(:target_items) { "0" } - - it { is_expected.to be_invalid } - end - - context "when no title" do - let(:title) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - - context "when no witnesses" do - let(:witnesses) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - - context "when no additional info" do - let(:additional_info) { { es: "", en: "", ca: "" } } - - it { is_expected.to be_invalid } - end - end - end - end -end diff --git a/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb b/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb deleted file mode 100644 index ff32439242d9e..0000000000000 --- a/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe SortitionsHelper do - describe "components_options" do - let(:components) { [double(id: 1, name: { "en" => "Component name" })] } - - it "Returns a list of selectable components" do - expect(helper.components_options(components)).to include(["Component name", 1]) - end - end - - describe "sortition_taxonomies" do - let(:sortition) { double(taxonomies:) } - - context "when taxonomy is null" do - let(:taxonomies) { [] } - - it "Returns all taxonomies" do - expect(helper.sortition_taxonomies(sortition)).to eq("All taxonomies") - end - end - - context "when taxonomy is not null" do - let(:taxonomies) { [double(name: { "en" => "Taxonomy name" })] } - - it "Returns the taxonomy name" do - expect(helper.sortition_taxonomies(sortition)).to eq("Taxonomy name") - end - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb b/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb deleted file mode 100644 index 99cdf686d3463..0000000000000 --- a/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - describe SortitionsHelper do - describe "proposal_path" do - let(:proposal) { create(:proposal) } - - it "Returns a path for a proposal" do - expect(helper.proposal_path(proposal)).not_to be_blank - end - end - - describe "sortition_taxonomy_labels" do - let(:sortition) { create(:sortition) } - - context "when sortition has no taxonomies" do - it "returns from all taxonomies" do - expect(helper.sortition_taxonomy_labels(sortition)).to eq("from all taxonomies") - end - end - - context "when sortition has taxonomies" do - let(:taxonomy) { create(:taxonomy, :with_parent, skip_injection: true, organization: sortition.organization) } - - before do - sortition.taxonomies << taxonomy - end - - it "returns from the given taxonomy" do - expect(helper.sortition_taxonomy_labels(sortition)).to eq("from the #{taxonomy.name["en"]} taxonomies") - end - end - end - - describe "sortition_proposal_candidate_ids" do - let(:sortition) { create(:sortition) } - let!(:label) { helper.sortition_proposal_candidate_ids(sortition) } - - it "Contains all candidate proposal ids" do - sortition.candidate_proposals.each do |proposal_id| - expect(label).to include proposal_id.to_s - end - end - - it "Selected proposal ids appear in bold" do - sortition.selected_proposals.each do |proposal_id| - expect(label).to include "#{proposal_id}" - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb b/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb deleted file mode 100644 index 7e27bec7f31df..0000000000000 --- a/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Accountability component" do # rubocop:disable RSpec/DescribeClass - let!(:component) { create(:sortition_component) } - let(:organization) { component.organization } - let!(:current_user) { create(:user, :confirmed, :admin, organization:) } - - describe "on edit", type: :system do - let(:edit_component_path) do - Decidim::EngineRouter.admin_proxy(component.participatory_space).edit_component_path(component.id) - end - - before do - switch_to_host(organization.host) - login_as current_user, scope: :user - end - - context "when comments_max_length is empty" do - it_behaves_like "has mandatory config setting", :comments_max_length - end - end -end diff --git a/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb b/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb deleted file mode 100644 index b5f633d0e84e4..0000000000000 --- a/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Sortitions::Engine do - it_behaves_like "clean engine" -end diff --git a/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb b/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb deleted file mode 100644 index 9e7bf151bc9a2..0000000000000 --- a/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - describe Sortition do - subject { sortition } - - let(:sortition) { build(:sortition) } - - it { is_expected.to be_valid } - it { is_expected.to be_versioned } - - include_examples "has taxonomies" - - describe "seed" do - it "is the multiplication of timestamp per dice value" do - expect(sortition.seed).to eq(sortition.request_timestamp.to_i * sortition.dice) - end - end - - describe "similar_count" do - let(:sortition) { create(:sortition) } - let(:taxonomy1) { create(:taxonomy, :with_parent, organization: sortition.organization) } - let(:taxonomy2) { create(:taxonomy, :with_parent, organization: sortition.organization) } - - before do - sortition.taxonomies = [taxonomy1, taxonomy2] - sortition.reload - end - - context "when first sortition" do - it "is one" do - expect(sortition.similar_count).to eq(1) - end - end - - context "when following sortitions" do - let(:repetitions) { 2 } - - before do - create_list(:sortition, repetitions, - component: sortition.component, - decidim_proposals_component: sortition.decidim_proposals_component, - target_items: sortition.target_items).each do |sortition| - Decidim::Taxonomization.create!(taxonomy_id: taxonomy1.id, taxonomizable: sortition) - end - - create_list(:sortition, repetitions, - component: sortition.component, - decidim_proposals_component: sortition.decidim_proposals_component, - target_items: sortition.target_items) - end - - it "Counts similar sortitions" do - expect(sortition.similar_count).to eq(1 + repetitions) - end - end - end - - describe "proposals" do - it "returns a list of selected proposals" do - expect(sortition.proposals).to eq(Decidim::Proposals::Proposal.where(id: sortition.selected_proposals)) - end - end - - describe "cancelled" do - it "is true when cancelled_on has value" do - sortition = build(:sortition, cancelled_on: Time.now.utc) - expect(sortition).to be_cancelled - end - - it "is false when cancelled_on is nil" do - sortition = build(:sortition, cancelled_on: nil) - expect(sortition).not_to be_cancelled - end - end - end - end -end diff --git a/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb b/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb deleted file mode 100644 index 96fab5d3945d0..0000000000000 --- a/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Sortitions::Admin::Permissions do - subject { described_class.new(user, permission_action, context).permissions.allowed? } - - let(:user) { create(:user, organization: sortition_component.organization) } - let(:context) do - { - current_component: sortition_component, - sortition: - } - end - let(:sortition_component) { create(:sortition_component) } - let(:sortition) { create(:sortition, component: sortition_component) } - let(:permission_action) { Decidim::PermissionAction.new(**action) } - let(:registrations_enabled) { true } - let(:action) do - { scope: :admin, action: action_name, subject: :sortition } - end - let(:action_name) { :foo } - - context "when scope is not admin" do - let(:action) do - { scope: :foo, action: :vote, subject: :sortition } - end - - it_behaves_like "permission is not set" - end - - context "when subject is not a sortition" do - let(:action) do - { scope: :admin, action: :vote, subject: :foo } - end - - it_behaves_like "permission is not set" - end - - context "when action is a random one" do - let(:action_name) { :foo } - - it_behaves_like "permission is not set" - end - - context "when reading a sortition" do - let(:action_name) { :read } - - it { is_expected.to be true } - end - - context "when creating a sortition" do - let(:action_name) { :create } - - it { is_expected.to be true } - end - - context "when destroying a sortition" do - let(:action_name) { :destroy } - - context "when sortition is present" do - context "when sortition is not cancelled" do - it { is_expected.to be true } - end - - context "when sortition is cancelled" do - let(:sortition) { create(:sortition, :cancelled, component: sortition_component) } - - it_behaves_like "permission is not set" - end - end - - context "when sortition is missing" do - let(:sortition) { nil } - - it_behaves_like "permission is not set" - end - end - - context "when updating a sortition" do - let(:action_name) { :update } - - context "when sortition is present" do - it { is_expected.to be true } - end - - context "when sortition is missing" do - let(:sortition) { nil } - - it_behaves_like "permission is not set" - end - end -end diff --git a/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb b/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb deleted file mode 100644 index 05be490cec42d..0000000000000 --- a/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Sortitions::Permissions do - subject { described_class.new(user, permission_action, context).permissions.allowed? } - - let(:user) { create(:user, organization: sortition_component.organization) } - let(:context) do - { - current_component: sortition_component, - sortition: - } - end - let(:sortition_component) { create(:sortition_component) } - let(:sortition) { create(:sortition, component: sortition_component) } - let(:permission_action) { Decidim::PermissionAction.new(**action) } - let(:registrations_enabled) { true } - - context "when scope is admin" do - let(:action) do - { scope: :admin, action: :vote, subject: :sortition } - end - - it_behaves_like "delegates permissions to", Decidim::Sortitions::Admin::Permissions - end - - context "when any other condition" do - let(:action) do - { scope: :foo, action: :blah, subject: :sortition } - end - - it_behaves_like "permission is not set" - end -end diff --git a/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb b/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb deleted file mode 100644 index 0a76a638d9050..0000000000000 --- a/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Sortitions::AdminLog::SortitionPresenter, type: :helper do - include_examples "present admin log entry" do - let(:participatory_space) { create(:participatory_process, organization:) } - let(:component) { create(:sortition_component, participatory_space:) } - let(:admin_log_resource) { create(:sortition, component:) } - let(:action) { "delete" } - end -end diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb deleted file mode 100644 index e92f58a9860e0..0000000000000 --- a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe ParticipatorySpaceProposalComponents do - let(:organization) { create(:organization) } - let(:participatory_process) { create(:participatory_process, organization:) } - let(:proposal_components) { create_list(:proposal_component, 10, participatory_space: participatory_process) } - let(:unpublished_proposal_components) { create_list(:proposal_component, 10, participatory_space: participatory_process, published_at: nil) } - let(:sortition_components) { create_list(:sortition_component, 10, participatory_space: participatory_process) } - - it "returns proposal components in the participatory space" do - expect(described_class.for(participatory_process)).to include(*proposal_components) - end - - it "Do not include unpublished proposal components" do - expect(described_class.for(participatory_process)).not_to include(*unpublished_proposal_components) - end - - it "do not return other components in participatory space" do - expect(described_class.for(participatory_process)).not_to include(*sortition_components) - end - end - end - end -end diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb deleted file mode 100644 index e6c557b22d54e..0000000000000 --- a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb +++ /dev/null @@ -1,123 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe ParticipatorySpaceProposals do - let(:organization) { create(:organization) } - let(:participatory_process) { create(:participatory_process, organization:) } - let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) } - let(:another_proposal_component) { create(:proposal_component, participatory_space: participatory_process) } - let(:proposals) { create_list(:proposal, 10, component: proposal_component, created_at: request_timestamp - 10.days) } - let(:request_timestamp) { Time.now.utc } - let(:taxonomies) { [] } - let(:decidim_proposals_component) { proposal_component } - let(:sortition) do - double( - request_timestamp:, - taxonomies:, - decidim_proposals_component: - ) - end - - context "when filtering by component" do - let(:other_component_proposals) { create_list(:proposal, 10, component: another_proposal_component) } - - it "Includes only proposals in this component" do - expect(described_class.for(sortition)).to include(*proposals) - end - - it "Do not includes proposals in other components" do - expect(described_class.for(sortition)).not_to include(*other_component_proposals) - end - end - - context "when filtering by creation date" do - let(:recent_proposals) { create_list(:proposal, 10, component: proposal_component, created_at: Time.now.utc) } - let(:request_timestamp) { Time.now.utc - 1.day } - - it "Includes proposals created before the sortition date" do - expect(described_class.for(sortition)).to include(*proposals) - end - - it "Do not includes proposals created after the sortition date" do - expect(described_class.for(sortition)).not_to include(*recent_proposals) - end - end - - context "when filtering by taxonomy" do - let(:taxonomy) { create(:taxonomy, :with_parent, organization:) } - let(:sub_taxonomy) { create(:taxonomy, parent: taxonomy, organization:) } - let(:taxonomy_proposals) do - create_list(:proposal, 10, - component: proposal_component, - taxonomies: [taxonomy], - created_at: request_timestamp - 10.days) - end - let(:sub_taxonomy_proposals) do - create_list(:proposal, 10, - component: proposal_component, - taxonomies: [sub_taxonomy], - created_at: request_timestamp - 10.days) - end - - context "and no taxonomies" do - it "Contains all proposals" do - expect(described_class.for(sortition)).to include(*proposals) - expect(described_class.for(sortition)).to include(*taxonomy_proposals) - expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals) - end - end - - context "and taxonomy is passed" do - let(:taxonomies) { [taxonomy] } - - it "Contains proposals of the taxonomy and sub_taxonomies" do - expect(described_class.for(sortition)).to include(*taxonomy_proposals) - expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals) - end - - it "Do not contains proposals of the taxonomy" do - expect(described_class.for(sortition)).not_to include(*proposals) - end - end - - context "and sub_taxonomy is passed" do - let(:taxonomies) { [sub_taxonomy] } - - it "Contains proposals of the sub_taxonomy" do - expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals) - end - - it "Do not contains proposals of the taxonomy" do - expect(described_class.for(sortition)).not_to include(*proposals) - expect(described_class.for(sortition)).not_to include(*taxonomy_proposals) - end - end - end - - context "when filtering withdrawn proposals" do - let(:proposals) do - create_list(:proposal, 10, :withdrawn, component: proposal_component, created_at: request_timestamp - 10.days) - end - - it "do not return withdrawn proposals" do - expect(described_class.for(sortition)).not_to include(*proposals) - end - end - - context "when filtering drafts proposals" do - let(:proposals) do - create_list(:proposal, 10, :draft, component: proposal_component, created_at: request_timestamp - 10.days) - end - - it "do not return draft proposals" do - expect(described_class.for(sortition)).not_to include(*proposals) - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb deleted file mode 100644 index 0492069e925ae..0000000000000 --- a/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - describe FilteredSortitions do - let(:organization) { create(:organization) } - let(:component) { create(:sortition_component, organization:) } - let(:other_component) { create(:sortition_component) } - let!(:sortitions) { create_list(:sortition, 10, component:) } - - it "Includes all sortitions for the given component" do - expect(described_class.for(component)).to include(*sortitions) - end - - it "Do not includes sortitions from other components" do - expect(described_class.for(other_component)).not_to include(*sortitions) - end - end - end -end diff --git a/decidim-sortitions/spec/requests/sortition_search_spec.rb b/decidim-sortitions/spec/requests/sortition_search_spec.rb deleted file mode 100644 index ac19427e8881e..0000000000000 --- a/decidim-sortitions/spec/requests/sortition_search_spec.rb +++ /dev/null @@ -1,114 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -RSpec.describe "Sortition search" do - include Decidim::ComponentPathHelper - - subject { response.body } - - let(:component) { create(:sortition_component) } - let(:participatory_space) { component.participatory_space } - let(:organization) { participatory_space.organization } - let(:filter_params) { {} } - - let!(:sortition1) { create(:sortition, title: { en: "A doggo" }, component:) } - let!(:sortition2) { create(:sortition, additional_info: { en: "There is a doggo in the office" }, component:) } - let!(:sortition3) { create(:sortition, witnesses: { en: "My doggo was there" }, component:) } - let!(:sortition4) { create(:sortition, component:) } - let!(:sortition5) { create(:sortition, :cancelled, component:) } - - let(:request_path) { Decidim::EngineRouter.main_proxy(component).sortitions_path } - - before do - get( - request_path, - params: { filter: filter_params }, - headers: { "HOST" => component.organization.host } - ) - end - - it_behaves_like "a resource search", :sortition - it_behaves_like "a resource search with taxonomies", :sortition - - it "displays all non-cancelled sortitions without any filters" do - expect(subject).to include(decidim_escape_translated(sortition1.title)) - expect(subject).to include(decidim_escape_translated(sortition2.title)) - expect(subject).to include(decidim_escape_translated(sortition3.title)) - expect(subject).to include(decidim_escape_translated(sortition4.title)) - expect(subject).not_to include(decidim_escape_translated(sortition5.title)) - end - - context "when searching by text" do - let(:filter_params) { { search_text_cont: "doggo" } } - - it "displays only the sortitions containing the search_text" do - expect(subject).to include(decidim_escape_translated(sortition1.title)) - expect(subject).to include(decidim_escape_translated(sortition2.title)) - expect(subject).to include(decidim_escape_translated(sortition3.title)) - expect(subject).not_to include(decidim_escape_translated(sortition4.title)) - expect(subject).not_to include(decidim_escape_translated(sortition5.title)) - end - end - - context "when searching by state" do - let(:filter_params) { { with_any_state: state } } - - context "and the state is active" do - let(:state) { "active" } - - it "displays the active sortitions" do - expect(subject).to include(decidim_escape_translated(sortition1.title)) - expect(subject).to include(decidim_escape_translated(sortition2.title)) - expect(subject).to include(decidim_escape_translated(sortition3.title)) - expect(subject).to include(decidim_escape_translated(sortition4.title)) - expect(subject).not_to include(decidim_escape_translated(sortition5.title)) - end - end - - context "and the state is cancelled" do - let(:state) { "cancelled" } - - it "displays only the cancelled sortition" do - expect(subject).not_to include(decidim_escape_translated(sortition1.title)) - expect(subject).not_to include(decidim_escape_translated(sortition2.title)) - expect(subject).not_to include(decidim_escape_translated(sortition3.title)) - expect(subject).not_to include(decidim_escape_translated(sortition4.title)) - expect(subject).to include(decidim_escape_translated(sortition5.title)) - end - end - - context "and the state is all" do - let(:state) { "all" } - - it "displays all the sortitions" do - expect(subject).to include(decidim_escape_translated(sortition1.title)) - expect(subject).to include(decidim_escape_translated(sortition2.title)) - expect(subject).to include(decidim_escape_translated(sortition3.title)) - expect(subject).to include(decidim_escape_translated(sortition4.title)) - expect(subject).to include(decidim_escape_translated(sortition5.title)) - end - end - end - - describe "#index" do - let(:url) { "http://#{component.organization.host + request_path}" } - - it "redirects to the index page" do - get( - url_to_root(request_path), - params: {}, - headers: { "HOST" => component.organization.host } - ) - expect(response["Location"]).to eq(url) - expect(response).to have_http_status(:moved_permanently) - end - end - - private - - def url_to_root(url) - parts = url.split("/") - parts[0..-2].join("/") - end -end diff --git a/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb b/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb deleted file mode 100644 index 651206d610dbc..0000000000000 --- a/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Sortitions - module Admin - describe Draw do - let(:organization) { create(:organization) } - let(:participatory_process) { create(:participatory_process, organization:) } - let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) } - let(:target_items) { ::Faker::Number.number(digits: 2).to_i } - let(:seed) { Time.now.utc.to_i * ::Faker::Number.between(from: 1, to: 6).to_i } - let!(:proposals) do - create_list(:proposal, target_items * 2, - component: proposal_component, - created_at: Time.now.utc - 1.day) - end - let(:sortition) do - double( - target_items:, - seed:, - taxonomies: [], - request_timestamp: Time.now.utc, - decidim_proposals_component: proposal_component - ) - end - let(:initial_draw) { Draw.for(sortition) } - - it "Draw can be reproduced several times" do - expect(Draw.for(sortition)).to eq(initial_draw) - end - end - end - end -end diff --git a/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb b/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb deleted file mode 100644 index c6e10488d9b7d..0000000000000 --- a/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -shared_examples "cancel sortitions" do - describe "cancellation" do - let!(:sortition) { create(:sortition, component: current_component) } - - before do - visit_component_admin - within "tr", text: decidim_escape_translated(sortition.title) do - find("button[data-controller='dropdown']").click - click_on "Cancel the sortition" - end - end - - it "requires cancellation reason" do - within "form" do - expect(page).to have_content(/Cancel reason/i) - end - end - - it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-cancel_reason-tabs']", "content" - - context "when cancels a sortition" do - it "Redirects to sortitions view" do - within ".confirm_destroy_sortition" do - fill_in_i18n_editor( - :sortition_cancel_reason, - "#sortition-cancel_reason-tabs", - en: "Cancel reason", - es: "Mótivo de cancelación", - ca: "Motiu de cancelació" - ) - - accept_confirm { find("*[type=submit]").click } - end - - expect(page).to have_admin_callout("successfully") - end - end - end -end diff --git a/decidim-sortitions/spec/shared/manage_sortitions_examples.rb b/decidim-sortitions/spec/shared/manage_sortitions_examples.rb deleted file mode 100644 index 750f9aed80246..0000000000000 --- a/decidim-sortitions/spec/shared/manage_sortitions_examples.rb +++ /dev/null @@ -1,110 +0,0 @@ -# frozen_string_literal: true - -shared_examples "manage sortitions" do - describe "creation" do - let(:taxonomy) { create(:taxonomy, :with_parent, organization: current_component.organization) } - let(:taxonomy_filter) { create(:taxonomy_filter, root_taxonomy: taxonomy.parent, participatory_space_manifests: [current_component.participatory_space.manifest.name]) } - let!(:taxonomy_filter_item) { create(:taxonomy_filter_item, taxonomy_filter:, taxonomy_item: taxonomy) } - let!(:proposal_component) do - create(:proposal_component, :published, participatory_space: current_component.participatory_space) - end - - before do - current_component.update!(settings: { taxonomy_filters: [taxonomy_filter.id] }) - click_on "New sortition" - end - - it "Requires a title" do - within "form" do - expect(page).to have_content(/Title/i) - end - end - - it "can be related to taxonomies" do - within "form" do - expect(page).to have_content(/Taxonomies of the set of proposals in which you want to apply the draw/i) - end - end - - it "Requires a random number" do - within "form" do - expect(page).to have_content(/Result of die roll/i) - end - end - - it "Requires the number of proposals to select" do - within "form" do - expect(page).to have_content(/Number of proposals to be selected/i) - end - end - - it "Requires the proposals component" do - within "form" do - expect(page).to have_content(/Proposals set/i) - end - end - - it "Requires the witnesses" do - within "form" do - expect(page).to have_content(/Witnesses/i) - end - end - - it "Requires additional information" do - within "form" do - expect(page).to have_content(/Sortition information/i) - end - end - - context "when creates a sortition" do - let(:sortition_dice) { Faker::Number.between(from: 1, to: 6) } - let(:sortition_target_items) { Faker::Number.between(from: 1, to: 10) } - let!(:proposal) { create(:proposal, component: proposal_component) } - let(:attributes) { attributes_for(:sortition, component: current_component) } - - it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-additional_info-tabs']", "full" - it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-witnesses-tabs']", "content" - - it "shows the sortition details", versioning: true do - within ".new_sortition" do - fill_in :sortition_dice, with: sortition_dice - fill_in :sortition_target_items, with: sortition_target_items - select translated(proposal_component.name), from: :sortition_decidim_proposals_component_id - - fill_in_i18n_editor(:sortition_witnesses, "#sortition-witnesses-tabs", **attributes[:witnesses].except("machine_translations")) - fill_in_i18n_editor(:sortition_additional_info, "#sortition-additional_info-tabs", **attributes[:additional_info].except("machine_translations")) - fill_in_i18n(:sortition_title, "#sortition-title-tabs", **attributes[:title].except("machine_translations")) - - accept_confirm { find("*[type=submit]").click } - end - - expect(page).to have_admin_callout("successfully") - expect(page).to have_content(/Title/i) - - sortition = Decidim::Sortitions::Sortition.last - within ".sortition" do - expect(page).to have_content(/Draw time/i) - expect(page).to have_content(/Dice/i) - expect(page).to have_content(/Items to select/i) - expect(page).to have_content(/Taxonomies/i) - expect(page).to have_content(/All taxonomies/i) - expect(page).to have_content(/Proposals component/i) - expect(page).to have_content(translated(proposal_component.name)) - expect(page).to have_content(/Seed/i) - expect(page).to have_content(sortition.seed) - end - - within ".proposals" do - expect(page).to have_content(/Proposals selected for draw/i) - expect(sortition.proposals).not_to be_empty - sortition.proposals.each do |p| - expect(page).to have_content(translated(p.title)) - end - end - - visit decidim_admin.root_path - expect(page).to have_content("created the #{translated(attributes[:title])} sortition") - end - end - end -end diff --git a/decidim-sortitions/spec/shared/update_sortitions_examples.rb b/decidim-sortitions/spec/shared/update_sortitions_examples.rb deleted file mode 100644 index aa5796cfc3633..0000000000000 --- a/decidim-sortitions/spec/shared/update_sortitions_examples.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -shared_examples "update sortitions" do - describe "update sortition data" do - let!(:sortition) { create(:sortition, component: current_component) } - let(:attributes) { attributes_for(:sortition, component: current_component) } - - before do - visit_component_admin - within "tr", text: decidim_escape_translated(sortition.title) do - find("button[data-controller='dropdown']").click - click_on "Edit" - end - end - - it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-additional_info-tabs']", "full" - - it "requires title" do - within "form" do - expect(page).to have_content(/Title/i) - end - end - - it "requires additional information" do - within "form" do - expect(page).to have_content(/Sortition information/i) - end - end - - context "when updates a sortition" do - it "Redirects to sortitions view", versioning: true do - within ".edit_sortition" do - fill_in_i18n_editor(:sortition_additional_info, "#sortition-additional_info-tabs", **attributes[:additional_info].except("machine_translations")) - fill_in_i18n(:sortition_title, "#sortition-title-tabs", **attributes[:title].except("machine_translations")) - - find("*[type=submit]").click - end - - expect(page).to have_admin_callout("successfully") - - visit decidim_admin.root_path - expect(page).to have_content("updated the #{translated(attributes[:title])} sortition") - end - end - end -end diff --git a/decidim-sortitions/spec/spec_helper.rb b/decidim-sortitions/spec/spec_helper.rb deleted file mode 100644 index db3a51cf80ab9..0000000000000 --- a/decidim-sortitions/spec/spec_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -require "decidim/dev" - -ENV["ENGINE_ROOT"] = File.dirname(__dir__) - -Decidim::Dev.dummy_app_path = File.expand_path(File.join("..", "spec", "decidim_dummy_app")) - -require "decidim/dev/test/base_spec_helper" diff --git a/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb deleted file mode 100644 index dc8b60220c29d..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Admin manages sortitions" do - let(:manifest_name) { "sortitions" } - - include_context "when managing a component as an admin" - - it_behaves_like "manage sortitions" - it_behaves_like "cancel sortitions" - it_behaves_like "update sortitions" - it_behaves_like "manage taxonomy filters in settings" - - context "when adding a new sortitions module" do - let(:component_name) { "My super new sortitions component" } - - it "is added" do - visit current_path - within_admin_sidebar_menu do - click_on "Components" - end - click_on "Add component" - click_on "Sortitions" - - fill_in_i18n( - :component_name, - "#component-name-tabs", - en: component_name - ) - - click_on "Add component" - - expect(page).to have_content("Component created successfully") - expect(page).to have_content(component_name) - end - end -end diff --git a/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb deleted file mode 100644 index b844fd352b1a7..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "index" do - include_context "when managing a component as an admin" - let!(:sortition) { create(:sortition, component: current_component) } - let(:manifest_name) { "sortitions" } - - before do - visit_component_admin - end - - it_behaves_like "access component permissions form" - - it "Contains a new button" do - expect(page).to have_link("New") - end - - it "Contains a button that shows sortition details" do - within "tr", text: decidim_escape_translated(sortition.title) do - find("button[data-controller='dropdown']").click - expect(page).to have_link("Sortition details") - end - end - - it "Contains the sortitions data" do - expect(page).to have_content(sortition.title[:en]) - expect(page).to have_content(sortition.reference) - end -end diff --git a/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb deleted file mode 100644 index cdf94b1a9d781..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "preview sortitions with a share token" do - let(:manifest_name) { "sortitions" } - - include_context "with a component" - it_behaves_like "preview component with a share_token" -end diff --git a/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb deleted file mode 100644 index 3065b2baca900..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "show" do - include_context "with a component" - let(:manifest_name) { "sortitions" } - - context "when shows the sortition component" do - let!(:sortition) { create(:sortition, component:) } - - before do - visit_component - find("#sortitions .card__list").click - end - - it "shows the sortition additional info" do - expect(page).to have_content(sortition.additional_info[:en]) - end - - it "shows the sortition witnesses" do - expect(page).to have_content(sortition.witnesses[:en]) - end - end - - context "when sortition result" do - let(:sortition) { create(:sortition, component:) } - let!(:proposals) do - create_list(:proposal, 10, - component: sortition.decidim_proposals_component, - created_at: sortition.request_timestamp - 1.day, - skip_injection: true) - end - - before do - sortition.update(selected_proposals: Decidim::Sortitions::Admin::Draw.for(sortition)) - visit_component - find("#sortitions .card__list").click - end - - context "when votes are enabled" do - let!(:decidim_proposals_component) { create(:proposal_component, :with_votes_enabled, organization: component.organization) } - let!(:sortition) { create(:sortition, component:, decidim_proposals_component:) } - - it "shows all selected proposals" do - sortition.proposals.each do |p| - expect(page).to have_content(translated(p.title)) - end - end - end - - it "there are selected proposals" do - expect(sortition.selected_proposals).not_to be_empty - end - - it "shows all selected proposals" do - sortition.proposals.each do |p| - expect(page).to have_content(translated(p.title)) - end - end - - it "shows a banner links back to the result" do - proposal = sortition.proposals.last - - within "#proposals" do - click_on translated(proposal.title) - end - - expect(page).to have_content("Included in #{translated(sortition.title)}") - end - end - - context "when cancelled sortition" do - let(:witnesses) { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } - let(:additional_info) { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } - let(:cancel_reason) { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } - let!(:sortition) { create(:sortition, :cancelled, component:, witnesses:, additional_info:, cancel_reason:) } - - before do - page.visit "#{main_component_path(component)}?filter[with_any_state]=cancelled" - find("#sortitions .card__list").click - end - - context "when the field is additional_info" do - it_behaves_like "has embedded video in description", :additional_info - end - - it "shows the cancel reasons" do - expect(page).to have_content(sortition.cancel_reason[:en]) - end - end -end diff --git a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb deleted file mode 100644 index 89c3484181b06..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" -require "decidim/core/test/shared_examples/social_share_examples" - -describe "Social shares" do - let(:organization) { create(:organization) } - let(:participatory_process) { create(:participatory_process, hero_image:, organization:) } - let(:hero_image) { Decidim::Dev.test_file("city2.jpeg", "image/jpeg") } - let(:component) { create(:sortition_component, participatory_space: participatory_process) } - let(:sortition) { create(:sortition, component:, additional_info:) } - let(:content_block) { create(:content_block, organization:, manifest_name: :hero, scope_name: :homepage) } - let(:additional_info) { { en: "Description

" } } - let(:description_image_path) { Rails.application.routes.url_helpers.rails_blob_path(description_image, only_path: true) } - let(:description_image) do - ActiveStorage::Blob.create_and_upload!( - io: File.open(Decidim::Dev.asset("city.jpeg")), - filename: "description_image.jpg", - content_type: "image/jpeg" - ) - end - let(:block_attachment_file) { Decidim::Dev.test_file("icon.png", "image/png") } - let(:resource) { sortition } - - before do - if content_block - content_block.images_container.background_image = block_attachment_file - content_block.save! - end - switch_to_host(organization.host) - end - - it_behaves_like "a social share meta tag", "description_image.jpg" - it_behaves_like "a social share widget" - it_behaves_like "a social share via QR code" - - context "when no description image" do - let(:additional_info) { nil } - let(:description_image_path) { "" } - - it_behaves_like "a social share meta tag", "city2.jpeg" - end - - context "when listing all sortitions" do - let(:resource) { main_component_path(component) } - - it_behaves_like "a social share meta tag", "city2.jpeg" - end -end diff --git a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb deleted file mode 100644 index 6e92751a705f0..0000000000000 --- a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "sortitions" do - include_context "with a component" - - let(:manifest_name) { "sortitions" } - let!(:user) { create(:user, :confirmed, organization: participatory_process.organization) } - - context "when there are no sortitions" do - it "shows an empty page with a message" do - visit_component - - within "main" do - expect(page).to have_content("There are no sortitions yet.") - end - end - end - - context "when listing sortitions in a participatory process" do - it "lists all the sortitions" do - create_list(:sortition, 3, component:) - visit_component - expect(page).to have_css(".card__list", count: 3) - end - - context "when order by 'random'" do - let!(:lucky_sortition) { create(:sortition, component:) } - let!(:unlucky_sortition) { create(:sortition, component:) } - - it "lists the sortitions ordered randomly" do - page.visit "#{main_component_path(component)}?order=random" - - expect(page).to have_css(".card__list", count: 2) - expect(page).to have_css(".card__list", text: lucky_sortition.title[:en]) - expect(page).to have_css(".card__list", text: unlucky_sortition.title[:en]) - end - end - - context "when ordering by 'recent'" do - it "lists the sortitions ordered by created at" do - older = create(:sortition, component:, created_at: 1.month.ago) - recent = create(:sortition, component:) - - visit_component - - expect(page).to have_css(".order-by .button:first-child", text: recent.title[:en]) - expect(page).to have_css(".order-by .button:last-child", text: older.title[:en]) - end - end - - context "when paginating" do - let!(:collection) { create_list(:sortition, collection_size, component:) } - let!(:resource_selector) { ".card__list" } - - it_behaves_like "a paginated resource" - end - end - - describe "filters" do - context "when filtering by text" do - it "updates the current URL" do - create(:sortition, component:, title: { en: "Foobar sortition" }) - create(:sortition, component:, title: { en: "Another sortition" }) - visit_component - - within "form.new_filter" do - fill_in("filter[search_text_cont]", with: "foobar") - within "div.filter-search" do - click_on - end - end - - expect(page).to have_no_content("Another sortition") - expect(page).to have_content("Foobar sortition") - - filter_params = CGI.parse(URI.parse(page.current_url).query) - expect(filter_params["filter[search_text_cont]"]).to eq(["foobar"]) - end - end - end -end diff --git a/decidim-sortitions/spec/types/integration_schema_spec.rb b/decidim-sortitions/spec/types/integration_schema_spec.rb deleted file mode 100644 index 9806240409abf..0000000000000 --- a/decidim-sortitions/spec/types/integration_schema_spec.rb +++ /dev/null @@ -1,186 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" -require "decidim/api/test" -require "decidim/sortitions/test/factories" - -describe "Decidim::Api::QueryType" do - include_context "with a graphql decidim component" do - let(:component_fragment) do - %( - fragment fooComponent on Sortitions { - sortition(id: #{sortition.id}){ - acceptsNewComments - additionalInfo { translation(locale: "#{locale}") } - author { id } - cancelReason { translation(locale: "#{locale}") } - cancelledByUser { id } - cancelledOn - candidateProposals - taxonomies { id } - comments { id } - commentsHaveAlignment - commentsHaveVotes - createdAt - dice - hasComments - id - proposals { - id - title { translation(locale: "#{locale}") } - } - reference - requestTimestamp - selectedProposals - targetItems - title { translation(locale: "#{locale}") } - totalCommentsCount - type - updatedAt - url - userAllowedToComment - witnesses { translation(locale: "#{locale}") } - } - } - ) - end - end - let(:component_type) { "Sortitions" } - let!(:current_component) { create(:sortition_component, participatory_space: participatory_process) } - let(:author) { create(:user, :confirmed, :admin, organization: current_component.organization) } - let!(:sortition) { create(:sortition, component: current_component, taxonomies:, author:) } - - let(:sortition_single_result) do - sortition.reload - { - "acceptsNewComments" => sortition.accepts_new_comments?, - "additionalInfo" => { "translation" => sortition.additional_info[locale] }, - "author" => { "id" => sortition.author.id.to_s }, - "cancelReason" => sortition.cancel_reason, - "cancelledByUser" => sortition.cancelled_by_user, - "cancelledOn" => sortition.cancelled_on, - "candidateProposals" => sortition.candidate_proposals, - "taxonomies" => [{ "id" => sortition.taxonomies.first.id.to_s }], - "comments" => [], - "commentsHaveAlignment" => sortition.comments_have_alignment?, - "commentsHaveVotes" => sortition.comments_have_votes?, - "createdAt" => sortition.created_at.to_time.iso8601, - "dice" => sortition.dice, - "hasComments" => sortition.comment_threads.size.positive?, - "id" => sortition.id.to_s, - "proposals" => sortition.proposals.map { |proposal| { "id" => proposal.id.to_s, "title" => { "translation" => translated(proposal.title) } } }, - "reference" => sortition.reference, - "requestTimestamp" => sortition.request_timestamp.to_time.iso8601, - "selectedProposals" => sortition.selected_proposals, - "targetItems" => sortition.target_items, - "title" => { "translation" => sortition.title[locale] }, - "totalCommentsCount" => sortition.comments_count, - "type" => "Decidim::Sortitions::Sortition", - "updatedAt" => sortition.updated_at.to_time.iso8601, - "url" => Decidim::ResourceLocatorPresenter.new(sortition).url, - "userAllowedToComment" => sortition.user_allowed_to_comment?(current_user), - "witnesses" => { "translation" => sortition.witnesses[locale] } - } - end - - let(:sortition_data) do - { - "__typename" => "Sortitions", - "id" => current_component.id.to_s, - "name" => { "translation" => translated(current_component.name) }, - "sortitions" => { - "edges" => [ - { - "node" => sortition_single_result - } - ] - }, - "url" => Decidim::EngineRouter.main_proxy(current_component).root_url, - "weight" => 0 - } - end - - describe "commentable" do - let(:component_fragment) { nil } - let(:participatory_process_query) do - %( - commentable(id: "#{sortition.id}", type: "Decidim::Sortitions::Sortition", locale: "en", toggleTranslations: false) { - __typename - } - ) - end - - it "executes successfully" do - expect { response }.not_to raise_error - end - - it do - expect(response).to eq({ "commentable" => { "__typename" => "Sortition" } }) - end - end - - describe "valid connection query" do - let(:component_fragment) do - %( - fragment fooComponent on Sortitions { - sortitions { - edges{ - node{ - acceptsNewComments - additionalInfo { translation(locale: "#{locale}") } - author { id } - cancelReason { translation(locale: "#{locale}") } - cancelledByUser { id } - cancelledOn - candidateProposals - taxonomies { id } - comments { id } - commentsHaveAlignment - commentsHaveVotes - createdAt - dice - hasComments - id - proposals { - id - title { translation(locale: "#{locale}") } - } - reference - requestTimestamp - selectedProposals - targetItems - title { translation(locale: "#{locale}") } - totalCommentsCount - type - updatedAt - url - userAllowedToComment - witnesses { translation(locale: "#{locale}") } - } - } - } - } - ) - end - - it "executes successfully" do - expect { response }.not_to raise_error - end - - it { expect(response["participatoryProcess"]["components"].first).to eq(sortition_data) } - end - - describe "valid query" do - it "executes successfully" do - expect { response }.not_to raise_error - end - - it { expect(response["participatoryProcess"]["components"].first["sortition"]).to eq(sortition_single_result) } - end - - include_examples "with resource visibility" do - let(:component_factory) { :sortition_component } - let(:lookout_key) { "sortition" } - let(:query_result) { sortition_single_result } - end -end diff --git a/decidim-sortitions/spec/types/sortition_type_spec.rb b/decidim-sortitions/spec/types/sortition_type_spec.rb deleted file mode 100644 index 1d3956a84ad7a..0000000000000 --- a/decidim-sortitions/spec/types/sortition_type_spec.rb +++ /dev/null @@ -1,203 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" -require "decidim/api/test" - -module Decidim - module Sortitions - describe SortitionType, type: :graphql do - include_context "with a graphql class type" - - let(:model) { create(:sortition) } - let(:organization) { model.organization } - - include_examples "taxonomizable interface" - describe "id" do - let(:query) { "{ id }" } - - it "returns all the required fields" do - expect(response).to include("id" => model.id.to_s) - end - end - - describe "dice" do - let(:query) { "{ dice }" } - - it "returns the dice field" do - expect(response["dice"]).to eq(model.dice) - end - end - - describe "targetItems" do - let(:query) { "{ targetItems }" } - - it "returns the targetItems field" do - expect(response["targetItems"]).to eq(model.target_items) - end - end - - describe "requestTimestamp" do - let(:query) { "{ requestTimestamp }" } - - it "returns when the sortition was created" do - expect(response["requestTimestamp"]).to eq(model.request_timestamp.to_time.iso8601) - end - end - - describe "proposals" do - let(:query) { "{ proposals { id } }" } - - it "returns all the required fields" do - response_ids = response["proposals"].map { |selected_proposal| selected_proposal } - expect(response_ids).to eq(model.proposals.map { |s| { "id" => s.id.to_s } }) - end - end - - describe "selectedProposals" do - let(:query) { "{ selectedProposals }" } - - it "returns all the required fields" do - response_ids = response["selectedProposals"].map { |selected_proposal| selected_proposal } - expect(response_ids).to eq(model.selected_proposals) - end - end - - describe "witnesses" do - let(:query) { '{ witnesses { translation(locale: "en")}}' } - - it "returns all the required fields" do - expect(response["witnesses"]["translation"]).to eq(model.witnesses["en"]) - end - end - - describe "reference" do - let(:query) { "{ reference }" } - - it "returns the reference field" do - expect(response["reference"]).to eq(model.reference) - end - end - - describe "additionalInfo" do - let(:query) { '{ additionalInfo { translation(locale: "en")}}' } - - it "returns all the required fields" do - expect(response["additionalInfo"]["translation"]).to eq(model.additional_info["en"]) - end - end - - describe "title" do - let(:query) { '{ title { translation(locale: "en")}}' } - - it "returns all the required fields" do - expect(response["title"]["translation"]).to eq(model.title["en"]) - end - end - - describe "createdAt" do - let(:query) { "{ createdAt }" } - - it "returns when the sortition was created" do - expect(response["createdAt"]).to eq(model.created_at.to_time.iso8601) - end - end - - describe "updatedAt" do - let(:query) { "{ updatedAt }" } - - it "returns when the sortition was updated" do - expect(response["updatedAt"]).to eq(model.updated_at.to_time.iso8601) - end - end - - describe "url" do - let(:query) { "{ url }" } - - it "returns all the required fields" do - expect(response["url"]).to eq(Decidim::ResourceLocatorPresenter.new(model).url) - end - end - - describe "candidateProposals" do - let(:query) { "{ candidateProposals }" } - - it "returns the candidateProposals field" do - expect(response["candidateProposals"]).to eq(model.candidate_proposals) - end - end - - context "when the sortition is cancelled" do - let(:component) { create(:sortition_component) } - let(:author) { create(:user, :confirmed, :admin, organization: component.organization) } - let(:model) { create(:sortition, :cancelled, component:, author:, cancelled_by_user: author) } - - describe "cancelReason" do - let(:query) { '{ cancelReason { translation(locale: "en")}}' } - - it "returns all the required fields" do - expect(response["cancelReason"]["translation"]).to eq(model.cancel_reason["en"]) - end - end - - describe "cancelledOn" do - let(:query) { "{ cancelledOn }" } - - it "returns when the sortition was cancelled" do - expect(response["cancelledOn"]).to eq(model.cancelled_on.to_date.iso8601) - end - end - - describe "cancelledByUser" do - let(:query) { "{ cancelledByUser { name }}" } - - it "returns the user that cancelled the sortition" do - expect(response["cancelledByUser"]["name"]).to eq(model.cancelled_by_user.name) - end - end - - context "when participatory space is private" do - let(:participatory_space) { create(:participatory_process, :with_steps, :private, organization: current_organization) } - let(:current_component) { create(:sortition_component, participatory_space:) } - let(:model) { create(:sortition, component: current_component) } - let(:query) { "{ id }" } - - it "returns nothing" do - expect(response).to be_nil - end - end - - context "when participatory space is private but transparent" do - let(:participatory_space) { create(:assembly, :private, :transparent, organization: current_organization) } - let(:current_component) { create(:sortition_component, :published, participatory_space:) } - let(:model) { create(:sortition, component: current_component) } - let(:query) { "{ id }" } - - it "returns the object" do - expect(response).to include("id" => model.id.to_s) - end - end - - context "when participatory space is not published" do - let(:participatory_space) { create(:participatory_process, :with_steps, :unpublished, organization: current_organization) } - let(:current_component) { create(:sortition_component, participatory_space:) } - let(:model) { create(:sortition, component: current_component) } - let(:query) { "{ id }" } - - it "returns nothing" do - expect(response).to be_nil - end - end - - context "when component is not published" do - let(:current_component) { create(:sortition_component, :unpublished, organization: current_organization) } - let(:model) { create(:sortition, component: current_component) } - let(:query) { "{ id }" } - - it "returns nothing" do - expect(response).to be_nil - end - end - end - end - end -end diff --git a/decidim-sortitions/spec/types/sortitions_type_spec.rb b/decidim-sortitions/spec/types/sortitions_type_spec.rb deleted file mode 100644 index 1955a846753f4..0000000000000 --- a/decidim-sortitions/spec/types/sortitions_type_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" -require "decidim/api/test" - -module Decidim - module Sortitions - describe SortitionsType, type: :graphql do - include_context "with a graphql class type" - let(:model) { create(:sortition_component) } - - it_behaves_like "a component query type" - - describe "sortitions" do - let!(:component_sortitions) { create_list(:sortition, 2, component: model) } - let!(:other_sortitions) { create_list(:sortition, 2) } - - let(:query) { "{ sortitions { edges { node { id } } } }" } - - it "returns the published sortitions" do - ids = response["sortitions"]["edges"].map { |edge| edge["node"]["id"] } - expect(ids).to include(*component_sortitions.map(&:id).map(&:to_s)) - expect(ids).not_to include(*other_sortitions.map(&:id).map(&:to_s)) - end - end - - describe "sortition" do - let(:query) { "query sortition($id: ID!){ sortition(id: $id) { id } }" } - let(:variables) { { id: sortition.id.to_s } } - - context "when the sortition belongs to the component" do - let!(:sortition) { create(:sortition, component: model) } - - it "finds the sortition" do - expect(response["sortition"]["id"]).to eq(sortition.id.to_s) - end - end - - context "when the sortition does not belong to the component" do - let!(:sortition) { create(:sortition, component: create(:sortition_component)) } - - it "returns null" do - expect(response["sortition"]).to be_nil - end - end - end - end - end -end diff --git a/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb b/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb index 0b1a83ad175e6..a0c164cb0d556 100644 --- a/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb +++ b/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb @@ -89,6 +89,16 @@ def default_filter_params with_any_state: %w(open) } end + + def add_breadcrumb_item + return {} if survey.blank? + + { + label: translated_attribute(survey.title), + url: Decidim::EngineRouter.main_proxy(current_component).survey_path(survey), + active: false + } + end end end end diff --git a/decidim-surveys/config/locales/ca-IT.yml b/decidim-surveys/config/locales/ca-IT.yml index 74e983f20084a..47e021e9f06c7 100644 --- a/decidim-surveys/config/locales/ca-IT.yml +++ b/decidim-surveys/config/locales/ca-IT.yml @@ -48,6 +48,17 @@ ca-IT: email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de rebre notificacions seguint l'enllaç anterior. email_subject: Una nova enquesta a %{participatory_space_title} notification_title: L'enquesta %{resource_title} en %{participatory_space_title} ja està oberta. + open_data: + help: + published_survey_user_responses: + body: El contingut de la resposta + created_at: La data en què es va crear aquesta resposta + id: Identificador únic per la resposta a l'enquesta + ip_hash: Adreça IP de la enquestada, codificada (hash) per privacitat + question: La pregunta que es va respondre + registered: Participant registrada + unregistered: Participant no registrada + user_status: Estat de la usuària que va enviar la resposta statistics: responses: 'Respostes:' responses_count: Respostes diff --git a/decidim-surveys/config/locales/ca.yml b/decidim-surveys/config/locales/ca.yml index ee57591b1fb77..511dc34128dbe 100644 --- a/decidim-surveys/config/locales/ca.yml +++ b/decidim-surveys/config/locales/ca.yml @@ -48,6 +48,17 @@ ca: email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de rebre notificacions seguint l'enllaç anterior. email_subject: Una nova enquesta a %{participatory_space_title} notification_title: L'enquesta %{resource_title} en %{participatory_space_title} ja està oberta. + open_data: + help: + published_survey_user_responses: + body: El contingut de la resposta + created_at: La data en què es va crear aquesta resposta + id: Identificador únic per la resposta a l'enquesta + ip_hash: Adreça IP de la enquestada, codificada (hash) per privacitat + question: La pregunta que es va respondre + registered: Participant registrada + unregistered: Participant no registrada + user_status: Estat de la usuària que va enviar la resposta statistics: responses: 'Respostes:' responses_count: Respostes diff --git a/decidim-surveys/config/locales/en.yml b/decidim-surveys/config/locales/en.yml index 24f8c163c55d2..4e92e4b9352df 100644 --- a/decidim-surveys/config/locales/en.yml +++ b/decidim-surveys/config/locales/en.yml @@ -49,6 +49,17 @@ en: email_outro: You have received this notification because you are following %{participatory_space_title}. You can stop receiving notifications following the previous link. email_subject: A new survey in %{participatory_space_title} notification_title: The survey %{resource_title} in %{participatory_space_title} is now open. + open_data: + help: + published_survey_user_responses: + body: The content of the response + created_at: Timestamp when the response was created + id: Unique identifier for the survey response + ip_hash: Hashed IP address of the respondent for privacy + question: The question that was Responded + registered: Registered participant + unregistered: Unregistered participant + user_status: Status of the user who submitted the response statistics: responses: 'Responses:' responses_count: Responses diff --git a/decidim-surveys/config/locales/es-MX.yml b/decidim-surveys/config/locales/es-MX.yml index 49e2c7dc1c905..f376da438495a 100644 --- a/decidim-surveys/config/locales/es-MX.yml +++ b/decidim-surveys/config/locales/es-MX.yml @@ -48,6 +48,17 @@ es-MX: email_outro: Has recibido esta notificación porque estás siguiendo %{participatory_space_title}. Puedes dejar de recibir notificaciones siguiendo el enlace anterior. email_subject: Nueva encuesta en %{participatory_space_title} notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}. + open_data: + help: + published_survey_user_responses: + body: El contenido de la respuesta + created_at: La fecha en la que se creó esta respuesta + id: Identificador único para la respuesta a la encuesta + ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad + question: La pregunta que se respondió + registered: Participante registrada + unregistered: Participante no registrada + user_status: Estado de la usuaria que envió la respuesta statistics: responses: 'Respuestas:' responses_count: Respuestas diff --git a/decidim-surveys/config/locales/es-PY.yml b/decidim-surveys/config/locales/es-PY.yml index c386715f3b78e..5c77b85e08657 100644 --- a/decidim-surveys/config/locales/es-PY.yml +++ b/decidim-surveys/config/locales/es-PY.yml @@ -48,6 +48,17 @@ es-PY: email_outro: Has recibido esta notificación porque estás siguiendo %{participatory_space_title}. Puedes dejar de recibir notificaciones siguiendo el enlace anterior. email_subject: Nueva encuesta en %{participatory_space_title} notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}. + open_data: + help: + published_survey_user_responses: + body: El contenido de la respuesta + created_at: La fecha en la que se creó esta respuesta + id: Identificador único para la respuesta a la encuesta + ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad + question: La pregunta que se respondió + registered: Participante registrada + unregistered: Participante no registrada + user_status: Estado de la usuaria que envió la respuesta statistics: responses: 'Respuestas:' responses_count: Respuestas diff --git a/decidim-surveys/config/locales/es.yml b/decidim-surveys/config/locales/es.yml index b793537792096..71b369fb78bf7 100644 --- a/decidim-surveys/config/locales/es.yml +++ b/decidim-surveys/config/locales/es.yml @@ -48,6 +48,17 @@ es: email_outro: Has recibido esta notificación porque estás siguiendo el espacio "%{participatory_space_title}". Puedes dejar de recibir notificaciones siguiendo el enlace anterior. email_subject: Nueva encuesta en %{participatory_space_title} notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}. + open_data: + help: + published_survey_user_responses: + body: El contenido de la respuesta + created_at: La fecha en la que se creó esta respuesta + id: Identificador único para la respuesta a la encuesta + ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad + question: La pregunta que se respondió + registered: Participante registrada + unregistered: Participante no registrada + user_status: Estado de la usuaria que envió la respuesta statistics: responses: 'Respuestas:' responses_count: Respuestas diff --git a/decidim-surveys/config/locales/fr-CA.yml b/decidim-surveys/config/locales/fr-CA.yml index 9e5c5a0ad1283..af24af25cc2f7 100644 --- a/decidim-surveys/config/locales/fr-CA.yml +++ b/decidim-surveys/config/locales/fr-CA.yml @@ -48,6 +48,17 @@ fr-CA: email_outro: Vous avez reçu cette notification car vous suivez l'espace participatif %{participatory_space_title}. Vous pouvez arrêter de recevoir ces notifications à partir du lien précédent. email_subject: Une nouvelle enquête a été créée dans %{participatory_space_title} notification_title: 'L''enquête %{resource_title} est ouverte. Vous pouvez y participer en vous rendant sur le lien suivant : %{participatory_space_title}.' + open_data: + help: + published_survey_user_responses: + body: Le contenu de la réponse + created_at: Horodatage de création de la réponse + id: Identifiant unique pour la réponse à l'enquête + ip_hash: Adresse IP du répondant pour confidentialité + question: La question à laquelle on a répondu + registered: Participant inscrit + unregistered: Participant non inscrit + user_status: Statut de l'utilisateur qui a soumis la réponse statistics: responses: 'Réponses:' responses_count: Réponses diff --git a/decidim-surveys/config/locales/fr.yml b/decidim-surveys/config/locales/fr.yml index e484ac36a4385..9709ab79d256a 100644 --- a/decidim-surveys/config/locales/fr.yml +++ b/decidim-surveys/config/locales/fr.yml @@ -48,6 +48,17 @@ fr: email_outro: Vous avez reçu cette notification car vous suivez la concertation %{participatory_space_title}. Si vous souhaitez vous désabonner des notifications, connectez-vous à la plateforme, puis rendez-vous dans l'onglet “Mon compte” > “Paramètres des notifications”. email_subject: Une nouvelle enquête a été créée dans %{participatory_space_title} notification_title: 'L''enquête %{resource_title} est ouverte. Vous pouvez y participer en vous rendant sur le lien suivant : %{participatory_space_title}.' + open_data: + help: + published_survey_user_responses: + body: Le contenu de la réponse + created_at: Horodatage de création de la réponse + id: Identifiant unique pour la réponse à l'enquête + ip_hash: Adresse IP du répondant pour confidentialité + question: La question à laquelle on a répondu + registered: Participant inscrit + unregistered: Participant non inscrit + user_status: Statut de l'utilisateur qui a soumis la réponse statistics: responses: 'Réponses:' responses_count: Réponses diff --git a/decidim-surveys/config/locales/sv.yml b/decidim-surveys/config/locales/sv.yml index cd7f0fb2e6633..519d2753591b3 100644 --- a/decidim-surveys/config/locales/sv.yml +++ b/decidim-surveys/config/locales/sv.yml @@ -34,6 +34,17 @@ sv: email_outro: Du har fått det här meddelandet eftersom du följer %{participatory_space_title}. Du kan sluta att ta emot meddelanden via föregående länk. email_subject: En ny enkät i %{participatory_space_title} notification_title: Enkäten %{resource_title} i %{participatory_space_title} är nu öppen. + open_data: + help: + published_survey_user_responses: + body: + created_at: Datum då resultatet skapades + id: Unik identifierare för enkätsvar + ip_hash: Hashad IP-adress åt respondenten för sekretess + question: Frågan som besvarades + registered: Registrerad deltagare + unregistered: Oregistrerad deltagare + user_status: Status för användaren som skickade svaret statistics: responses: 'Svar:' surveys_count_tooltip: Antalet tillgängliga undersökningar och svar som samlats in. diff --git a/decidim-surveys/decidim-surveys.gemspec b/decidim-surveys/decidim-surveys.gemspec index 5bc7942a1d34c..d748461a209ce 100644 --- a/decidim-surveys/decidim-surveys.gemspec +++ b/decidim-surveys/decidim-surveys.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-surveys" s.summary = "Decidim surveys module" diff --git a/decidim-surveys/lib/decidim/surveys.rb b/decidim-surveys/lib/decidim/surveys.rb index d49ea6def2b56..6de3029433cee 100644 --- a/decidim-surveys/lib/decidim/surveys.rb +++ b/decidim-surveys/lib/decidim/surveys.rb @@ -10,5 +10,6 @@ module Decidim # This namespace holds the logic of the `Surveys` component. This component # allows users to create surveys in a participatory process. module Surveys + autoload :UserResponsesSerializer, "decidim/surveys/user_responses_serializer" end end diff --git a/decidim-surveys/lib/decidim/surveys/component.rb b/decidim-surveys/lib/decidim/surveys/component.rb index ce93db5c6ba1e..f2f89ea4ae30a 100644 --- a/decidim-surveys/lib/decidim/surveys/component.rb +++ b/decidim-surveys/lib/decidim/surveys/component.rb @@ -71,6 +71,23 @@ exports.serializer Decidim::Forms::UserResponsesSerializer end + component.exports :published_survey_user_responses do |exports| + exports.collection do |component| + survey = Decidim::Surveys::Survey.find_by(component: component) + + Decidim::Forms::Response + .joins(:question) + .where(questionnaire: survey.questionnaire) + .where.not(decidim_forms_questions: { question_type: %w(separator title_and_description) }) + .where.not(decidim_forms_questions: { survey_responses_published_at: nil }) + .includes(:question, :choices, :user) + end + + exports.formats [] + exports.include_in_open_data = true + exports.serializer Decidim::Surveys::UserResponsesSerializer + end + component.seeds do |participatory_space| require "decidim/surveys/seeds" diff --git a/decidim-surveys/lib/decidim/surveys/seeds.rb b/decidim-surveys/lib/decidim/surveys/seeds.rb index 4ffd0647cd5ac..8f67ae902d6e5 100644 --- a/decidim-surveys/lib/decidim/surveys/seeds.rb +++ b/decidim-surveys/lib/decidim/surveys/seeds.rb @@ -96,7 +96,7 @@ def create_questions!(questionnaire:) # Files type questions do not support being conditionals for another questions files_question = questionnaire.questions.where(question_type: "files") - possible_condition_questions = questionnaire.questions.excluding(files_question) + possible_condition_questions = questionnaire.questions.excluding(question, files_question) question.display_conditions.create!( condition_question: possible_condition_questions.sample, diff --git a/decidim-surveys/lib/decidim/surveys/test/factories.rb b/decidim-surveys/lib/decidim/surveys/test/factories.rb index b1f590ee43784..f4222633dddb5 100644 --- a/decidim-surveys/lib/decidim/surveys/test/factories.rb +++ b/decidim-surveys/lib/decidim/surveys/test/factories.rb @@ -19,7 +19,7 @@ transient do skip_injection { false } end - questionnaire { build(:questionnaire, :with_questions, skip_injection:) } + questionnaire { build(:questionnaire, :with_questions, questionnaire_for: component.try(:participatory_space), skip_injection:) } component { build(:surveys_component, skip_injection:) } trait :published do diff --git a/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb b/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb new file mode 100644 index 0000000000000..4ea43a1b082d6 --- /dev/null +++ b/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Decidim + module Surveys + class UserResponsesSerializer < Decidim::Exporters::Serializer + include Decidim::TranslationsHelper + + # Public: Exports a hash with the serialized data for the user response. + def serialize + # Returns a csv export of surveys responses only if they have been published. + response = resource + { + id: response.session_token, + created_at: response.created_at, + ip_hash: response.ip_hash, + user_status: I18n.t(response.decidim_user_id.present? ? "registered" : "unregistered", scope: "decidim.open_data.help.published_survey_user_responses"), + question: question_text(response), + body: normalize_body(response) + } + end + + private + + def question_text(response) + if response.question.present? + "#{response.question.position}. #{translated_attribute(response.question.body)}" + else + "" + end + end + + def normalize_body(response) + return response.body if response.body.present? + + normalize_choices(response.choices) + end + + def normalize_choices(choices) + choices.map { |choice| translated_attribute(choice.try(:body)) }.compact.join(", ") + end + + def translated_attribute(attribute) + if attribute.is_a?(Hash) + attribute[I18n.locale.to_s] || attribute[organization.default_locale] || attribute.values.first + else + attribute.to_s + end + end + + def organization + resource.questionnaire.questionnaire_for.organization + end + end + end +end diff --git a/decidim-surveys/spec/services/open_data_exporter_spec.rb b/decidim-surveys/spec/services/open_data_exporter_spec.rb new file mode 100644 index 0000000000000..e46feb2c6244a --- /dev/null +++ b/decidim-surveys/spec/services/open_data_exporter_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe Decidim::OpenDataExporter do # rubocop:disable RSpec/SpecFilePathFormat + subject { described_class.new(organization, path) } + + let(:organization) { create(:organization) } + let(:path) { Rails.root.join("tmp/open-data-export") } + + describe "published survey user responses" do + let(:component) { create(:surveys_component, organization:, published_at: Time.current) } + let(:questionnaire) { create(:questionnaire) } + let(:questions) { create(:questionnaire_question, survey_responses_published_at: Time.current) } + + context "when no responses are published" do + before do + questions.update(survey_responses_published_at: nil) + end + + it "does not export unpublished responses" do + subject.export + + csv_file = Dir.glob(path.join("*published-survey-user-responses*.csv")).first + + expect(CSV.read(csv_file, headers: true).count).to eq(0) if csv_file + end + end + + context "when survey component is unpublished" do + before do + component.update(published_at: nil) + questions.update(survey_responses_published_at: nil) + end + + it "does not export responses from unpublished responses" do + subject.export + + csv_file = Dir.glob(path.join("*published-survey-user-responses*.csv")).first + + expect(CSV.read(csv_file, headers: true).count).to eq(0) if csv_file + end + end + end +end diff --git a/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb b/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb index 8901ba7259097..a6fffec05c08b 100644 --- a/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb +++ b/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb @@ -96,13 +96,13 @@ # There is a chance of a flaky spec here, as sometimes the jobs are not enqueued in the correct order # causing user's confirmations to be sent after the export is ready - def perform_and_wait_for_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block) + def perform_and_wait_for_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &) while enqueued_jobs.size.positive? perform_enqueued_jobs sleep 0.5 end - perform_enqueued_jobs(only:, except:, queue:, at:, &block) + perform_enqueued_jobs(only:, except:, queue:, at:, &) while enqueued_jobs.size.positive? perform_enqueued_jobs diff --git a/decidim-surveys/spec/system/admin_access_spec.rb b/decidim-surveys/spec/system/admin_access_spec.rb new file mode 100644 index 0000000000000..194786c6e3cb0 --- /dev/null +++ b/decidim-surveys/spec/system/admin_access_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "decidim/admin/test/admin_participatory_space_component_access_examples" + +describe "AdminAccess" do + let(:manifest_name) { "surveys" } + let!(:survey) { create(:survey, :published, :clean_after_publish, component:) } + let(:title) { "Surveys" } + + include_context "when managing a component as an admin" + include_examples "accessing the component in a participatory space" +end diff --git a/decidim-surveys/spec/system/private_space_survey_spec.rb b/decidim-surveys/spec/system/private_space_survey_spec.rb index 90d36521bdfee..4e8ddd8b7978e 100644 --- a/decidim-surveys/spec/system/private_space_survey_spec.rb +++ b/decidim-surveys/spec/system/private_space_survey_spec.rb @@ -57,7 +57,7 @@ def visit_component expect(page).to have_no_css(".form.response-questionnaire") - within "[data-question-readonly]" do + within ".response-questionnaire__step" do expect(page).to have_i18n_content(question.body) expect(page).not_to have_i18n_content(question_conditioned.body) end diff --git a/decidim-surveys/spec/system/survey_spec.rb b/decidim-surveys/spec/system/survey_spec.rb index a4e2f14d90a61..30039b8d83f7d 100644 --- a/decidim-surveys/spec/system/survey_spec.rb +++ b/decidim-surveys/spec/system/survey_spec.rb @@ -39,6 +39,10 @@ it "does not allow responding the survey" do visit_component + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + end + choose "All" expect(page).to have_i18n_content(questionnaire.title) @@ -100,6 +104,11 @@ choose "All" click_on translated_attribute(questionnaire.title) + within(".menu-bar") do + expect(page).to have_content(translated(component.name)) + expect(page).to have_content(translated(questionnaire.title)) + end + # does not show the charts if not published expect(page.html).not_to include('new Chartkick["ColumnChart"]("chart-1"') expect(page.html).not_to include('new Chartkick["ColumnChart"]("chart-2"') diff --git a/decidim-system/config/locales/ca-IT.yml b/decidim-system/config/locales/ca-IT.yml index 0e335127c78aa..8467cdf931bd1 100644 --- a/decidim-system/config/locales/ca-IT.yml +++ b/decidim-system/config/locales/ca-IT.yml @@ -283,7 +283,7 @@ ca-IT: intro: | Si us plau, vés en compte en considerar canviar aquests ajustos. Com menys opcions permetis, millor. Permetre extensions d'arxius específiques o tipus MIME pot exposar a les usuàries del sistema a riscos de seguretat i també pot afectar l'accessibilitat del lloc web. - header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre al lloc de documentació. + header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre a l'espai de documentació. index: title: Organitzacions new: diff --git a/decidim-system/config/locales/ca.yml b/decidim-system/config/locales/ca.yml index 3e8fce1344782..59b11b0dc8263 100644 --- a/decidim-system/config/locales/ca.yml +++ b/decidim-system/config/locales/ca.yml @@ -283,7 +283,7 @@ ca: intro: | Si us plau, vés en compte en considerar canviar aquests ajustos. Com menys opcions permetis, millor. Permetre extensions d'arxius específiques o tipus MIME pot exposar a les usuàries del sistema a riscos de seguretat i també pot afectar l'accessibilitat del lloc web. - header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre al lloc de documentació. + header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre a l'espai de documentació. index: title: Organitzacions new: diff --git a/decidim-system/config/locales/es-MX.yml b/decidim-system/config/locales/es-MX.yml index ca628cc53421d..6c1f704353185 100644 --- a/decidim-system/config/locales/es-MX.yml +++ b/decidim-system/config/locales/es-MX.yml @@ -284,7 +284,7 @@ es-MX: intro: | Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor. Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web. - header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación. + header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación. index: title: Organizaciones new: diff --git a/decidim-system/config/locales/es-PY.yml b/decidim-system/config/locales/es-PY.yml index 19d205996871c..1e6676bccba3a 100644 --- a/decidim-system/config/locales/es-PY.yml +++ b/decidim-system/config/locales/es-PY.yml @@ -284,7 +284,7 @@ es-PY: intro: | Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor. Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web. - header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación. + header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación. index: title: Organizaciones new: diff --git a/decidim-system/config/locales/es.yml b/decidim-system/config/locales/es.yml index a988fdac1799b..4a12d6cc4cb1d 100644 --- a/decidim-system/config/locales/es.yml +++ b/decidim-system/config/locales/es.yml @@ -284,7 +284,7 @@ es: intro: | Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor. Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web. - header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación. + header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación. index: title: Organizaciones new: diff --git a/decidim-system/config/locales/eu.yml b/decidim-system/config/locales/eu.yml index 2acbf065b73c7..7d014fb663578 100644 --- a/decidim-system/config/locales/eu.yml +++ b/decidim-system/config/locales/eu.yml @@ -285,7 +285,7 @@ eu: Mesedez, kontuz ibili doikuntza horiek aldatzean. Zenbat eta aukera gutxiago, hobe. Fitxategi espezifikoen luzapenak edo MIME motakoak baimentzeak segurtasun-arriskuen eraginpean jar ditzake sistemaren parte-hartzaileak, eta webgunearen irisgarritasunari ere eragin diezaioke. - header_snippets_help_html: Erabili eremu hau HTML goiburuari gauzak gehitzeko. Erabilera ohikoena da JavaScript edo CSS osagarriak behar dituzten hirugarrenen zerbitzuak integratzea. HTMLri meta-etiketa gehigarriak gehitzeko ere erabil dezakezu. Kontuan izan hori orrialde publikoetan soilik renderizatuko dela, ez administrazio-atalean. Kodeak kanpoko APIekin elkarreragiten badu edo aplikazioaren segurtasun-jarraibideak betetzen ez baditu, Edukiaren Segurtasun Politika aldatu beharko da. Irakurri gehiago honi buruz dokumentazioaren kokalekuan. + header_snippets_help_html: Erabili eremu hau HTML goiburuari gauzak gehitzeko. Erabilera ohikoena da JavaScript edo CSS osagarriak behar dituzten hirugarrenen zerbitzuak integratzea. HTMLri meta-etiketa gehigarriak gehitzeko ere erabil dezakezu. Kontuan izan hori orrialde publikoetan soilik renderizatuko dela, ez administrazio-atalean. Kodeak kanpoko APIekin elkarreragiten badu edo aplikazioaren segurtasun-jarraibideak betetzen ez baditu, Edukiaren Segurtasun Politika aldatu beharko da. Irakurri gehiago honi buruz dokumentazioaren kokalekuan. index: title: Erakundeak new: diff --git a/decidim-system/config/locales/fi-plain.yml b/decidim-system/config/locales/fi-plain.yml index 927d5a287dcc5..9cde4529a5dda 100644 --- a/decidim-system/config/locales/fi-plain.yml +++ b/decidim-system/config/locales/fi-plain.yml @@ -283,7 +283,7 @@ fi-pl: intro: | Ole erityisen varovainen harkitessasi näiden asetusten muuttamista. Mitä vähemmän sallit, sitä parempi. Sallimalla tietyt tiedostopäätteet tai MIME-tyypit voit altistaa järjestelmän käyttäjät turvallisuusriskeille ja se voi myös vaikuttaa sivuston saavutettavuuteen. - header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta. + header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta. index: title: Organisaatiot new: diff --git a/decidim-system/config/locales/fi.yml b/decidim-system/config/locales/fi.yml index 03c5534838f84..84b7ee32353b8 100644 --- a/decidim-system/config/locales/fi.yml +++ b/decidim-system/config/locales/fi.yml @@ -283,7 +283,7 @@ fi: intro: | Ole erityisen varovainen harkitessasi näiden asetusten muuttamista. Mitä vähemmän sallit, sitä parempi. Sallimalla tietyt tiedostopäätteet tai MIME-tyypit voit altistaa järjestelmän käyttäjät turvallisuusriskeille ja se voi myös vaikuttaa sivuston saavutettavuuteen. - header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta. + header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta. index: title: Organisaatiot new: diff --git a/decidim-system/config/locales/fr-CA.yml b/decidim-system/config/locales/fr-CA.yml index e64f4e4bcbbb5..944bdf88204bb 100644 --- a/decidim-system/config/locales/fr-CA.yml +++ b/decidim-system/config/locales/fr-CA.yml @@ -216,7 +216,7 @@ fr-CA: intro: | Veuillez être extrèmement prudent lorsque vous envisagez de modifier ces paramètres. Moins vous autorisez, mieux c'est. L'autorisation d'extensions de fichiers spécifiques ou de types MIME peut exposer les utilisateurs du système à des risques de sécurité et peut également affecter l'accessibilité du site. - header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation. + header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation. index: title: Organisations new: diff --git a/decidim-system/config/locales/fr.yml b/decidim-system/config/locales/fr.yml index 8b71d21aadb28..6052268a4813e 100644 --- a/decidim-system/config/locales/fr.yml +++ b/decidim-system/config/locales/fr.yml @@ -216,7 +216,7 @@ fr: intro: | Veuillez être extrêmement prudent lorsque vous envisagez de modifier ces paramètres. Moins vous autorisez, mieux c'est. L'autorisation d'extensions de fichiers spécifiques ou de types MIME peut exposer les utilisateurs du système à des risques de sécurité et peut également affecter l'accessibilité du site. - header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation. + header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation. index: title: Organisations new: diff --git a/decidim-system/config/locales/ja.yml b/decidim-system/config/locales/ja.yml index 9e4cd6ff821b1..1cccb86e4a962 100644 --- a/decidim-system/config/locales/ja.yml +++ b/decidim-system/config/locales/ja.yml @@ -281,7 +281,7 @@ ja: intro: | これらの設定を変更する場合は、余分に注意してください。許可する数が少ないほど好ましいです。 特定のファイル拡張子や MIME タイプを許可することは、システムユーザーをセキュリティリスクにさらす可能性があり、ウェブサイトのアクセシビリティにも影響を与える可能性があります。 - header_snippets_help_html: このフィールドは、HTML の head 内に要素を追加するために使用します。最も一般的な用途は、追加の JavaScript や CSS を必要とするサードパーティサービスの統合です。また、HTML に追加のメタタグを挿入することもできます。なお、この内容は公開ページのみに反映され、管理セクションでは表示されません。もしコードが外部 API と連携したり、アプリケーションのセキュリティガイドラインに準拠していない場合は、Content Security Policy(CSP)の変更が必要になります。詳しくはドキュメントサイトをご覧ください。 + header_snippets_help_html: このフィールドを使用して、HTML の head セクションに要素を追加します。最も一般的な使用例は、追加の JavaScript や CSS を必要とするサードパーティサービスを統合する場合です。また、HTML に追加のメタタグを追加するためにも使用できます。ただし、この機能は公開ページでのみレンダリングされ、管理画面では反映されません。コードが外部 API と連携している場合や、アプリケーションのセキュリティガイドラインに準拠していない場合は、コンテンツセキュリティポリシーの変更が必要になります。詳細については、ドキュメントサイト をご覧ください。 index: title: 組織 new: diff --git a/decidim-system/config/locales/sv.yml b/decidim-system/config/locales/sv.yml index 9b8a9cae60fe2..c21948340f528 100644 --- a/decidim-system/config/locales/sv.yml +++ b/decidim-system/config/locales/sv.yml @@ -231,7 +231,7 @@ sv: title: Tillåtna filändelser file_sizes: title: Maximal filstorlek - header_snippets_help_html: Använd det här fältet för att göra tillägg till HTML-huvudet. Vanligaste användningen är för att integrera tredjepartstjänster som kräver extra JavaScript eller CSS. Du kan också lägga till extra metataggar till HTML. Observera att detta endast kommer att visas på offentliga sidor, inte i admingränssnittet. Om koden använder externa API:er eller bryter mot webbplatsens riktlinjer behöver du ändra säkerhetspolicyn. Läs mer på dokumentationssidan. + header_snippets_help_html: Använd det här fältet för att lägga till saker i HTML-rubriken. Vanligaste användningsområdet är att integrera tredjepartstjänster som kräver extra JavaScript eller CSS. Du kan också lägga till extra metataggar i HTML-koden. Notera att det bara kommer visas på offentliga sidor, inte i admin-sektionen. Om koden interagerar med externa API:er eller inte följer applikationens säkerhetskrav kommer det att vara nödvändigt att ändra innehållssäkerhetspolicyn. Läs mer på dokumentationssidan. index: title: Organisationer new: diff --git a/decidim-system/decidim-system.gemspec b/decidim-system/decidim-system.gemspec index b6cd9f2b20ee6..bcbb01d6fee26 100644 --- a/decidim-system/decidim-system.gemspec +++ b/decidim-system/decidim-system.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |s| "homepage_uri" => "https://decidim.org", "source_code_uri" => "https://github.com/decidim/decidim" } - s.required_ruby_version = "~> 3.3.0" + s.required_ruby_version = "~> 3.4.0" s.name = "decidim-system" s.summary = "Decidim system administration" diff --git a/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb b/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb index f716a9e5f066b..bbb803e7c7c7e 100644 --- a/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb +++ b/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb @@ -25,7 +25,7 @@ <%= link_to translated_attribute(template.name), edit_block_user_template_path(template) %>
"> - <%= l template.created_at, format: :long %> + <%= l template.created_at, format: :decidim_short %> " class="table-list__actions"> "> - <%= l template.created_at, format: :long %> + <%= l template.created_at, format: :decidim_short %> " class="table-list__actions"> "> - <%= l template.created_at, format: :long %> + <%= l template.created_at, format: :decidim_short %> " class="table-list__actions">