Advanced Customization
Below is an overview of how transform and inheritsFrom work within this customization system. They allow you to build a hierarchy of customizations in which items can inherit fields from a parent and then optionally apply a transformation before returning the final result.
inheritsFrom​
Purpose​
Indicates that the current customization should inherit and merge fields from another customization. The system fetches the parent customization, merges its properties, and returns a combined object.
How It Works​
- When you request or transform a customization that has 
inheritsFrom: "parentCustomizationId", the service looks upparentCustomizationIdviagetCustomization(...). - Properties from the parent get copied into the child, but the child’s own properties overwrite any matching ones from the parent.
 - If the child has a 
transformfunction, it runs after the merge. 
Example​
export default {
  measurementsContextMenu: {
    $set: {
      inheritsFrom: 'ohif.contextMenu',
      menus: [
        {
          selector: ({ nearbyToolData }) => !!nearbyToolData,
          items: [
            // ...
          ],
        },
      ],
    },
  },
};
Here, measurementsContextMenu inherits from ohif.contextMenu. During retrieval or transformation, the system merges ohif.contextMenu into measurementsContextMenu.
transform​
Purpose​
Specifies a function that can modify or enhance the customization object at runtime. Often used to run extra setup code or combine fields in a special way.
How It Works​
- You define a 
transform(customizationService)function inside your customization object. - When the system retrieves the customization, after merging any inherited fields, it calls 
transform. - The function may return an updated object, clone existing properties, or apply logic to nested items.
 
Example​
export default {
  '@ohif/contextMenuAnnotationCode': {
    $transform: function (customizationService) {
      const { code: codeRef } = this;
      if (!codeRef) {
        throw new Error(`item ${this} has no code ref`);
      }
      const codingValues = customizationService.getCustomization('codingValues');
      const code = codingValues[codeRef];
      return {
        ...this,
        codeRef,
        code: { ref: codeRef, ...code },
        label: this.label || code.text || codeRef,
        commands: [{ commandName: 'updateMeasurement' }],
      };
    },
  },
};
In this snippet, the transform function:
- Reads a code reference from 
this. - Looks up more data for that code in 
codingValues. - Merges those details back into 
thisbefore returning the final object. 
Common Use Cases​
- 
Base and Specialized Customizations Use
inheritsFromto define a broad, general customization (e.g., a generic context menu) and then create specialized versions that only override certain fields. - 
Dynamic Assembly Use
transformwhen you need to compute or modify fields based on application state or other registered customizations. - 
Nested Items If an item within the customization also has
inheritsFrom, it will follow the same inheritance flow and can run its owntransformlogic. 
Key Points
inheritsFromis a reference to another customization’s ID.- If 
transformis defined, it always runs after inheritance is resolved. - Merging is shallow: child properties override the parent’s.
 - You can nest multiple levels of inheritance, each possibly having its own 
transformstep.