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 upparentCustomizationId
viagetCustomization(...)
. - 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
transform
function, 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
this
before returning the final object.
Common Use Cases
-
Base and Specialized Customizations Use
inheritsFrom
to define a broad, general customization (e.g., a generic context menu) and then create specialized versions that only override certain fields. -
Dynamic Assembly Use
transform
when 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 owntransform
logic.
Key Points
inheritsFrom
is a reference to another customization’s ID.- If
transform
is 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
transform
step.