Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
3f51fe4
Add viv loader
igoroctaviano Apr 7, 2026
4eac4c0
Improve viewport displaying
igoroctaviano Apr 7, 2026
3cb9955
Fixing 8-bit: Rendering images correctly (wrong position)
igoroctaviano Apr 7, 2026
da8b189
Fixing 8-bit: Rendering images correctly (correct position)
igoroctaviano Apr 7, 2026
1c8ed29
Add request abort
igoroctaviano Apr 7, 2026
a386f08
Working: Bulk ann (polygons)
igoroctaviano Apr 8, 2026
476e6b1
Working: Bulk ann (polygons)
igoroctaviano Apr 8, 2026
08cf693
Linting
igoroctaviano Apr 8, 2026
6f3a061
Linting and padding
igoroctaviano Apr 8, 2026
a6e519e
Linting and padding and styling
igoroctaviano Apr 8, 2026
8dfe2ee
Fix icc profile for viv mode
igoroctaviano Apr 14, 2026
6335d5f
Improve performance
igoroctaviano May 7, 2026
3004452
Improve performance
igoroctaviano May 7, 2026
d2b3d1c
Add logging and chunk annotations processing
igoroctaviano May 19, 2026
8d5178a
Load images from center outwards
igoroctaviano May 19, 2026
4f9abfe
Load annotations from center
igoroctaviano May 19, 2026
81f3380
Use points to improve memory usage
igoroctaviano May 19, 2026
98b2ea8
Scale points
igoroctaviano May 19, 2026
d0c25ae
Hardening
igoroctaviano May 20, 2026
30ef8da
Add loading indicator for bulk annotation retrieve and processing.
igoroctaviano May 20, 2026
d7e9faa
Add tooltip
igoroctaviano May 20, 2026
a1f06fc
Improving image load and caching
igoroctaviano May 20, 2026
7863a60
Update comments
igoroctaviano May 20, 2026
11fa0f4
Clean up ci
igoroctaviano May 20, 2026
7f506c4
Add tooltip back
igoroctaviano May 20, 2026
db006be
Update point size
igoroctaviano May 20, 2026
82387b1
Load ann during retrieval
igoroctaviano Jun 4, 2026
dd9e353
Fix final rendering
igoroctaviano Jun 4, 2026
667eeaa
Update lock
igoroctaviano Jul 2, 2026
3056886
Address stream / load and pan
igoroctaviano Jul 13, 2026
d69cc61
Adjust stroke
igoroctaviano Jul 13, 2026
74d7840
Adjust stroke
igoroctaviano Jul 13, 2026
49821d2
Address errors
igoroctaviano Jul 13, 2026
8d28d2f
Address errors
igoroctaviano Jul 13, 2026
2bce40c
Update point vs polygon defaults
igoroctaviano Jul 14, 2026
70e2e14
fix: address code-review findings for viv loader path
igoroctaviano Jul 31, 2026
d516d49
fix: prevent stale hydrate settle from wiping a re-dispatch
igoroctaviano Jul 31, 2026
5ef5c1c
fix: tighten bulk-stream edge cases from pipeline review
igoroctaviano Jul 31, 2026
d18c16b
docs: prefer JSDoc block comments for explanations
igoroctaviano Jul 31, 2026
af9b5ee
fix(viv): skip useless bulk Range retries and duplicate layer fallback
igoroctaviano Jul 31, 2026
5a4bff5
fix(viv): drop hydrate ownership on catalog invalidation
igoroctaviano Jul 31, 2026
5ec2544
ci: retrigger checks after master merge
igoroctaviano Aug 6, 2026
8685860
fix: silence react-hooks exhaustive-deps CI failures in viv bulk hook
igoroctaviano Aug 6, 2026
67590fb
fix: resolve DeepSource code quality issues
igoroctaviano Aug 14, 2026
e52c4ad
fix(viv): address DeepSource code quality issues
igoroctaviano Aug 14, 2026
3643dfd
fix(viv): address remaining DeepSource code quality issues
igoroctaviano Aug 14, 2026
a48096d
fix(viv): address SonarQube and DeepSource quality issues
igoroctaviano Aug 14, 2026
1b69445
fix(viv): add eslint-disable for intentional useMemo dependencies
igoroctaviano Aug 14, 2026
de13151
fix(viv): place eslint-disable before dependency array
igoroctaviano Aug 14, 2026
61b607c
chore(ci): remove e2e-visual workflow from viv-loader branch
igoroctaviano Aug 14, 2026
cd78f28
fix(viv): address DeepSource code quality issues and remove e2e workflow
igoroctaviano Aug 14, 2026
6a11b5b
fix(viv): address additional DeepSource code quality issues
igoroctaviano Aug 14, 2026
ff5c627
fix(viv): suppress remaining DeepSource issues
igoroctaviano Aug 14, 2026
91e54b5
fix(viv): address all remaining DeepSource issues
igoroctaviano Aug 14, 2026
5d81ce4
fix(viv): fix DeepSource issues in VivSlideViewport
igoroctaviano Aug 14, 2026
7f76ce1
fix(deps): add missing dicomweb-client@0.10.3 entry in lockfile
igoroctaviano Aug 14, 2026
da60454
fix(deps): regenerate lockfile to remove duplicate entries
igoroctaviano Aug 24, 2026
fd12e41
chore: merge master to resolve conflicts
igoroctaviano Sep 29, 2026
4c0281d
merge: resolve conflicts with master
igoroctaviano Oct 8, 2026
c1cdcb6
Merge branch 'master' into feat/viv-loader
igoroctaviano Oct 11, 2026
3c11650
Merge branch 'master' into feat/viv-loader
igoroctaviano Oct 16, 2026
d01ca8c
Merge branch 'master' into feat/viv-loader
igoroctaviano Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions craco.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,19 @@ module.exports = {
}
}

/* Viv / Deck.gl / Luma ship modern JS; transpile for CRA 5 / webpack 5. */
config.module.rules.push({
test: /\.m?js$/,
include: /node_modules[\\/](@deck\.gl|@luma\.gl|@math\.gl|@probe\.gl|@vivjs)[\\/]/,
use: {
loader: require.resolve('babel-loader'),
options: {
presets: [require.resolve('babel-preset-react-app/dependencies')],
cacheDirectory: true
}
}
})

return config
}
},
Expand Down
30 changes: 30 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,20 @@
]
},
"dependencies": {
"@deck.gl/core": "9.1.15",
"@deck.gl/extensions": "9.1.15",
"@deck.gl/geo-layers": "9.1.15",
"@deck.gl/layers": "9.1.15",
"@deck.gl/mesh-layers": "9.1.15",
"@deck.gl/react": "9.1.15",
"@deck.gl/widgets": "9.1.15",
"@vivjs/layers": "^0.20.0",
"@vivjs/loaders": "^0.20.0",
"@luma.gl/constants": "~9.1.10",
"@luma.gl/core": "~9.1.10",
"@luma.gl/engine": "~9.1.10",
"@luma.gl/shadertools": "~9.1.10",
"@luma.gl/webgl": "~9.1.10",
"antd": "^4.22.8",
"classnames": "^2.2.6",
"dcmjs": "^0.52.0",
Expand Down Expand Up @@ -83,5 +97,21 @@
"react-test-renderer": "^18.2.0",
"sonarqube-scanner": "^4.3.0",
"typescript": "^4.7.4"
},
"overrides": {
"@types/minimatch": "5.1.2",
"@deck.gl/core": "9.1.15",
"@deck.gl/extensions": "9.1.15",
"@deck.gl/geo-layers": "9.1.15",
"@deck.gl/layers": "9.1.15",
"@deck.gl/mesh-layers": "9.1.15",
"@deck.gl/react": "9.1.15",
"@deck.gl/widgets": "9.1.15",
"nth-check": "2.0.1",
"wrap-ansi": "7.0.0",
"make-dir": "3.1.0",
"express": "4.21.0",
"rollup": "3.29.5",
"semver": "7.5.2"
}
}
1,127 changes: 1,127 additions & 0 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ function ParametrizedCaseViewer({
app={app}
enableAnnotationTools={enableAnnotationTools}
studyInstanceUID={studyInstanceUID}
useViv={config.useViv === true}
vivSettings={config.vivSettings}
/>
</ValidationProvider>
)
Expand Down
24 changes: 24 additions & 0 deletions src/AppConfig.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,23 @@ export interface OidcSettings {
endSessionEndpoint?: string
}

export interface VivChannelSelection {
c: number
t?: number
z?: number
}

export interface VivSettings {
selections?: VivChannelSelection[]
channelsVisible?: boolean[]
contrastLimits?: Array<[number, number]>
colors?: Array<[number, number, number]>
initialViewState?: {
target: [number, number, number]
zoom?: number
}
}

export default interface AppConfig {
/**
* Currently, only one server is supported. However, support for multiple
Expand Down Expand Up @@ -128,4 +145,11 @@ export default interface AppConfig {
enableInDevelopment?: boolean
}
enableMemoryMonitoring?: boolean
/**
* When true, the slide viewport uses Viv + Deck.gl (src/viv)
* instead of the default OpenLayers-based SlideViewer. Limited feature set.
*/
useViv?: boolean
/** Optional display overrides for the Viv viewer path (channels, contrast, etc.). */
vivSettings?: VivSettings
}
14 changes: 14 additions & 0 deletions src/DicomWebManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,20 @@ export default class DicomWebManager implements dwc.api.DICOMwebClient {
return this.stores[0].client.headers
}

/**
* Run a callback on the primary {@link dwc.api.DICOMwebClient} (the store used for reads).
* Used e.g. to append Viv tile {@link dwc.api.DICOMwebClientOptions.requestHooks} that must
* see the same XHR pipeline as {@link dmv.viewer.VolumeImageViewer}.
*/
applyToPrimaryDicomwebClient(
fn: (client: dwc.api.DICOMwebClient) => void,
): void {
if (this.stores.length === 0) {
return
}
fn(this.stores[0].client)
}

/**
* Store new instances in the first writable configured store. Picking the
* first writable (rather than always store[0]) keeps backwards compatibility
Expand Down
Loading
Loading