diff --git a/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts b/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts index fd85749ac..67de64e57 100644 --- a/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts +++ b/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts @@ -11,6 +11,7 @@ import { isDisplaySetFromUrl, sopInstanceLocation } from './custom-attribute/isD import numberOfDisplaySetsWithImages from './custom-attribute/numberOfDisplaySetsWithImages'; import seriesDescriptionsFromDisplaySets from './custom-attribute/seriesDescriptionsFromDisplaySets'; import uuidv4 from '../../utils/uuidv4'; +import { getUniqueAttributeFromList } from './lib/getUniqueAttributeFromList'; type Protocol = HangingProtocol.Protocol | HangingProtocol.ProtocolGenerator; @@ -77,15 +78,15 @@ export default class HangingProtocolService extends PubSubService { }, ModalitiesInStudy: { name: 'Gets the array of the modalities for the series', - callback: metadata => - metadata.ModalitiesInStudy ?? - (metadata.series || []).reduce((prev, curr) => { - const { Modality } = curr; - if (Modality && prev.indexOf(Modality) == -1) { - prev.push(Modality); - } - return prev; - }, []), + callback: metadata => { + if (metadata.ModalitiesInStudy?.length > 0) { + return metadata.ModalitiesInStudy; + } + if (Array.isArray(metadata.series)) { + return getUniqueAttributeFromList(metadata.series, 'Modality'); + } + return []; + }, }, isReconstructable: { name: 'Checks if the display set is reconstructable', diff --git a/platform/core/src/services/HangingProtocolService/lib/getUniqueAttributeFromList.ts b/platform/core/src/services/HangingProtocolService/lib/getUniqueAttributeFromList.ts new file mode 100644 index 000000000..4ea3af867 --- /dev/null +++ b/platform/core/src/services/HangingProtocolService/lib/getUniqueAttributeFromList.ts @@ -0,0 +1,19 @@ +/** + * Returns an array of unique values for the given attribute from a series array. + * If the attribute is not present on the series, attempts to get it from the first instance. + * @param {Array} series - The series array to extract attributes from. + * @param {string} attribute - The attribute name to extract. + * @returns {Array} Array of unique attribute values. + */ +export function getUniqueAttributeFromList(series, attribute) { + return series.reduce((prev, curr) => { + let value = curr[attribute]; + if (!value && curr.instances && curr.instances[0]) { + value = curr.instances[0][attribute]; + } + if (value && prev.indexOf(value) === -1) { + prev.push(value); + } + return prev; + }, []); +}