Skip to content

1.3.0: green linters#2299

Merged
Freika merged 8 commits intomasterfrom
dev
Feb 25, 2026
Merged

1.3.0: green linters#2299
Freika merged 8 commits intomasterfrom
dev

Conversation

@Freika
Copy link
Owner

@Freika Freika commented Feb 24, 2026

Summary by CodeRabbit

  • Chores

    • Updated development configuration and linting settings.
    • Minor dependency comment clarified.
  • Style

    • Consistent CSS formatting, selector syntax, and content declarations across stylesheets.
    • Standardized JSON and manifest spacing.
  • Bug Fixes

    • Adjusted stylesheet spacing that may affect map control label line-height and related UI spacing.

@coderabbitai
Copy link

coderabbitai bot commented Feb 24, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7c9352 and caab93b.

📒 Files selected for processing (5)
  • app/assets/stylesheets/actiontext.css
  • app/assets/stylesheets/application.css
  • app/assets/stylesheets/leaflet.control.layers.tree.css
  • app/assets/stylesheets/leaflet_theme.css
  • app/assets/stylesheets/maps_maplibre_panel.css

📝 Walkthrough

Walkthrough

RuboCop configuration key changed and many cops disabled/excluded; miscellaneous formatting and inline comment tweaks in devcontainer, Gemfile, and app.json; CSS files reformatted and normalized (quotes, spacing, selector layout), with one stylesheet introducing a spacing change near !important.

Changes

Cohort / File(s) Summary
Configuration & Manifests
\.devcontainer/devcontainer.json, \.rubocop.yml, Gemfile, app.json
.rubocop.yml switched top-level require:plugins: and added many cops with Enabled: false and Exclude lists; .devcontainer/devcontainer.json, Gemfile, and app.json only have comment/whitespace formatting edits.
ActionText & App stylesheet
app/assets/stylesheets/actiontext.css, app/assets/stylesheets/application.css
Formatting and selector reflow, whitespace/quote normalization, minor style property spacing changes; no API or behavioral changes reported.
Leaflet-related styles
app/assets/stylesheets/leaflet.control.layers.tree.css, app/assets/stylesheets/leaflet_theme.css
Formatting and selector spacing normalized; leaflet_theme.css preserves !important usage with added comments; leaflet.control.layers.tree.css has a space introduced before !important (1.5rem !important) which can invalidate or change the rule's behavior—requires attention.
Map UI styles
app/assets/stylesheets/maps_maplibre_panel.css
Content quote normalization, added comment about focus state, and transition declarations reformatted to multiline; behavior unchanged aside from formatting.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I nibble spaces, tuck quotes in line,
I hop through rubocs, toggle rules divine,
A hop, a tweak, a gentle style prune—
Files look tidy under moon,
Tiny changes, a cheerful tune 🌙✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '1.3.0: green linters' accurately describes the main changes: updating linter configurations (.rubocop.yml) and fixing linter violations across CSS and config files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (2)
.rubocop.yml (1)

28-35: Bulk-disabling all complexity/size metrics removes meaningful code quality signals.

With Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/BlockLength, Metrics/MethodLength, Metrics/ClassLength, and Metrics/ModuleLength all disabled, RuboCop no longer enforces any complexity or size limits. Combined with Metrics/ParameterLists: Enabled: false (Line 34), this removes a meaningful layer of maintainability enforcement.

Consider restoring at least some of these with elevated (rather than disabled) thresholds, or scoping exclusions to test/spec files where long methods are more acceptable.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.rubocop.yml around lines 28 - 35, The RuboCop config currently
bulk-disables metrics (Metrics/AbcSize, Metrics/CyclomaticComplexity,
Metrics/PerceivedComplexity, Metrics/BlockLength, Metrics/MethodLength,
Metrics/ClassLength, Metrics/ModuleLength) and disables Metrics/ParameterLists;
restore maintainability checks by re-enabling a subset of these rules with
relaxed thresholds (e.g., raise Max for Metrics/CyclomaticComplexity and
Metrics/PerceivedComplexity, increase Max for
MethodLength/BlockLength/ClassLength) and/or scope strict enforcement to
non-test files via an AllCops or Metrics namespace Exclude pattern; update the
entries for Metrics/PerceivedComplexity, Metrics/ModuleLength,
Metrics/ParameterLists and add explicit configuration blocks for
Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength and
Metrics/BlockLength to reflect the new thresholds or file excludes.
Gemfile (1)

53-53: Nit: shortened comment loses diagnostic context.

The original comment explained why sidekiq 8.1+ breaks Rails (it requires connection_pool 3.0+). The new "breaking Rails" wording is vague and won't help future maintainers understand the constraint without cross-referencing Line 15's comment.

✏️ Suggested wording
-gem 'sidekiq', '8.0.10' # Pin to 8.0.x - sidekiq 8.1+ requires connection_pool 3.0+ breaking Rails
+gem 'sidekiq', '8.0.10' # Pin to 8.0.x - sidekiq 8.1+ requires connection_pool 3.0+ (breaking API changes with Rails RedisCacheStore)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Gemfile` at line 53, Restore the original diagnostic detail on the Sidekiq
pin: update the comment on the line containing gem 'sidekiq', '8.0.10' to
explicitly state that Sidekiq 8.1+ requires connection_pool 3.0+, which breaks
compatibility with the project's Rails version, so keep the pin; include the
specific "requires connection_pool 3.0+" rationale to aid future maintainers.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.rubocop.yml:
- Around line 73-74: The config currently disables the Rails/OutputSafety cop
which removes automated XSS checks; restore the cop by removing or reverting the
"Rails/OutputSafety: Enabled: false" entry and instead suppress only the
specific false-positive call sites (e.g., usages of html_safe, raw, concat) by
adding localized RuboCop directives around those lines (rubocop:disable/enable
Rails/OutputSafety) or by annotating those methods as safe, so the global cop
remains enabled while only known-safe instances are exempted.
- Around line 47-48: The RuboCop rule Rails/SkipsModelValidations is currently
disabled globally which is unsafe; re-enable the cop (remove or revert Enabled:
false) and instead add a scoped Exclude list for known safe locations where
validation-skipping is intentional (for example db/seeds.rb, db/migrate/**,
lib/tasks/** or specific data migration files), or document and prefer inline
rubocop:disable comments in those specific files; update the .rubocop.yml entry
for Rails/SkipsModelValidations to remove the global disable and include an
Exclude array listing those specific paths.
- Around line 54-60: Remove the blanket Exclude for the
Rails/ReversibleMigration and Rails/NotNullColumn cops in .rubocop.yml (the
entries under "Rails/ReversibleMigration: Exclude: - 'db/migrate/**/*'" and
"Rails/NotNullColumn: Exclude: - 'db/migrate/**/*'") and instead allow
violations to be suppressed inline per-migration using # rubocop:disable
comments; alternatively, if a narrower global exemption is required, restrict
the Exclude pattern to specific filenames rather than the entire db/migrate/**/*
directory so the cops continue to run on most migrations.

In `@app/assets/stylesheets/actiontext.css`:
- Around line 38-40: The comment in actiontext.css (the block comment above the
.trix-button-group.trix-button-group--file-tools rule) lacks a space before the
closing `*/`, causing Stylelint to fail; update that comment to include a space
before `*/` (i.e., change the comment text to end with a space before the
closing delimiter) so the file passes linting.
- Around line 21-36: The custom ActionText/Trix CSS rules (.trix-content,
.attachment-gallery, .attachment-gallery--2, .attachment-gallery--4,
action-text-attachment, .attachment) should either be replaced with equivalent
Tailwind/DaisyUI utilities (e.g., flex-basis/max-width responsive classes) to
comply with app/**/*.{css,scss,html,erb} guidelines, or—if these selectors are
required for ActionText output—add a brief justification comment above the block
explaining why bespoke CSS is necessary and ensure the block follows Tailwind
ordering conventions; update the file accordingly and keep the selector names
intact so Trix output continues to style correctly.

In `@app/assets/stylesheets/leaflet.control.layers.tree.css`:
- Around line 34-36: The removal of !important from the .leaflet-control-layers
label rule causes its 1.5rem line-height to be overridden by leaflet_theme.css's
1.25rem because asset loading order applies; to fix, either restore the
!important on .leaflet-control-layers label in leaflet.control.layers.tree.css
so the 1.5rem remains authoritative, or intentionally change the theme rule (in
leaflet_theme.css) to 1.5rem (or increase its selector specificity) if the
smaller line-height is not desired — update the rule for the selector
.leaflet-control-layers label accordingly to reflect the intended visual result.

---

Nitpick comments:
In @.rubocop.yml:
- Around line 28-35: The RuboCop config currently bulk-disables metrics
(Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity,
Metrics/BlockLength, Metrics/MethodLength, Metrics/ClassLength,
Metrics/ModuleLength) and disables Metrics/ParameterLists; restore
maintainability checks by re-enabling a subset of these rules with relaxed
thresholds (e.g., raise Max for Metrics/CyclomaticComplexity and
Metrics/PerceivedComplexity, increase Max for
MethodLength/BlockLength/ClassLength) and/or scope strict enforcement to
non-test files via an AllCops or Metrics namespace Exclude pattern; update the
entries for Metrics/PerceivedComplexity, Metrics/ModuleLength,
Metrics/ParameterLists and add explicit configuration blocks for
Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength and
Metrics/BlockLength to reflect the new thresholds or file excludes.

In `@Gemfile`:
- Line 53: Restore the original diagnostic detail on the Sidekiq pin: update the
comment on the line containing gem 'sidekiq', '8.0.10' to explicitly state that
Sidekiq 8.1+ requires connection_pool 3.0+, which breaks compatibility with the
project's Rails version, so keep the pin; include the specific "requires
connection_pool 3.0+" rationale to aid future maintainers.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ab8d09 and c7c9352.

⛔ Files ignored due to path filters (291)
  • app/assets/svg/icons/flags/landscape/ad.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ae.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/af.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ag.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ai.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/al.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/am.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ao.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/aq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ar.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/arab.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/as.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/asean.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/at.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/au.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/aw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ax.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/az.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ba.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bb.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bd.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/be.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bi.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bj.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bo.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/br.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bs.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/by.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/bz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ca.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cd.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cefta.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ch.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ci.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ck.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/co.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cp.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cx.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cy.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/cz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/de.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/dg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/dj.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/dk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/dm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/do.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/dz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/eac.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ec.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ee.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/eg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/eh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/er.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/es-ct.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/es-ga.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/es-pv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/es.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/et.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/eu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fi.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fj.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fo.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/fr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ga.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gb-eng.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gb-nir.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gb-sct.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gb-wls.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gb.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gd.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ge.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gi.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gp.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gs.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/gy.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/hk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/hm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/hn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/hr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ht.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/hu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ic.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/id.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ie.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/il.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/im.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/in.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/io.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/iq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ir.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/is.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/it.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/je.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/jm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/jo.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/jp.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ke.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ki.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/km.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kp.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ky.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/kz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/la.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lb.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/li.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ls.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/lv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ly.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ma.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/md.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/me.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ml.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mo.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mp.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ms.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mx.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/my.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/mz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/na.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ne.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ng.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ni.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/no.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/np.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/nz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/om.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pa.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pe.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ph.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ps.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/pw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/py.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/qa.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/re.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ro.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/rs.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ru.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/rw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sa.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sb.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sd.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/se.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sh-ac.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sh-hl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sh-ta.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sh.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/si.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sj.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/so.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ss.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/st.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sx.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sy.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/sz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/td.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/th.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tj.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tl.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/to.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tr.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tv.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/tz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ua.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ug.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/um.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/un.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/us.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/uy.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/uz.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/va.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/vc.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ve.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/vg.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/vi.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/vn.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/vu.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/wf.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ws.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/xk.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/xx.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/ye.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/yt.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/za.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/zm.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/landscape/zw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ad.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ae.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/af.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ag.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ai.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/al.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/am.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ao.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/aq.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ar.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/arab.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/as.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/asean.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/at.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/au.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/aw.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ax.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/az.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/ba.svg is excluded by !**/*.svg
  • app/assets/svg/icons/flags/square/bb.svg is excluded by !**/*.svg
📒 Files selected for processing (9)
  • .devcontainer/devcontainer.json
  • .rubocop.yml
  • Gemfile
  • app.json
  • app/assets/stylesheets/actiontext.css
  • app/assets/stylesheets/application.css
  • app/assets/stylesheets/leaflet.control.layers.tree.css
  • app/assets/stylesheets/leaflet_theme.css
  • app/assets/stylesheets/maps_maplibre_panel.css

Comment on lines 47 to +48
Rails/SkipsModelValidations:
Enabled: false
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Disabling Rails/SkipsModelValidations globally is a data-integrity risk.

This cop catches uses of update_column, update_columns, update_all, upsert, insert_all, and similar methods that bypass ActiveRecord validations and callbacks. Disabling it project-wide silently allows these patterns everywhere, which can corrupt data in models with critical callbacks (e.g., password hashing, audit logging, normalizations).

Consider scoping the exclusion to specific files/directories where bypassing validations is intentional (e.g., data migrations, seed files) rather than disabling it globally.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.rubocop.yml around lines 47 - 48, The RuboCop rule
Rails/SkipsModelValidations is currently disabled globally which is unsafe;
re-enable the cop (remove or revert Enabled: false) and instead add a scoped
Exclude list for known safe locations where validation-skipping is intentional
(for example db/seeds.rb, db/migrate/**, lib/tasks/** or specific data migration
files), or document and prefer inline rubocop:disable comments in those specific
files; update the .rubocop.yml entry for Rails/SkipsModelValidations to remove
the global disable and include an Exclude array listing those specific paths.

Comment on lines +54 to +60
Rails/ReversibleMigration:
Exclude:
- 'db/migrate/**/*'

Rails/NotNullColumn:
Exclude:
- 'db/migrate/**/*'
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Excluding Rails/ReversibleMigration and Rails/NotNullColumn for the entire db/migrate/**/* directory removes critical safety guardrails.

  • Rails/ReversibleMigration ensures migrations can be rolled back — excluding it for all migrations means rake db:rollback breakages won't be caught at review time.
  • Rails/NotNullColumn prevents adding NOT NULL columns without defaults to tables with existing rows, which causes deployment failures in production.

These cops exist precisely to protect migration files. If specific migrations intentionally violate them, use inline # rubocop:disable comments instead of a blanket directory exclusion.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.rubocop.yml around lines 54 - 60, Remove the blanket Exclude for the
Rails/ReversibleMigration and Rails/NotNullColumn cops in .rubocop.yml (the
entries under "Rails/ReversibleMigration: Exclude: - 'db/migrate/**/*'" and
"Rails/NotNullColumn: Exclude: - 'db/migrate/**/*'") and instead allow
violations to be suppressed inline per-migration using # rubocop:disable
comments; alternatively, if a narrower global exemption is required, restrict
the Exclude pattern to specific filenames rather than the entire db/migrate/**/*
directory so the cops continue to run on most migrations.

Comment on lines +73 to +74
Rails/OutputSafety:
Enabled: false
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Disabling Rails/OutputSafety degrades XSS protection.

Rails/OutputSafety flags unsafe uses of html_safe, raw, and concat that can introduce XSS vulnerabilities. Disabling it means code reviewers lose automated detection of potentially unsafe HTML interpolation. If there are specific known-safe call sites triggering false positives, those should be suppressed inline rather than turning the cop off globally.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.rubocop.yml around lines 73 - 74, The config currently disables the
Rails/OutputSafety cop which removes automated XSS checks; restore the cop by
removing or reverting the "Rails/OutputSafety: Enabled: false" entry and instead
suppress only the specific false-positive call sites (e.g., usages of html_safe,
raw, concat) by adding localized RuboCop directives around those lines
(rubocop:disable/enable Rails/OutputSafety) or by annotating those methods as
safe, so the global cop remains enabled while only known-safe instances are
exempted.

Comment on lines +21 to 36
.trix-content
.attachment-gallery.attachment-gallery--2
> action-text-attachment,
.trix-content .attachment-gallery.attachment-gallery--2 > .attachment,
.trix-content
.attachment-gallery.attachment-gallery--4
> action-text-attachment,
.trix-content .attachment-gallery.attachment-gallery--4 > .attachment {
flex-basis: 50%;
max-width: 50%;
}

.trix-content action-text-attachment .attachment {
padding: 0 !important;
max-width: 100% !important;
padding: 0;
max-width: 100%;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use Tailwind/DaisyUI utilities or justify bespoke CSS here.

These modified rules are bespoke CSS inside app assets; if this is unavoidable for ActionText/Trix output, please add a brief justification comment or move styling to Tailwind/DaisyUI utilities where feasible.
As per coding guidelines: “app//*.{css,scss,html,erb}: Use Tailwind + DaisyUI for styling” and “app//*.{css,scss}: Follow Tailwind ordering conventions and avoid bespoke CSS unless necessary.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/assets/stylesheets/actiontext.css` around lines 21 - 36, The custom
ActionText/Trix CSS rules (.trix-content, .attachment-gallery,
.attachment-gallery--2, .attachment-gallery--4, action-text-attachment,
.attachment) should either be replaced with equivalent Tailwind/DaisyUI
utilities (e.g., flex-basis/max-width responsive classes) to comply with
app/**/*.{css,scss,html,erb} guidelines, or—if these selectors are required for
ActionText output—add a brief justification comment above the block explaining
why bespoke CSS is necessary and ensure the block follows Tailwind ordering
conventions; update the file accordingly and keep the selector names intact so
Trix output continues to style correctly.

Comment on lines 38 to +40
/* Hide both attach files and attach images buttons in trix editor*/
.trix-button-group.trix-button-group--file-tools {
display:none;
display: none;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix comment whitespace to satisfy lint.

Stylelint expects a space before */ in the comment.

🔧 Proposed fix
-/* Hide both attach files and attach images buttons in trix editor*/
+/* Hide both attach files and attach images buttons in trix editor */
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
/* Hide both attach files and attach images buttons in trix editor*/
.trix-button-group.trix-button-group--file-tools {
display:none;
display: none;
/* Hide both attach files and attach images buttons in trix editor */
.trix-button-group.trix-button-group--file-tools {
display: none;
🧰 Tools
🪛 Stylelint (17.3.0)

[error] 38-38: Expected whitespace before "*/" (comment-whitespace-inside)

(comment-whitespace-inside)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/assets/stylesheets/actiontext.css` around lines 38 - 40, The comment in
actiontext.css (the block comment above the
.trix-button-group.trix-button-group--file-tools rule) lacks a space before the
closing `*/`, causing Stylelint to fail; update that comment to include a space
before `*/` (i.e., change the comment text to end with a space before the
closing delimiter) so the file passes linting.

@Freika Freika merged commit 19037f0 into master Feb 25, 2026
10 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant