feat: Automate tracking prompts for a less disruptive annotation workflow (#4822)

Co-authored-by: Devu Jayalekshmi <devu.jayalekshmi@trenser.com>
This commit is contained in:
nithin-trenserandDevu Jayalekshmi authored and GitHub committed 2025-04-04 12:02:13 -04:00
1 parent c0391cea1b
commit 54fded554e
42 files changed
+948 -70

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -125,7 +125,7 @@ Here are a list of some options available:
- `investigationalUseDialog`: This should contain an object with `option` value, it can be either `always` which always shows the dialog once per session, `never` which never shows the dialog, or `configure` which shows the dialog once and won't show it again until a set number of days defined by the user, if it's set to configure, you are required to add an additional property `days` which is the number of days to wait before showing the dialog again.
- `groupEnabledModesFirst`: boolean, if set to true, all valid modes for the study get grouped together first, then the rest of the modes. If false, all modes are shown in the order they are defined in the configuration.
- `experimentalStudyBrowserSort`: boolean, if set to true, you will get the experimental StudyBrowserSort component in the UI, which displays a list of sort functions that the displaySets can be sorted by, the sort reflects in all part of the app including the thumbnail/study panel. These sort functions are defined in the customizationModule and can be expanded by users.
- `disableConfirmationPrompts`: boolean, if set to true, it skips confirmation prompts for measurement tracking and hydration.
- `disableConfirmationPrompts`: boolean, if set to true, it skips confirmation prompts for segmentation related prompts.
- `showPatientInfo`: string, if set to 'visible', the patient info header will be shown and its initial state is expanded. If set to 'visibleCollapsed', the patient info header will be shown but it's initial state is collapsed. If set to 'disabled', the patient info header will never be shown, and if set to 'visibleReadOnly', the patient info header will be shown and always expanded.
- `requestTransferSyntaxUID` : Request a specific Transfer syntax from dicom web server ex: 1.2.840.10008.1.2.4.80 (applied only if acceptHeader is not set)
- `omitQuotationForMultipartRequest`: Some servers (e.g., .NET) require the `multipart/related` request to be sent without quotation marks. Defaults to `false`. If your server doesn't require this, then setting this flag to `true` might improve performance (by removing the need for preflight requests). Also note that
@@ -27,6 +27,15 @@ import windowLevelActionMenu from '../../../assets/img/windowLevelActionMenu.png
import viewPortNotificationImage from '../../../assets/img/viewport-notification.png';
import captureViewportModal from '../../../assets/img/captureViewportModal.png';
import aboutModal from '../../../assets/img/aboutModal.png';
import promptBeginTrackingContent from '../../../assets/img/promptBeginTrackingContent.png';
import promptAddSeriesContent from '../../../assets/img/promptAddSeriesContent.png';
import promptSRTrackingContent from '../../../assets/img/promptSRTrackingContent.png';
import promptsegmentationContent from '../../../assets/img/promptsegmentationContent.png';
import promptRtstructContent from '../../../assets/img/promptRtstructContent.png';
import promptDiscardStudyContent from '../../../assets/img/promptDiscardStudyContent.png';
import promptDiscardSeriesContent from '../../../assets/img/promptDiscardSeriesContent.png';
import promptDiscardDirtyContent from '../../../assets/img/promptDiscardDirtyContent.png';
import promptTrackStudyContent from '../../../assets/img/promptTrackStudyContent.png';
export const viewportOverlayCustomizations = [
{
@@ -952,6 +961,296 @@ window.config = {
};
`,
},
{
id: 'viewportNotification.beginTrackingMessage',
description: 'Define the content to be displayed in begin tracking prompt',
default: 'Track measurements for this series?',
image: [promptBeginTrackingContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.beginTrackingMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.trackNewSeriesMessage',
description: 'Define the content to be displayed in track new series prompt',
default: 'Do you want to add this measurement to the existing report?',
image: [promptAddSeriesContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.trackNewSeriesMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.discardSeriesMessage',
description: 'Define the content to be displayed in discard series prompt',
default:
'You have existing tracked measurements. What would you like to do with your existing tracked measurements?',
image: [promptDiscardSeriesContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.discardSeriesMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.trackNewStudyMessage',
description: 'Define the content to be displayed in track new study prompt',
default: 'Track measurements for this series?',
image: [promptTrackStudyContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.trackNewStudyMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.discardStudyMessage',
description: 'Define the content to be displayed in discard study prompt',
default:
'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?',
image: [promptDiscardStudyContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.discardStudyMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.hydrateSRMessage',
description: 'Define the content to be displayed in hydrate SR prompt',
default: 'Do you want to continue tracking measurements for this study?',
image: [promptSRTrackingContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.hydrateSRMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.hydrateRTMessage',
description: 'Define the content to be displayed in hydrate RT prompt',
default: 'Do you want to open this Segmentation?',
image: [promptRtstructContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.hydrateRTMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.hydrateSEGMessage',
description: 'Define the content to be displayed in hydrate SEG prompt',
default: 'Do you want to open this Segmentation?',
image: [promptsegmentationContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.hydrateSEGMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'viewportNotification.discardDirtyMessage',
description: 'Define the content to be displayed in hydrate SR prompt',
default: 'There are unsaved measurements. Do you want to save it?',
image: [promptDiscardDirtyContent],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'viewportNotification.discardDirtyMessage': {
$set: CustomizedComponent,
},
},
],
};
`,
},
{
id: 'measurement.promptBeginTracking',
description:
'Define the functionality to connect with the measurement tracking machine on begin measurement tracking',
default: 'promptBeginTracking',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptBeginTracking': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptHydrateStructuredReport',
description:
'Define the functionality to connect with the measurement tracking machine on hydrate SR',
default: 'promptHydrateStructuredReport',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptHydrateStructuredReport': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptTrackNewSeries',
description:
'Define the functionality to connect with the measurement tracking machine on tracking new series',
default: 'promptTrackNewSeries',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptTrackNewSeries': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptTrackNewStudy',
description:
'Define the functionality to connect with the measurement tracking machine on tracking new study',
default: 'promptTrackNewStudy',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptTrackNewStudy': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptLabelAnnotation',
description:
'Define the functionality to connect with the measurement tracking machine on begin measurement tracking',
default: 'promptLabelAnnotation',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptLabelAnnotation': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptSaveReport',
description:
'Define the functionality to connect with the measurement tracking machine on save SR report',
default: 'promptSaveReport',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptSaveReport': {
$set: customFunction,
},
},
],
};
`,
},
{
id: 'measurement.promptHasDirtyAnnotations',
description:
'Define the functionality to connect with the measurement tracking machine on there are dirty annotations',
default: 'promptHasDirtyAnnotations',
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'measurement.promptHasDirtyAnnotations': {
$set: customFunction,
},
},
],
};
`,
},
];
export const segmentationCustomizations = [