diff --git a/.eslintrc.json b/.eslintrc.json index 8b788aa..1b7bf61 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,247 +1,3 @@ { - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "prettier" - ], - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "globals": { - "require": false, - "$": false, - "jQuery": false, - "L": false, - "ApiFetcher": false, - "FormStorage": false, - "Quill": false, - "InscrybMDE": false, - "CodeMirror": false, - "Europa": false, - "DecidimAwesome": false, - "inlineAttachment": false, - "CustomFieldsBuilder": false - }, - "rules": { - "accessor-pairs": "error", - "array-bracket-spacing": "error", - "array-callback-return": "error", - "arrow-body-style": "off", - "arrow-parens": [ - "error", - "always" - ], - "arrow-spacing": [ - "error", - { - "after": true, - "before": true - } - ], - "block-scoped-var": "error", - "block-spacing": "off", - "callback-return": "error", - "class-methods-use-this": "off", - "comma-dangle": ["error", "never"], - "comma-spacing": [ - "error", - { - "after": true, - "before": false - } - ], - "comma-style": [ - "error", - "last" - ], - "complexity": "error", - "computed-property-spacing": [ - "error", - "never" - ], - "consistent-this": "error", - "curly": "error", - "default-case": "error", - "dot-location": "error", - "dot-notation": "error", - "eol-last": "error", - "func-call-spacing": "error", - "func-name-matching": "error", - "func-names": [ - "error", - "never" - ], - "generator-star-spacing": "error", - "global-require": "error", - "handle-callback-err": "error", - "id-blacklist": "error", - "id-match": "error", - "indent": ["error", 2, { "VariableDeclarator": 2 }], - "jsx-quotes": "error", - "key-spacing": "error", - "keyword-spacing": [ - "error", - { - "after": true, - "before": true - } - ], - "linebreak-style": [ - "error", - "unix" - ], - "lines-around-comment": "error", - "lines-around-directive": "error", - "max-len": "off", - "max-lines": "error", - "max-nested-callbacks": "error", - "max-params": "error", - "max-statements": "off", - "max-statements-per-line": "error", - "multiline-ternary": "error", - "new-cap": "error", - "new-parens": "error", - "newline-after-var": "off", - "newline-before-return": "off", - "newline-per-chained-call": "off", - "no-alert": "error", - "no-array-constructor": "error", - "no-bitwise": "error", - "no-caller": "error", - "no-catch-shadow": "error", - "no-confusing-arrow": "error", - "no-continue": "error", - "no-div-regex": "error", - "no-duplicate-imports": "error", - "no-else-return": "error", - "no-eq-null": "error", - "no-eval": "error", - "no-extend-native": "error", - "no-extra-bind": "error", - "no-extra-label": "error", - "no-extra-parens": "off", - "no-floating-decimal": "error", - "no-implicit-coercion": "error", - "no-implicit-globals": "error", - "no-implied-eval": "error", - "no-iterator": "error", - "no-label-var": "error", - "no-labels": "error", - "no-lone-blocks": "error", - "no-lonely-if": "error", - "no-magic-numbers": "off", - "no-mixed-requires": "error", - "no-multi-spaces": "off", - "no-multi-str": "error", - "no-multiple-empty-lines": "error", - "no-native-reassign": "error", - "no-negated-condition": "error", - "no-negated-in-lhs": "error", - "no-nested-ternary": "error", - "no-new": "error", - "no-new-func": "error", - "no-new-object": "error", - "no-new-require": "error", - "no-new-wrappers": "error", - "no-octal-escape": "error", - "no-path-concat": "error", - "no-plusplus": "error", - "no-process-env": "error", - "no-process-exit": "error", - "no-proto": "error", - "no-prototype-builtins": "error", - "no-restricted-globals": "error", - "no-restricted-imports": "error", - "no-restricted-modules": "error", - "no-restricted-properties": "error", - "no-restricted-syntax": "error", - "no-return-assign": "error", - "no-script-url": "error", - "no-self-compare": "error", - "no-sequences": "error", - "no-shadow": "error", - "no-shadow-restricted-names": "error", - "no-spaced-func": "error", - "no-sync": "error", - "no-tabs": "error", - "no-template-curly-in-string": "error", - "no-throw-literal": "error", - "no-trailing-spaces": "off", - "no-undef-init": "error", - "no-undefined": "error", - "no-underscore-dangle": "off", - "no-unmodified-loop-condition": "error", - "no-unneeded-ternary": "error", - "no-unused-expressions": "error", - "no-use-before-define": "error", - "no-useless-call": "error", - "no-useless-computed-key": "error", - "no-useless-concat": "error", - "no-useless-constructor": "error", - "no-useless-escape": "error", - "no-useless-rename": "error", - "no-var": "error", - "no-void": "error", - "no-warning-comments": "error", - "no-whitespace-before-property": "error", - "no-with": "error", - "object-curly-newline": "off", - "object-curly-spacing": "off", - "object-property-newline": [ - "error", - { - "allowMultiplePropertiesPerLine": true - } - ], - "object-shorthand": "off", - "one-var": "off", - "one-var-declaration-per-line": "error", - "operator-assignment": "error", - "operator-linebreak": "error", - "padded-blocks": "off", - "prefer-arrow-callback": "off", - "prefer-const": "off", - "prefer-numeric-literals": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "prefer-template": "error", - "quote-props": "off", - "quotes": ["error", "double", { "avoidEscape": true }], - "require-jsdoc": "error", - "rest-spread-spacing": "error", - "semi": "off", - "semi-spacing": "error", - "sort-imports": "off", - "sort-keys": "off", - "space-before-blocks": "error", - "space-before-function-paren": "off", - "space-in-parens": [ - "error", - "never" - ], - "space-infix-ops": "error", - "space-unary-ops": "error", - "spaced-comment": [ - "error", - "always" - ], - "strict": "error", - "symbol-description": "error", - "template-curly-spacing": "error", - "unicode-bom": [ - "error", - "never" - ], - "vars-on-top": "error", - "wrap-iife": "error", - "wrap-regex": "error", - "yield-star-spacing": "error", - "yoda": "error", - "import/no-named-as-default": "off", - "import/no-extraneous-dependencies": "off" - } -} + "extends": "@decidim" +} \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 894091f..134569d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,22 +8,37 @@ on: pull_request: env: - RUBY_VERSION: 3.0.6 + RUBY_VERSION: 3.1.6 + NODE_VERSION: 18.17.1 jobs: lint-report: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 1 + - uses: actions/setup-node@master + with: + node-version: ${{ env.NODE_VERSION }} + + - run: npm ci + name: Install JS deps + + - run: npm run lint + name: Lint JS files + + - run: npm run stylelint + name: Lint SCSS files + - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.RUBY_VERSION }} bundler-cache: true - - name: Lint and Rubocop - run: | - bundle exec rubocop -P - bundle exec erblint app/**/*.erb + - run: bundle exec rubocop -P + name: Lint Ruby files + + - run: bundle exec erblint app/**/*.erb + name: Lint ERB files diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c1dff17..0a4d147 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,13 +8,20 @@ on: pull_request: env: - RUBY_VERSION: 3.0.6 - NODE_VERSION: 16.9.1 + CI: 1 + SIMPLECOV: 1 + NODE_VERSION: 18.17.1 + RUBY_VERSION: 3.1.6 + DISPLAY: ":99" + RUBYOPT: '-W:no-deprecated' + RAILS_ENV: test + NODE_ENV: test jobs: test-report: + name: Tests runs-on: ubuntu-latest - + timeout-minutes: 30 services: postgres: image: postgres:11 @@ -30,53 +37,54 @@ jobs: DATABASE_USERNAME: postgres DATABASE_PASSWORD: postgres DATABASE_HOST: localhost - steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 1 - - uses: actions/setup-node@v3 + - uses: ruby/setup-ruby@v1 with: - node-version: ${{ env.NODE_VERSION }} + bundler-cache: true + + - uses: nanasess/setup-chromedriver@v2 + with: + chromedriver-version: 126.0.6478.182 - - name: Get npm cache directory path - id: npm-cache-dir-path - run: echo "::set-output name=dir::$(npm get cache)-civcrm" + - name: Remove Chrome + run: sudo apt remove google-chrome-stable - - uses: actions/cache@v2.0.0 - id: npm-cache + - uses: browser-actions/setup-chrome@v1 with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - npm- - - run: npm ci + chrome-version: 126.0.6478.182 - - uses: ruby/setup-ruby@v1 + - uses: actions/setup-node@v3 with: - ruby-version: ${{ env.RUBY_VERSION }} - bundler-cache: true + node-version: ${{ env.NODE_VERSION }} - - name: Setup Database - run: bundle exec rake test_app - - - run: RAILS_ENV=test bundle exec rails assets:precompile + - run: bundle exec rake test_app + name: Create test app + + - run: bundle exec rails assets:precompile name: Precompile assets working-directory: ./spec/decidim_dummy_app/ + shell: "bash" - run: bundle exec rspec name: RSpec - env: - CODECOV: 1 - - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 - - uses: actions/upload-artifact@v2-preview + - uses: actions/upload-artifact@v3 if: always() with: name: screenshots path: ./spec/decidim_dummy_app/tmp/screenshots if-no-files-found: ignore + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: Test logs + path: ./spec/decidim_dummy_app/log/test.log + if-no-files-found: ignore \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0f52f6a..33b4bb4 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,8 @@ spec/decidim_dummy_app # default development application development_app - +.rubocop-* +tailwind.config.js .rbenv-vars .vscode .byebug_history diff --git a/.rubocop.yml b/.rubocop.yml index b2dc6b1..7f5e268 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1 +1,6 @@ -inherit_from: https://raw.githubusercontent.com/decidim/decidim/release/0.27-stable/.rubocop.yml +inherit_from: + - https://raw.githubusercontent.com/decidim/decidim/release/0.28-stable/.rubocop.yml + +AllCops: + Exclude: + - "spec/decidim_dummy_app*/**/*" diff --git a/.ruby-version b/.ruby-version index 8ffc1ad..8a4b275 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.0.6 \ No newline at end of file +3.1.6 \ No newline at end of file diff --git a/Gemfile b/Gemfile index 9474785..23ce940 100644 --- a/Gemfile +++ b/Gemfile @@ -16,24 +16,23 @@ gem "decidim", DECIDIM_VERSION gem "decidim-civicrm", path: "." gem "bootsnap", "~> 1.4" -gem "faker", "~> 2.14" -gem "rspec", "~> 3.0" +gem "puma", ">= 6.3.1" group :development, :test do gem "byebug", "~> 11.0", platform: :mri gem "decidim-dev", DECIDIM_VERSION + + gem "brakeman", "~> 5.4" + gem "net-imap", "~> 0.2.3" + gem "net-pop", "~> 0.1.1" + gem "net-smtp", "~> 0.3.1" end group :development do - gem "letter_opener_web", "~> 1.3" + gem "letter_opener_web", "~> 2.0" gem "listen", "~> 3.1" - gem "rubocop-faker", "~> 1.1" gem "spring", "~> 2.0" gem "spring-watcher-listen", "~> 2.0" - gem "web-console" -end - -group :test do - gem "codecov", require: false + gem "web-console", "~> 4.2" end diff --git a/Gemfile.lock b/Gemfile.lock index f885e6e..b8d3f73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,49 +1,49 @@ PATH remote: . specs: - decidim-civicrm (0.27.4) - decidim-admin (>= 0.27.0, < 0.28) - decidim-core (>= 0.27.0, < 0.28) - decidim-verifications (>= 0.27.0, < 0.28) + decidim-civicrm (0.7.0) + decidim-admin (>= 0.28.0, < 0.29) + decidim-core (>= 0.28.0, < 0.29) + decidim-verifications (>= 0.28.0, < 0.29) deface (~> 1.5) GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.4) - actionpack (= 6.1.7.4) - activesupport (= 6.1.7.4) + actioncable (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.4) - actionpack (= 6.1.7.4) - activejob (= 6.1.7.4) - activerecord (= 6.1.7.4) - activestorage (= 6.1.7.4) - activesupport (= 6.1.7.4) + actionmailbox (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (>= 2.7.1) - actionmailer (6.1.7.4) - actionpack (= 6.1.7.4) - actionview (= 6.1.7.4) - activejob (= 6.1.7.4) - activesupport (= 6.1.7.4) + actionmailer (6.1.7.8) + actionpack (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7.4) - actionview (= 6.1.7.4) - activesupport (= 6.1.7.4) + actionpack (6.1.7.8) + actionview (= 6.1.7.8) + activesupport (= 6.1.7.8) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.4) - actionpack (= 6.1.7.4) - activerecord (= 6.1.7.4) - activestorage (= 6.1.7.4) - activesupport (= 6.1.7.4) + actiontext (6.1.7.8) + actionpack (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) nokogiri (>= 1.8.5) - actionview (6.1.7.4) - activesupport (= 6.1.7.4) + actionview (6.1.7.8) + activesupport (= 6.1.7.8) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -51,69 +51,64 @@ GEM active_link_to (1.0.5) actionpack addressable - activejob (6.1.7.4) - activesupport (= 6.1.7.4) + activejob (6.1.7.8) + activesupport (= 6.1.7.8) globalid (>= 0.3.6) - activemodel (6.1.7.4) - activesupport (= 6.1.7.4) - activerecord (6.1.7.4) - activemodel (= 6.1.7.4) - activesupport (= 6.1.7.4) - activestorage (6.1.7.4) - actionpack (= 6.1.7.4) - activejob (= 6.1.7.4) - activerecord (= 6.1.7.4) - activesupport (= 6.1.7.4) + activemodel (6.1.7.8) + activesupport (= 6.1.7.8) + activerecord (6.1.7.8) + activemodel (= 6.1.7.8) + activesupport (= 6.1.7.8) + activestorage (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activesupport (= 6.1.7.8) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.4) + activesupport (6.1.7.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - acts_as_list (0.9.19) - activerecord (>= 3.0) - addressable (2.8.5) - public_suffix (>= 2.0.2, < 6.0) + acts_as_list (1.2.2) + activerecord (>= 6.1) + activesupport (>= 6.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) - axe-core-api (4.7.0) - dumb_delegator - virtus - axe-core-rspec (4.1.0) - axe-core-api - dumb_delegator - virtus - axiom-types (0.1.1) - descendants_tracker (~> 0.0.4) - ice_nine (~> 0.11.0) - thread_safe (~> 0.3, >= 0.3.1) + base64 (0.2.0) batch-loader (1.5.0) - bcrypt (3.1.19) - better_html (1.0.16) - actionview (>= 4.0) - activesupport (>= 4.0) + bcrypt (3.1.20) + better_html (2.1.1) + actionview (>= 6.0) + activesupport (>= 6.0) ast (~> 2.0) erubi (~> 1.4) - html_tokenizer (~> 0.0.6) parser (>= 2.4) smart_properties + bigdecimal (3.1.8) bindex (0.8.1) - bootsnap (1.16.0) + bootsnap (1.18.4) msgpack (~> 1.2) + brakeman (5.4.1) browser (2.7.1) - builder (3.2.4) + builder (3.3.0) + bullet (7.2.0) + activesupport (>= 3.0.0) + uniform_notifier (~> 1.11) byebug (11.1.3) - capybara (3.39.2) + capybara (3.40.0) addressable matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - carrierwave (2.2.4) + carrierwave (2.2.6) activemodel (>= 5.0.0) activesupport (>= 5.0.0) addressable (~> 2.6) @@ -132,96 +127,82 @@ GEM cells-rails (0.1.5) actionpack (>= 5.0) cells (>= 4.1.6, < 5.0.0) - charlock_holmes (0.7.7) - chef-utils (18.2.7) - concurrent-ruby - childprocess (4.1.0) - codecov (0.6.0) - simplecov (>= 0.15, < 0.22) - coercible (1.0.0) - descendants_tracker (~> 0.0.1) - coffee-rails (5.0.0) - coffee-script (>= 2.2.0) - railties (>= 5.2.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) + charlock_holmes (0.7.9) + childprocess (5.1.0) + logger (~> 1.5) commonmarker (0.23.10) - concurrent-ruby (1.2.2) - crack (0.4.5) + concurrent-ruby (1.3.4) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) - css_parser (1.14.0) + css_parser (1.19.0) addressable - date (3.3.3) + csv (3.3.0) date_validator (0.12.0) activemodel (>= 3) activesupport (>= 3) - db-query-matchers (0.10.0) - activesupport (>= 4.0, < 7) - rspec (~> 3.0) - decidim (0.27.4) - decidim-accountability (= 0.27.4) - decidim-admin (= 0.27.4) - decidim-api (= 0.27.4) - decidim-assemblies (= 0.27.4) - decidim-blogs (= 0.27.4) - decidim-budgets (= 0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-debates (= 0.27.4) - decidim-forms (= 0.27.4) - decidim-generators (= 0.27.4) - decidim-meetings (= 0.27.4) - decidim-pages (= 0.27.4) - decidim-participatory_processes (= 0.27.4) - decidim-proposals (= 0.27.4) - decidim-sortitions (= 0.27.4) - decidim-surveys (= 0.27.4) - decidim-system (= 0.27.4) - decidim-templates (= 0.27.4) - decidim-verifications (= 0.27.4) - decidim-accountability (0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-admin (0.27.4) + decidim (0.28.3) + decidim-accountability (= 0.28.3) + decidim-admin (= 0.28.3) + decidim-api (= 0.28.3) + decidim-assemblies (= 0.28.3) + decidim-blogs (= 0.28.3) + decidim-budgets (= 0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-debates (= 0.28.3) + decidim-forms (= 0.28.3) + decidim-generators (= 0.28.3) + decidim-meetings (= 0.28.3) + decidim-pages (= 0.28.3) + decidim-participatory_processes (= 0.28.3) + decidim-proposals (= 0.28.3) + decidim-sortitions (= 0.28.3) + decidim-surveys (= 0.28.3) + decidim-system (= 0.28.3) + decidim-verifications (= 0.28.3) + decidim-accountability (0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-admin (0.28.3) active_link_to (~> 1.0) - decidim-core (= 0.27.4) + decidim-core (= 0.28.3) devise (~> 4.7) devise-i18n (~> 1.2) - devise_invitable (~> 2.0) - decidim-api (0.27.4) - graphql (~> 1.12, < 1.13) - graphql-docs (~> 2.1.0) + devise_invitable (~> 2.0, >= 2.0.9) + decidim-api (0.28.3) + commonmarker (~> 0.23.0, >= 0.23.9) + decidim-core (= 0.28.3) + graphql (~> 2.0.0) + graphql-docs (~> 3.0.1) rack-cors (~> 1.0) - decidim-assemblies (0.27.4) - decidim-core (= 0.27.4) - decidim-blogs (0.27.4) - decidim-admin (= 0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-budgets (0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-comments (0.27.4) - decidim-core (= 0.27.4) + decidim-assemblies (0.28.3) + decidim-core (= 0.28.3) + decidim-blogs (0.28.3) + decidim-admin (= 0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-budgets (0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-comments (0.28.3) + decidim-core (= 0.28.3) redcarpet (~> 3.5, >= 3.5.1) - decidim-core (0.27.4) + decidim-core (0.28.3) active_link_to (~> 1.0) - acts_as_list (~> 0.9) + acts_as_list (~> 1.0) batch-loader (~> 1.2) browser (~> 2.7) - carrierwave (~> 2.2.1) + carrierwave (~> 2.2.5, >= 2.2.5) cells-erb (~> 0.1.0) cells-rails (~> 0.1.3) charlock_holmes (~> 0.7) date_validator (~> 0.12.0) - decidim-api (= 0.27.4) devise (~> 4.7) - devise-i18n (~> 1.2) + devise-i18n (~> 1.2, < 1.11.1) diffy (~> 3.3) - doorkeeper (~> 5.1) + doorkeeper (~> 5.6, >= 5.6.6) doorkeeper-i18n (~> 4.0) file_validators (~> 3.0) fog-local (~> 0.6) @@ -230,104 +211,102 @@ GEM hashdiff (>= 0.4.0, < 2.0.0) invisible_captcha (~> 0.12) kaminari (~> 1.2, >= 1.2.1) - loofah (~> 2.19.0) + loofah (~> 2.19, >= 2.19.1) mime-types (>= 1.16, < 4.0) mini_magick (~> 4.9) - mustache (~> 1.1.0) + net-smtp (~> 0.3.1) omniauth (~> 2.0) omniauth-facebook (~> 5.0) omniauth-google-oauth2 (~> 1.0) omniauth-rails_csrf_protection (~> 1.0) omniauth-twitter (~> 1.4) paper_trail (~> 12.0) - pg (~> 1.1.4, < 2) + pg (~> 1.4.0, < 2) pg_search (~> 2.2) premailer-rails (~> 1.10) - rack (~> 2.2, >= 2.2.3) + psych (~> 4.0) + rack (~> 2.2, >= 2.2.6.4) rack-attack (~> 6.0) - rails (~> 6.1.0) + rails (~> 6.1.7, >= 6.1.7.4) rails-i18n (~> 6.0) - ransack (~> 2.4.1) + ransack (~> 3.2.1) redis (~> 4.1) request_store (~> 1.5.0) rubyXL (~> 3.4) rubyzip (~> 2.0) - seven_zip_ruby (~> 1.3) - social-share-button (~> 1.2, >= 1.2.1) - valid_email2 (~> 2.1) - webpacker (= 6.0.0.rc.5) - webpush (~> 1.1) + shakapacker (~> 7.1.0) + valid_email2 (~> 4.0) + web-push (~> 3.0) wisper (~> 2.0) - decidim-debates (0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-dev (0.27.4) - axe-core-rspec (~> 4.1.0) + decidim-debates (0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-dev (0.28.3) + bullet (~> 7.0) byebug (~> 11.0) - capybara (~> 3.24) - db-query-matchers (~> 0.10.0) - decidim (= 0.27.4) - erb_lint (~> 0.0.35) - factory_bot_rails (~> 4.8) - i18n-tasks (~> 0.9.18) - mdl (~> 0.5) - nokogiri (~> 1.13) - parallel_tests (~> 3.7) - puma (~> 5.0) + capybara (~> 3.39) + decidim (= 0.28.3) + erb_lint (~> 0.4.0) + factory_bot_rails (~> 6.2) + faker (~> 3.2) + i18n-tasks (~> 1.0) + nokogiri (~> 1.14, >= 1.14.3) + parallel_tests (~> 4.2) + puma (~> 6.2, >= 6.3.1) rails-controller-testing (~> 1.0) + rspec (~> 3.12) rspec-cells (~> 0.3.7) - rspec-html-matchers (~> 0.9.1) - rspec-rails (~> 4.0) + rspec-html-matchers (~> 0.10) + rspec-rails (~> 6.0) rspec-retry (~> 0.6.2) - rspec_junit_formatter (~> 0.3.0) - rubocop (~> 1.28.0) - rubocop-rails (~> 2.14) - rubocop-rspec (~> 2.10) - selenium-webdriver (~> 4.1.0) - simplecov (~> 0.21.0) + rspec_junit_formatter (~> 0.6.0) + rubocop (~> 1.50.0) + rubocop-faker (~> 1.1) + rubocop-rails (~> 2.19) + rubocop-rspec (~> 2.20) + selenium-webdriver (~> 4.9) + simplecov (~> 0.22.0) simplecov-cobertura (~> 2.1.0) + spring (~> 2.0) + spring-watcher-listen (~> 2.0) w3c_rspec_validators (~> 0.3.0) - webmock (~> 3.6) + webmock (~> 3.18) wisper-rspec (~> 1.0) - decidim-forms (0.27.4) - decidim-core (= 0.27.4) + decidim-forms (0.28.3) + decidim-core (= 0.28.3) wicked_pdf (~> 2.1) wkhtmltopdf-binary (~> 0.12) - decidim-generators (0.27.4) - decidim-core (= 0.27.4) - decidim-meetings (0.27.4) - decidim-core (= 0.27.4) - decidim-forms (= 0.27.4) + decidim-generators (0.28.3) + decidim-core (= 0.28.3) + decidim-meetings (0.28.3) + decidim-core (= 0.28.3) + decidim-forms (= 0.28.3) icalendar (~> 2.5) - decidim-pages (0.27.4) - decidim-core (= 0.27.4) - decidim-participatory_processes (0.27.4) - decidim-core (= 0.27.4) - decidim-proposals (0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - doc2text (~> 0.4.5) + decidim-pages (0.28.3) + decidim-core (= 0.28.3) + decidim-participatory_processes (0.28.3) + decidim-core (= 0.28.3) + decidim-proposals (0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + doc2text (~> 0.4.6) redcarpet (~> 3.5, >= 3.5.1) - decidim-sortitions (0.27.4) - decidim-admin (= 0.27.4) - decidim-comments (= 0.27.4) - decidim-core (= 0.27.4) - decidim-proposals (= 0.27.4) - decidim-surveys (0.27.4) - decidim-core (= 0.27.4) - decidim-forms (= 0.27.4) - decidim-templates (= 0.27.4) - decidim-system (0.27.4) + decidim-sortitions (0.28.3) + decidim-admin (= 0.28.3) + decidim-comments (= 0.28.3) + decidim-core (= 0.28.3) + decidim-proposals (= 0.28.3) + decidim-surveys (0.28.3) + decidim-core (= 0.28.3) + decidim-forms (= 0.28.3) + decidim-system (0.28.3) active_link_to (~> 1.0) - decidim-core (= 0.27.4) + decidim-core (= 0.28.3) devise (~> 4.7) devise-i18n (~> 1.2) - devise_invitable (~> 2.0) - decidim-templates (0.27.4) - decidim-core (= 0.27.4) - decidim-forms (= 0.27.4) - decidim-verifications (0.27.4) - decidim-core (= 0.27.4) + devise_invitable (~> 2.0, >= 2.0.9) + decidim-verifications (0.28.3) + decidim-core (= 0.28.3) declarative-builder (0.1.0) declarative-option (< 0.2.0) declarative-option (0.1.0) @@ -337,9 +316,7 @@ GEM polyglot railties (>= 5.2) rainbow (>= 2.1.0) - descendants_tracker (0.0.4) - thread_safe (~> 0.3, >= 0.3.1) - devise (4.9.2) + devise (4.9.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -347,51 +324,51 @@ GEM warden (~> 1.2.3) devise-i18n (1.11.0) devise (>= 4.9.0) - devise_invitable (2.0.8) + devise_invitable (2.0.9) actionmailer (>= 5.0) devise (>= 4.6) - diff-lcs (1.5.0) + diff-lcs (1.5.1) diffy (3.4.2) - doc2text (0.4.6) - nokogiri (>= 1.13.2, < 1.15.0) + digest (3.1.1) + doc2text (0.4.7) + nokogiri (>= 1.13.2, < 1.17.0) rubyzip (~> 2.3.0) - docile (1.4.0) - doorkeeper (5.6.6) + docile (1.4.1) + doorkeeper (5.7.1) railties (>= 5) doorkeeper-i18n (4.0.1) - dumb_delegator (1.0.0) - erb_lint (0.0.37) + erb_lint (0.4.0) activesupport - better_html (~> 1.0.7) - html_tokenizer + better_html (>= 2.0.1) parser (>= 2.7.1.4) rainbow rubocop smart_properties erbse (0.1.4) temple - erubi (1.12.0) - escape_utils (1.3.0) - excon (0.100.0) - execjs (2.8.1) + erubi (1.13.0) + escape_utils (1.2.2) + excon (0.112.0) extended-markdown-filter (0.7.0) html-pipeline (~> 2.9) - factory_bot (4.11.1) - activesupport (>= 3.0.0) - factory_bot_rails (4.11.1) - factory_bot (~> 4.11.1) - railties (>= 3.0.0) - faker (2.23.0) + factory_bot (6.5.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faker (3.4.2) i18n (>= 1.8.11, < 2) - faraday (2.7.10) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) - ffi (1.15.5) + faraday (2.12.0) + faraday-net_http (>= 2.0, < 3.4) + json + logger + faraday-net_http (3.3.0) + net-http + ffi (1.17.0) file_validators (3.0.0) activemodel (>= 3.2) mime-types (>= 1.0) - fog-core (2.3.0) + fog-core (2.5.0) builder excon (~> 0.71) formatador (>= 0.2, < 2.0) @@ -405,50 +382,54 @@ GEM activesupport (>= 4.1, < 7.1) railties (>= 4.1, < 7.1) gemoji (3.0.1) - geocoder (1.8.2) - globalid (1.1.0) - activesupport (>= 5.0) - graphql (1.12.24) - graphql-docs (2.1.0) + geocoder (1.8.3) + base64 (>= 0.1.0) + csv (>= 3.0.0) + globalid (1.2.1) + activesupport (>= 6.1) + graphql (2.0.31) + base64 + graphql-docs (3.0.1) commonmarker (~> 0.16) - escape_utils (~> 1.2) + escape_utils (~> 1.2.2) extended-markdown-filter (~> 0.4) gemoji (~> 3.0) - graphql (~> 1.12) + graphql (~> 2.0) html-pipeline (~> 2.9) sass (~> 3.4) - hashdiff (1.0.1) + hashdiff (1.1.1) hashie (5.0.0) - highline (2.1.0) - hkdf (0.3.0) + highline (3.1.1) + reline html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) - html_tokenizer (0.0.7) htmlentities (4.3.4) - i18n (1.14.1) + i18n (1.14.6) concurrent-ruby (~> 1.0) - i18n-tasks (0.9.37) + i18n-tasks (1.0.14) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi highline (>= 2.0.0) i18n - parser (>= 2.2.3.0) + parser (>= 3.2.2.1) rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) - icalendar (2.9.0) + icalendar (2.10.3) ice_cube (~> 0.16) - ice_cube (0.16.4) - ice_nine (0.11.2) - image_processing (1.12.2) + ostruct + ice_cube (0.17.0) + image_processing (1.13.0) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) invisible_captcha (0.13.0) rails (>= 3.2.0) - json (2.6.3) - jwt (2.7.1) + io-console (0.7.2) + json (2.7.2) + jwt (2.9.3) + base64 kaminari (1.2.2) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.2) @@ -461,63 +442,55 @@ GEM activerecord kaminari-core (= 1.2.2) kaminari-core (1.2.2) - kramdown (2.4.0) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - launchy (2.5.2) + launchy (3.0.1) addressable (~> 2.8) - letter_opener (1.8.1) - launchy (>= 2.2, < 3) - letter_opener_web (1.4.1) - actionmailer (>= 3.2) - letter_opener (~> 1.0) - railties (>= 3.2) - listen (3.8.0) + childprocess (~> 5.0) + letter_opener (1.10.0) + launchy (>= 2.2, < 4) + letter_opener_web (2.0.0) + actionmailer (>= 5.2) + letter_opener (~> 1.7) + railties (>= 5.2) + rexml + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.19.1) + logger (1.6.1) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.2) + marcel (1.0.4) matrix (0.4.2) - mdl (0.12.0) - kramdown (~> 2.3) - kramdown-parser-gfm (~> 1.1) - mixlib-cli (~> 2.1, >= 2.1.1) - mixlib-config (>= 2.2.1, < 4) - mixlib-shellout - method_source (1.0.0) - mime-types (3.5.0) + method_source (1.1.0) + mime-types (3.6.0) + logger mime-types-data (~> 3.2015) - mime-types-data (3.2023.0808) - mini_magick (4.12.0) + mime-types-data (3.2024.1001) + mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.19.0) - mixlib-cli (2.1.8) - mixlib-config (3.0.27) - tomlrb - mixlib-shellout (3.2.7) - chef-utils - msgpack (1.7.2) - multi_xml (0.6.0) - mustache (1.1.1) - net-imap (0.3.7) - date + minitest (5.25.1) + msgpack (1.7.3) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + net-http (0.4.1) + uri + net-imap (0.2.4) + digest net-protocol + strscan net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.3.3) + net-smtp (0.3.4) net-protocol - nio4r (2.5.9) - nokogiri (1.14.5-x86_64-linux) + nio4r (2.7.3) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) @@ -532,81 +505,87 @@ GEM rack (>= 1.2, < 4) snaky_hash (~> 2.0) version_gem (~> 1.1) - omniauth (2.1.1) + omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection omniauth-facebook (5.0.0) omniauth-oauth2 (~> 1.2) - omniauth-google-oauth2 (1.1.1) - jwt (>= 2.0) - oauth2 (~> 2.0.6) + omniauth-google-oauth2 (1.2.0) + jwt (>= 2.9) + oauth2 (~> 2.0) omniauth (~> 2.0) - omniauth-oauth2 (~> 1.8.0) - omniauth-oauth (1.2.0) + omniauth-oauth2 (~> 1.8) + omniauth-oauth (1.2.1) oauth omniauth (>= 1.0, < 3) + rack (>= 1.6.2, < 4) omniauth-oauth2 (1.8.0) oauth2 (>= 1.4, < 3) omniauth (~> 2.0) - omniauth-rails_csrf_protection (1.0.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack + openssl (3.2.0) orm_adapter (0.5.0) + ostruct (0.6.0) paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) - parallel (1.23.0) - parallel_tests (3.13.0) + parallel (1.26.3) + parallel_tests (4.7.2) parallel - parser (3.2.2.3) + parser (3.3.5.0) ast (~> 2.4.1) racc - pg (1.1.4) - pg_search (2.3.6) - activerecord (>= 5.2) - activesupport (>= 5.2) + pg (1.4.6) + pg_search (2.3.7) + activerecord (>= 6.1) + activesupport (>= 6.1) polyglot (0.3.5) - premailer (1.21.0) + premailer (1.27.0) addressable - css_parser (>= 1.12.0) + css_parser (>= 1.19.0) htmlentities (>= 4.0.0) premailer-rails (1.12.0) actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - public_suffix (5.0.3) - puma (5.6.6) + psych (4.0.6) + stringio + public_suffix (6.0.1) + puma (6.4.3) nio4r (~> 2.0) - racc (1.7.1) - rack (2.2.8) + racc (1.8.1) + rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) rack-cors (1.1.1) rack (>= 2.0.0) - rack-protection (3.1.0) + rack-protection (3.2.0) + base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) - rack-proxy (0.7.6) + rack-proxy (0.7.7) rack rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.4) - actioncable (= 6.1.7.4) - actionmailbox (= 6.1.7.4) - actionmailer (= 6.1.7.4) - actionpack (= 6.1.7.4) - actiontext (= 6.1.7.4) - actionview (= 6.1.7.4) - activejob (= 6.1.7.4) - activemodel (= 6.1.7.4) - activerecord (= 6.1.7.4) - activestorage (= 6.1.7.4) - activesupport (= 6.1.7.4) + rails (6.1.7.8) + actioncable (= 6.1.7.8) + actionmailbox (= 6.1.7.8) + actionmailer (= 6.1.7.8) + actionpack (= 6.1.7.8) + actiontext (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activemodel (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) bundler (>= 1.15.0) - railties (= 6.1.7.4) + railties (= 6.1.7.8) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -616,91 +595,100 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.5.0) - loofah (~> 2.19, >= 2.19.1) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.1.7.4) - actionpack (= 6.1.7.4) - activesupport (= 6.1.7.4) + railties (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) method_source rake (>= 12.2) thor (~> 1.0) rainbow (3.1.1) - rake (13.0.6) - ransack (2.4.2) - activerecord (>= 5.2.4) - activesupport (>= 5.2.4) + rake (13.2.1) + ransack (3.2.1) + activerecord (>= 6.1.5) + activesupport (>= 6.1.5) i18n rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) redcarpet (3.6.0) redis (4.8.1) - regexp_parser (2.8.1) + regexp_parser (2.9.2) + reline (0.5.10) + io-console (~> 0.5) request_store (1.5.1) rack (>= 1.4) - responders (3.1.0) + responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.2.6) - rspec (3.12.0) - rspec-core (~> 3.12.0) - rspec-expectations (~> 3.12.0) - rspec-mocks (~> 3.12.0) - rspec-cells (0.3.8) + rexml (3.3.8) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-cells (0.3.9) cells (>= 4.0.0, < 6.0.0) - rspec-rails (>= 3.0.0, < 6.1.0) - rspec-core (3.12.2) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.3) + rspec-rails (>= 3.0.0, < 6.2.0) + rspec-core (3.13.1) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-html-matchers (0.9.4) + rspec-support (~> 3.13.0) + rspec-html-matchers (0.10.0) nokogiri (~> 1) - rspec (>= 3.0.0.a, < 4) - rspec-mocks (3.12.6) + rspec (>= 3.0.0.a) + rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-rails (4.1.2) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) + rspec-support (~> 3.13.0) + rspec-rails (6.1.5) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) rspec-retry (0.6.2) rspec-core (> 3.3) - rspec-support (3.12.1) - rspec_junit_formatter (0.3.0) + rspec-support (3.13.1) + rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (1.28.2) + rubocop (1.50.2) + json (~> 2.3) parallel (~> 1.10) - parser (>= 3.1.0.0) + parser (>= 3.2.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.17.0, < 2.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.29.0) - parser (>= 3.2.1.0) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.32.3) + parser (>= 3.3.1.0) + rubocop-capybara (2.21.0) + rubocop (~> 1.41) + rubocop-factory_bot (2.26.0) + rubocop (~> 1.41) rubocop-faker (1.1.0) faker (>= 2.12.0) rubocop (>= 0.82.0) - rubocop-rails (2.15.2) + rubocop-rails (2.25.1) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 1.7.0, < 2.0) - rubocop-rspec (2.11.1) - rubocop (~> 1.19) + rubocop (>= 1.33.0, < 2.0) + rubocop-rspec (2.20.0) + rubocop (~> 1.33) + rubocop-capybara (~> 2.17) ruby-progressbar (1.13.0) - ruby-vips (2.1.4) + ruby-vips (2.2.2) ffi (~> 1.12) - ruby2_keywords (0.0.5) - rubyXL (3.4.25) + logger + rubyXL (3.4.27) nokogiri (>= 1.10.8) rubyzip (>= 1.3.0) rubyzip (2.3.2) @@ -709,59 +697,61 @@ GEM sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - selenium-webdriver (4.1.0) - childprocess (>= 0.5, < 5.0) + selenium-webdriver (4.25.0) + base64 (~> 0.2) + logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) semantic_range (3.0.0) - seven_zip_ruby (1.3.0) - simplecov (0.21.2) + shakapacker (7.1.0) + activesupport (>= 5.2) + rack-proxy (>= 0.6.1) + railties (>= 5.2) + semantic_range (>= 2.3.0) + simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) simplecov-cobertura (2.1.0) rexml simplecov (~> 0.19) - simplecov-html (0.12.3) + simplecov-html (0.13.1) simplecov_json_formatter (0.1.4) smart_properties (1.17.0) snaky_hash (2.0.1) hashie version_gem (~> 1.1, >= 1.1.1) - social-share-button (1.2.4) - coffee-rails spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.2.0) + sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) - ssrf_filter (1.1.1) - temple (0.10.2) + ssrf_filter (1.1.2) + stringio (3.1.1) + strscan (3.1.0) + temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (1.2.2) - thread_safe (0.3.6) - tilt (2.2.0) - timeout (0.4.0) - tomlrb (2.0.3) + thor (1.3.2) + tilt (2.4.0) + timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unicode-display_width (2.4.2) - valid_email2 (2.3.1) + unicode-display_width (2.6.0) + uniform_notifier (1.16.0) + uri (0.13.1) + valid_email2 (4.0.6) activemodel (>= 3.2) mail (~> 2.5) - version_gem (1.1.3) - virtus (2.0.0) - axiom-types (~> 0.1) - coercible (~> 1.0) - descendants_tracker (~> 0.0, >= 0.0.3) + version_gem (1.1.4) w3c_rspec_validators (0.3.0) rails rspec @@ -772,56 +762,65 @@ GEM rexml (~> 3.2) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.0) + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webmock (3.18.1) + web-push (3.0.1) + jwt (~> 2.0) + openssl (~> 3.0) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webpacker (6.0.0.rc.5) - activesupport (>= 5.2) - rack-proxy (>= 0.6.1) - railties (>= 5.2) - semantic_range (>= 2.3.0) - webpush (1.1.0) - hkdf (~> 0.2) - jwt (~> 2.0) + websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - wicked_pdf (2.6.3) + wicked_pdf (2.8.1) activesupport wisper (2.0.1) wisper-rspec (1.1.0) - wkhtmltopdf-binary (0.12.6.6) + wkhtmltopdf-binary (0.12.6.8) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.11) + zeitwerk (2.6.18) PLATFORMS - x86_64-linux + aarch64-linux + aarch64-linux-gnu + aarch64-linux-musl + arm-linux + arm-linux-gnu + arm-linux-musl + arm64-darwin + x86-linux + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl DEPENDENCIES bootsnap (~> 1.4) + brakeman (~> 5.4) byebug (~> 11.0) - codecov - decidim (= 0.27.4) + decidim (= 0.28.3) decidim-civicrm! - decidim-dev (= 0.27.4) - faker (~> 2.14) - letter_opener_web (~> 1.3) + decidim-dev (= 0.28.3) + letter_opener_web (~> 2.0) listen (~> 3.1) - rspec (~> 3.0) - rubocop-faker (~> 1.1) + net-imap (~> 0.2.3) + net-pop (~> 0.1.1) + net-smtp (~> 0.3.1) + puma (>= 6.3.1) spring (~> 2.0) spring-watcher-listen (~> 2.0) - web-console + web-console (~> 4.2) RUBY VERSION - ruby 3.0.6p216 + ruby 3.1.6p260 BUNDLED WITH - 2.2.33 + 2.5.20 diff --git a/README.md b/README.md index 1662beb..c205e01 100644 --- a/README.md +++ b/README.md @@ -41,24 +41,38 @@ Add into the `Gemfile` gem "decidim-civicrm", github: "openpoke/decidim-module-civicrm" ``` -for version 0.26 you can use: +for version 0.27 you can use: ```ruby -gem "decidim-civicrm", github: "openpoke/decidim-module-civicrm", branch: "release/0.26-stable" +gem "decidim-civicrm", github: "openpoke/decidim-module-civicrm", branch: "release/0.27-stable" ``` Install dependencies: ``` bundle +bin/rails decidim:upgrade +bin/rails db:migrate ``` -Install (and run) migrations: +> **EXPERTS ONLY** +> +> Under the hood, when running `bundle exec rails decidim:upgrade` the `decidim-civicrm` gem will run the following two tasks (that can also be run manually if you consider): +> +> ```bash +> bin/rails decidim_civicrm:install:migrations +> ``` + +The correct version of Civicrm module should resolved automatically by the Bundler. + +Depending on your Decidim version, choose the corresponding Civicrm version to ensure compatibility: + +| Civicrm version | Compatible Decidim versions | +|---|---| +| 0.7.x | 0.28.x | +| 0.6.x | >= 0.27, < 0.28 | +| 0.5.x | >= 0.26, < 0.27 | -``` -bundle exec rails decidim_civicrm:install:migrations -bundle exec rails db:migrate -``` ## Configuration diff --git a/Rakefile b/Rakefile index 6d8933a..a104634 100644 --- a/Rakefile +++ b/Rakefile @@ -32,7 +32,7 @@ end def fix_babel_config(path) Dir.chdir(path) do babel_config = "#{Dir.pwd}/babel.config.json" - File.delete(babel_config) if File.exist?(babel_config) + FileUtils.rm_f(babel_config) FileUtils.cp("#{__dir__}/babel.config.json", Dir.pwd) # Temporary fix to overcome the issue with sass-embedded, see: diff --git a/app/controllers/concerns/decidim/civicrm/admin/needs_multiselect_snippets.rb b/app/controllers/concerns/decidim/civicrm/admin/needs_multiselect_snippets.rb deleted file mode 100644 index b37be78..0000000 --- a/app/controllers/concerns/decidim/civicrm/admin/needs_multiselect_snippets.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module Civicrm - module Admin - module NeedsMultiselectSnippets - extend ActiveSupport::Concern - - included do - helper_method :snippets - end - - def snippets - @snippets ||= Decidim::Snippets.new - - unless @snippets.any?(:select2) - @snippets.add(:select2, ActionController::Base.helpers.stylesheet_link_tag("https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css")) - @snippets.add(:select2, ActionController::Base.helpers.javascript_include_tag("https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js")) - @snippets.add(:select2, ActionController::Base.helpers.javascript_pack_tag("decidim_admin_civicrm_selects")) - @snippets.add(:select2, ActionController::Base.helpers.stylesheet_pack_tag("decidim_admin_civicrm_selects")) - @snippets.add(:head, @snippets.for(:select2)) - end - - @snippets - end - end - end - end -end diff --git a/app/controllers/concerns/decidim/civicrm/force_authorization.rb b/app/controllers/concerns/decidim/civicrm/force_authorization.rb index 8435299..45528dd 100644 --- a/app/controllers/concerns/decidim/civicrm/force_authorization.rb +++ b/app/controllers/concerns/decidim/civicrm/force_authorization.rb @@ -35,7 +35,7 @@ def ensure_authorization! def missing_authorizations @missing_authorizations ||= Civicrm.login_required_authorizations.reject do |name, _desc| current_organization.available_authorizations.exclude?(name.to_s) || - Decidim::Authorization.exists?(user: current_user, name: name) + Decidim::Authorization.exists?(user: current_user, name:) end end diff --git a/app/controllers/concerns/decidim/civicrm/meetings_registrations_controller_override.rb b/app/controllers/concerns/decidim/civicrm/meetings_registrations_controller_override.rb index 2d284ec..95f7a27 100644 --- a/app/controllers/concerns/decidim/civicrm/meetings_registrations_controller_override.rb +++ b/app/controllers/concerns/decidim/civicrm/meetings_registrations_controller_override.rb @@ -10,11 +10,11 @@ module MeetingsRegistrationsControllerOverride private def registered_in_decidim? - Decidim::Meetings::Registration.find_by(meeting: meeting, user: current_user) + Decidim::Meetings::Registration.find_by(meeting:, user: current_user) end def civicrm_event_meeting - Decidim::Civicrm::EventMeeting.find_by(meeting: meeting, redirect_active: true)&.redirect_url + Decidim::Civicrm::EventMeeting.find_by(meeting:, redirect_active: true)&.redirect_url end def after_answer_path diff --git a/app/controllers/concerns/decidim/civicrm/needs_civicrm_snippets.rb b/app/controllers/concerns/decidim/civicrm/needs_civicrm_snippets.rb index 3c79ea3..c61f477 100644 --- a/app/controllers/concerns/decidim/civicrm/needs_civicrm_snippets.rb +++ b/app/controllers/concerns/decidim/civicrm/needs_civicrm_snippets.rb @@ -13,7 +13,6 @@ def snippets @snippets ||= Decidim::Snippets.new unless @snippets.any?(:oauth2_civicrm) - @snippets.add(:oauth2_civicrm, ActionController::Base.helpers.javascript_pack_tag("decidim_civicrm")) @snippets.add(:oauth2_civicrm, ActionController::Base.helpers.stylesheet_pack_tag("decidim_civicrm")) @snippets.add(:head, @snippets.for(:oauth2_civicrm)) end diff --git a/app/controllers/decidim/civicrm/admin/groups_controller.rb b/app/controllers/decidim/civicrm/admin/groups_controller.rb index 389dad1..e8cf244 100644 --- a/app/controllers/decidim/civicrm/admin/groups_controller.rb +++ b/app/controllers/decidim/civicrm/admin/groups_controller.rb @@ -6,7 +6,6 @@ module Admin class GroupsController < Decidim::Admin::ApplicationController include Paginable include NeedsPermission - include NeedsMultiselectSnippets helper CivicrmHelpers helper Decidim::Messaging::ConversationHelper @@ -14,6 +13,7 @@ class GroupsController < Decidim::Admin::ApplicationController helper_method :group, :groups, :members, :all_participatory_spaces layout "decidim/admin/civicrm" + add_breadcrumb_item_from_menu :admin_civicrm_menu def index # enforce_permission_to :index, :civicrm_groups @@ -67,8 +67,8 @@ def update group.group_participatory_spaces = params[:participatory_spaces].filter_map do |item| type, id = item.split(".") - space = type.safe_constantize&.find_by(id: id) - GroupParticipatorySpace.new(group: group, participatory_space: space) if space + space = type.safe_constantize&.find_by(id:) + GroupParticipatorySpace.new(group:, participatory_space: space) if space end group.save! @@ -94,10 +94,10 @@ def json_groups def json_participatory_spaces models = Decidim.participatory_space_manifests.pluck(:model_class_name) - query = Decidim::SearchableResource.where(resource_type: models, organization: current_organization) + query = Decidim::SearchableResource.where(resource_type: models, organization: current_organization, locale: current_locale) query = query.where("resource_type ILIKE ? OR content_a ILIKE ?", "%#{params[:q]}%", "%#{params[:q]}%") if params[:q] - items = query.order("content_a='' ASC").map do |item| + items = query.order("content_a ASC").map do |item| { id: "#{item.resource_type}.#{item.resource_id}", text: "#{item.resource_type}: #{item.content_a}" diff --git a/app/controllers/decidim/civicrm/admin/info_controller.rb b/app/controllers/decidim/civicrm/admin/info_controller.rb index c785458..9d6f153 100644 --- a/app/controllers/decidim/civicrm/admin/info_controller.rb +++ b/app/controllers/decidim/civicrm/admin/info_controller.rb @@ -10,6 +10,7 @@ class InfoController < Decidim::Admin::ApplicationController helper CivicrmHelpers layout "decidim/admin/civicrm" + add_breadcrumb_item_from_menu :admin_civicrm_menu def index # enforce_permission_to :index, :info diff --git a/app/controllers/decidim/civicrm/admin/meeting_registrations_controller.rb b/app/controllers/decidim/civicrm/admin/meeting_registrations_controller.rb index f32bd5c..1ce2bae 100644 --- a/app/controllers/decidim/civicrm/admin/meeting_registrations_controller.rb +++ b/app/controllers/decidim/civicrm/admin/meeting_registrations_controller.rb @@ -9,6 +9,7 @@ class MeetingRegistrationsController < Decidim::Admin::ApplicationController include TranslatableAttributes layout "decidim/admin/civicrm" + add_breadcrumb_item_from_menu :admin_civicrm_menu helper CivicrmHelpers helper Decidim::Messaging::ConversationHelper @@ -27,6 +28,10 @@ def new @form = form(Decidim::Civicrm::Admin::EventMeetingForm).instance end + def edit + @form = form(Decidim::Civicrm::Admin::EventMeetingForm).from_model(event_meeting) + end + def create @form = form(Decidim::Civicrm::Admin::EventMeetingForm).from_params(params) CreateEventMeeting.call(@form) do @@ -43,10 +48,6 @@ def create end end - def edit - @form = form(Decidim::Civicrm::Admin::EventMeetingForm).from_model(event_meeting) - end - def update @form = form(Decidim::Civicrm::Admin::EventMeetingForm).from_params(params) CreateEventMeeting.call(@form, event_meeting) do diff --git a/app/controllers/decidim/civicrm/admin/meetings_controller.rb b/app/controllers/decidim/civicrm/admin/meetings_controller.rb index ca996b2..e2db306 100644 --- a/app/controllers/decidim/civicrm/admin/meetings_controller.rb +++ b/app/controllers/decidim/civicrm/admin/meetings_controller.rb @@ -9,6 +9,7 @@ class MeetingsController < Decidim::Admin::ApplicationController include TranslatableAttributes layout "decidim/admin/civicrm" + add_breadcrumb_item_from_menu :admin_civicrm_menu helper CivicrmHelpers helper Decidim::Messaging::ConversationHelper diff --git a/app/controllers/decidim/civicrm/admin/membership_types_controller.rb b/app/controllers/decidim/civicrm/admin/membership_types_controller.rb index 7bcec21..efa095e 100644 --- a/app/controllers/decidim/civicrm/admin/membership_types_controller.rb +++ b/app/controllers/decidim/civicrm/admin/membership_types_controller.rb @@ -6,12 +6,12 @@ module Admin class MembershipTypesController < Decidim::Admin::ApplicationController include Paginable include NeedsPermission - include NeedsMultiselectSnippets helper_method :membership_types helper CivicrmHelpers layout "decidim/admin/civicrm" + add_breadcrumb_item_from_menu :admin_civicrm_menu def index # enforce_permission_to :index, :civicrm_membership_types diff --git a/app/events/decidim/civicrm/verifications/base_notification.rb b/app/events/decidim/civicrm/verifications/base_notification.rb index af61802..005660e 100644 --- a/app/events/decidim/civicrm/verifications/base_notification.rb +++ b/app/events/decidim/civicrm/verifications/base_notification.rb @@ -1,4 +1,4 @@ -# frozen-string_literal: true +# frozen_string_literal: true module Decidim module Civicrm diff --git a/app/events/decidim/civicrm/verifications/invalid_notification.rb b/app/events/decidim/civicrm/verifications/invalid_notification.rb index ef67f4c..2d9cf69 100644 --- a/app/events/decidim/civicrm/verifications/invalid_notification.rb +++ b/app/events/decidim/civicrm/verifications/invalid_notification.rb @@ -1,4 +1,4 @@ -# frozen-string_literal: true +# frozen_string_literal: true module Decidim module Civicrm diff --git a/app/events/decidim/civicrm/verifications/success_notification.rb b/app/events/decidim/civicrm/verifications/success_notification.rb index 25b1d2f..241527d 100644 --- a/app/events/decidim/civicrm/verifications/success_notification.rb +++ b/app/events/decidim/civicrm/verifications/success_notification.rb @@ -1,4 +1,4 @@ -# frozen-string_literal: true +# frozen_string_literal: true module Decidim module Civicrm diff --git a/app/forms/decidim/civicrm/admin/event_meeting_form.rb b/app/forms/decidim/civicrm/admin/event_meeting_form.rb index 5dee5b9..6a8a447 100644 --- a/app/forms/decidim/civicrm/admin/event_meeting_form.rb +++ b/app/forms/decidim/civicrm/admin/event_meeting_form.rb @@ -21,7 +21,7 @@ def meeting private def decidim_meeting_uniqueness - errors.add(:decidim_meeting_id, :taken) if EventMeeting.where(decidim_meeting_id: decidim_meeting_id).where.not(id: id).exists? + errors.add(:decidim_meeting_id, :taken) if EventMeeting.where(decidim_meeting_id:).where.not(id:).exists? end def mutually_exclusive diff --git a/app/forms/decidim/civicrm/verifications/civicrm.rb b/app/forms/decidim/civicrm/verifications/civicrm.rb index a5524f4..286ffa6 100644 --- a/app/forms/decidim/civicrm/verifications/civicrm.rb +++ b/app/forms/decidim/civicrm/verifications/civicrm.rb @@ -10,7 +10,7 @@ class Civicrm < Decidim::AuthorizationHandler def metadata super.merge( - uid: uid, + uid:, contact_id: civicrm_contact&.civicrm_contact_id ) end @@ -32,7 +32,7 @@ def uid end def civicrm_contact - @civicrm_contact ||= Decidim::Civicrm::Contact.find_by(user: user) + @civicrm_contact ||= Decidim::Civicrm::Contact.find_by(user:) end def civicrm_api_contact diff --git a/app/helpers/decidim/array_settings_helper.rb b/app/helpers/decidim/array_settings_helper.rb index a26953e..6b96a59 100644 --- a/app/helpers/decidim/array_settings_helper.rb +++ b/app/helpers/decidim/array_settings_helper.rb @@ -10,7 +10,7 @@ def multiple_select_input(form, attribute, name, i18n_scope, options = {}) form_method = :select help_text ||= text_for_setting(name, "help", i18n_scope) - help_text_options = help_text ? { help_text: help_text } : {} + help_text_options = help_text ? { help_text: } : {} options = { label: t(name, scope: i18n_scope) } .merge(help_text_options) diff --git a/app/helpers/decidim/civicrm/admin/civicrm_helpers.rb b/app/helpers/decidim/civicrm/admin/civicrm_helpers.rb index fab4513..01fa706 100644 --- a/app/helpers/decidim/civicrm/admin/civicrm_helpers.rb +++ b/app/helpers/decidim/civicrm/admin/civicrm_helpers.rb @@ -15,10 +15,10 @@ def last_sync_class(datetime) def check_icon(valid, label: false, icon: true) if valid - pic = icon "check", class: "action-icon text-success" + pic = icon "check-line", class: "action-icon text-success" txt = "#{t("enabled", scope: "decidim.civicrm.admin")}" else - pic = icon "x", class: "action-icon text-muted" + pic = icon "close-line", class: "action-icon text-muted" txt = "#{t("disabled", scope: "decidim.civicrm.admin")}" end diff --git a/app/jobs/decidim/civicrm/event_sync_job.rb b/app/jobs/decidim/civicrm/event_sync_job.rb index 29065a3..92b1396 100644 --- a/app/jobs/decidim/civicrm/event_sync_job.rb +++ b/app/jobs/decidim/civicrm/event_sync_job.rb @@ -13,7 +13,7 @@ def perform(event_name, data) return unless parser unless parser.valid? - Rails.logger.error "Parser invalid. Not publishing event ##{data[:resource]&.id} [#{event_name}] to CiviCRM API: #{parser.errors.values}" + Rails.logger.error "Parser invalid. Not publishing event ##{data[:resource]&.id} [#{event_name}] to CiviCRM API: #{parser.error_messages}" return end diff --git a/app/jobs/decidim/civicrm/rebuild_verifications_job.rb b/app/jobs/decidim/civicrm/rebuild_verifications_job.rb index b834298..0ffefe1 100644 --- a/app/jobs/decidim/civicrm/rebuild_verifications_job.rb +++ b/app/jobs/decidim/civicrm/rebuild_verifications_job.rb @@ -23,7 +23,7 @@ def perform(workflow_name, organization_id) private def perform_auth(user) - handler = Decidim::AuthorizationHandler.handler_for(@workflow_name, user: user) + handler = Decidim::AuthorizationHandler.handler_for(@workflow_name, user:) return unless handler destroy_existing!(user) @@ -41,7 +41,7 @@ def perform_auth(user) def destroy_existing!(user) Decidim::Authorization.find_by( - user: user, + user:, name: @workflow_name )&.destroy! end diff --git a/app/jobs/decidim/civicrm/sync_all_event_registrations_job.rb b/app/jobs/decidim/civicrm/sync_all_event_registrations_job.rb index adab84e..74f875f 100644 --- a/app/jobs/decidim/civicrm/sync_all_event_registrations_job.rb +++ b/app/jobs/decidim/civicrm/sync_all_event_registrations_job.rb @@ -6,7 +6,7 @@ class SyncAllEventRegistrationsJob < ApplicationJob queue_as :default def perform(organization) - EventMeeting.where(organization: organization).find_each do |event_meeting| + EventMeeting.where(organization:).find_each do |event_meeting| SyncEventRegistrationsJob.perform_later(event_meeting.id) end end diff --git a/app/jobs/decidim/civicrm/sync_all_events_job.rb b/app/jobs/decidim/civicrm/sync_all_events_job.rb index 940b8c1..3834339 100644 --- a/app/jobs/decidim/civicrm/sync_all_events_job.rb +++ b/app/jobs/decidim/civicrm/sync_all_events_job.rb @@ -26,7 +26,7 @@ def update_event(organization_id, data) Rails.logger.info "SyncAllEventsJob: Creating / updating EventMeeting #{data[:title]} (civicrm id: #{civicrm_event_id}) with data #{data}" - event = EventMeeting.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_event_id: civicrm_event_id) + event = EventMeeting.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_event_id:) event.extra = data event.marked_for_deletion = false diff --git a/app/jobs/decidim/civicrm/sync_all_groups_job.rb b/app/jobs/decidim/civicrm/sync_all_groups_job.rb index 6425a0f..2771817 100644 --- a/app/jobs/decidim/civicrm/sync_all_groups_job.rb +++ b/app/jobs/decidim/civicrm/sync_all_groups_job.rb @@ -27,14 +27,14 @@ def update_group(organization_id, data) Rails.logger.info "SyncAllGroupsJob: Creating / updating Group #{data[:title]} (civicrm id: #{civicrm_group_id}) with data #{data}" - group = Group.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_group_id: civicrm_group_id) + group = Group.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_group_id:) group.title = data[:title] group.description = data[:description] group.extra = data group.marked_for_deletion = false - group.auto_sync_members = Decidim::Civicrm.default_sync_groups&.include?(civicrm_group_id.to_i) unless group.id + group.auto_sync_members = group.id ? false : Decidim::Civicrm.default_sync_groups&.include?(civicrm_group_id.to_i).present? group.save! diff --git a/app/jobs/decidim/civicrm/sync_event_registrations_job.rb b/app/jobs/decidim/civicrm/sync_event_registrations_job.rb index 0a52ec1..8ad22e5 100644 --- a/app/jobs/decidim/civicrm/sync_event_registrations_job.rb +++ b/app/jobs/decidim/civicrm/sync_event_registrations_job.rb @@ -6,7 +6,7 @@ class SyncEventRegistrationsJob < ApplicationJob queue_as :default def perform(event_meeting_id) - EventRegistration.prepare_cleanup(event_meeting_id: event_meeting_id) + EventRegistration.prepare_cleanup(event_meeting_id:) event_meeting = Decidim::Civicrm::EventMeeting.find(event_meeting_id) @@ -16,9 +16,9 @@ def perform(event_meeting_id) update_event_meeting(event_meeting, data) - Rails.logger.info "SyncEventRegistrationsJob: #{EventRegistration.where(event_meeting_id: event_meeting_id).to_delete.count} event_meeting registrations to delete" + Rails.logger.info "SyncEventRegistrationsJob: #{EventRegistration.where(event_meeting_id:).to_delete.count} event_meeting registrations to delete" - EventRegistration.clean_up_records(event_meeting_id: event_meeting_id) + EventRegistration.clean_up_records(event_meeting_id:) remove_non_participants_meeting_registrations(event_meeting) diff --git a/app/jobs/decidim/civicrm/sync_group_members_job.rb b/app/jobs/decidim/civicrm/sync_group_members_job.rb index 732c99e..85afb12 100644 --- a/app/jobs/decidim/civicrm/sync_group_members_job.rb +++ b/app/jobs/decidim/civicrm/sync_group_members_job.rb @@ -6,7 +6,7 @@ class SyncGroupMembersJob < ApplicationJob queue_as :default def perform(group_id) - GroupMembership.prepare_cleanup(group_id: group_id) + GroupMembership.prepare_cleanup(group_id:) group = Decidim::Civicrm::Group.find(group_id) @@ -21,9 +21,9 @@ def perform(group_id) update_group(group, data) - Rails.logger.info "SyncGroupMembersJob: #{GroupMembership.where(group_id: group_id).to_delete.count} group memberships to delete" + Rails.logger.info "SyncGroupMembersJob: #{GroupMembership.where(group_id:).to_delete.count} group memberships to delete" - GroupMembership.clean_up_records(group_id: group_id) + GroupMembership.clean_up_records(group_id:) ActiveSupport::Notifications.publish("decidim.civicrm.group_membership.updated", group.id) end @@ -60,7 +60,7 @@ def update_group_membership(group, member) Rails.logger.info "SyncGroupMembersJob: Creating / updating membership for Contact #{member[:contact_id]} for Group with civicrm_group_id: #{group.civicrm_group_id}" - membership = GroupMembership.find_or_create_by(civicrm_contact_id: member[:contact_id], group: group) + membership = GroupMembership.find_or_create_by(civicrm_contact_id: member[:contact_id], group:) membership.contact = Decidim::Civicrm::Contact.find_by(civicrm_contact_id: member[:contact_id], organization: group.organization) membership.extra = member membership.marked_for_deletion = false diff --git a/app/jobs/decidim/civicrm/sync_membership_types_job.rb b/app/jobs/decidim/civicrm/sync_membership_types_job.rb index da7cd70..a784260 100644 --- a/app/jobs/decidim/civicrm/sync_membership_types_job.rb +++ b/app/jobs/decidim/civicrm/sync_membership_types_job.rb @@ -27,7 +27,7 @@ def update_membership_types(organization_id, data) Rails.logger.info "SyncMembershipTypesJob: Creating / updating MembershipType #{data[:name]} \ (civicrm id: #{civicrm_membership_type_id}) with data #{data}" - membership_type = MembershipType.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_membership_type_id: civicrm_membership_type_id) + membership_type = MembershipType.find_or_initialize_by(decidim_organization_id: organization_id, civicrm_membership_type_id:) membership_type.name = data[:name] membership_type.marked_for_deletion = false diff --git a/app/models/decidim/civicrm/contact.rb b/app/models/decidim/civicrm/contact.rb index e3f933c..4f93e95 100644 --- a/app/models/decidim/civicrm/contact.rb +++ b/app/models/decidim/civicrm/contact.rb @@ -16,8 +16,8 @@ class Contact < ApplicationRecord def possible_memberships GroupMembership.joins(:group).where({ - civicrm_contact_id: civicrm_contact_id, - decidim_civicrm_groups: { decidim_organization_id: decidim_organization_id } + civicrm_contact_id:, + decidim_civicrm_groups: { decidim_organization_id: } }) end diff --git a/app/overrides/decidim/account/show/email_readonly.html.erb.deface b/app/overrides/decidim/account/show/email_readonly.html.erb.deface index 2382f7b..4ebf139 100644 --- a/app/overrides/decidim/account/show/email_readonly.html.erb.deface +++ b/app/overrides/decidim/account/show/email_readonly.html.erb.deface @@ -1,3 +1,3 @@ -<%= f.email_field :email, disabled: current_user.unconfirmed_email.present?, autocomplete: "email", readonly: Decidim::Civicrm.block_user_email && current_user.civicrm_identity? %> +<%= f.email_field :email, disabled: current_user.unconfirmed_email.present?, autocomplete: "email", readonly: Decidim::Civicrm.block_user_email && current_user.civicrm_identity?, data: { original: current_user.email } %> diff --git a/app/overrides/decidim/admin/resource_permissions/edit/add_multiselect.html.erb.deface b/app/overrides/decidim/admin/resource_permissions/edit/add_multiselect.html.erb.deface new file mode 100644 index 0000000..af86697 --- /dev/null +++ b/app/overrides/decidim/admin/resource_permissions/edit/add_multiselect.html.erb.deface @@ -0,0 +1,9 @@ + + +<% append_stylesheet_pack_tag("decidim_admin_civicrm_selects") %> +<% append_javascript_pack_tag("decidim_admin_civicrm_selects") %> + + diff --git a/app/packs/entrypoints/decidim_admin_civicrm_selects.js b/app/packs/entrypoints/decidim_admin_civicrm_selects.js index 8fa571f..06ec5f0 100644 --- a/app/packs/entrypoints/decidim_admin_civicrm_selects.js +++ b/app/packs/entrypoints/decidim_admin_civicrm_selects.js @@ -1,2 +1,2 @@ -import "src/decidim/civicrm/admin/resource_permissions_multiselect.js"; -import "stylesheets/vendor/select2_foundation_theme.css"; +import "src/decidim/civicrm/admin/multiselect.js"; +import "stylesheets/decidim/civicrm/admin/multiselect.scss"; diff --git a/app/packs/src/decidim/civicrm/admin/multiselect.js b/app/packs/src/decidim/civicrm/admin/multiselect.js new file mode 100644 index 0000000..2e7430c --- /dev/null +++ b/app/packs/src/decidim/civicrm/admin/multiselect.js @@ -0,0 +1,101 @@ +import TomSelect from "tom-select/dist/cjs/tom-select.popular"; + +/** + * Overrides simple inputs in the resource permissions controller + * Allows to use more than one group when configuring :civicrm_groups authorization handler + */ +/* eslint-disable no-new */ +document.addEventListener("DOMContentLoaded", () => { + + /** + * Multiselect to choose which participatory spaces should sync with Civicrm groups + * */ + const spacesSelector = document.getElementById("civicrm-groups-participatory-spaces-selector"); + if (spacesSelector) { + new TomSelect(spacesSelector, { + plugins: ["remove_button", "dropdown_input"], + valueField: "id", + labelField: "text", + searchField: "text", + create: false, + render: { + option: (data, escape) => { + return `