Skip to content
Snippets Groups Projects
Commit 4dfdd8fd authored by Marjolaine Bodin's avatar Marjolaine Bodin
Browse files

Merge branch '806-generic_metadata_information' into 'main'

Resolve "Display of generic metadata information"

Closes #806

See merge request !718
parents fe041533 cdfd73f7
No related branches found
No related tags found
1 merge request!718Resolve "Display of generic metadata information"
Pipeline #226414 waiting for manual action
Showing
with 368 additions and 364 deletions
...@@ -4,31 +4,15 @@ import { ...@@ -4,31 +4,15 @@ import {
formatDateToDayAndTime, formatDateToDayAndTime,
Gallery, Gallery,
getDatasetParamValue, getDatasetParamValue,
MetadataCard,
MetadataTable, MetadataTable,
AttenuatorsWidget,
type MetadataTableParameter, type MetadataTableParameter,
MetadataTableParameters,
} from '@edata-portal/core'; } from '@edata-portal/core';
import { InstrumentSlitWidget } from '@edata-portal/core/src/components/metadata/InstrumentSlitWidget';
import type { Dataset } from '@edata-portal/icat-plus-api'; import type { Dataset } from '@edata-portal/icat-plus-api';
import { Card, Col, Container, Row } from 'react-bootstrap'; import { Col, Container, Row } from 'react-bootstrap';
const addParam = (
params: MetadataTableParameter[],
dataset: Dataset,
key: string,
caption: string,
digits?: number,
) => {
const value = getDatasetParamValue(dataset, key) || undefined;
if (value) {
params.push({
caption,
value,
digits,
parameterName: key,
});
}
};
const presetSummary = (dataset: Dataset): MetadataTableParameter[] => { const presetSummary = (dataset: Dataset): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = []; const params: MetadataTableParameter[] = [];
...@@ -107,30 +91,6 @@ const beamParameters = (dataset: Dataset) => [ ...@@ -107,30 +91,6 @@ const beamParameters = (dataset: Dataset) => [
}, },
]; ];
const attenuatorsParameters = (dataset: Dataset): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
for (let i = 0; i < 15; i++) {
const index = (i + 1).toString().padStart(2, '0');
const type = getDatasetParamValue(
dataset,
`InstrumentAttenuator${index}_type`,
);
const thickness = getDatasetParamValue(
dataset,
`InstrumentAttenuator${index}_thickness`,
);
if (type && type.toLowerCase() !== 'empty') {
params.push({
caption: `Att${i + 1}`,
value: `${type}, ${thickness}`,
parameterName: `InstrumentAttenuator${index}_type`,
});
}
}
return params;
};
const formatImagesDimensions = (dataset: Dataset) => { const formatImagesDimensions = (dataset: Dataset) => {
const value = getDatasetParamValue(dataset, `InstrumentDetector01Rois_value`); const value = getDatasetParamValue(dataset, `InstrumentDetector01Rois_value`);
const dimensions = value?.split(','); const dimensions = value?.split(',');
...@@ -197,145 +157,7 @@ const cameraParameters = (dataset: Dataset) => [ ...@@ -197,145 +157,7 @@ const cameraParameters = (dataset: Dataset) => [
}, },
]; ];
const primarySlitsParameters = (dataset: Dataset): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
addParam(
params,
dataset,
'InstrumentSlitPrimary_horizontal_gap',
'Horizontal gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_horizontal_offset',
'Horizontal offset',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_vertical_gap',
'Vertical gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_vertical_offset',
'Vertical offset',
2,
);
return params;
};
const secondarySlitsParameters = (
dataset: Dataset,
): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
addParam(
params,
dataset,
'InstrumentSlitSecondary_horizontal_gap',
'Horizontal gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_horizontal_offset',
'Horizontal offset',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_vertical_gap',
'Vertical gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_vertical_offset',
'Vertical offset',
2,
);
return params;
};
const otherSlits = (
dataset: Dataset,
): { slitsTitles: string[]; otherSlitsData: MetadataTableParameter[][] } => {
const paramKeys = [
{ key: 'InstrumentSlits_horizontal_gap', caption: 'Horizontal gap' },
{ key: 'InstrumentSlits_horizontal_offset', caption: 'Horizontal offset' },
{ key: 'InstrumentSlits_vertical_gap', caption: 'Vertical gap' },
{ key: 'InstrumentSlits_vertical_offset', caption: 'Vertical offset' },
];
const values = paramKeys.map(({ key }) => getDatasetParamValue(dataset, key));
if (values.every((val) => val === null || val === undefined)) {
return { slitsTitles: ['Slits'], otherSlitsData: [] };
}
const splitArrays = values.map((val) =>
typeof val === 'string'
? val.split(/\s+/).filter(Boolean) // Split on spaces and remove empty entries
: val !== null && val !== undefined
? [String(val)]
: [],
);
// Ensure all split arrays have the same length
const slitsNumber = Math.max(...splitArrays.map((arr) => arr.length));
const allHaveSameLength = splitArrays.every(
(arr) => arr.length === slitsNumber,
);
if (allHaveSameLength) {
// Slit names if available, otherwise "Slits"
const slitNames = getDatasetParamValue(dataset, 'InstrumentSlits_name');
const slitTitles = slitNames
? slitNames
.split(/\s+/)
.slice(0, slitsNumber)
.map((name) => name.trim())
: Array(slitsNumber).fill('Slits');
// Data into separate rows per slit configuration
const slitData = Array.from({ length: slitsNumber }, (_, i) =>
paramKeys.map(({ caption }, j) => ({
caption,
value: splitArrays[j][i] || '',
digits: 2,
})),
);
return {
slitsTitles: slitTitles,
otherSlitsData: slitData,
};
}
return {
slitsTitles: ['Slits'],
otherSlitsData: [
paramKeys
.map(({ caption }, i) =>
values[i] !== null && values[i] !== undefined
? { caption, value: String(values[i]).trim(), digits: 2 }
: null,
)
.filter(Boolean) as MetadataTableParameter[],
],
};
};
export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) { export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) {
const { slitsTitles, otherSlitsData } = otherSlits(dataset);
return ( return (
<Container fluid> <Container fluid>
<Row className="g-3"> <Row className="g-3">
...@@ -348,75 +170,28 @@ export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) { ...@@ -348,75 +170,28 @@ export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) {
</Col> </Col>
)} )}
<Col xs="auto"> <Col xs="auto">
<TOMOMetadataCard <MetadataCard
title="Acquisition parameters" title="Acquisition parameters"
dataset={dataset} entity={dataset}
parameters={acquisitionParameters()} content={acquisitionParameters()}
/> />
</Col> </Col>
<Col xs="auto"> <Col xs="auto">
<TOMOMetadataCard <MetadataCard
title="Beam" title="Beam"
dataset={dataset} entity={dataset}
parameters={beamParameters(dataset)} content={beamParameters(dataset)}
/> />
</Col> </Col>
{attenuatorsParameters(dataset).length > 0 && ( <AttenuatorsWidget dataset={dataset} />
<Col xs="auto">
<TOMOMetadataCard
title="Attenuators"
dataset={dataset}
parameters={attenuatorsParameters(dataset)}
/>
</Col>
)}
<Col xs="auto"> <Col xs="auto">
<TOMOMetadataCard <MetadataCard
title="Camera and optics" title="Camera and optics"
dataset={dataset} entity={dataset}
parameters={cameraParameters(dataset)} content={cameraParameters(dataset)}
/> />
</Col> </Col>
{(primarySlitsParameters(dataset).length > 0 || <InstrumentSlitWidget dataset={dataset} />
secondarySlitsParameters(dataset).length > 0 ||
otherSlitsData.length > 0) && (
<Col xs="auto">
<Card>
<Card.Header className="text-center">Slits</Card.Header>
<Card.Body>
<Row>
{primarySlitsParameters(dataset).length > 0 && (
<Col xs="auto">
<TOMOMetadataCard
title="Primary Slits"
dataset={dataset}
parameters={primarySlitsParameters(dataset)}
/>
</Col>
)}
{secondarySlitsParameters(dataset).length > 0 && (
<Col xs="auto">
<TOMOMetadataCard
title="Secondary Slits"
dataset={dataset}
parameters={secondarySlitsParameters(dataset)}
/>
</Col>
)}
{otherSlitsData.map((params, index) => (
<Col xs="auto" key={index}>
<TOMOMetadataCard
title={slitsTitles[index] || 'Slits'}
dataset={dataset}
parameters={params}
/>
</Col>
))}
</Row>
</Card.Body>
</Card>
</Col>
)}
<Col xs="auto"> <Col xs="auto">
<Gallery dataset={dataset.outputDatasets?.[0]}></Gallery> <Gallery dataset={dataset.outputDatasets?.[0]}></Gallery>
</Col> </Col>
...@@ -424,20 +199,3 @@ export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) { ...@@ -424,20 +199,3 @@ export default function TOMOSummaryView({ dataset }: { dataset: Dataset }) {
</Container> </Container>
); );
} }
function TOMOMetadataCard({
title,
dataset,
parameters,
}: {
title: string;
dataset: Dataset;
parameters: MetadataTableParameters;
}) {
return (
<Card>
<Card.Header className="text-center">{title}</Card.Header>
<MetadataTable entity={dataset} parameters={parameters}></MetadataTable>
</Card>
);
}
import { import {
sortParameters,
DatasetFilesTabName, DatasetFilesTabName,
Loading, Loading,
MetadataTab, MetadataTab,
DatasetFiles, DatasetFiles,
DoiInfo, DoiInfo,
useConfig, useConfig,
getInstrummentTab,
} from '@edata-portal/core'; } from '@edata-portal/core';
import { InstrumentWidget } from 'components/dataset/metadata/InstrumentWidget';
import { Col, Row, Tabs, Tab } from 'react-bootstrap'; import { Col, Row, Tabs, Tab } from 'react-bootstrap';
import { Suspense } from 'react'; import { Suspense } from 'react';
import type { Dataset, Parameter } from '@edata-portal/icat-plus-api'; import type { Dataset, Parameter } from '@edata-portal/icat-plus-api';
import { GenericDatasetSummary } from '@edata-portal/core/src/components/dataset/generic/GenericDatasetSummary'; import { GenericDatasetSummary } from '@edata-portal/core/src/components/dataset/generic/GenericDatasetSummary';
export function DatasetDetail({ dataset }: { dataset: Dataset }) { export function DatasetDetail({ dataset }: { dataset: Dataset }) {
const instrumentParams = sortParameters( const instrumentTab = getInstrummentTab(dataset);
dataset.parameters.filter((parameter) =>
parameter.name.startsWith('Instrument'),
),
);
const config = useConfig(); const config = useConfig();
...@@ -53,12 +48,13 @@ export function DatasetDetail({ dataset }: { dataset: Dataset }) { ...@@ -53,12 +48,13 @@ export function DatasetDetail({ dataset }: { dataset: Dataset }) {
} }
return null; return null;
})} })}
{instrumentParams.length > 0 && ( {instrumentTab && (
<Tab key="beamline" eventKey="beamline" title="Beamlines"> <Tab
<InstrumentWidget key={instrumentTab.key}
dataset={dataset} eventKey={instrumentTab.key}
parameters={instrumentParams} title={instrumentTab.title}
/> >
{instrumentTab.content}
</Tab> </Tab>
)} )}
......
import {
renderParameterNameAsTitle,
MetadataCategories,
} from '@edata-portal/core';
import type { Dataset } from '@edata-portal/icat-plus-api';
import { Col, Card } from 'react-bootstrap';
export function InstrumentSlitWidget({ dataset }: { dataset: Dataset }) {
const prefixes = [
{ prefix: 'InstrumentSlitPrimary', name: 'Primary slit' },
{ prefix: 'InstrumentSlitSecondary', name: 'Secondary slit' },
{ prefix: 'InstrumentSlits', name: 'Slits' },
];
const suffixes = [
'blade_front',
'blade_back',
'blade_up',
'blade_down',
'horizontal_gap',
'horizontal_offset',
'vertical_gap',
'vertical_offset',
];
const slits = prefixes.map((prefix) => {
return {
title: prefix.name,
id: prefix.name,
content: suffixes.map((suffix) => ({
caption: renderParameterNameAsTitle(suffix),
parameterName: `${prefix.prefix}_${suffix}`,
})),
};
});
if (slits.length === 0) {
return null;
}
return (
<Col>
<Card>
<Card.Header>
<strong>Slits</strong>
</Card.Header>
<Card.Body>
<MetadataCategories categories={slits} entity={dataset} />
</Card.Body>
</Card>
</Col>
);
}
...@@ -2,7 +2,12 @@ import type { Dataset } from '@edata-portal/icat-plus-api'; ...@@ -2,7 +2,12 @@ import type { Dataset } from '@edata-portal/icat-plus-api';
import { Gallery } from 'components/dataset/gallery'; import { Gallery } from 'components/dataset/gallery';
import { GenericDatasetSummary } from 'components/dataset/generic/GenericDatasetSummary'; import { GenericDatasetSummary } from 'components/dataset/generic/GenericDatasetSummary';
import { MetadataCategories, MetadataCategory } from 'components/metadata'; import { MetadataCategories, MetadataCategory } from 'components/metadata';
import { getFilesTab, getMetadataTab, TabDefinition } from 'components/tabs'; import {
getFilesTab,
getInstrummentTab,
getMetadataTab,
TabDefinition,
} from 'components/tabs';
export type GenericDatasetTabsConfig = { export type GenericDatasetTabsConfig = {
summaryTab: summaryTab:
...@@ -42,8 +47,10 @@ export function getGenericDatasetTabs( ...@@ -42,8 +47,10 @@ export function getGenericDatasetTabs(
), ),
}; };
const instrumentTab = getInstrummentTab(dataset);
return [ return [
summary, summary,
instrumentTab,
config.filesTab config.filesTab
? getFilesTab(dataset, config.showPathInFilesTab, false) ? getFilesTab(dataset, config.showPathInFilesTab, false)
: undefined, : undefined,
......
import type { Dataset } from '@edata-portal/icat-plus-api';
import { MetadataCard } from 'components/metadata/MetadataCard';
import { MetadataTableParameter } from 'components/models';
import { getDatasetParamValue } from 'helpers';
import { Col } from 'react-bootstrap';
export function AttenuatorsWidget({ dataset }: { dataset: Dataset }) {
const presetAttenuators = (dataset: Dataset): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
for (let i = 0; i < 15; i++) {
const index = (i + 1).toString().padStart(2, '0');
const type = getDatasetParamValue(
dataset,
`InstrumentAttenuator${index}_type`,
);
const thickness = getDatasetParamValue(
dataset,
`InstrumentAttenuator${index}_thickness`,
);
if (type && type.toLowerCase() !== 'empty') {
params.push({ caption: `Att${i + 1}`, value: `${type}, ${thickness}` });
}
}
return params;
};
if (presetAttenuators.length === 0) {
return null;
}
return (
<Col xs="auto">
<MetadataCard
title="Attenuators"
entity={dataset}
content={presetAttenuators(dataset)}
/>
</Col>
);
}
import { import type { Dataset } from '@edata-portal/icat-plus-api';
type MetadataTableParameter, import { MetadataCategories } from 'components/metadata/MetadataCategories';
getDatasetParamValue, import { MetadataTableParameter } from 'components/models';
MetadataCategories, import { getDatasetParamValue } from 'helpers';
} from '@edata-portal/core';
import type { Dataset, Parameter } from '@edata-portal/icat-plus-api';
import { Col, Card } from 'react-bootstrap'; import { Col, Card } from 'react-bootstrap';
export function InstrumentDetectorWidget({ export function InstrumentDetectorWidget({ dataset }: { dataset: Dataset }) {
dataset,
parameters,
}: {
dataset: Dataset;
parameters: Parameter[];
}) {
const detectors = []; const detectors = [];
for (let index = 1; index < 10; index++) { for (let index = 1; index < 10; index++) {
const prefix = `InstrumentDetector0${index}`; const prefix = `InstrumentDetector0${index}`;
const detectorParams = parameters.filter((parameter) =>
parameter.name.startsWith(prefix),
);
const presetDetector: MetadataTableParameter[] = []; const presetDetector: MetadataTableParameter[] = [];
const positionersValues = const positionersValues =
getDatasetParamValue(dataset, `${prefix}Positioners_value`) getDatasetParamValue(dataset, `${prefix}Positioners_value`)
...@@ -36,7 +25,7 @@ export function InstrumentDetectorWidget({ ...@@ -36,7 +25,7 @@ export function InstrumentDetectorWidget({
}); });
} }
if (detectorParams.length > 0) { if (presetDetector.length > 0) {
const name = `${prefix}_name`; const name = `${prefix}_name`;
detectors.push({ detectors.push({
title: `#${index} ${getDatasetParamValue(dataset, name)}`, title: `#${index} ${getDatasetParamValue(dataset, name)}`,
...@@ -52,9 +41,7 @@ export function InstrumentDetectorWidget({ ...@@ -52,9 +41,7 @@ export function InstrumentDetectorWidget({
return ( return (
<Col> <Col>
<Card> <Card>
<Card.Header> <Card.Header className="text-center">Detector</Card.Header>
<strong>Detector</strong>
</Card.Header>
<Card.Body> <Card.Body>
<MetadataCategories categories={detectors} entity={dataset} /> <MetadataCategories categories={detectors} entity={dataset} />
</Card.Body> </Card.Body>
......
import {
type MetadataTableParameter,
shortenParameterName,
MetadataCard,
} from '@edata-portal/core';
import type { Dataset, Parameter } from '@edata-portal/icat-plus-api'; import type { Dataset, Parameter } from '@edata-portal/icat-plus-api';
import { MetadataCard } from 'components/metadata/MetadataCard';
import { MetadataTableParameter } from 'components/models';
import { shortenParameterName } from 'helpers';
import { Col } from 'react-bootstrap'; import { Col } from 'react-bootstrap';
export function InstrumentMonochromatorWidget({ export function InstrumentMonochromatorWidget({
......
import {
type MetadataTableParameter,
getDatasetParamValue,
MetadataCard,
} from '@edata-portal/core';
import type { Dataset } from '@edata-portal/icat-plus-api'; import type { Dataset } from '@edata-portal/icat-plus-api';
import { MetadataCard } from 'components/metadata/MetadataCard';
import { MetadataTableParameter } from 'components/models';
import { getDatasetParamValue } from 'helpers';
import { Col } from 'react-bootstrap'; import { Col } from 'react-bootstrap';
export function InstrumentOpticsWidget({ dataset }: { dataset: Dataset }) { export function InstrumentOpticsWidget({ dataset }: { dataset: Dataset }) {
...@@ -24,7 +22,7 @@ export function InstrumentOpticsWidget({ dataset }: { dataset: Dataset }) { ...@@ -24,7 +22,7 @@ export function InstrumentOpticsWidget({ dataset }: { dataset: Dataset }) {
return null; return null;
} }
return ( return (
<Col> <Col xs="auto">
<MetadataCard title="Optics" entity={dataset} content={presetOptics} /> <MetadataCard title="Optics" entity={dataset} content={presetOptics} />
</Col> </Col>
); );
......
import {
type MetadataTableParameter,
getDatasetParamValue,
MetadataCard,
} from '@edata-portal/core';
import type { Dataset } from '@edata-portal/icat-plus-api'; import type { Dataset } from '@edata-portal/icat-plus-api';
import { MetadataCard } from 'components/metadata/MetadataCard';
import { MetadataTableParameter } from 'components/models';
import { getDatasetParamValue } from 'helpers';
import { Col } from 'react-bootstrap'; import { Col } from 'react-bootstrap';
export function InstrumentPositionersWidget({ dataset }: { dataset: Dataset }) { export function InstrumentPositionersWidget({ dataset }: { dataset: Dataset }) {
......
import type { Dataset } from '@edata-portal/icat-plus-api';
import { MetadataCard } from 'components/metadata/MetadataCard';
import { MetadataTableParameter } from 'components/models';
import { getDatasetParamValue } from 'helpers';
import { Col, Card, Row } from 'react-bootstrap';
export function InstrumentSlitWidget({ dataset }: { dataset: Dataset }) {
const addParam = (
params: MetadataTableParameter[],
dataset: Dataset,
key: string,
caption: string,
digits?: number,
) => {
const value = getDatasetParamValue(dataset, key) || undefined;
if (value) {
params.push({ caption, value, digits });
}
};
const primarySlitsParameters = (
dataset: Dataset,
): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
addParam(
params,
dataset,
'InstrumentSlitPrimary_horizontal_gap',
'Horizontal gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_horizontal_offset',
'Horizontal offset',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_vertical_gap',
'Vertical gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitPrimary_vertical_offset',
'Vertical offset',
2,
);
return params;
};
const secondarySlitsParameters = (
dataset: Dataset,
): MetadataTableParameter[] => {
const params: MetadataTableParameter[] = [];
addParam(
params,
dataset,
'InstrumentSlitSecondary_horizontal_gap',
'Horizontal gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_horizontal_offset',
'Horizontal offset',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_vertical_gap',
'Vertical gap',
2,
);
addParam(
params,
dataset,
'InstrumentSlitSecondary_vertical_offset',
'Vertical offset',
2,
);
return params;
};
const otherSlits = (
dataset: Dataset,
): { slitsTitles: string[]; otherSlitsData: MetadataTableParameter[][] } => {
const paramKeys = [
{ key: 'InstrumentSlits_horizontal_gap', caption: 'Horizontal gap' },
{
key: 'InstrumentSlits_horizontal_offset',
caption: 'Horizontal offset',
},
{ key: 'InstrumentSlits_vertical_gap', caption: 'Vertical gap' },
{ key: 'InstrumentSlits_vertical_offset', caption: 'Vertical offset' },
];
const values = paramKeys.map(({ key }) =>
getDatasetParamValue(dataset, key),
);
if (values.every((val) => val === null || val === undefined)) {
return { slitsTitles: ['Slits'], otherSlitsData: [] };
}
const splitArrays = values.map((val) =>
typeof val === 'string'
? val.split(/\s+/).filter(Boolean) // Split on spaces and remove empty entries
: val !== null && val !== undefined
? [String(val)]
: [],
);
// Ensure all split arrays have the same length
const slitsNumber = Math.max(...splitArrays.map((arr) => arr.length));
const allHaveSameLength = splitArrays.every(
(arr) => arr.length === slitsNumber,
);
if (allHaveSameLength) {
// Slit names if available, otherwise "Slits"
const slitNames = getDatasetParamValue(dataset, 'InstrumentSlits_name');
const slitTitles = slitNames
? slitNames
.split(/\s+/)
.slice(0, slitsNumber)
.map((name) => name.trim())
: Array(slitsNumber).fill('Slits');
// Data into separate rows per slit configuration
const slitData = Array.from({ length: slitsNumber }, (_, i) =>
paramKeys.map(({ caption }, j) => ({
caption,
value: splitArrays[j][i] || '',
digits: 2,
})),
);
return {
slitsTitles: slitTitles,
otherSlitsData: slitData,
};
}
return {
slitsTitles: ['Slits'],
otherSlitsData: [
paramKeys
.map(({ caption }, i) =>
values[i] !== null && values[i] !== undefined
? { caption, value: String(values[i]).trim(), digits: 2 }
: null,
)
.filter(Boolean) as MetadataTableParameter[],
],
};
};
const { slitsTitles, otherSlitsData } = otherSlits(dataset);
return primarySlitsParameters(dataset).length > 0 ||
secondarySlitsParameters(dataset).length > 0 ||
otherSlitsData.length > 0 ? (
<Col xs="auto">
<Card>
<Card.Header className="text-center">Slits</Card.Header>
<Card.Body>
<Row>
{primarySlitsParameters(dataset).length > 0 && (
<Col xs="auto">
<MetadataCard
title="Primary Slits"
entity={dataset}
content={primarySlitsParameters(dataset)}
/>
</Col>
)}
{secondarySlitsParameters(dataset).length > 0 && (
<Col xs="auto">
<MetadataCard
title="Secondary Slits"
entity={dataset}
content={secondarySlitsParameters(dataset)}
/>
</Col>
)}
{otherSlitsData.map((params, index) => (
<Col xs="auto" key={index}>
<MetadataCard
title={slitsTitles[index] || 'Slits'}
entity={dataset}
content={params}
/>
</Col>
))}
</Row>
</Card.Body>
</Card>
</Col>
) : null;
}
import type { Dataset, Parameter } from '@edata-portal/icat-plus-api'; import type { Dataset } from '@edata-portal/icat-plus-api';
import { InstrumentMonochromatorWidget } from 'components/dataset/metadata/InstrumentMonochromatorWidget'; import { InstrumentMonochromatorWidget } from 'components/metadata/InstrumentMonochromatorWidget';
import { InstrumentDetectorWidget } from 'components/dataset/metadata/InstrumentDetectorWidget'; import { InstrumentDetectorWidget } from 'components/metadata/InstrumentDetectorWidget';
import { InstrumentSlitWidget } from 'components/dataset/metadata/InstrumentSlitWidget'; import { InstrumentSlitWidget } from 'components/metadata/InstrumentSlitWidget';
import { InstrumentOpticsWidget } from 'components/dataset/metadata/InstrumentOpticsWidget'; import { InstrumentOpticsWidget } from 'components/metadata/InstrumentOpticsWidget';
import { InstrumentPositionersWidget } from 'components/dataset/metadata/InstrumentPositionersWidget'; import { InstrumentPositionersWidget } from 'components/metadata/InstrumentPositionersWidget';
import { Col, Row } from 'react-bootstrap'; import { Col, Row } from 'react-bootstrap';
import { getInstrumentParameters } from 'helpers';
export function InstrumentWidget({ export function InstrumentWidget({ dataset }: { dataset: Dataset }) {
dataset, const instrumentParams = getInstrumentParameters(dataset);
parameters,
}: {
dataset: Dataset;
parameters: Parameter[];
}) {
return ( return (
<Row className="g-2 m-2"> <Row className="g-2 m-2">
<Col xs={'auto'}> <Col xs={'auto'}>
<InstrumentMonochromatorWidget <InstrumentMonochromatorWidget
dataset={dataset} dataset={dataset}
parameters={parameters} parameters={instrumentParams}
/> />
</Col> </Col>
<Col xs={'auto'}> <Col xs={'auto'}>
<InstrumentDetectorWidget dataset={dataset} parameters={parameters} /> <InstrumentDetectorWidget dataset={dataset} />
</Col> </Col>
<Col xs={'auto'}> <Col xs={'auto'}>
<InstrumentSlitWidget dataset={dataset} /> <InstrumentSlitWidget dataset={dataset} />
......
...@@ -14,15 +14,12 @@ export function MetadataCard({ ...@@ -14,15 +14,12 @@ export function MetadataCard({
}) { }) {
return ( return (
<Card <Card
className="text-center"
style={{ style={{
maxWidth: 700, maxWidth: 700,
flexGrow: 1, flexGrow: 1,
}} }}
> >
<Card.Header className="p-1"> <Card.Header className="text-center">{title}</Card.Header>
<strong>{title}</strong>
</Card.Header>
<Card.Body style={{ padding: 0 }}> <Card.Body style={{ padding: 0 }}>
<MetadataTable entity={entity} parameters={content} /> <MetadataTable entity={entity} parameters={content} />
</Card.Body> </Card.Body>
......
export * from './MetadataCard'; export * from './MetadataCard';
export * from './MetadataCategories'; export * from './MetadataCategories';
export * from './MetadataTable'; export * from './MetadataTable';
export * from './InstrumentWidget';
export * from './AttenuatorsWidget';
export * from './InstrumentSlitWidget';
...@@ -5,7 +5,8 @@ import { ...@@ -5,7 +5,8 @@ import {
DatasetList, DatasetList,
MetadataTab, MetadataTab,
} from 'components/dataset'; } from 'components/dataset';
import { getInputDatasetIds } from 'helpers'; import { InstrumentWidget } from 'components/metadata';
import { getInputDatasetIds, getInstrumentParameters } from 'helpers';
import { Badge, Container } from 'react-bootstrap'; import { Badge, Container } from 'react-bootstrap';
export type TabDefinition = { export type TabDefinition = {
...@@ -71,3 +72,18 @@ export function getInputsTab(dataset: Dataset): TabDefinition { ...@@ -71,3 +72,18 @@ export function getInputsTab(dataset: Dataset): TabDefinition {
hidden: !inputs.length, hidden: !inputs.length,
}; };
} }
export function getInstrummentTab(dataset: Dataset): TabDefinition | undefined {
const instrumentParams = getInstrumentParameters(dataset);
return instrumentParams.length > 0
? {
key: 'instrument',
title: 'Instrument',
content: (
<Container fluid>
<InstrumentWidget dataset={dataset} />
</Container>
),
}
: undefined;
}
import type { Dataset } from '@edata-portal/icat-plus-api'; import type { Dataset, Parameter } from '@edata-portal/icat-plus-api';
import { immutableArray } from 'helpers/array'; import { immutableArray } from 'helpers/array';
import { import {
DATASET_TYPE_ACQUISITION, DATASET_TYPE_ACQUISITION,
...@@ -8,6 +8,7 @@ import { ...@@ -8,6 +8,7 @@ import {
import { prettyPrint } from 'helpers/string'; import { prettyPrint } from 'helpers/string';
import { unit } from 'mathjs'; import { unit } from 'mathjs';
import { convertToFixed } from 'helpers/numeric'; import { convertToFixed } from 'helpers/numeric';
import { sortParameters } from 'helpers/metadata';
export const DATASET_NAME_PARAM = 'datasetName'; export const DATASET_NAME_PARAM = 'datasetName';
...@@ -148,3 +149,18 @@ export function convertUnitDatasetParameter( ...@@ -148,3 +149,18 @@ export function convertUnitDatasetParameter(
} }
return value; return value;
} }
/**
* Returns the sorted list of Instrument metadata for a given dataset
* Empty if not Instrument metadata are found
* @param dataset
* @returns
*/
export function getInstrumentParameters(dataset: Dataset): Parameter[] {
const instrumentParams = sortParameters(
dataset.parameters.filter((parameter) =>
parameter.name.startsWith('Instrument'),
),
);
return instrumentParams;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment