Skip to content

Add Jobs feature for tracking client opportunities#451

Open
wilmveel wants to merge 7 commits intomainfrom
feat/jobs
Open

Add Jobs feature for tracking client opportunities#451
wilmveel wants to merge 7 commits intomainfrom
feat/jobs

Conversation

@wilmveel
Copy link
Copy Markdown
Contributor

@wilmveel wilmveel commented Feb 24, 2026

Summary

  • Jobs represent potential assignments from clients, allowing the team to track incoming opportunities (title, description, rate, hours, dates, status, client, attachments) before they become actual Assignments
  • Full-stack implementation: Wirespec contract, Kotlin backend (entity, repository, service, controller with CRUD + file upload), Liquibase migration, React frontend (list with status chips, dialog with form, client selector, document upload)
  • Added "Jobs" to navigation drawer and routing, secured with JobAuthority.READ/WRITE
  • Fixed wirespec API: spread Pageable into individual query params (page, size, sort) since DefaultParamSerialization only handles primitives

Test plan

  • Maven build passes (./mvnw clean install -DskipTests)
  • TypeScript compiles cleanly (npx tsc --noEmit)
  • Jest tests pass (npm test — 25/25)
  • Playwright e2e tests pass — all 19 tests (5 job + 14 existing)
  • Job CRUD verified: create, edit, delete, client/status selection, navigation drawer

🤖 Generated with Claude Code

wilmveel and others added 4 commits February 24, 2026 15:05
Jobs represent potential assignments from clients, allowing the team to
track incoming opportunities with title, description, rate, and
attachments before they become actual Assignments.

Backend: Wirespec contract, JPA entity, repository, service, controller
with CRUD + file upload endpoints, Liquibase migration, and JobAuthority
(READ/WRITE).

Frontend: JobClient API client, JobFeature/JobList/JobDialog/JobForm
components with status chips, client selector, date pickers, and
document upload via DropzoneAreaField. Added to navigation drawer and
routing.

Includes Playwright e2e tests for create, edit, delete, and navigation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace manual Spring MVC annotations with Wirespec handler interfaces
on the backend, use wirespec-generated JobForm directly in JobService
(removing the domain JobForm.kt), and rewrite JobClient.ts to use
wirespecFetch with typed endpoint clients instead of NonInternalizingClient.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use proper package export paths (@flock/wirespec/fetch and
@flock/wirespec/serialization) and add TypeScript path mappings
in tsconfig.json so both Vite and tsc can resolve the modules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
wilmveel and others added 3 commits February 24, 2026 16:09
HTML <input type="number"> has implicit role "spinbutton", not
"textbox". This caused all job CRUD tests to time out looking
for the wrong element.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two issues found from CI Playwright test failures:
1. GET /api/jobs failed because wirespecFetch doesn't URL-encode query
   values. Serialized Pageable JSON contains {, }, [, ] characters that
   Tomcat rejects per RFC 7230/3986. Added wirespecFetchSafe wrapper.
2. POST /api/jobs failed with "Sequence job_seq not found" because the
   Hibernate 6 sequence migration (changelog-026) predates the Job entity
   (changelog-027). Added changelog-028 to create the missing sequence.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spread Pageable into individual query params (page, size, sort) in
wirespec contract since DefaultParamSerialization cannot deserialize
complex types. Fix test selectors for MUI Select comboboxes, scoped
card assertions, and strict mode violations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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