From a51b15bf4fd354e31e8a71f0db6ed6d4526ca3c8 Mon Sep 17 00:00:00 2001 From: Roland Date: Sun, 4 Oct 2026 18:22:52 -0600 Subject: [PATCH] Solar: move the data attribution to the bottom of the page The full NASA POWER acknowledgment, license and changes now sit in a small "Data attribution" section at the end of the calculator, always visible, instead of behind a link under the location. The source line under the location points to it. Bumps wrolpi-help to match. Co-Authored-By: Claude Opus 5.5 --- .../components/calculators/SolarCalculator.js | 27 ++++++++++--------- .../calculators/SolarCalculator.test.js | 16 ++++++----- docker/help/wrolpi-help | 2 +- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/app/src/components/calculators/SolarCalculator.js b/app/src/components/calculators/SolarCalculator.js index 2b492e3b..011ce2e8 100644 --- a/app/src/components/calculators/SolarCalculator.js +++ b/app/src/components/calculators/SolarCalculator.js @@ -2,7 +2,6 @@ import React from "react"; import {useSearchParams} from "react-router"; import { Accordion, - Anchor, Button, Grid, Group, @@ -199,6 +198,17 @@ const compassLabel = azimuth => { // Small explanatory text at the top of a collapsed section. const Hint = ({children}) =>

{children}

; +// NASA POWER's requested acknowledgment, the license, and how WROLPi changed the data (CC BY 4.0). +function DataAttribution() { + return
+
Data attribution
+

{CLIMATOLOGY_ACKNOWLEDGMENT} {CLIMATOLOGY_DATA_REFERENCE}

+

License: {CLIMATOLOGY_LICENSE}

+

{CLIMATOLOGY_CHANGES}

+
; +} + const ESTIMATE_INFO = 'A typical-year estimate from monthly averages. Real years vary; expect roughly ±10–15% ' + 'over a year and more in any single month. Shading from trees and buildings is not modeled beyond the ' + 'Shading loss.'; @@ -216,7 +226,6 @@ const GEOLOCATION_ERRORS = { function LocationSection({get, set, s, climatology}) { const [locating, setLocating] = React.useState(false); - const [showAttribution, setShowAttribution] = React.useState(false); const [geoError, setGeoError] = React.useState(null); const latError = get('lat') && s.latitude === null ? 'Latitude must be between -90 and 90' : null; const lonError = get('lon') && s.longitude === null ? 'Longitude must be between -180 and 180' : null; @@ -248,17 +257,7 @@ function LocationSection({get, set, s, climatology}) { Enter your own monthly sunlight under "Use my own sunlight data" below. ; } else { - source = <> - Sunlight and temperature: {CLIMATOLOGY_SOURCE}.{' '} - setShowAttribution(!showAttribution)}> - Data attribution - - {showAttribution &&
-

{CLIMATOLOGY_ACKNOWLEDGMENT} {CLIMATOLOGY_DATA_REFERENCE}

-

License: {CLIMATOLOGY_LICENSE}

-

{CLIMATOLOGY_CHANGES}

-
} - ; + source = `Sunlight and temperature: ${CLIMATOLOGY_SOURCE}; see Data attribution at the bottom of the page.`; } return <> @@ -622,5 +621,7 @@ export function SolarCalculator() { + + ; } diff --git a/app/src/components/calculators/SolarCalculator.test.js b/app/src/components/calculators/SolarCalculator.test.js index 5eaf4b55..81837b09 100644 --- a/app/src/components/calculators/SolarCalculator.test.js +++ b/app/src/components/calculators/SolarCalculator.test.js @@ -122,14 +122,18 @@ describe('SolarCalculator', () => { expect(global.fetch).toHaveBeenCalledWith(expect.stringMatching(/\/data\/solar-climatology\.bin$/)); }); - test('the data attribution expands', async () => { + test('the data attribution is at the bottom of the page', async () => { renderWithProviders(, {route: DENVER}); await findEstimate(); - expect(screen.queryByText(/Prediction Of Worldwide Energy Resources/)).not.toBeInTheDocument(); - fireEvent.click(screen.getByRole('button', {name: 'Data attribution'})); - expect(screen.getByText(/Prediction Of Worldwide Energy Resources/)).toBeInTheDocument(); - expect(screen.getByText(/WROLPi modified the data/)).toBeInTheDocument(); - expect(screen.getByText(/CC BY 4\.0/, {selector: 'p'})).toBeInTheDocument(); + const heading = screen.getByRole('heading', {name: 'Data attribution'}); + const section = screen.getByRole('region', {name: 'Data attribution'}); + expect(within(section).getByText(/Prediction Of Worldwide Energy Resources/)).toBeInTheDocument(); + expect(within(section).getByText(/WROLPi modified the data/)).toBeInTheDocument(); + expect(within(section).getByText(/CC BY 4\.0/)).toBeInTheDocument(); + // After everything else, including the last Fine-tune section. + const lastControl = screen.getByText('Use my own sunlight data: off'); + expect(lastControl.compareDocumentPosition(heading) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy(); + expect(screen.getByText(/see Data attribution at the bottom of the page/)).toBeInTheDocument(); }); test('typing writes the URL and leaves defaults out', async () => { diff --git a/docker/help/wrolpi-help b/docker/help/wrolpi-help index 241ba003..e118fe46 160000 --- a/docker/help/wrolpi-help +++ b/docker/help/wrolpi-help @@ -1 +1 @@ -Subproject commit 241ba0032e3b571f1919b2b4f1905449fbd567ed +Subproject commit e118fe46c94a0f5f371b009ccc9d7fd14ca979df