<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/app/helpers, branch erdgeist-revive-events</title>
<subtitle>[no description]</subtitle>
<id>https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-revive-events</id>
<link rel='self' href='https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-revive-events'/>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/'/>
<updated>2026-06-30T22:24:10Z</updated>
<entry>
<title>Add RRULE humanizer and wire events into nodes#show</title>
<updated>2026-06-30T22:24:10Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-30T22:24:10Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=95955abaa339098755a214cfcadf87c90211fe64'/>
<id>urn:sha1:95955abaa339098755a214cfcadf87c90211fe64</id>
<content type='text'>
- app/models/concerns/rrule_humanizer.rb: new concern included into
  Event, renders recurring schedule as natural-language German or
  English from RRULE string; handles WEEKLY/MONTHLY, biweekly
  (INTERVAL=2), ordinal weekday positions (1TU, -1TH, -2WE),
  BYMONTH single-month exclusions (December pause convention);
  gracefully returns nil for COUNT/UNTIL/unrecognized shapes
- test/models/concerns/rrule_humanizer_test.rb: 15 tests covering
  all distinct RRULE shapes found in production data
- app/helpers/nodes_helper.rb: add event_schedule_text helper
  combining humanize_rrule with start_time formatting
- app/views/nodes/show.html.erb: add events row, conditionally
  rendered when node has associated events
- config/locales/de.yml, en.yml: add event_schedule_time,
  event_schedule_unrecognized, event_schedule_none keys
</content>
</entry>
<entry>
<title>Fix events CRUD for standalone events and add events to admin menu</title>
<updated>2026-06-30T17:22:24Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-30T01:55:42Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=51629c5c42270a346885057a441095c964101cc1'/>
<id>urn:sha1:51629c5c42270a346885057a441095c964101cc1</id>
<content type='text'>
- event_params now permits title, description, is_primary
- event_information helper lists all node.events, not just the first
- Occurrence.generate handles nil node (standalone events)
- Page.aggregate order_by title uses correlated subquery to avoid
  GROUP BY conflict with tag-filter path; order_direction whitelisted
  to ASC/DESC to prevent SQL injection
- Events link added to admin menu bar
- events/index shows title, is_primary; drops latitude/longitude columns
</content>
</entry>
<entry>
<title>Phase 2: chapter nodes, aggregate partial, fixes</title>
<updated>2026-06-30T17:22:24Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-28T02:43:28Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=4dd49b1eebb0a99d3aee66b7eca539c87a9c6332'/>
<id>urn:sha1:4dd49b1eebb0a99d3aee66b7eca539c87a9c6332</id>
<content type='text'>
- _chapter.html.erb: new partial for erfa/chaostreff aggregated lists;
  renders title, location, external_url, sanitized body
- content_helper: fix aggregate attr regex to allow hyphens in values
  (erfa-detail tag was silently dropped); add debug logging (remove)
- page.rb: suppress libxml stderr noise in rewrite_links_in_body
- db/seeds/chapters.rb: one-shot seed script for erfa and chaostreff
  chapter nodes under parent nodes 548/549; creates bilingual pages,
  external_url, primary events with RRULEs where known
  Note: run Node.rebuild!(false) after execution to fix lft/rgt values
</content>
</entry>
<entry>
<title>Phase 1: standalone events, external_url on nodes</title>
<updated>2026-06-30T17:22:24Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-30T17:15:22Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=a7a6ad786eeb9f94f7882462bccbdd31e1bb4743'/>
<id>urn:sha1:a7a6ad786eeb9f94f7882462bccbdd31e1bb4743</id>
<content type='text'>
- Migration: node_id nullable on events and occurrences, add
  title/description/is_primary to events, external_url to nodes
- Existing events marked is_primary: true (were all 1:1 with nodes)
- Node: has_one :event -&gt; has_many :events
- Event: belongs_to :node optional, validates title presence for
  standalone events, is_primary uniqueness scoped to node_id,
  display_title helper falling back through node title
- Occurrence: belongs_to :node optional, summary falls back to
  event.display_title
- nodes_helper: event_information uses events.first (interim; will
  be replaced in Phase 3 event UI)
- Tests: fix node.event -&gt; node.events.first in event_test
</content>
</entry>
<entry>
<title>Address brakeman security findings</title>
<updated>2026-06-30T17:21:25Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-29T19:39:49Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=31ca8e93efa860d73918b57ddddeaedf9917b22d'/>
<id>urn:sha1:31ca8e93efa860d73918b57ddddeaedf9917b22d</id>
<content type='text'>
- Replace permit! with permit(:locale, :page_path) in
  AdminHelper#language_selector
</content>
</entry>
<entry>
<title>Prevent xss by not allowing return_to to point to javascript resources</title>
<updated>2026-06-30T17:19:06Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-29T19:25:22Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=e6f59af64c7645cae130a92a4b7afd908a84c983'/>
<id>urn:sha1:e6f59af64c7645cae130a92a4b7afd908a84c983</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Stage 7 click-testing fixes</title>
<updated>2026-06-27T19:14:48Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-27T19:14:48Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=a627a650fda4e22107245a3269465347bb778258'/>
<id>urn:sha1:a627a650fda4e22107245a3269465347bb778258</id>
<content type='text'>
- aggregate: switch to shortcode syntax [aggregate ...]; fix paragraph
  wrapping by excising the shortcode and its surrounding &lt;p&gt; before
  sanitize, concatenating collection output outside sanitized content
- page.rb: remove aggregate XML unwrapping from rewrite_links_in_body
  (no longer needed with shortcode approach)
- rss builders: explicit CGI.escapeHTML on title/abstract; Builder 3.3.0
  does not escape when target buffer is html_safe (ActionView default)
- tinymce: disable menubar and promotion nag; add code plugin, remove
  paste plugin (built into TinyMCE 8 core); configure via admin_interface.js
  directly (config/tinymce.yml affects tinymce() helper only, not tinymce.init)
</content>
</entry>
<entry>
<title>Fix routes after removing the routing-filter</title>
<updated>2026-06-27T18:28:00Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-27T18:28:00Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=4c22631a5a85b3082f0525cc2454d2bd2251922a'/>
<id>urn:sha1:4c22631a5a85b3082f0525cc2454d2bd2251922a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Stage 5 click-testing fixes</title>
<updated>2026-06-26T11:40:55Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-26T11:40:55Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=811bb04649365b0faaa00b1e0810bb101a4d19b1'/>
<id>urn:sha1:811bb04649365b0faaa00b1e0810bb101a4d19b1</id>
<content type='text'>
- Fix link_to :method → button_to for all PUT/DELETE actions
- Add button_to CSS reset to admin.css for visual consistency
- Fix admin layout: replace broken jquery/jquery_ujs pipeline refs with
  admin_bundle via sprockets; add sprockets-rails, jquery-ui-rails gems
- Add app/assets/javascripts/admin_bundle.js pipeline manifest
- Fix event_information helper: use safe_join to avoid double-escaping
- Fix nodes_helper: to_s(:db) → to_fs(:db) for event times
- Fix revisions view: eliminate nested forms; diff button uses vanilla JS
  to collect radio button values before POST
- Fix config/environments/development.rb and test.rb: cache_classes →
  enable_reloading
- Add routing_filter_rails71_patch.rb version guard
- Move LockedByAnotherUser to own file for Zeitwerk autoloading
- Fix Globalize fallbacks via config.i18n.fallbacks in application.rb
</content>
</entry>
<entry>
<title>Stage 5 fixes: RouteWithParams removal, Globalize fallbacks, search stub, to_s(:db) → to_fs(:db), LockedByAnotherUser autoload, test environment config</title>
<updated>2026-06-26T03:19:28Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-26T03:19:28Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=a1ddc25da0d2aa79a4d9216ef7792f26233bd38e'/>
<id>urn:sha1:a1ddc25da0d2aa79a4d9216ef7792f26233bd38e</id>
<content type='text'>
- Remove safe_path helper and content_path shim from link_helper.rb
- Update all safe_path call sites in views to use named route helpers directly
- Fix Globalize fallbacks via config.i18n.fallbacks in application.rb, remove i18n initializer
- Stub Node.search returning none (search disabled pending PostgreSQL upgrade)
- Replace to_s(:db) with to_fs(:db) in node.rb, nodes_helper.rb, link_helper.rb, admin view
- Move LockedByAnotherUser to app/models/locked_by_another_user.rb for Zeitwerk autoloading
- Fix config/environments/test.rb: config.assets removed, cache_classes → enable_reloading,
  test_order removed, minitest pinned to ~&gt; 5.25
- Fix config/environments/development.rb: cache_classes → enable_reloading
- Park search vector migration in doc/ pending PostgreSQL and plpgsql availability
</content>
</entry>
</feed>
