Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions components/frontend/src/metric/MetricConfigurationParameters.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { metricPropType, reportPropType, subjectPropType } from "../sharedPropTy
import {
formatMetricScale,
getMetricDirection,
getMetricName,
getMetricScale,
getMetricTags,
getMetricUnit,
Expand Down Expand Up @@ -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)}
/>
)
}
Expand Down Expand Up @@ -252,12 +253,7 @@ export function MetricConfigurationParameters({ metric, metricUuid, reload, repo
return (
<Grid container spacing={{ xs: 1, sm: 2, md: 3 }} columns={{ xs: 1, sm: 3, md: 3 }}>
<Grid size={1}>
<MetricType
subjectType={subject.type}
metricType={metric.type}
metricUuid={metricUuid}
reload={reload}
/>
<MetricType metric={metric} metricUuid={metricUuid} reload={reload} subjectType={subject.type} />
</Grid>
<Grid size={1}>
<Stack spacing={{ xs: 1, sm: 1, md: 1 }}>
Expand Down
12 changes: 7 additions & 5 deletions components/frontend/src/metric/MetricType.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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]))
Expand All @@ -70,7 +72,7 @@ export function MetricType({ subjectType, metricType, metricUuid, reload }) {
disabled={disabled}
helperText={
<>
<ReadTheDocsLink url={referenceDocumentationURL(dataModel.metrics[metricType].name)} />
<ReadTheDocsLink url={referenceDocumentationURL(getMetricTypeName(metric, dataModel))} />
{howToConfigure}
</>
}
Expand All @@ -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,
}
2 changes: 1 addition & 1 deletion components/frontend/src/metric/MetricType.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function renderMetricType(metricType) {
<DataModelContext value={dataModel}>
<MetricType
subjectType="subject_type"
metricType={metricType}
metric={{ type: metricType }}
metricUuid="metric_uuid"
reload={vi.fn()}
/>
Expand Down
4 changes: 2 additions & 2 deletions components/frontend/src/report/ReportSources.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -215,7 +215,7 @@ export function ReportSources({ reload, report, settings }) {
onExpand={() => settings.expandedItems.toggle(source.uuid)}
firstCellContent={getSourceName(source, dataModel)}
>
<TableCell>{dataModel.sources[source.type].name}</TableCell>
<TableCell>{getSourceTypeName(source, dataModel)}</TableCell>
<TableCell>{source.parameters?.url ?? ""}</TableCell>
<TableCell align="right">{source.nrMetrics}</TableCell>
<TableCell align="right">
Expand Down
8 changes: 4 additions & 4 deletions components/frontend/src/source/Source.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)}
/>
</Grid>
<Grid size={{ xs: 1, sm: 2, md: 2 }}>
Expand Down Expand Up @@ -179,14 +179,14 @@ export function Source({
<ul>
<li>
Change the type of the metric (back) to a type that is supported by{" "}
<HyperLink url={referenceDocumentationURL(dataModel.metrics[metric.type].name)}>
<HyperLink url={referenceDocumentationURL(getMetricTypeName(metric, dataModel))}>
{sourceName}
</HyperLink>
.
</li>
<li>
Change the type of this source to a type that supports{" "}
<HyperLink url={referenceDocumentationURL(dataModel.sources[source.type].name)}>
<HyperLink url={referenceDocumentationURL(getSourceTypeName(source, dataModel))}>
{metricName}
</HyperLink>
.
Expand Down
30 changes: 16 additions & 14 deletions components/frontend/src/source/SourceEntities.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 (
<InfoMessage title="Measurement details not supported">
{`Showing individual ${unit} is not supported when using ${sourceTypeName} as source.`}
{`Showing individual ${unit} is not supported when using ${getSourceTypeName(source, dataModel)} as source.`}
</InfoMessage>
)
}
Expand All @@ -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 (
<InfoMessage title="Measurement details not available">
There are currently no measurement details available.
Expand All @@ -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) => (
<SourceEntity
Expand All @@ -243,14 +242,17 @@ export function SourceEntities({ loading, measurements, metric, metricUuid, relo
metricUuid={metricUuid}
reload={reload}
report={report}
status={entityStatus(source, entity)}
statusEndDate={entityStatusEndDate(source, entity)}
rationale={entityStatusRationale(source, entity)}
sourceUuid={source.source_uuid}
status={entityStatus(lastMeasurementSource, entity)}
statusEndDate={entityStatusEndDate(lastMeasurementSource, entity)}
rationale={entityStatusRationale(lastMeasurementSource, entity)}
sourceUuid={sourceUuid}
/>
))
const nrIgnoredEntities = entities.filter((entity) =>
entityCanBeIgnored(entityStatus(source, entity), entityStatusEndDate(source, entity)),
entityCanBeIgnored(
entityStatus(lastMeasurementSource, entity),
entityStatusEndDate(lastMeasurementSource, entity),
),
).length
const headers = sourceEntitiesHeaders(
columnsToHide,
Expand Down
10 changes: 6 additions & 4 deletions components/frontend/src/subject/SubjectParameters.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -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)}
/>
</Grid>
<Grid size={{ xs: 1, sm: 1, md: 1 }}>
Expand All @@ -54,6 +57,5 @@ export function SubjectParameters({ subject, subjectUuid, subjectName, reload })
SubjectParameters.propTypes = {
subject: subjectPropType,
subjectUuid: string,
subjectName: string,
reload: func,
}
13 changes: 3 additions & 10 deletions components/frontend/src/subject/SubjectTitle.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 (
<div className="sticky" style={{ zIndex: zIndexSubjectTitle }}>
Expand All @@ -90,12 +88,7 @@ export function SubjectTitle({
]}
uuid={subjectUuid}
>
<SubjectParameters
subject={subject}
subjectUuid={subjectUuid}
subjectName={subjectName}
reload={reload}
/>
<SubjectParameters subject={subject} subjectUuid={subjectUuid} reload={reload} />
<ChangeLog subjectUuid={subjectUuid} timestamp={report.timestamp} />
</Tabs>
<SubjectTitleButtonRow
Expand Down
16 changes: 14 additions & 2 deletions components/frontend/src/utils.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,16 @@ export function formatMetricDirection(metric, dataModel) {
return { "<": "≦", ">": "≧" }[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) {
Expand Down Expand Up @@ -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) {
Expand Down
Loading