From bad5d700aaa7340d7d29dc7ba82643a91ee9dd62 Mon Sep 17 00:00:00 2001
From: Devu Jayalekshmi <devu.jayalekshmi@trenser.com>
Date: Thu, 23 Jan 2025 16:21:56 +0530
Subject: [PATCH 1/3] feat/windowLevelActionMenu customization support

---
 .../WindowLevelActionMenu/getWindowLevelActionMenu.tsx   | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
index a0e65fb018..746c441b28 100644
--- a/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
+++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
@@ -20,6 +20,13 @@ export function getWindowLevelActionMenu({
   const colorbarProperties = customizationService.getCustomization('cornerstone.colorbar');
   const { volumeRenderingPresets, volumeRenderingQualityRange } =
     customizationService.getCustomization('cornerstone.3dVolumeRendering');
+  const windowLevelActionMenu = customizationService.getCustomization(
+    'cornerstone.windowLevelActionMenu'
+  );
+  const MenuComponent =
+    windowLevelActionMenu && windowLevelActionMenu.content
+      ? windowLevelActionMenu.content
+      : WindowLevelActionMenu;
 
   const displaySetPresets = displaySets
     .filter(displaySet => presets[displaySet.Modality])
@@ -36,7 +43,7 @@ export function getWindowLevelActionMenu({
   }
 
   return (
-    <WindowLevelActionMenu
+    <MenuComponent
       viewportId={viewportId}
       element={element}
       presets={displaySetPresets}

From 4829e7c1cfd5edbf90dd4891b287b91128f54acc Mon Sep 17 00:00:00 2001
From: Devu Jayalekshmi <devu.jayalekshmi@trenser.com>
Date: Mon, 27 Jan 2025 12:12:56 +0530
Subject: [PATCH 2/3] Window level action menu documentation

---
 .../docs/assets/img/windowLevelActionMenu.png | Bin 0 -> 6689 bytes
 .../sampleCustomizations.tsx                  |  21 ++++++++++++++++++
 2 files changed, 21 insertions(+)
 create mode 100644 platform/docs/docs/assets/img/windowLevelActionMenu.png

diff --git a/platform/docs/docs/assets/img/windowLevelActionMenu.png b/platform/docs/docs/assets/img/windowLevelActionMenu.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a1b43b86adf34a8a0ec38b19c30271fa91d9b3f
GIT binary patch
literal 6689
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
Kp<K=~?7skw=0+<3

literal 0
HcmV?d00001

diff --git a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
index 723f3b46bf..941a67d562 100644
--- a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
+++ b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
@@ -14,6 +14,7 @@ import segDisplayEditingTrue from '../../../assets/img/segDisplayEditingTrue.png
 import segDisplayEditingFalse from '../../../assets/img/segDisplayEditingFalse.png';
 import thumbnailMenuItemsImage from '../../../assets/img/thumbnailMenuItemsImage.png';
 import studyMenuItemsImage from '../../../assets/img/studyMenuItemsImage.png';
+import windowLevelActionMenu from '../../../assets/img/windowLevelActionMenu.png';
 
 export const viewportOverlayCustomizations = [
   {
@@ -219,6 +220,26 @@ window.config = {
     default: 'The CinePlayer component in the UI',
     configuration: null,
   },
+  {
+    id: 'cornerstone.windowLevelActionMenu',
+    description: 'Window level action menu for the cornerstone viewport.',
+    image: windowLevelActionMenu,
+    default: null,
+    configuration: `
+      window.config = {
+        // rest of window config
+        customizationService: [
+          {
+            'cornerstone.windowLevelActionMenu': {
+                $set: {
+                  content:CustomizedComponent
+                },
+            },
+          },
+        ],
+      };
+    `,
+  },
   {
     id: 'cornerstone.windowLevelPresets',
     description: 'Window level presets for the cornerstone viewport.',

From 86a4d8f30a772b7455806f451eb6d68d05c2dec6 Mon Sep 17 00:00:00 2001
From: Devu Jayalekshmi <devu.jayalekshmi@trenser.com>
Date: Tue, 28 Jan 2025 11:35:37 +0530
Subject: [PATCH 3/3] Window level action menu customization

---
 .../getWindowLevelActionMenu.tsx                      | 11 +++--------
 .../windowLevelActionMenuCustomization.ts             |  5 +++++
 extensions/cornerstone/src/getCustomizationModule.tsx |  2 ++
 .../customization-service/sampleCustomizations.tsx    |  4 +---
 4 files changed, 11 insertions(+), 11 deletions(-)
 create mode 100644 extensions/cornerstone/src/customizations/windowLevelActionMenuCustomization.ts

diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
index 746c441b28..ebd35e8964 100644
--- a/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
+++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
@@ -1,5 +1,5 @@
 import React, { ReactNode } from 'react';
-import { nonWLModalities, WindowLevelActionMenu } from './WindowLevelActionMenu';
+import { nonWLModalities } from './WindowLevelActionMenu';
 
 export function getWindowLevelActionMenu({
   viewportId,
@@ -20,14 +20,9 @@ export function getWindowLevelActionMenu({
   const colorbarProperties = customizationService.getCustomization('cornerstone.colorbar');
   const { volumeRenderingPresets, volumeRenderingQualityRange } =
     customizationService.getCustomization('cornerstone.3dVolumeRendering');
-  const windowLevelActionMenu = customizationService.getCustomization(
+  const WindowLevelActionMenu = customizationService.getCustomization(
     'cornerstone.windowLevelActionMenu'
   );
-  const MenuComponent =
-    windowLevelActionMenu && windowLevelActionMenu.content
-      ? windowLevelActionMenu.content
-      : WindowLevelActionMenu;
-
   const displaySetPresets = displaySets
     .filter(displaySet => presets[displaySet.Modality])
     .map(displaySet => {
@@ -43,7 +38,7 @@ export function getWindowLevelActionMenu({
   }
 
   return (
-    <MenuComponent
+    <WindowLevelActionMenu
       viewportId={viewportId}
       element={element}
       presets={displaySetPresets}
diff --git a/extensions/cornerstone/src/customizations/windowLevelActionMenuCustomization.ts b/extensions/cornerstone/src/customizations/windowLevelActionMenuCustomization.ts
new file mode 100644
index 0000000000..ccbcca53b4
--- /dev/null
+++ b/extensions/cornerstone/src/customizations/windowLevelActionMenuCustomization.ts
@@ -0,0 +1,5 @@
+import { WindowLevelActionMenu } from '../components/WindowLevelActionMenu/WindowLevelActionMenu';
+
+export default {
+  'cornerstone.windowLevelActionMenu': WindowLevelActionMenu,
+};
diff --git a/extensions/cornerstone/src/getCustomizationModule.tsx b/extensions/cornerstone/src/getCustomizationModule.tsx
index 91463bc9f3..3e2a30d3a8 100644
--- a/extensions/cornerstone/src/getCustomizationModule.tsx
+++ b/extensions/cornerstone/src/getCustomizationModule.tsx
@@ -8,6 +8,7 @@ import volumeRenderingCustomization from './customizations/volumeRenderingCustom
 import colorbarCustomization from './customizations/colorbarCustomization';
 import windowLevelPresetsCustomization from './customizations/windowLevelPresetsCustomization';
 import miscCustomization from './customizations/miscCustomization';
+import windowLevelActionMenuCustomization from './customizations/windowLevelActionMenuCustomization';
 
 function getCustomizationModule({ commandsManager, servicesManager }) {
   return [
@@ -24,6 +25,7 @@ function getCustomizationModule({ commandsManager, servicesManager }) {
         ...colorbarCustomization,
         ...windowLevelPresetsCustomization,
         ...miscCustomization,
+        ...windowLevelActionMenuCustomization,
       },
     },
   ];
diff --git a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
index 941a67d562..92b9db8492 100644
--- a/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
+++ b/platform/docs/docs/platform/services/customization-service/sampleCustomizations.tsx
@@ -231,9 +231,7 @@ window.config = {
         customizationService: [
           {
             'cornerstone.windowLevelActionMenu': {
-                $set: {
-                  content:CustomizedComponent
-                },
+                $set: CustomizedComponent,
             },
           },
         ],