feat: scaffold React Spring Boot ILCR template - #3
Conversation
|
I'll hold this PR until tomorrow. We are still setting up a few things |
…oot-template # Conflicts: # .github/workflows/analysis.yml # .gitignore # backend/.dockerignore # backend/Dockerfile # backend/openshift.deploy.yml # backend/pom.xml # backend/src/main/resources/application.yml # docker-compose.yml
…e' into feature/react-springboot-template
…ntext foundation Epic 1 (open Schedule 1 in context) and Epic 2 stories 2.1-2.2: - millcontext validation, JdbcClient persistence, RFC 7807 error contract, action-based authorization + dev mock principal, shared Testcontainers/Flyway THE snapshot (1.1/1.2) - Schedule 1 page read-only then editable: GET aggregate document, PUT save with optimistic lock, DELETE, verbatim legacy messages, AD-8 success-message field (1.3/2.1/2.2) - verified against real Oracle (unit + acceptance ITs green) - manual-verification polish: clean 404 for unmapped paths (no stack trace), quieter business-4xx logging, Schedules submenu, header toggle-icon contrast Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… response From the backend/frontend separation-of-concerns review vs the CSP reference: - frontend: validateSchedule1 mirrors the Schedule1Request ranges, shows inline Carbon invalid/invalidText and gates Save (backend remains authoritative) - backend: handleDataIntegrityViolation returns a generic 409 message and logs the specific DB cause server-side only (closes an AD-11 info-leak) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR replaces the prior generated backend scaffolding with a Spring Boot–based ILCR scaffold and adds a React + Carbon frontend shell for local development, including mock auth/role selection, theme toggling, and initial Schedule 1 wiring (DTOs, API proxy defaults, and test scaffolding). It also updates OpenShift/Docker/GitHub workflow templates to match the new stack and to keep deploy/test automation gated until Gold deployment is enabled.
Changes:
- Swap backend scaffold to Spring Boot with actuator health endpoints, Oracle datasource toggle/validation, and Schedule 1 API/read-write test scaffolding.
- Replace frontend Bootstrap-based shell with a Carbon-based layout, navigation, theme handling, mock auth selector, and Schedule 1 client interfaces/validation.
- Update local dev + CI/CD templates (docker-compose, OpenShift templates, integration test suite selection, and GitHub workflows) with Gold placeholders behind feature gates.
Reviewed changes
Copilot reviewed 189 out of 200 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| SECURITY.md | Updates security reporting/support posture and baseline control notes for the scaffold. |
| migrations/.dockerignore | Adds Docker ignore rules for the migrations context. |
| frontend/vite.config.ts | Improves dev server defaults and backend proxy configuration; adjusts aliasing. |
| frontend/src/test-utils.tsx | Wraps RTL render with app providers for consistent test context. |
| frontend/src/test-setup.ts | Adds MSW handlers + ResizeObserver mock for Carbon/jsdom compatibility. |
| frontend/src/styles/index.scss | Introduces app-level Carbon-aligned styling and layout utilities. |
| frontend/src/styles/_variables.scss | Adds shared Sass variables for Carbon prefixing. |
| frontend/src/styles/_mixins.scss | Adds shared Sass mixins used across app layout. |
| frontend/src/styles/_custom.scss | Adds theme-specific overrides for Carbon components. |
| frontend/src/service/api-service.ts | Tightens axios interceptor typing/logging and ensures errors are rethrown. |
| frontend/src/scss/styles.scss | Removes Bootstrap-based global styles. |
| frontend/src/routeTree.gen.ts | Updates generated TanStack route tree for new routes. |
| frontend/src/routes/submissions.tsx | Adds Submissions placeholder route. |
| frontend/src/routes/schedule-1.tsx | Adds Schedule 1 route wiring. |
| frontend/src/routes/mill-associations.tsx | Adds Mill Associations placeholder route. |
| frontend/src/routes/-navigation.ts | Defines top-level navigation structure and route constants. |
| frontend/src/main.tsx | Switches app bootstrapping to Carbon styles + shared providers. |
| frontend/src/interfaces/Schedule1Response.ts | Adds Schedule 1 response contract mirroring backend DTO. |
| frontend/src/interfaces/Schedule1Request.ts | Adds Schedule 1 request contract + writable code constants. |
| frontend/src/index.css | Removes legacy MUI/Bootstrap-specific CSS override. |
| frontend/src/context/theme/useTheme.ts | Adds theme hook using context consumption. |
| frontend/src/context/theme/ThemeProvider.tsx | Adds Carbon theme provider with localStorage persistence + DOM dataset. |
| frontend/src/context/theme/ThemeContext.tsx | Adds theme context types/defaults. |
| frontend/src/context/millYear/useMillYear.ts | Adds mill/year context hook with provider guard. |
| frontend/src/context/millYear/MillYearProvider.tsx | Adds mill/year provider with defaults and test seed support. |
| frontend/src/context/millYear/millYearDefaults.ts | Introduces dev default mill/year constants. |
| frontend/src/context/millYear/MillYearContext.tsx | Adds mill/year context definition. |
| frontend/src/context/millYear/tests/useMillYear.test.tsx | Adds unit tests for mill/year context defaults and guard. |
| frontend/src/context/layout/useLayout.ts | Adds layout context hook with provider guard. |
| frontend/src/context/layout/LayoutProvider.tsx | Adds provider for side-nav expansion state. |
| frontend/src/context/layout/LayoutContext.tsx | Adds layout context definition. |
| frontend/src/context/auth/useMockAuth.ts | Adds mock auth hook using context consumption. |
| frontend/src/context/auth/mockUsers.ts | Adds mock user set + ILCR roles for local dev. |
| frontend/src/context/auth/MockAuthProvider.tsx | Adds mock-auth provider with localStorage persistence. |
| frontend/src/context/auth/MockAuthContext.tsx | Adds mock-auth context types/defaults. |
| frontend/src/components/ThemeToggle.tsx | Adds header theme toggle action using Carbon global actions. |
| frontend/src/components/schedule1/validation.ts | Adds client-side advisory validation consistent with backend ranges/messages. |
| frontend/src/components/schedule1/index.scss | Adds Carbon table/layout styles for Schedule 1 UI. |
| frontend/src/components/PlaceholderPage.tsx | Adds reusable placeholder page shell for future routes. |
| frontend/src/components/NotFound.tsx | Migrates 404 page from Bootstrap to Carbon layout components. |
| frontend/src/components/MockUserSelector.tsx | Adds mock user selector control for local role testing. |
| frontend/src/components/Layout/LayoutSideNav.tsx | Adds Carbon side navigation rendering from navigation config. |
| frontend/src/components/Layout/LayoutHeader.tsx | Adds Carbon header with menu toggle, mock user selector, and theme toggle. |
| frontend/src/components/Layout/index.tsx | Adds shared layout wrapper using Carbon HeaderContainer/Content. |
| frontend/src/components/Layout/index.scss | Adds layout CSS for content and toast positioning. |
| frontend/src/components/Layout.tsx | Removes old BC Gov design system / Bootstrap layout component. |
| frontend/src/components/core/PageTitle/index.tsx | Adds reusable page title + breadcrumb component and document title updates. |
| frontend/src/components/core/PageTitle/index.scss | Adds PageTitle styling aligned with Carbon/BC Gov prefix. |
| frontend/src/components/core/LoadingScreen/index.tsx | Adds Carbon Loading-based screen component. |
| frontend/src/components/core/LoadingScreen/index.scss | Adds LoadingScreen styling. |
| frontend/src/components/core/EmptySection/index.tsx | Adds empty-state component using Carbon pictograms. |
| frontend/src/components/core/EmptySection/index.scss | Adds empty-state styling. |
| frontend/src/components/tests/NotFound.test.tsx | Updates tests to use shared test-utils and providers. |
| frontend/src/components/tests/Dashboard.test.tsx | Updates tests for new Dashboard copy and Carbon-based close button behavior. |
| frontend/src/app/AppProviders.tsx | Centralizes app provider composition for runtime and tests. |
| frontend/src/tests/Dashboard.tsx | Updates smoke test expectations for new UI copy. |
| frontend/package.json | Renames package, swaps Bootstrap deps for Carbon/nr-theme, adds Playwright script. |
| frontend/openshift.deploy.yml | Updates OpenShift domain defaults and corrects template parameter substitution. |
| frontend/index.html | Updates app title/description metadata. |
| frontend/e2e/utils/index.ts | Points E2E default baseURL to localhost for local dev. |
| frontend/e2e/pages/dashboard.ts | Updates Playwright assertions for the new Carbon-based shell. |
| docker-compose.yml | Replaces legacy DB services with Maven-based Spring Boot local run + frontend proxying. |
| common/tests/integration/src/test_suites/it.backend.springboot.json | Adds/targets integration suite for Spring Boot scaffold endpoint(s). |
| common/tests/integration/src/test_suites/it.backend.quarkus.json | Removes obsolete integration suite definition. |
| common/tests/integration/src/test_suites/it.backend.nest.json | Removes obsolete integration suite definition. |
| common/tests/integration/src/test_suites/it.backend.fiber.json | Removes obsolete integration suite definition. |
| common/tests/integration/src/test_suites/it.backend.fastapi.json | Removes obsolete integration suite definition. |
| common/openshift.init.yml | Updates init template (name, policies) and removes DB secret/policy template pieces. |
| common/openshift.database.yml | Removes DB template (no longer part of scaffold deploy). |
| backend/src/test/resources/db/V4__seed_schedule1_write_fixtures.sql | Adds write-path seed fixtures for Schedule 1 acceptance tests. |
| backend/src/test/resources/db/V3__seed_schedule1_details.sql | Adds Schedule 1 detail-row seed data and summary updates for pinned contract. |
| backend/src/test/resources/db/V1__the_schedule1_snapshot.sql | Adds minimal THE schema snapshot for Oracle test scope. |
| backend/src/test/resources/db/migration/V1.0.0__org_unit_table.sql | Removes obsolete migration. |
| backend/src/test/resources/application-default.yml | Removes obsolete test application defaults. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/web/RootControllerTest.java | Adds unit test for /api service info endpoint. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/util/PaginationUtilTest.java | Removes obsolete pagination util unit test. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/support/AbstractOracleIT.java | Adds shared Oracle Testcontainers + Flyway base for acceptance ITs. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/security/SchedulePermissionTest.java | Adds unit tests for role→action permissions. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/security/RoleTest.java | Removes obsolete Role enum test. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/security/JwtRoleCheckerIntegrationTest.java | Removes obsolete integration tests tied to previous security wiring. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/security/JwtRoleAuthorizationManagerFactoryIntegrationTest.java | Removes obsolete integration tests tied to previous security wiring. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/security/CognitoGroupsJwtAuthenticationConverterTest.java | Adds tests for cognito:groups → ILCR role authority mapping. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/schedule1/Schedule1WriteFailureIT.java | Adds write failure rollback + retry acceptance test scaffolding. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/schedule1/Schedule1WriteAuthorizationIT.java | Adds authorization IT for write actions with security enabled. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/schedule1/Schedule1DocumentIT.java | Adds pinned contract IT scaffolding for Schedule 1 GET. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/schedule1/Schedule1AuthorizationIT.java | Adds authorization IT for Schedule 1 GET with security enabled. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/millcontext/MillContextServiceTest.java | Adds unit tests for mill/year validation rules. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/IlcrBackendApplicationTests.java | Adds Spring context smoke test with mocked JdbcClient when datasource disabled. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/extensions/WithMockJwtSecurityContextFactory.java | Removes obsolete WithMockJwt infrastructure. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/extensions/WithMockJwt.java | Removes obsolete WithMockJwt annotation. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/extensions/CustomOracleContainer.java | Removes obsolete custom container wrapper. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/extensions/AbstractTestContainerIntegrationTest.java | Removes obsolete shared container base. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/controller/CodesControllerIntegrationTest.java | Removes obsolete codes endpoint integration test. |
| backend/src/test/java/ca/bc/gov/nrs/ilcr/configuration/FeatureFlagsConfigurationIntegrationTest.java | Removes obsolete integration test for feature flags config. |
| backend/src/main/resources/META-INF/native-image/ca.bc.gov.nrs/nr-ilcr-backend-additional-hints/reachability-metadata.json | Removes native-image reachability hints (no longer used with jar build). |
| backend/src/main/resources/messages.properties | Adds legacy-parity message bundle for user-facing errors/success/validation. |
| backend/src/main/resources/application.properties | Removes legacy application.properties content. |
| backend/src/main/resources/application-openshift.yml | Adds OpenShift profile config (shutdown/logging). |
| backend/src/main/resources/application-local.yml | Removes placeholder local profile file. |
| backend/src/main/resources/application-da2923-dev.yml | Removes legacy environment-specific datasource snippet. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/web/RootController.java | Adds /api info endpoint returning name/version/status. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/web/AppInfoResponse.java | Adds record type for /api info response. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/util/PaginationUtil.java | Reworks sort resolution to use Spring Sort rather than JPA unsafe sort. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/util/JwtPrincipalUtil.java | Updates group prefix stripping from prior app to ILCR prefix. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/service/codes/DistrictService.java | Removes obsolete district service. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/SchedulePermissions.java | Adds central permission map and @PreAuthorize checker for schedule actions. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/Oauth2SecurityCustomizer.java | Removes obsolete OAuth2 customizer. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/MockPrincipalFilter.java | Adds dev-mode mock principal seeding when security disabled. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/JwtRoleChecker.java | Updates javadoc example for role checks. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/HeadersSecurityCustomizer.java | Removes obsolete header security customizer. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/DatabaseAuditor.java | Removes obsolete JPA auditor (no longer used). |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/CsrfSecurityCustomizer.java | Removes obsolete CSRF customizer. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/CognitoGroupsJwtAuthenticationConverter.java | Adds converter to map cognito:groups to ILCR role authorities. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/ApiAuthorizationCustomizer.java | Removes obsolete route authorization customizer. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/security/Action.java | Adds named actions for permission checks (VIEW/EDIT schedule). |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/StaleRevisionException.java | Adds optimistic-lock conflict exception mapping to 409. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/ScheduleNotSavedException.java | Adds persistence failure exception mapping to 500 with legacy key. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/ScheduleNotEditableException.java | Adds non-draft edit conflict exception mapping to 409. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/Schedule1Controller.java | Adds Schedule 1 GET/PUT/DELETE controller with permission checks + message handling. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/SilvicultureBlock.java | Adds Schedule 1 silviculture block DTO. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/Schedule1Response.java | Adds Schedule 1 aggregate response DTO (+ message helper). |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/Schedule1Request.java | Adds Schedule 1 write DTO with Jakarta validation ranges and legacy message keys. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/OtherCostsSummary.java | Adds Other Costs subtotal DTO. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/MessageResponse.java | Adds minimal message wrapper for delete responses. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/MessageInfo.java | Adds message key+text DTO. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/dto/LineItem.java | Adds Schedule 1 line item DTO. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/schedule1/api/Schedule1Api.java | Defines Schedule 1 API interface contract for controller implementation. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/repository/codes/OrgUnitRepository.java | Removes obsolete JPA repository. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/millcontext/ScheduleNotFoundException.java | Adds schedule context 404 business exception. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/millcontext/MillContextService.java | Adds centralized mill/year validation service. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/millcontext/MillContextRepository.java | Adds JdbcClient-based context queries for THE tables. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/millcontext/MillClosedException.java | Adds closed-mill 409 business exception. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/mappers/MapperConstants.java | Removes obsolete mapper constants. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/mappers/codes/DistrictMapper.java | Removes obsolete district mapper. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/mappers/AbstractSingleMapper.java | Removes obsolete mapper abstraction. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/IlcrBackendApplication.java | Adds new Spring Boot application entrypoint. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/HealthCheck.java | Adds lightweight Java-based container healthcheck for readiness endpoint. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/exception/UserNotFoundException.java | Removes obsolete exception type. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/exception/BusinessException.java | Adds base business exception carrying status + legacy message key. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/entity/codes/OrgUnitEntity.java | Removes obsolete JPA entity. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/dto/base/Role.java | Updates role set to ILCR roles (ADMIN/SUBMITTER) for new permission model. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/controller/CodesController.java | Removes obsolete codes controller. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/ValidationConfiguration.java | Wires MessageSource into Bean Validation for legacy key interpolation. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/ValidatingDataSource.java | Adds startup datasource validation wrapper. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/OracleHealthIndicator.java | Adds health indicator that validates Oracle connectivity when enabled. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/IlcrMetricConfiguration.java | Removes obsolete Micrometer configuration. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/IlcrConfiguration.java | Removes obsolete configuration properties class. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/GracefulShutdownConfiguration.java | Removes obsolete JPA shutdown listener. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/GlobalConfiguration.java | Removes obsolete global config and native reflection hints. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/FeatureFlagsConfiguration.java | Renames metric prefix from hrs→ilcr. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/configuration/DataSourceConfiguration.java | Adds conditional Oracle datasource + JdbcClient + transaction manager wiring. |
| backend/src/main/java/ca/bc/gov/nrs/ilcr/BackendApplication.java | Removes old application entrypoint. |
| backend/README.md | Removes legacy backend README content. |
| backend/Dockerfile | Switches to jar build + distroless runtime + Java-based healthcheck. |
| backend/config/application-local.yml | Removes local config file under backend/config. |
| backend/.mvn/wrapper/maven-wrapper.properties | Removes Maven wrapper properties. |
| backend/.dockerignore | Replaces large generated ignore list with curated exclusions. |
| .github/workflows/scheduled.yml | Gates scheduled jobs behind repository variables and updates target domain. |
| .github/workflows/reusable-tests.yml | Updates integration tests to target springboot suite and domain vars. |
| .github/workflows/reusable-tests-be.yml | Removes obsolete backend reusable test workflow. |
| .github/workflows/reusable-deploy.yml | Removes DB secret requirements and database deploy stage. |
| .github/workflows/pr-validate.yml | Updates PR validation links for zone mapping and Gold domain defaults. |
| .github/workflows/pr-open.yml | Gates PR env build/deploy/test behind deploy flag and zone mapping. |
| .github/workflows/pr-close.yml | Updates cleanup to target zone mapping and new package set. |
| .github/workflows/merge.yml | Gates deploy/test/promote steps behind deploy flag; drops migrations package. |
| .github/ISSUE_TEMPLATE/ux.yml | Removes trailing whitespace in markdown text blocks. |
| .github/ISSUE_TEMPLATE/security.yml | Removes trailing whitespace in markdown text blocks. |
| .github/ISSUE_TEMPLATE/question.yml | Removes trailing whitespace in markdown text blocks. |
| .github/ISSUE_TEMPLATE/feature.yml | Removes trailing whitespace in markdown text blocks and aligns formatting. |
| .github/ISSUE_TEMPLATE/epic.yml | Removes trailing whitespace in markdown text blocks and aligns formatting. |
| .github/ISSUE_TEMPLATE/decision.yml | Removes trailing whitespace in markdown text blocks. |
| .github/ISSUE_TEMPLATE/bugfix.yml | Removes trailing whitespace in markdown text blocks and aligns formatting. |
| .env.example | Adds sanitized local environment template for Spring Boot scaffold. |
Files not reviewed (1)
- frontend/package-lock.json: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Show the mock identity's display name in the selector, with roles as a secondary hint, instead of only the joined role strings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Other Costs button only renders for an editable (already-saved) schedule, so the `if (!data)` window.alert branch was dead. Remove it and the now-unused ALT_SAVE_BEFORE_OTHER_COSTS constant; Story 2.5 wires the sub-page navigation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
actions/stale closes stale PRs and issues, not branches. Rename the job label to match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the integration-test health wait with the OpenShift readiness probe (/api/health/readiness) instead of the aggregate /api/health, so the gate matches what the deploy actually waits on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- merge.yml: remove ENABLE_OPENSHIFT_DEPLOY gates so main deploys run and fail visibly (per @DerekRoberts), and add a lightweight "Merge Results" gate mirroring analysis.yml (per @paulushcgcj). - Delete dead JwtRoleChecker + JwtRoleAuthorizationManagerFactory scaffolding (not on the live auth path; SchedulePermissions + @PreAuthorize is the live path — will be re-introduced with the FAM auth story). - Remove the orphan migrations/ directory (Node-era leftover, only a stray .dockerignore remained). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e (no 404) Product decision (reverses the earlier "keep the 404" note): a valid, active mill/year with no saved Schedule 1 (Draft track, no category-"1" summary) now returns 200 with an empty, all-null, editable:false document (the canonical line items present) instead of 404 — matching legacy's greyed locked form. GET uses MillContextService.validateMillYearActive (unknown mill→404, closed→409, no summary required); PUT/DELETE still require an existing summary. Frontend renders the editable:false state as disabled/greyed Carbon inputs (uniform with non-Draft-with-data). Verified: 16 frontend + backend unit green, 28 Schedule 1 ITs green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…k on the tombstone Addresses PR #227 review feedback: - Footer BC Gov links use HTTPS (removes the http->https downgrade window). [paulushcgcj] - ScheduleTombstone's working-context block is a labelled <section aria-label="Working context"> region again — schedules 2/4/8 use the tombstone (not PageTitle+ContextBanner), so the landmark now lives there; the e2e locator switches to getByRole('region', { name: 'Working context' }). [SScholefield #3] Review points #1 (non-migrated pages lose the strip) and #2 (ContextBanner dead code) are resolved by merging main: #222 renders ContextBanner inside PageTitle, so the non-tombstone pages keep the working-context strip and ContextBanner is live again. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Save semantics, tests Reviewer-raised edge cases (paulushcgcj + SScholefield): - #2 Surface option-load failures on the samples + rates levels, not just the page list — the rates table resolves cost-item names client-side from /options, so a silent failure otherwise renders raw IDs with no explanation. - #3 RatesPage Save now commits a typed-but-not-yet-Added draft (guarded path) instead of silently discarding it; dirty checks include itemDescription so a description-only draft still confirms on Cancel. - #4 Guard the in-panel "TtT Samples" button — editing a page then drilling into samples now confirms before dropping unsaved page edits. - #5 Schedule8ServiceTest: assert getOptions() partitions category-8 cost items into additions ('1'/'2') vs deductions ('3'/'4'). - #6 Schedule8OptionsAuthorizationIT: VIEW_SCHEDULE authorization coverage for GET /options (parity with the other Schedule 8 endpoints). - #7 Re-add the Schedule 4 in-app-back test with assertions updated for the intended replace:true behavior (browser Back no longer re-opens the sub-page). - Mutual-exclusion (index.tsx:527): already cleared on switch + nulled in buildRequest; add a regression test that switching a saved TFL page to a TSA sends tflNumber:null. Stub Element.scrollIntoView (jsdom gap) so a pre-selected dropdown can open in tests. Not changed — #1 (samples header): legacy schedule8Detail.xhtml:72 genuinely reads "Tree To Truck Pages" (and "Action", singular); kept verbatim for parity, aligned the action header to singular. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The numeric grid inputs displayed `withCommas(raw)` over raw state, so any regrouping keystroke made React reassign input.value and the caret jumped to the end — worst on a bare comma-delete (raw unchanged → re-render bails → controlled-value revert snaps the caret to the end). Extract a shared core/CommaNumberInput that records the caret by digit count, reports the raw value, and re-places the caret after that same digit via requestAnimationFrame (runs whether or not a re-render happened). Swap the Schedule 2 category grid, Schedule 4 category grid, and Schedule 4 sub-page (add-row + editable rows) onto it. Adds a unit test proving the caret stays put on regroup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Summary
Validation
mvn -q -f backend\pom.xml verifynpm run lintnpm run format:checknpm run test:covnpm run buildgit diff --checkhttp://127.0.0.1:3000/, backend readinesshttp://localhost:3001/api/health/readinessNotes
ENABLE_OPENSHIFT_DEPLOYuntil the Gold project is available..env;.env.exampleis sanitized and does not include secrets.Thanks for the PR!
Deployments, as required, will be available below:
Please create PRs in draft mode. Mark as ready to enable:
After merge, new images are deployed in: