Skip to content

P4: Componentize Add Class + Onboarding into shared AddClassForm - #29

Merged
sandervonk merged 5 commits into
mainfrom
cursor/p4-add-class-shared-6677
Sep 3, 2026
Merged

P4: Componentize Add Class + Onboarding into shared AddClassForm#29
sandervonk merged 5 commits into
mainfrom
cursor/p4-add-class-shared-6677

Conversation

@sandervonk

@sandervonk sandervonk commented Sep 3, 2026

Copy link
Copy Markdown
Member

Summary

P4 Vue slice (non-destructive): extract shared Add Class / Onboarding enroll UI into one component. Flat enrollClass / store.add_class only — no nested writers, no nested delete, no server/rules changes.

Pairs with merged mvtt-server#32 (05d58c2).

Before / after structure

Before

  • AddClass.vue (~291 lines) — full join/add UI + enroll logic
  • Onboarding.vue (~133 lines) — duplicated email/picker + add_class enroll

After

  • src/components/Portal/AddClassForm.vue — shared form owns:
    • teacher email / class id (or join-code) fields
    • loaded-class picker
    • join vs add / welcome copy
    • submit → store.add_class(...)enrollClass({ classId })
    • loading / already-joined states
  • AddClass.vue — thin shell (title chrome + variant="add")
  • Onboarding.vue — thin shell (welcome chrome + variant="welcome")
  • parseJoinRef in src/common/paths.ts — join-ref → bare classId (+ teacher when prefixed; dual-read flag for short ids)

Files

File Change
src/components/Portal/AddClassForm.vue new shared enroll form
src/views/Portal/AddClass.vue thin modal shell
src/views/Portal/Onboarding.vue thin welcome shell
src/common/paths.ts parseJoinRef + JoinRefParts (P4 flat enroll)
scripts/test-join-class.mjs unit tests for parseJoinRef
package.json test:join-class script
.github/workflows/ci.yml wire join-class tests
.gitignore ignore local .env (CI copies .env.test)

Flat-only notes

  • No nested classes/{email}/classes/... writes on this path
  • Prefer bare classId enrollment pointers via existing store.add_classenrollClass
  • Dual-read resolution for join codes / legacy refs kept during soak (parseJoinRef + class_from_ref)
  • CreateClass left alone (ClassFields already shared elsewhere)

Out of scope

  • Nested tree / placeholder deletion
  • Server endpoints / Firestore rules
  • Canvas

Verification (local)

  • npm run test:join-class
  • npm run lint
  • npm run build

Test plan

  • npm run test:join-class
  • npm run lint
  • npm run build
  • Manual: Add Class modal (email → picker → enroll)
  • Manual: join via code/ref route still resolves
  • Manual: Onboarding welcome → same enroll, Skip closes
Open in Web Open in Cursor 

cursoragent and others added 5 commits September 3, 2026 01:48
Extract flat enroll UI/logic into AddClassForm (enrollClass via
store.add_class). Thin shells keep modal/welcome chrome only.
Add parseJoinRef helper + CI unit tests for join-ref → bare classId.

Co-authored-by: Sander Vonk <sandervonk@users.noreply.github.com>
Relative TS imports break under --experimental-strip-types;
keep join-ref helper in the existing leaf paths module.

Co-authored-by: Sander Vonk <sandervonk@users.noreply.github.com>
CI already copies .env.test → .env; do not commit local env.

Co-authored-by: Sander Vonk <sandervonk@users.noreply.github.com>
Co-authored-by: Sander Vonk <sandervonk@users.noreply.github.com>
Co-authored-by: Sander Vonk <sandervonk@users.noreply.github.com>
@sandervonk
sandervonk marked this pull request as ready for review September 3, 2026 01:51
@sandervonk
sandervonk merged commit 6d05b06 into main Sep 3, 2026
1 check passed
@sandervonk
sandervonk deleted the cursor/p4-add-class-shared-6677 branch September 3, 2026 01:51
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.

2 participants