Skip to content

Conversation

@dan-rukas
Copy link
Member

@dan-rukas dan-rukas commented Nov 18, 2025

Context

Introduces a complete Study List system built with a headless-first architecture, along with design system components and an interactive prototype for user testing and iteration.

Key Highlights:

  • Composable, headless-first architecture enabling full customization
  • 4 new Design System components (DataTable, Table, PatientSummary, StudyList)
  • Interactive prototype environment for rapid design iteration and user testing

Prototype Preview Links

Changes & Results

1. DataTable (platform/ui-next/src/components/DataTable/)

A composable, feature-rich data table component built on @tanstack/react-table with compound component patterns.

Files Added (11):

  • DataTable.tsx - Core table component with state management
  • context.tsx - Shared table context
  • ColumnHeader.tsx - Sortable column headers
  • FilterRow.tsx - Inline filtering UI
  • Pagination.tsx - Pagination controls
  • ViewOptions.tsx - Column visibility menu
  • Toolbar.tsx - Table toolbar container
  • Title.tsx - Table title component
  • ActionCell.tsx - Action cell wrapper
  • ActionOverlayCell.tsx - Hover/selection action cell
  • index.ts - Public exports

Features:

  • Column sorting, filtering, and visibility toggles
  • Single/multi-row selection with keyboard support (Enter/Space)
  • Pagination with configurable page sizes
  • Compound component API for flexible composition
  • Full TypeScript generics support

2. Table (platform/ui-next/src/components/Table/)

Primitive table components providing the foundational HTML table elements with consistent styling.

Files Added (2):

  • Table.tsx - Base table primitives (Table, TableHeader, TableBody, TableHead, TableRow, TableCell)
  • index.ts - Public exports

Features:

  • Semantic HTML table structure
  • Optional scroll container
  • Consistent design tokens
  • Ref forwarding for all components

3. PatientSummary (platform/ui-next/src/components/PatientSummary/)

A flexible patient information display component with workflow launcher integration.

Files Added (2):

  • PatientSummary.tsx - Main component with compound slots (Patient, Icon, Title, Subtitle, Workflows, Section)
  • index.ts - Public exports

Features:

  • Compound component API for flexible layouts
  • Workflow launcher integration
  • Customizable data mapping via get prop
  • Series thumbnails with drag-and-drop support
  • Responsive layout options (row/column)

4. StudyList (platform/ui-next/src/components/StudyList/)

A complete, production-ready study list built from composable building blocks with headless state management.

Architecture:

  • Headless State (headless/) - UI-agnostic state management
  • Building Blocks (components/) - Small, focused UI components
  • Layouts (layouts/) - Pre-composed responsive layouts
  • Columns (columns/) - Default column definitions

Files Added (20):

Headless State (3):

  • headless/StudyListProvider.tsx - Context provider
  • headless/useStudyList.ts - Core state hook
  • headless/workflows-registry.ts - Workflow inference logic

Building Blocks (8):

  • components/StudyListLayout.tsx - Resizable split layout with compound slots
  • components/StudyListTable.tsx - Table built on DataTable
  • components/PreviewPanelShell.tsx - Preview container
  • components/PreviewPanelContent.tsx - Preview with PatientSummary
  • components/PreviewPanelEmpty.tsx - Empty state
  • components/SettingsPopover.tsx - Settings popover with workflow selector
  • components/StudyListActionsCell.tsx - Actions column cell
  • components/StudyListInstancesCell.tsx - Instances column cell
  • components/WorkflowsMenu.tsx - Workflow dropdown menu
  • components/SeriesListView.tsx - Series list display

Layouts (1):

  • layouts/StudyListLargeLayout.tsx - Default desktop layout

Core (5):

  • StudyList.tsx - Main facade component
  • StudyListTypes.ts - TypeScript type definitions
  • WorkflowsInfer.ts - Workflow utilities export
  • useDefaultWorkflow.ts - localStorage-backed default workflow
  • columns/defaultColumns.tsx - Default column factory

Documentation (2):

  • README.md - Component documentation
  • index.ts - Public exports

Features:

  • Headless-first architecture for maximum flexibility
  • Resizable preview panel with open/close state
  • Row selection with double-click to launch
  • Default workflow persistence (localStorage)
  • Workflow inference from modalities
  • Keyboard navigation support
  • Column visibility, sorting, and filtering
  • Compound component patterns throughout
  • Full TypeScript support with generics

5. Icons (platform/ui-next/src/components/Icons/Sources/)

New icon components for study list UI.

Files Added (7):

  • PatientStudyList.tsx - Patient/study icon
  • SettingsStudyList.tsx - Settings icon
  • SortingNew.tsx - Base sorting icon
  • SortingNewAscending.tsx - Ascending sort indicator
  • SortingNewDescending.tsx - Descending sort indicator
  • PanelRight.tsx - Panel toggle icon

Interactive Prototype

Playground Environment (platform/ui-next/playground/)

A lightweight, standalone environment for rapid prototyping and user testing that renders UI-Next components with production-identical styling.

Files Added (11):

  • .webpack/webpack.playground.js - Webpack config for playground
  • playground/index.tsx - Dynamic route loader
  • playground/README.md - Playground documentation
  • playground/studylist.tsx - StudyList prototype entry
  • playground/studylist/app.tsx - Main prototype app
  • playground/studylist/entry.tsx - React 18 mount point
  • playground/studylist/launch.tsx - Launch placeholder page
  • playground/studylist/patient-studies.json - Sample dataset (2,920 lines)
  • playground/public/_redirects - Netlify redirects

Features:

  • Hot module replacement for rapid iteration
  • Dynamic routing (http://localhost:3100/<prototype-name>)
  • Default route to StudyList prototype
  • Sample dataset with realistic study data
  • Launch workflow testing with navigation
  • Identical tokens and styling to production viewer

Testing

Checklist

PR

  • My Pull Request title is descriptive, accurate and follows the
    semantic-release format and guidelines.

Code

  • My code has been well-documented (function documentation, inline comments,
    etc.)

Public Documentation Updates

  • [] The documentation page has been updated as necessary for any public API
    additions or removals.

Tested Environment

  • OS: macOS Sequoia 15.7.1, Apple M4 Pro
  • Node version: v20.19.1
  • Browser: Chrome 142.0.7444.162 (Official Build) (arm64)

@netlify
Copy link

netlify bot commented Nov 18, 2025

Deploy Preview for ohif-dev ready!

Name Link
🔨 Latest commit e898228
🔍 Latest deploy log https://app.netlify.com/projects/ohif-dev/deploys/693c4a827ef0d0000858fe8c
😎 Deploy Preview https://deploy-preview-5570--ohif-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Includes InputMultiSelect, Badge, filters.ts for modality tokenization, and changes to defaultColumns and StudyListTable
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find this DataTable a little bit confusing. It is not really a component, but really a provider.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated (see next comment)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure how useful this file is.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As we discussed internally, I think I ideally DataTable should follow what shadcn recommends whereby DataTable provides not just a provider/context but also basic pieces of rendering and styling for a table with many of the features of what StudyListTable is providing. So a refactor of StudyListTable moving some of its pieces "up" into DataTable is in order here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Latest commit adds an updated DataTable and changes to StudyListTable. The root of DataTable is still the provider and sub-components fit better into the structure.

The new DataTable.Table now includes the layout markup.

New DataTable

<DataTable data={data} columns={columns}>
  <DataTable.Toolbar>
    <DataTable.Title>Studies</DataTable.Title>
    <DataTable.Pagination />
    <DataTable.ViewOptions />
  </DataTable.Toolbar>
  <DataTable.Table>
    <DataTable.Header />
    <DataTable.FilterRow />
    <DataTable.Body />
  </DataTable.Table>
</DataTable>

dan-rukas and others added 16 commits November 25, 2025 12:51
…exible and easier to reuse.

Removed both unused and duplicate code.
Removed some unnecessary complexity.
Removed duplication of settings and open/close panel buttons.
Removed unnecessary headless design pattern.
Moved the view and formatting logic for columns to defaultColumns.tsx.
Created a better directory structure for the study list.
Added toolbarRightActionsComponent for the study list.
Ensured old WorkList is still available and working.
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