Skip to content

feat (Frontend): Add team tender list sign-up page#408

Merged
Strehk merged 3 commits intomainfrom
feat/team-tender-page
Mar 15, 2026
Merged

feat (Frontend): Add team tender list sign-up page#408
Strehk merged 3 commits intomainfrom
feat/team-tender-page

Conversation

@Strehk
Copy link
Copy Markdown
Member

@Strehk Strehk commented Mar 15, 2026

Summary

  • Adds a low-friction sign-up page at /team-tender/ (with short URL /tt/ for QR codes) where users can opt in to receive tender emails for DMUN conference team positions
  • Reuses the existing wantsJoinTeamInformation field on the User model and the updateOneUsersNewsletterPreferences mutation — no backend changes needed
  • Includes breadcrumb navigation, i18n translations (DE/EN), and two UI states (sign-up / already signed up with unsubscribe)

Test plan

  • Visit /tt/ and verify redirect to /team-tender/
  • When not logged in, verify automatic OIDC redirect and return to /team-tender/ after login
  • Click "Sign me up" and verify success toast + UI switches to "already signed up" state
  • Click "Unsubscribe" and verify success toast + UI reverts to sign-up state
  • Verify wantsJoinTeamInformation toggles correctly in the database
  • Verify breadcrumb displays correctly on the page

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Team Tender: users can sign up/unsubscribe to receive notifications about team position openings; includes a short URL redirect to the Team Tender page and a new breadcrumb entry.
  • Documentation

    • Added German and English translation strings for the Team Tender UI and messages.
  • Chores

    • CI: pinned Trivy scanner version in workflow configuration.

Low-friction page accessible via QR code (/tt/) where users can log in
and sign up to receive tender emails for DMUN conference team positions.
Reuses existing wantsJoinTeamInformation field on User model.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Strehk Strehk added the PR: Feature New feature label Mar 15, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 15, 2026

Warning

Rate limit exceeded

@Strehk has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 0 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b87cbda1-217b-4d0d-b428-b5925bb615ff

📥 Commits

Reviewing files that changed from the base of the PR and between c395cd6 and 48bf5a4.

📒 Files selected for processing (1)
  • src/routes/(authenticated)/team-tender/+page.svelte
📝 Walkthrough

Walkthrough

Adds a new "Team Tender" feature: localized strings (EN/DE), an authenticated SvelteKit route with server-side load querying user preference, a client page to sign up/unsubscribe via GraphQL mutation with toasts, a breadcrumb entry, and a short /tt → /team-tender redirect.

Changes

Cohort / File(s) Summary
Translation files
messages/en.json, messages/de.json
Added 11 new i18n keys for the Team Tender UI (title, description, sign-up/unsubscribe actions, status, loading, error, manage preferences, success messages).
Authenticated route (server + page)
src/routes/(authenticated)/team-tender/+page.server.ts, src/routes/(authenticated)/team-tender/+page.svelte
New authenticated page: server load queries current user's wantsJoinTeamInformation; client page shows signup state, performs updateOneUsersNewsletterPreferences mutation, manages local state and toast notifications.
Navigation & redirect
src/routes/(authenticated)/Breadcrumbs.svelte, src/routes/tt/+page.ts
Added breadcrumb entry for team-tender; added /tt route that redirects (302) to /team-tender.
CI workflow
.github/workflows/ci.yml
Pinned aquasecurity/trivy-action invocations to version: 'v0.69.3' in CI steps.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant B as Browser/Page
    participant S as SvelteKit Server (load)
    participant GQ as GraphQL API

    U->>B: Navigate to /team-tender
    B->>S: invoke load()
    activate S
    S->>GQ: query user(wantsJoinTeamInformation) by id
    activate GQ
    GQ-->>S: return user preference
    deactivate GQ
    S-->>B: return signedUp status
    deactivate S
    B->>U: render signup UI (signedUp state)

    U->>B: Click Sign Up / Unsubscribe
    B->>GQ: mutation updateOneUsersNewsletterPreferences(email, wantsJoinTeamInformation)
    activate GQ
    GQ-->>B: mutation result (success/error)
    deactivate GQ
    B->>U: show toast, update UI state
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐇 I hopped to code with a joyful cheer,
New keys and a page for the team to hear,
A toggle, a toast, and a tiny redirect,
Now tenders ring out — perfect and direct! 🎉

🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Boy Scout Scope ⚠️ Warning PR includes opportunistic CI workflow changes unrelated to the team-tender feature, violating Boy Scout Scope rule. Remove CI workflow changes or document them in a 'Boy Scout changes' section with justification for inclusion.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: adding a new team tender sign-up page feature on the frontend, which aligns with all file changes in the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Pr Label Required ✅ Passed The pull request has the label "PR: Feature" applied, which is one of the accepted release-category labels.
German Gender-Inclusive Language ✅ Passed German translations contain no person-related nouns requiring gender-inclusive language treatment with gender star or neutral forms.

✏️ 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 feat/team-tender-page
📝 Coding Plan
  • Generate coding plan for human review comments

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
Copy Markdown
Contributor

@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: 2

🧹 Nitpick comments (1)
src/routes/(authenticated)/team-tender/+page.svelte (1)

4-5: Align i18n/icon usage with Svelte conventions.

This component uses m.*() helpers and fa-solid icons, while project Svelte conventions require $t() and duotone icons.

As per coding guidelines "Use Paraglide-JS $t() function for translated strings in Svelte components" and "Use FontAwesome Duotone icons with fa-duotone fa-icon-name format in Svelte components".

Also applies to: 51-51, 67-67

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

In `@src/routes/`(authenticated)/team-tender/+page.svelte around lines 4 - 5, This
file uses the Paraglide m.*() helpers and solid icon classes; update each use of
m.<...>() in the Svelte component (e.g., where PageProps or labels are built) to
call the Paraglide-JS Svelte translation function $t(...) instead, and replace
any FontAwesome "fa-solid" classes with duotone classes in the "fa-duotone
fa-<icon-name>" format; specifically update occurrences noted (around the usages
at the current imports and the two other locations referenced) so string lookups
use $t and icon class attributes use fa-duotone.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/routes/`(authenticated)/team-tender/+page.svelte:
- Around line 13-17: The GraphQL mutation UpdateTeamTenderPreference and the
resolver updateOneUsersNewsletterPreferences accept a mutable email parameter
allowing clients to change other users' preferences; remove the client-supplied
email from the mutation signature and from the client call in +page.svelte, and
modify the resolver in modules/user.ts to derive the target user from the
authenticated context (e.g., ctx.user.id or equivalent) and ignore any provided
email input so updates are only applied to the signed-in user.
- Around line 35-37: The mutation successful path currently only updates local
state (setting signedUp after awaiting promise); after the mutation succeeds you
must mark Houdini cache stale and revalidate route data by calling
cache.markStale() and then awaiting invalidateAll() — e.g., in the same success
branch where you await promise (before/after setting signedUp) call
cache.markStale() and await invalidateAll() so other views receive updated
preference state. Ensure you import or reference the existing Houdini
cache/invalidate helpers used in the project and only run these calls on the
successful completion of the mutation.

---

Nitpick comments:
In `@src/routes/`(authenticated)/team-tender/+page.svelte:
- Around line 4-5: This file uses the Paraglide m.*() helpers and solid icon
classes; update each use of m.<...>() in the Svelte component (e.g., where
PageProps or labels are built) to call the Paraglide-JS Svelte translation
function $t(...) instead, and replace any FontAwesome "fa-solid" classes with
duotone classes in the "fa-duotone fa-<icon-name>" format; specifically update
occurrences noted (around the usages at the current imports and the two other
locations referenced) so string lookups use $t and icon class attributes use
fa-duotone.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fa27538f-5978-450d-a054-8326de902c2b

📥 Commits

Reviewing files that changed from the base of the PR and between da90aa2 and ae61986.

📒 Files selected for processing (6)
  • messages/de.json
  • messages/en.json
  • src/routes/(authenticated)/Breadcrumbs.svelte
  • src/routes/(authenticated)/team-tender/+page.server.ts
  • src/routes/(authenticated)/team-tender/+page.svelte
  • src/routes/tt/+page.ts

Comment thread src/routes/(authenticated)/team-tender/+page.svelte
Comment thread src/routes/(authenticated)/team-tender/+page.svelte
Strehk and others added 2 commits March 15, 2026 12:34
trivy-action@0.32.0 defaults to "latest" which can resolve to versions
with removed release artifacts (e.g. v0.69.1), causing exit code 1.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tion

Ensures other views (e.g. my-account) reflect updated preference state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Strehk Strehk merged commit a72f2c8 into main Mar 15, 2026
12 checks passed
@Strehk Strehk deleted the feat/team-tender-page branch March 15, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PR: Feature New feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant