Skip to content

v4.0.0#610

Open
jthrilly wants to merge 1301 commits intomainfrom
next
Open

v4.0.0#610
jthrilly wants to merge 1301 commits intomainfrom
next

Conversation

@jthrilly
Copy link
Member

@jthrilly jthrilly commented Feb 9, 2026

Significant release!

  • New form system
  • Schema 8
    • Geospatial interface
    • Anonymisation interface
    • Multi-select dyad census
    • Family tree census
  • New drag and drop system
  • New dashboard UI
  • Multi-user capability
  • Preview mode
  • React 19 and Next 16

Waiting on:

  • New form system #453
  • Implementation of same-sex relationships in family tree census
  • Upgrade to posthog based analytics
  • React 19 and Next 16 upgrade
  • Bugfixes for dashboard
  • Bugfixes for ALL interview features

jthrilly and others added 30 commits January 27, 2026 21:15
Replace the previous e2e test system with a new architecture using
two isolated environments (setup + dashboard), PostgreSQL testcontainers
with JSON snapshot/restore, and advisory lock-based mutation isolation.

Key changes:
- New helpers: TestDatabase, AppServer, TestDataBuilder, seed, context,
  logger, dialog, table, row-actions, form
- DatabaseIsolation fixture with pg_advisory_lock for cross-file
  serialization of mutation tests
- New specs: onboarding, login, overview, protocols, participants,
  interviews, settings (77 tests total)
- Visual snapshots with animation disabling and dynamic content masking
- Remove old test infrastructure (suites/, utils/, configs, protocols)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
fixes bug where interview data was lost on hard refresh
  Extract hit detection from createDndStore into an injectable
  HitDetector function. Production uses domHitDetector (elementsFromPoint),
  tests use boundsHitDetector (geometric bounds). Fixes test failures
  caused by jsdom lacking elementsFromPoint.
# Conflicts:
#	.storybook/main.ts
#	lib/dnd/types.ts
#	lib/dnd/useDropTarget.ts
#	lib/form/components/fields/Boolean.js
#	lib/interviewer/Interfaces/FamilyTreeCensus/FamilyTreeProvider.tsx
#	lib/interviewer/Interfaces/FamilyTreeCensus/components/CensusForm.tsx
#	lib/interviewer/Interfaces/FamilyTreeCensus/components/FamilyTreeNode.tsx
#	lib/interviewer/Interfaces/FamilyTreeCensus/components/FamilyTreeNodeForm.tsx
#	lib/interviewer/Interfaces/FamilyTreeCensus/components/FamilyTreeShells.tsx
#	lib/interviewer/Interfaces/NameGenerator/NameGenerator.tsx
#	lib/interviewer/Interfaces/NameGenerator/components/NodePanels.tsx
#	lib/interviewer/Interfaces/NameGeneratorRoster/NameGeneratorRoster.tsx
#	lib/interviewer/components/MultiNodeBucket.tsx
#	lib/interviewer/components/NodeList.tsx
#	lib/interviewer/containers/OrdinalBins.js
#	lib/interviewer/styles/containers/_name-generator-interface.scss
#	package.json
#	pnpm-lock.yaml
Port the kinship2 pedigree layout algorithm to TypeScript as a standalone
module at lib/pedigree-layout/. Includes depth assignment, alignment
optimization via quadratic programming, connector geometry computation,
and comprehensive test coverage.
Delete unused Canvas components (LayoutNode, NodeLayout,
NodeLayoutContainer). Remove unused exports and functions from e2e
helpers. Narrow storybook theme icon type. Add missing cookie mock
properties in route test. Remove exported PairAccumulator types
only used internally.
Use anonymous Docker volumes for node_modules and .next so the
container gets Linux-native binaries instead of sharing the macOS
host's. Always copy static/public files into the standalone directory
even when the build is skipped, so the app serves CSS and JS properly.
Update Playwright Docker image to v1.58.0 to match the lockfile.
Swap the BFS-based layoutFamilyTree engine and manual EdgeRenderer SVG
geometry for the kinship2-ported alignPedigree + computeConnectors
pipeline. A new pedigreeAdapter module bridges the store's Map-based
data model and the library's array-based PedigreeInput format.
Convert solveQP from CJS require to ESM import for Vite/browser
compatibility. Add quadprog type declaration. Gracefully fall back to
unoptimized positions when the QP solver fails with inconsistent
constraints. Add Storybook stories for visual evaluation of pedigree
layouts.
…overage

The onboard route handler always redirected to the generic /onboard/error
page regardless of error type. Now checks for 'no-anonymous-recruitment'
errorType and redirects to the dedicated page instead.

Adds unit tests for the new redirect path (GET and POST) and a full e2e
spec covering onboard integration scenarios including participant reuse,
anonymous recruitment toggle, and limitInterviews enforcement.
The R code uses nid > 0 to identify valid entries (1-based indices).
The TS port uses 0-based indices, so person 0 has nid = 0, which is
indistinguishable from the empty sentinel. This caused missing QP
variable assignments and contradictory constraints (e.g. pos[k] <= -1
vs pos[k] >= 0), triggering "constraints are inconsistent" errors.

Fix by using position-based checks (j < n[lev]) instead of value-based
checks (nid > 0), since entries are always packed left-to-right.
…e story

Fix the same nid > 0 bug from alignped4 in two more locations:
- connectors.ts: person 0 was excluded from duplicate arc detection
- scaling.ts: person 0 was excluded from x-range computation

Also fix twin detection sentinel in alignPedigree.ts (use -1 instead
of 0 so person index 0 is distinguishable from "no parent connection").

Add ComplexMultiGenerational storybook story with 5 generations,
ex-partners at two levels, half-siblings, and cousins.
The require() call in autohint.ts failed because Vite/Node.js cannot
resolve ~/path aliases via require(). This caused autohint to crash
silently, falling back to sequential ordering without spouse hints,
which prevented proper sibling ordering at merge boundaries and
resulted in duplicate node appearances (e.g. father shown twice).

Replaced the require() lazy import with a layoutFn callback parameter
that alignPedigree passes when calling autohint, breaking the circular
dependency cleanly.
… story

FamilyTreeShells hydration was reading sex only from stage metadata,
defaulting to 'female' when metadata was missing. This caused all parent
edges to go to motherIndex, breaking the layout with "only one parent"
warnings.

Now reads sex from node.attributes[nodeSexVariable] first (the primary
source), falling back to metadata then 'female'. This matches how
FamilyTreeProvider initializes the store.

Added SimulatedHydration story to test the Redux hydration code path.
The pedigree layout uses 1-based levels (from R kinship2), so generation
0 is always empty and actual data starts at generation 1. This caused
200px top spacing (1 * rowHeight).

Added y-normalization to pedigreeLayoutToPositions and buildConnectorData
to shift all y coordinates so the topmost generation starts at y=0.
Twin set IDs were set to Math.min(id1, id2), so if person 0 was a twin,
the set ID would be 0. But the sentinel for "not in a twin set" was also
0, causing person 0's twin set to be skipped.

Changed sentinel from 0 to -1, and updated checks from "> 0" to ">= 0".
Resolved conflicts:
- Fixed import paths (removed 'containers/' from path)
- Replaced layoutFamilyTree.ts with new pedigree-layout library
- Updated EdgeRenderer.tsx, store.ts, pedigreeAdapter.ts imports
- Fixed PedigreeLayout.stories.tsx Node import
Resolved conflicts:
- Added getEgoSexVariable and getNetworkEgo imports to FamilyTreeShells.tsx
- Fixed import paths (removed 'containers/')
adds ability to create ex partners and select which existing network member the person is an ex partner of, name both parents if there are multiple possible parents, remove automatic creation of ex partners, add tests to cover this behavior
@github-actions
Copy link

@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

jthrilly and others added 5 commits February 17, 2026 21:50
…_yarn/next/jsdom-28.1.0

chore(deps-dev): Bump jsdom from 28.0.0 to 28.1.0
- Convex hulls now visually encompass nodes using stroke-based technique
  with paint-order and non-scaling-stroke instead of centroid expansion
- Legend uses controlled accordion where collapsing a section disables
  its visual feature (edges, hulls, highlighting)
- Annotation lines fade gradually on pen lift using direct opacity
  animation instead of broken AnimatePresence exit animations
- New DrawingControls component with pen toggle (default off), freeze,
  and reset buttons, positioned bottom-left
- Pen button enables/disables the annotation overlay
- All three buttons always visible when freeDraw is enabled
- Removed drawing controls from PresetSwitcher (now legend-only)
- Made onChangeActiveAnnotations optional in Annotations
Use controlled open state to filter out outside-press dismiss events.
@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

1 similar comment
@github-actions
Copy link

@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

fix asset query in prunePreviewProtocols to use AND [some, every] pattern, preventing orphaned assets from being matched. add asset cleanup in abort-preview
@github-actions
Copy link

🎭 Playwright E2E Test Report

Tests failed. View the full report here:

👉 https://complexdatacollective.github.io/Fresco/pr-610/

Report details

@github-actions
Copy link

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.

3 participants