');
+ expect(sourceElement.innerHTML).toContain('Climate TRACE');
+ });
+
+ test('does not render sourceBy when null', () => {
+ const props = {
+ primary: 'Test Primary',
+ sourceBy: null,
+ classes: {
+ detailsContainer: 'detailsContainer',
+ primaryText: 'primaryText',
+ sourceText: 'sourceText',
+ unitText: 'unitText',
+ },
+ };
+
+ const { container } = render();
+
+ expect(screen.getByText('Test Primary')).toBeInTheDocument();
+
+ const sourceElement = container.querySelector('.sourceText');
+ expect(sourceElement).not.toBeInTheDocument();
+ });
+
+ test('does not render sourceBy when empty string', () => {
+ const props = {
+ primary: 'Test Primary',
+ sourceBy: '',
+ classes: {
+ detailsContainer: 'detailsContainer',
+ primaryText: 'primaryText',
+ sourceText: 'sourceText',
+ unitText: 'unitText',
+ },
+ };
+
+ const { container } = render();
+
+ const sourceElement = container.querySelector('.sourceText');
+ expect(sourceElement).not.toBeInTheDocument();
+ });
+
+ test('renders unit text inline with primary value', () => {
+ const props = {
+ primary: '100',
+ unit: 'kg',
+ classes: {
+ detailsContainer: 'detailsContainer',
+ primaryText: 'primaryText',
+ unitText: 'unitText',
+ },
+ };
+
+ const { container } = render();
+
+ const primaryElement = container.querySelector('.primaryText');
+ expect(primaryElement).toBeInTheDocument();
+ expect(primaryElement.textContent).toBe('100kg');
+
+ const unitElement = container.querySelector('.unitText');
+ expect(unitElement).toBeInTheDocument();
+ expect(unitElement.textContent).toBe('kg');
+ });
+
+ test('does not render unit text when unit is null', () => {
+ const props = {
+ primary: 'Test Primary',
+ unit: null,
+ classes: {
+ detailsContainer: 'detailsContainer',
+ primaryText: 'primaryText',
+ unitText: 'unitText',
+ },
+ };
+
+ const { container } = render();
+
+ expect(container.querySelector('.unitText')).not.toBeInTheDocument();
+ });
});
diff --git a/src/react/src/__tests__/components/FacilityDetailsGeneralFields.test.js b/src/react/src/__tests__/components/FacilityDetailsGeneralFields.test.js
index 12d443d89..96ce3ceee 100644
--- a/src/react/src/__tests__/components/FacilityDetailsGeneralFields.test.js
+++ b/src/react/src/__tests__/components/FacilityDetailsGeneralFields.test.js
@@ -311,4 +311,69 @@ describe('FacilityDetailsGeneralFields component', () => {
expect(getByText('Name')).toBeInTheDocument();
expect(getByText('Nice production location LTD')).toBeInTheDocument();
});
+
+ test('uses partner field label from top value when provided', () => {
+ const partnerFieldLabel = 'Climate TRACE Data 2024';
+ const dataWithPartnerField = {
+ ...mockData,
+ properties: {
+ ...mockData.properties,
+ partner_fields: {
+ ...mockData.properties.partner_fields,
+ climate_trace: [
+ {
+ value: { raw_value: 'Scope 1 emissions: 123' },
+ created_at: '2025-01-01T00:00:00Z',
+ updated_at: '2025-01-02T00:00:00Z',
+ contributor_name: 'Climate TRACE',
+ contributor_id: 1139,
+ is_from_claim: false,
+ is_verified: false,
+ field_name: 'climate_trace',
+ value_count: 1,
+ label: partnerFieldLabel,
+ source_by: 'Reported via Climate TRACE platform
',
+ },
+ ],
+ },
+ },
+ };
+
+ const { getByText } = renderComponent({ data: dataWithPartnerField });
+
+ expect(getByText(partnerFieldLabel)).toBeInTheDocument();
+ expect(getByText('Scope 1 emissions: 123')).toBeInTheDocument();
+ });
+
+ test('falls back to generated partner field label when top value label missing', () => {
+ const dataWithPartnerField = {
+ ...mockData,
+ properties: {
+ ...mockData.properties,
+ partner_fields: {
+ ...mockData.properties.partner_fields,
+ climate_trace: [
+ {
+ value: { raw_value: 'Scope 2 emissions: 456' },
+ created_at: '2025-01-01T00:00:00Z',
+ updated_at: '2025-01-02T00:00:00Z',
+ contributor_name: 'Climate TRACE',
+ contributor_id: 1139,
+ is_from_claim: false,
+ is_verified: false,
+ field_name: 'climate_trace',
+ value_count: 1,
+ label: null,
+ source_by: null,
+ },
+ ],
+ },
+ },
+ };
+
+ const { getByText } = renderComponent({ data: dataWithPartnerField });
+
+ expect(getByText('Climate Trace')).toBeInTheDocument();
+ expect(getByText('Scope 2 emissions: 456')).toBeInTheDocument();
+ });
});
diff --git a/src/react/src/components/FacilityDetailsDetail.jsx b/src/react/src/components/FacilityDetailsDetail.jsx
index a15800835..008063ccc 100644
--- a/src/react/src/components/FacilityDetailsDetail.jsx
+++ b/src/react/src/components/FacilityDetailsDetail.jsx
@@ -33,6 +33,21 @@ const detailsStyles = theme =>
lineHeight: '17px',
paddingTop: theme.spacing.unit,
},
+ sourceText: {
+ overflowWrap: 'anywhere',
+ fontWeight: 500,
+ fontSize: '16px',
+ lineHeight: '19px',
+ paddingTop: theme.spacing.unit,
+ },
+ unitText: {
+ display: 'inline-block',
+ marginLeft: theme.spacing.unit,
+ fontWeight: 400,
+ fontSize: '18px',
+ lineHeight: '21px',
+ verticalAlign: 'baseline',
+ },
});
const CLAIM_EXPLANATORY_TEXT =
@@ -46,6 +61,8 @@ const FacilityDetailsDetail = ({
primary,
locationLabeled,
secondary,
+ sourceBy,
+ unit,
isVerified,
isFromClaim,
classes,
@@ -66,9 +83,17 @@ const FacilityDetailsDetail = ({
-
+
{primary || locationLabeled}
+ {unit ? {unit} : null}
+ {sourceBy ? (
+
+ ) : null}
{secondary ? (
{secondary}
diff --git a/src/react/src/components/FacilityDetailsGeneralFields.jsx b/src/react/src/components/FacilityDetailsGeneralFields.jsx
index 11d7448f5..168e7eb1f 100644
--- a/src/react/src/components/FacilityDetailsGeneralFields.jsx
+++ b/src/react/src/components/FacilityDetailsGeneralFields.jsx
@@ -151,7 +151,7 @@ const FacilityDetailsGeneralFields = ({
@@ -227,8 +227,8 @@ const FacilityDetailsGeneralFields = ({
diff --git a/src/react/src/components/FacilityDetailsItem.jsx b/src/react/src/components/FacilityDetailsItem.jsx
index 1213d77fc..57fb43aae 100644
--- a/src/react/src/components/FacilityDetailsItem.jsx
+++ b/src/react/src/components/FacilityDetailsItem.jsx
@@ -38,6 +38,8 @@ const FacilityDetailsItem = ({
lng,
locationLabeled,
secondary,
+ sourceBy,
+ unit,
classes,
embed,
isVerified,
@@ -60,6 +62,8 @@ const FacilityDetailsItem = ({
lng={lng}
locationLabeled={locationLabeled}
secondary={!embed ? secondary : null}
+ sourceBy={!embed ? sourceBy : null}
+ unit={!embed ? unit : null}
isVerified={isVerified}
isFromClaim={isFromClaim}
/>
@@ -93,6 +97,8 @@ const FacilityDetailsItem = ({
diff --git a/src/react/src/components/FacilityDetailsLocationFields.jsx b/src/react/src/components/FacilityDetailsLocationFields.jsx
index 2ef402c62..9453acd4e 100644
--- a/src/react/src/components/FacilityDetailsLocationFields.jsx
+++ b/src/react/src/components/FacilityDetailsLocationFields.jsx
@@ -73,8 +73,8 @@ const FacilityDetailsLocationFields = ({