From 3d46c7fc1eed157d2a3696e0ecdf5dc74b2610aa Mon Sep 17 00:00:00 2001 From: Frank Niessink Date: Mon, 4 May 2026 23:16:30 +0200 Subject: [PATCH 1/2] Use getSourceName consistently. --- components/frontend/src/source/Source.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/frontend/src/source/Source.jsx b/components/frontend/src/source/Source.jsx index 607e3193a2..0dd4f5e576 100644 --- a/components/frontend/src/source/Source.jsx +++ b/components/frontend/src/source/Source.jsx @@ -122,7 +122,7 @@ function Parameters({ label="Source name" placeholder={sourceType.name} onChange={(value) => setSourceAttribute(sourceUuid, "name", value, reload)} - value={source.name || sourceType.name} + value={getSourceName(source, dataModel)} /> From ba6e56e33d5552bf871f218c0a18954a52f310a7 Mon Sep 17 00:00:00 2001 From: Frank Niessink Date: Tue, 5 May 2026 13:14:04 +0200 Subject: [PATCH 2/2] Use get(Type)Name() functions more consistently in frontend --- .../metric/MetricConfigurationParameters.jsx | 10 ++----- components/frontend/src/metric/MetricType.jsx | 12 ++++---- .../frontend/src/metric/MetricType.test.jsx | 2 +- .../frontend/src/report/ReportSources.jsx | 4 +-- components/frontend/src/source/Source.jsx | 6 ++-- .../frontend/src/source/SourceEntities.jsx | 30 ++++++++++--------- .../src/subject/SubjectParameters.jsx | 10 ++++--- .../frontend/src/subject/SubjectTitle.jsx | 13 ++------ components/frontend/src/utils.jsx | 16 ++++++++-- 9 files changed, 55 insertions(+), 48 deletions(-) diff --git a/components/frontend/src/metric/MetricConfigurationParameters.jsx b/components/frontend/src/metric/MetricConfigurationParameters.jsx index beb6303b4f..1ca00efc6c 100644 --- a/components/frontend/src/metric/MetricConfigurationParameters.jsx +++ b/components/frontend/src/metric/MetricConfigurationParameters.jsx @@ -12,6 +12,7 @@ import { metricPropType, reportPropType, subjectPropType } from "../sharedPropTy import { formatMetricScale, getMetricDirection, + getMetricName, getMetricScale, getMetricTags, getMetricUnit, @@ -52,7 +53,7 @@ function MetricName({ metric, metricUuid, reload }) { label="Metric name" placeholder={metricType.name} onChange={(value) => setMetricAttribute(metricUuid, "name", value, reload)} - value={metric.name || metricType.name} + value={getMetricName(metric, dataModel)} /> ) } @@ -252,12 +253,7 @@ export function MetricConfigurationParameters({ metric, metricUuid, reload, repo return ( - + diff --git a/components/frontend/src/metric/MetricType.jsx b/components/frontend/src/metric/MetricType.jsx index 8cc8287a30..7237d4cb91 100644 --- a/components/frontend/src/metric/MetricType.jsx +++ b/components/frontend/src/metric/MetricType.jsx @@ -6,7 +6,8 @@ import { setMetricAttribute } from "../api/metric" import { DataModelContext } from "../context/DataModel" import { accessGranted, EDIT_REPORT_PERMISSION, PermissionsContext } from "../context/Permissions" import { TextField } from "../fields/TextField" -import { getSubjectTypeMetrics, referenceDocumentationURL } from "../utils" +import { metricPropType } from "../sharedPropTypes" +import { getMetricTypeName, getSubjectTypeMetrics, referenceDocumentationURL } from "../utils" import { ReadTheDocsLink } from "../widgets/ReadTheDocsLink" export function metricTypeOption(key, metricType) { @@ -54,11 +55,12 @@ export function usedMetricTypesInReport(report) { return Array.from(metricTypes) } -export function MetricType({ subjectType, metricType, metricUuid, reload }) { +export function MetricType({ metric, metricUuid, reload, subjectType }) { const dataModel = useContext(DataModelContext) const permissions = useContext(PermissionsContext) const disabled = !accessGranted(permissions, [EDIT_REPORT_PERMISSION]) const options = metricTypeOptions(dataModel, subjectType) + const metricType = metric.type const metricTypes = options.map((option) => option.key) if (!metricTypes.includes(metricType)) { options.push(metricTypeOption(metricType, dataModel.metrics[metricType])) @@ -70,7 +72,7 @@ export function MetricType({ subjectType, metricType, metricUuid, reload }) { disabled={disabled} helperText={ <> - + {howToConfigure} } @@ -88,8 +90,8 @@ export function MetricType({ subjectType, metricType, metricUuid, reload }) { ) } MetricType.propTypes = { - subjectType: string, - metricType: string, + metric: metricPropType, metricUuid: string, reload: func, + subjectType: string, } diff --git a/components/frontend/src/metric/MetricType.test.jsx b/components/frontend/src/metric/MetricType.test.jsx index 9138c011b1..032e2cc74d 100644 --- a/components/frontend/src/metric/MetricType.test.jsx +++ b/components/frontend/src/metric/MetricType.test.jsx @@ -46,7 +46,7 @@ function renderMetricType(metricType) { diff --git a/components/frontend/src/report/ReportSources.jsx b/components/frontend/src/report/ReportSources.jsx index 694575ed99..c3fe9a1a5e 100644 --- a/components/frontend/src/report/ReportSources.jsx +++ b/components/frontend/src/report/ReportSources.jsx @@ -13,7 +13,7 @@ import { SourceParameter } from "../source/SourceParameter" import { reloadAfterMassEditSource } from "../source/Sources" import { SourceTypeRichDescription } from "../source/SourceType" import { theme } from "../theme" -import { getSourceName, referenceDocumentationURL } from "../utils" +import { getSourceName, getSourceTypeName, referenceDocumentationURL } from "../utils" import { UnsortableTableHeaderCell } from "../widgets/TableHeaderCell" import { TableRowWithDetails } from "../widgets/TableRowWithDetails" import { Tabs } from "../widgets/Tabs" @@ -215,7 +215,7 @@ export function ReportSources({ reload, report, settings }) { onExpand={() => settings.expandedItems.toggle(source.uuid)} firstCellContent={getSourceName(source, dataModel)} > - {dataModel.sources[source.type].name} + {getSourceTypeName(source, dataModel)} {source.parameters?.url ?? ""} {source.nrMetrics} diff --git a/components/frontend/src/source/Source.jsx b/components/frontend/src/source/Source.jsx index 0dd4f5e576..2fb63e6209 100644 --- a/components/frontend/src/source/Source.jsx +++ b/components/frontend/src/source/Source.jsx @@ -17,7 +17,7 @@ import { sourcePropType, stringsPropType, } from "../sharedPropTypes" -import { getMetricName, getSourceName, referenceDocumentationURL } from "../utils" +import { getMetricName, getMetricTypeName, getSourceName, getSourceTypeName, referenceDocumentationURL } from "../utils" import { ButtonRow } from "../widgets/ButtonRow" import { DeleteButton } from "../widgets/buttons/DeleteButton" import { ReorderButtonGroup } from "../widgets/buttons/ReorderButtonGroup" @@ -179,14 +179,14 @@ export function Source({
  • Change the type of the metric (back) to a type that is supported by{" "} - + {sourceName} .
  • Change the type of this source to a type that supports{" "} - + {metricName} . diff --git a/components/frontend/src/source/SourceEntities.jsx b/components/frontend/src/source/SourceEntities.jsx index ef61cabe91..911a048911 100644 --- a/components/frontend/src/source/SourceEntities.jsx +++ b/components/frontend/src/source/SourceEntities.jsx @@ -30,7 +30,7 @@ import { sourcePropType, stringsPropType, } from "../sharedPropTypes" -import { capitalize, getMetricUnit } from "../utils" +import { capitalize, getMetricUnit, getSourceTypeName } from "../utils" import { IgnoreIcon, ShowIcon } from "../widgets/icons" import { LoadingPlaceHolder } from "../widgets/Placeholder" import { SortableTableHeaderCell } from "../widgets/TableHeaderCell" @@ -180,15 +180,14 @@ export function SourceEntities({ loading, measurements, metric, metricUuid, relo const sortColumn = settings.entitySortColumn.getItem(metricUuid) || null const sortDirection = settings.entitySortDirection.getItem(metricUuid) - const sourceType = metric.sources[sourceUuid].type - const metricEntities = dataModel.sources[sourceType]?.entities?.[metric.type] + const source = metric.sources[sourceUuid] + const metricEntities = dataModel.sources[source.type]?.entities?.[metric.type] if (!metricEntities) { const unit = getMetricUnit(metric, dataModel) || "entities" - const sourceTypeName = dataModel.sources[sourceType].name return ( - {`Showing individual ${unit} is not supported when using ${sourceTypeName} as source.`} + {`Showing individual ${unit} is not supported when using ${getSourceTypeName(source, dataModel)} as source.`} ) } @@ -206,8 +205,8 @@ export function SourceEntities({ loading, measurements, metric, metricUuid, relo ) } const lastMeasurement = measurements.at(-1) - const source = lastMeasurement.sources.find((source) => source.source_uuid === sourceUuid) - if (!Array.isArray(source?.entities) || source.entities.length === 0) { + const lastMeasurementSource = lastMeasurement.sources.find((source) => source.source_uuid === sourceUuid) + if (!Array.isArray(lastMeasurementSource?.entities) || lastMeasurementSource.entities.length === 0) { return ( There are currently no measurement details available. @@ -229,8 +228,8 @@ export function SourceEntities({ loading, measurements, metric, metricUuid, relo sortDirection: sortDirection, } const columnType = sortColumn ? entityColumnType(sortColumn, entityAttributes) : "text" - const entities = sortedEntities(columnType, sortColumn, sortDirection, source) - const columnsToHide = determineColumnsToHide(settings, source, entities) + const entities = sortedEntities(columnType, sortColumn, sortDirection, lastMeasurementSource) + const columnsToHide = determineColumnsToHide(settings, lastMeasurementSource, entities) const hideIgnoredEntities = settings.hideIgnoredEntities.includes(metricUuid) const rows = entities.map((entity) => ( )) const nrIgnoredEntities = entities.filter((entity) => - entityCanBeIgnored(entityStatus(source, entity), entityStatusEndDate(source, entity)), + entityCanBeIgnored( + entityStatus(lastMeasurementSource, entity), + entityStatusEndDate(lastMeasurementSource, entity), + ), ).length const headers = sourceEntitiesHeaders( columnsToHide, diff --git a/components/frontend/src/subject/SubjectParameters.jsx b/components/frontend/src/subject/SubjectParameters.jsx index 53c53d8697..e962817b22 100644 --- a/components/frontend/src/subject/SubjectParameters.jsx +++ b/components/frontend/src/subject/SubjectParameters.jsx @@ -3,13 +3,16 @@ import { func, string } from "prop-types" import { useContext } from "react" import { setSubjectAttribute } from "../api/subject" +import { DataModelContext } from "../context/DataModel" import { accessGranted, EDIT_REPORT_PERMISSION, PermissionsContext } from "../context/Permissions" import { CommentField } from "../fields/CommentField" import { TextField } from "../fields/TextField" import { subjectPropType } from "../sharedPropTypes" +import { getSubjectName, getSubjectTypeName } from "../utils" import { SubjectType } from "./SubjectType" -export function SubjectParameters({ subject, subjectUuid, subjectName, reload }) { +export function SubjectParameters({ subject, subjectUuid, reload }) { + const dataModel = useContext(DataModelContext) const permissions = useContext(PermissionsContext) const disabled = !accessGranted(permissions, [EDIT_REPORT_PERMISSION]) return ( @@ -26,9 +29,9 @@ export function SubjectParameters({ subject, subjectUuid, subjectName, reload }) disabled={disabled} id={`${subjectUuid}-title`} label="Subject title" - placeholder={subjectName} + placeholder={getSubjectTypeName(subject, dataModel)} onChange={(value) => setSubjectAttribute(subjectUuid, "name", value, reload)} - value={subject.name || subjectName} + value={getSubjectName(subject, dataModel)} /> @@ -54,6 +57,5 @@ export function SubjectParameters({ subject, subjectUuid, subjectName, reload }) SubjectParameters.propTypes = { subject: subjectPropType, subjectUuid: string, - subjectName: string, reload: func, } diff --git a/components/frontend/src/subject/SubjectTitle.jsx b/components/frontend/src/subject/SubjectTitle.jsx index 94b15bf9f7..0e8d9db3fd 100644 --- a/components/frontend/src/subject/SubjectTitle.jsx +++ b/components/frontend/src/subject/SubjectTitle.jsx @@ -11,7 +11,7 @@ import { DataModelContext } from "../context/DataModel" import { EDIT_REPORT_PERMISSION, ReadOnlyOrEditable } from "../context/Permissions" import { zIndexSubjectTitle } from "../defaults" import { reportPropType, settingsPropType } from "../sharedPropTypes" -import { getSubjectType } from "../utils" +import { getSubjectName } from "../utils" import { ButtonRow } from "../widgets/ButtonRow" import { DeleteButton } from "../widgets/buttons/DeleteButton" import { PermLinkButton } from "../widgets/buttons/PermLinkButton" @@ -69,9 +69,7 @@ export function SubjectTitle({ settings, }) { const dataModel = useContext(DataModelContext) - const subjectType = getSubjectType(subject.type, dataModel.subjects) - const subjectName = subject.name || subjectType.name - const subjectTitle = (atReportsOverview ? report.title + " ❯ " : "") + subjectName + const subjectTitle = (atReportsOverview ? report.title + " ❯ " : "") + getSubjectName(subject, dataModel) const subjectUrl = `${globalThis.location}#${subjectUuid}` return (
    @@ -90,12 +88,7 @@ export function SubjectTitle({ ]} uuid={subjectUuid} > - + ": "≧" }[getMetricDirection(metric, dataModel)] } +export function getMetricTypeName(metric, dataModel) { + return dataModel.metrics[metric.type].name +} + export function getMetricName(metric, dataModel) { - return metric.name || dataModel.metrics[metric.type].name + return metric.name || getMetricTypeName(metric, dataModel) +} + +export function getSourceTypeName(source, dataModel) { + return dataModel.sources[source.type].name } export function getSourceName(source, dataModel) { @@ -89,8 +97,12 @@ getSubjectType.propTypes = { subjects: objectOf(subjectTypePropType), } +export function getSubjectTypeName(subject, dataModel) { + return getSubjectType(subject.type, dataModel.subjects).name +} + export function getSubjectName(subject, dataModel) { - return subject.name || getSubjectType(subject.type, dataModel.subjects).name + return subject.name || getSubjectTypeName(subject, dataModel) } export function getMetricTarget(metric) {