* fix: resolve all Rubocop and ERBLint offenses
Rubocop (16 offenses):
- Style/IfUnlessModifier in account_logo_controller
- Lint/RedundantSafeNavigation in templates_documents_controller
- Layout/LineLength in templates_documents_controller, account_config
- Rails/WhereMissing in teams_controller
- Rails/WhereExists in send_submitter_reminder_email_job
- Style/StringLiterals in create_teams migration
- Metrics/* (disabled via inline comments for complex case statements)
ERBLint (10 errors):
- Void element self-closing tags (img /> → img >)
- Layout/ArgumentAlignment in reminder_queue
- Style/StringLiterals + Rails/LinkToBlank in navbar_buttons
- Layout/BlockAlignment in custom_content mailer
- Style/WordArray in role_select
* feat: add local CI via Docker and pre-push lint hook
- Add docker-compose.ci.yml: lint, brakeman, rspec services
- Add Dockerfile.ci: test environment with Ruby, Node, Chromium
- Add bin/lint: quick lint-only check
- Add bin/ci: full CI suite (lint + brakeman + rspec)
- Add .githooks/pre-push: auto-runs linters before push
- Update docker-compose.yml: use ghcr.io image instead of local build
Setup: git config core.hooksPath .githooks
Usage: bin/ci or bin/lint
---------
Co-authored-by: Sebastian Noe <sebastian.schneider@boxine.de>
* feat: add customizable reminder email templates
- Add SubmitterMailer#reminder_email with separate subject/body resolution
- Support per-template and per-account reminder email customization
- Add GUI forms for reminder email templates (account + template level)
- Add i18n keys for reminder emails and reminder visibility UI
- Update SendSubmitterReminderEmailJob to use reminder_email instead of invitation_email
- Add race condition guard (1-minute dedup) in send job
* fix: prevent reminder job duplication on container restart
- Add deduplication in scheduled_jobs.rb initializer (clear existing before scheduling)
- Add reschedule! method in ProcessSubmitterRemindersJob that clears stale copies
- Prevents exponential job accumulation across container restarts
* feat: add reminder visibility and queue management
- Add SubmitterReminders module (lib/) for next-reminder-at calculation
- Show next reminder time per submitter on submission page (with timezone tooltip)
- Add pending reminders queue table on notifications settings page
- Add Skip button to advance past current pending reminder (Turbo Stream)
- Add skip_reminder_email event type to SubmissionEvent
- Update ProcessSubmitterRemindersJob to count skip events in reminder_count
- Add SubmitterRemindersController with destroy action for skip
* docs: document reminder email templates feature in README
---------
Co-authored-by: Sebastian Noe <sebastian.schneider@boxine.de>