From 253b50c817f30792ad7b6cbfc76dbfa093316409 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Fri, 17 Jan 2025 16:00:18 -0500 Subject: [PATCH 01/16] Added header to research purpose --- ui/src/app/pages/workspace/research-purpose.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/src/app/pages/workspace/research-purpose.tsx b/ui/src/app/pages/workspace/research-purpose.tsx index 9026afc0e22..08523b43fbc 100644 --- a/ui/src/app/pages/workspace/research-purpose.tsx +++ b/ui/src/app/pages/workspace/research-purpose.tsx @@ -32,7 +32,7 @@ const styles = reactStyles({ borderRadius: '23px', }, mainHeader: { - fontSize: '16px', + fontSize: '18px', fontWeight: 600, color: colors.primary, marginBottom: '0.75rem', @@ -100,7 +100,7 @@ export const ResearchPurpose = fp.flow( return (
- Primary purpose of project + Research Use Statement Questions
+
Primary purpose of project
{selectedResearchPurposeItems && selectedResearchPurposeItems.length > 0 && ( From e67bf54fc25fc2a44aeaba1e2d91ef76f8348891 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:01:52 -0500 Subject: [PATCH 02/16] Moved workspace edit text to a common location. --- ui/src/app/{pages/workspace => utils}/workspace-edit-text.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ui/src/app/{pages/workspace => utils}/workspace-edit-text.tsx (100%) diff --git a/ui/src/app/pages/workspace/workspace-edit-text.tsx b/ui/src/app/utils/workspace-edit-text.tsx similarity index 100% rename from ui/src/app/pages/workspace/workspace-edit-text.tsx rename to ui/src/app/utils/workspace-edit-text.tsx From 97599982307cdb50cd460fd4fee6df048cead730 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:02:53 -0500 Subject: [PATCH 03/16] Make a common research purpose component. --- .../components/research-purpose-section.tsx | 236 ++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 ui/src/app/components/research-purpose-section.tsx diff --git a/ui/src/app/components/research-purpose-section.tsx b/ui/src/app/components/research-purpose-section.tsx new file mode 100644 index 00000000000..fb26d0d47c2 --- /dev/null +++ b/ui/src/app/components/research-purpose-section.tsx @@ -0,0 +1,236 @@ +import * as React from 'react'; + +import { ResearchPurpose } from 'generated/fetch'; + +import colors, { colorWithWhiteness } from 'app/styles/colors'; +import { reactStyles } from 'app/utils'; +import { + getSelectedPopulations, + getSelectedResearchPurposeItems, +} from 'app/utils/research-purpose'; +// @ts-ignore +import { + aianResearchTypeMap, + disseminateFindings, + researchOutcomes, + researchPurposeQuestions, +} from 'app/utils/workspace-edit-text'; + +const styles = reactStyles({ + editIcon: { + marginTop: '0.15rem', + height: 22, + width: 22, + fill: colors.light, + backgroundColor: colors.accent, + padding: '5px', + borderRadius: '23px', + }, + mainHeader: { + fontSize: '18px', + fontWeight: 600, + color: colors.primary, + marginBottom: '0.75rem', + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + sectionContentContainer: { + marginLeft: '1.5rem', + }, + sectionHeader: { + fontSize: '16px', + fontWeight: 600, + color: colors.primary, + marginTop: '1.5rem', + }, + sectionItemWithBackground: { + padding: '10px', + backgroundColor: colors.white, + color: colors.primary, + marginLeft: '0.75rem', + borderRadius: '3px', + }, + sectionSubHeader: { + fontSize: '14px', + fontWeight: 600, + color: colors.primary, + marginTop: '0.75rem', + }, + sectionText: { + fontSize: '14px', + lineHeight: '24px', + color: colors.primary, + marginTop: '0.45rem', + }, + reviewPurposeReminder: { + marginTop: '0.45rem', + borderStyle: 'solid', + height: '3.75rem', + color: colors.primary, + alignItems: 'center', + justifyContent: 'center', + borderColor: colors.warning, + borderRadius: '0.6rem', + borderWidth: '0.15rem', + backgroundColor: colorWithWhiteness(colors.highlight, 0.7), + }, +}); + +interface Props { + researchPurpose: ResearchPurpose; +} + +export const ResearchPurposeSection = ({ researchPurpose }: Props) => { + const { + reasonForAllOfUs, + intendedStudy, + anticipatedFindings, + populationDetails, + scientificApproach, + disseminateResearchFindingList, + researchOutcomeList, + aianResearchType, + aianResearchDetails, + } = researchPurpose; + + const selectedResearchPurposeItems = getSelectedResearchPurposeItems( + researchPurpose, + true + ); + const selectedPrimaryPurposeItems = getSelectedResearchPurposeItems( + researchPurpose, + false + ); + + return ( +
+
Primary purpose of project
+
+ {selectedResearchPurposeItems && + selectedResearchPurposeItems.length > 0 && ( +
Research Purpose
+ )} + {selectedResearchPurposeItems.map((selectedResearchPurposeItem, i) => ( +
+
0 ? '1.5rem' : '0.45rem', + marginLeft: '1.5rem', + }} + > + {selectedResearchPurposeItem} +
+
+ ))} +
+
+ {selectedPrimaryPurposeItems.map((selectedPrimaryPurposeItem, i) => ( +
+
+ {selectedPrimaryPurposeItem} +
+
+ ))} +
+
Summary of research purpose
+
+ {/* Intended study section*/} +
+ {researchPurposeQuestions[2].header} +
+
+ {intendedStudy} +
+ + {/* Scientific approach section*/} +
+ {researchPurposeQuestions[3].header} +
+
+ {scientificApproach} +
+ + {/* Anticipated findings section*/} +
+ {researchPurposeQuestions[4].header} +
+
+ {anticipatedFindings} +
+
+ + {/* Findings section*/} +
Findings will be disseminated via:
+
+ {disseminateResearchFindingList.map((disseminateFinding, i) => ( +
+ { + disseminateFindings.find( + (finding) => finding.shortName === disseminateFinding + ).label + } +
+ ))} +
+ + {/* Outcomes section*/} +
+ Outcomes anticipated from the research: +
+
+ {researchOutcomeList.map((workspaceOutcome, i) => ( +
+ { + researchOutcomes.find( + (outcome) => outcome.shortName === workspaceOutcome + ).label + } +
+ ))} +
+ + {/* Underserved populations section*/} + {populationDetails.length > 0 && ( + +
Population of interest
+
+
+ {getSelectedPopulations(researchPurpose)} +
+
+
+ )} + + {/* AI/AN Research Approach section*/} +
AI/AN Research Approach
+
+
+ {researchPurposeQuestions[10].header} +
+
+ {aianResearchTypeMap.get(aianResearchType)} +
+
+ {researchPurposeQuestions[11].header} +
+
+ {aianResearchDetails} +
+
+
+ ); +}; From fab9da3ae6cb05985968bc562176b457a2b3de96 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:04:56 -0500 Subject: [PATCH 04/16] Have admin page use common research purpose component. --- .../pages/admin/workspace/admin-workspace.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/src/app/pages/admin/workspace/admin-workspace.tsx b/ui/src/app/pages/admin/workspace/admin-workspace.tsx index 10880c2e1a0..0f00c99fb5d 100644 --- a/ui/src/app/pages/admin/workspace/admin-workspace.tsx +++ b/ui/src/app/pages/admin/workspace/admin-workspace.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import { RouteComponentProps, withRouter } from 'react-router-dom'; +import { Accordion, AccordionTab } from 'primereact/accordion'; import { AdminRuntimeFields, @@ -10,6 +11,7 @@ import { } from 'generated/fetch'; import { Error as ErrorDiv } from 'app/components/inputs'; +import { ResearchPurposeSection } from 'app/components/research-purpose-section'; import { SpinnerOverlay } from 'app/components/spinners'; import { WithSpinnerOverlayProps } from 'app/components/with-spinner-overlay'; import { EgressEventsTable } from 'app/pages/admin/egress-events-table'; @@ -29,7 +31,6 @@ import { CloudStorageObjects } from './cloud-storage-objects'; import { CloudStorageTrafficChart } from './cloud-storage-traffic-chart'; import { CohortBuilder } from './cohort-builder'; import { Collaborators } from './collaborators'; -import { ResearchPurposeSection } from './research-purpose-section'; interface Props extends WithSpinnerOverlayProps, @@ -150,7 +151,18 @@ export class AdminWorkspaceImpl extends React.Component { {...{ workspace, activeStatus }} reload={async () => await this.populateWorkspaceDetails()} /> - + + ({ + style: { backgroundColor: 'pink' }, + }), + }} + > + + + {activeStatus === WorkspaceActiveStatus.ACTIVE && ( <> Date: Tue, 21 Jan 2025 10:05:53 -0500 Subject: [PATCH 05/16] Add styles necessary for admin research purpose section. --- ui/src/styles.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ui/src/styles.css b/ui/src/styles.css index da85bcf7e3d..5c9940ae396 100644 --- a/ui/src/styles.css +++ b/ui/src/styles.css @@ -353,6 +353,21 @@ form .form-block > label, color: #262262 !important } +.p-accordion-header-link { + border: 1px solid #c8c8c8 !important; + background: transparent !important; + box-shadow: none !important; + color: rgb(38, 34, 98) !important; +} + +.p-accordion-content { + background: transparent !important; +} + +.p-accordion .p-accordion-header .p-accordion-header-link { + font-weight: 400 !important; +} + .hover-style:hover { --hover-backgroundColor: var(--app-hover-backgroundColor); --hover-border: var(--app-hover-border); From 600736f0cb5900e541fbbd89b18f1cce11fbf66e Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:06:28 -0500 Subject: [PATCH 06/16] Delete unused admin research purpose section. --- .../workspace/research-purpose-section.tsx | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 ui/src/app/pages/admin/workspace/research-purpose-section.tsx diff --git a/ui/src/app/pages/admin/workspace/research-purpose-section.tsx b/ui/src/app/pages/admin/workspace/research-purpose-section.tsx deleted file mode 100644 index 86b561f3f36..00000000000 --- a/ui/src/app/pages/admin/workspace/research-purpose-section.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import * as React from 'react'; - -import { ResearchPurpose } from 'generated/fetch'; - -import { - getSelectedPopulations, - getSelectedPrimaryPurposeItems, -} from 'app/utils/research-purpose'; - -import { WorkspaceInfoField } from './workspace-info-field'; - -interface Props { - researchPurpose: ResearchPurpose; -} - -export const ResearchPurposeSection = ({ researchPurpose }: Props) => { - const { - reasonForAllOfUs, - intendedStudy, - anticipatedFindings, - populationDetails, - } = researchPurpose; - return ( - <> -

Research Purpose

-
- - {getSelectedPrimaryPurposeItems(researchPurpose).map( - (researchPurposeItem, i) => ( -
{researchPurposeItem}
- ) - )} -
- - {reasonForAllOfUs} - - - {intendedStudy} - - - {anticipatedFindings} - - {populationDetails.length > 0 && ( - - {getSelectedPopulations(researchPurpose)} - - )} -
- - ); -}; From e349b3632c1318b79fa25524defb42be089e93f5 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:08:02 -0500 Subject: [PATCH 07/16] Update imports --- ui/src/app/utils/research-purpose.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/app/utils/research-purpose.tsx b/ui/src/app/utils/research-purpose.tsx index 3f01256b261..f389139efef 100644 --- a/ui/src/app/utils/research-purpose.tsx +++ b/ui/src/app/utils/research-purpose.tsx @@ -3,13 +3,13 @@ import * as fp from 'lodash/fp'; import { ResearchPurpose, SpecificPopulationEnum } from 'generated/fetch'; +import colors from 'app/styles/colors'; import { PrimaryPurposeItems, ResearchPurposeItem, ResearchPurposeItems, SpecificPopulationItems, -} from 'app/pages/workspace/workspace-edit-text'; -import colors from 'app/styles/colors'; +} from 'app/utils/workspace-edit-text'; const styles = { researchPurposeItemHeader: { From 3aa4176e52e9c102655e378c423b3c8fa1577a33 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:09:03 -0500 Subject: [PATCH 08/16] Update imports --- ui/src/app/pages/workspace/workspace-about.spec.tsx | 2 +- ui/src/app/pages/workspace/workspace-edit.spec.tsx | 3 +-- ui/src/app/pages/workspace/workspace-research-summary.tsx | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ui/src/app/pages/workspace/workspace-about.spec.tsx b/ui/src/app/pages/workspace/workspace-about.spec.tsx index 10e572954a2..f8b72c68ccd 100644 --- a/ui/src/app/pages/workspace/workspace-about.spec.tsx +++ b/ui/src/app/pages/workspace/workspace-about.spec.tsx @@ -19,6 +19,7 @@ import { profileStore, serverConfigStore, } from 'app/utils/stores'; +import { SpecificPopulationItems } from 'app/utils/workspace-edit-text'; import { expectButtonElementDisabled, @@ -45,7 +46,6 @@ import { import { WorkspacesApiStub } from 'testing/stubs/workspaces-api-stub'; import { WorkspaceAbout } from './workspace-about'; -import { SpecificPopulationItems } from './workspace-edit-text'; describe('WorkspaceAbout', () => { const profile = ProfileStubVariables.PROFILE_STUB; diff --git a/ui/src/app/pages/workspace/workspace-edit.spec.tsx b/ui/src/app/pages/workspace/workspace-edit.spec.tsx index 080626c0044..0f8d22f98a1 100644 --- a/ui/src/app/pages/workspace/workspace-edit.spec.tsx +++ b/ui/src/app/pages/workspace/workspace-edit.spec.tsx @@ -38,6 +38,7 @@ import { serverConfigStore, } from 'app/utils/stores'; import { WorkspaceData } from 'app/utils/workspace-data'; +import { aianResearchTypeMap } from 'app/utils/workspace-edit-text'; import defaultServerConfig from 'testing/default-server-config'; import { @@ -59,8 +60,6 @@ import { UserApiStub } from 'testing/stubs/user-api-stub'; import { workspaceStubs } from 'testing/stubs/workspaces'; import { WorkspacesApiStub } from 'testing/stubs/workspaces-api-stub'; -import { aianResearchTypeMap } from './workspace-edit-text'; - jest.mock('app/utils/project-billing-info', () => ({ getBillingAccountInfo: () => new Promise((resolve) => diff --git a/ui/src/app/pages/workspace/workspace-research-summary.tsx b/ui/src/app/pages/workspace/workspace-research-summary.tsx index 32a5bc01a86..0cbe542bd64 100644 --- a/ui/src/app/pages/workspace/workspace-research-summary.tsx +++ b/ui/src/app/pages/workspace/workspace-research-summary.tsx @@ -2,9 +2,9 @@ import * as React from 'react'; import { TextAreaWithLengthValidationMessage } from 'app/components/inputs'; import { NOT_ENOUGH_CHARACTERS_RESEARCH_DESCRIPTION } from 'app/utils/strings'; +import { ResearchPurposeQuestion } from 'app/utils/workspace-edit-text'; import { WorkspaceEditSection } from './workspace-edit-section'; -import { ResearchPurposeQuestion } from './workspace-edit-text'; interface Props { id: string; From 244cf342b454cad9a8eda6b11f42c95d1d2a1d6b Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:09:22 -0500 Subject: [PATCH 09/16] Update imports --- ui/src/app/pages/workspace/workspace-edit.tsx | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/ui/src/app/pages/workspace/workspace-edit.tsx b/ui/src/app/pages/workspace/workspace-edit.tsx index 0d24334293e..ab710667f36 100644 --- a/ui/src/app/pages/workspace/workspace-edit.tsx +++ b/ui/src/app/pages/workspace/workspace-edit.tsx @@ -45,24 +45,6 @@ import { AoU, AouTitle } from 'app/components/text-wrappers'; import { WithSpinnerOverlayProps } from 'app/components/with-spinner-overlay'; import { CreateBillingAccountModal } from 'app/pages/workspace/create-billing-account-modal'; import { WorkspaceEditSection } from 'app/pages/workspace/workspace-edit-section'; -import { - aianResearchTypeMap, - disseminateFindings, - PrimaryPurposeItems, - RequestForReviewFooter, - researchOutcomes, - ResearchPurposeDescription, - ResearchPurposeItem, - ResearchPurposeItems, - researchPurposeQuestions, - SpecificPopulationItem, - SpecificPopulationItems, - toolTipText, - tooltipTextBillingWarning, - toolTipTextDemographic, - toolTipTextDucc, - toolTipTextStigmatization, -} from 'app/pages/workspace/workspace-edit-text'; import { WorkspaceResearchSummary } from 'app/pages/workspace/workspace-research-summary'; import { userApi, workspacesApi } from 'app/services/swagger-fetch-clients'; import colors, { colorWithWhiteness } from 'app/styles/colors'; @@ -102,6 +84,24 @@ import { serverConfigStore } from 'app/utils/stores'; import { delay } from 'app/utils/subscribable'; import { withNavigation } from 'app/utils/with-navigation-hoc'; import { WorkspaceData } from 'app/utils/workspace-data'; +import { + aianResearchTypeMap, + disseminateFindings, + PrimaryPurposeItems, + RequestForReviewFooter, + researchOutcomes, + ResearchPurposeDescription, + ResearchPurposeItem, + ResearchPurposeItems, + researchPurposeQuestions, + SpecificPopulationItem, + SpecificPopulationItems, + toolTipText, + tooltipTextBillingWarning, + toolTipTextDemographic, + toolTipTextDucc, + toolTipTextStigmatization, +} from 'app/utils/workspace-edit-text'; import { supportUrls } from 'app/utils/zendesk'; import { OldCdrVersionModal } from './old-cdr-version-modal'; From 577687bb8b6f98be0dfc9718646a6d3a1a5354ab Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 10:10:14 -0500 Subject: [PATCH 10/16] Have workspace about page utilize common research purpose component. --- .../app/pages/workspace/research-purpose.tsx | 158 +----------------- 1 file changed, 6 insertions(+), 152 deletions(-) diff --git a/ui/src/app/pages/workspace/research-purpose.tsx b/ui/src/app/pages/workspace/research-purpose.tsx index 08523b43fbc..da96f1977a4 100644 --- a/ui/src/app/pages/workspace/research-purpose.tsx +++ b/ui/src/app/pages/workspace/research-purpose.tsx @@ -3,20 +3,12 @@ import * as fp from 'lodash/fp'; import { Clickable } from 'app/components/buttons'; import { FadeBox } from 'app/components/containers'; +import { FlexRow } from 'app/components/flex'; +import { ResearchPurposeSection } from 'app/components/research-purpose-section'; import { EditComponentReact } from 'app/icons/edit'; -import { - aianResearchTypeMap, - disseminateFindings, - researchOutcomes, - researchPurposeQuestions, -} from 'app/pages/workspace/workspace-edit-text'; import colors, { colorWithWhiteness } from 'app/styles/colors'; import { reactStyles, withCurrentWorkspace } from 'app/utils'; import { useNavigation } from 'app/utils/navigation'; -import { - getSelectedPopulations, - getSelectedResearchPurposeItems, -} from 'app/utils/research-purpose'; import { withNavigation } from 'app/utils/with-navigation-hoc'; import { WorkspaceData } from 'app/utils/workspace-data'; import { WorkspacePermissionsUtil } from 'app/utils/workspace-permissions'; @@ -35,7 +27,6 @@ const styles = reactStyles({ fontSize: '18px', fontWeight: 600, color: colors.primary, - marginBottom: '0.75rem', display: 'flex', flexDirection: 'row', alignItems: 'center', @@ -88,19 +79,11 @@ export const ResearchPurpose = fp.flow( )(({ workspace }: { workspace: WorkspaceData }) => { const [navigate] = useNavigation(); const isOwner = WorkspacePermissionsUtil.isOwner(workspace.accessLevel); - const selectedResearchPurposeItems = getSelectedResearchPurposeItems( - workspace.researchPurpose, - true - ); - const selectedPrimaryPurposeItems = getSelectedResearchPurposeItems( - workspace.researchPurpose, - false - ); return ( -
- Research Use Statement Questions + +
Research Use Statement Questions
-
-
Primary purpose of project
-
- {selectedResearchPurposeItems && - selectedResearchPurposeItems.length > 0 && ( -
Research Purpose
- )} - {selectedResearchPurposeItems.map((selectedResearchPurposeItem, i) => ( -
-
0 ? '1.5rem' : '0.45rem', - marginLeft: '1.5rem', - }} - > - {selectedResearchPurposeItem} -
-
- ))} -
-
- {selectedPrimaryPurposeItems.map((selectedPrimaryPurposeItem, i) => ( -
-
- {selectedPrimaryPurposeItem} -
-
- ))} -
-
Summary of research purpose
-
- {/* Intended study section*/} -
- {researchPurposeQuestions[2].header} -
-
- {workspace.researchPurpose.intendedStudy} -
- - {/* Scientific approach section*/} -
- {researchPurposeQuestions[3].header} -
-
- {workspace.researchPurpose.scientificApproach} -
- - {/* Anticipated findings section*/} -
- {researchPurposeQuestions[4].header} -
-
- {workspace.researchPurpose.anticipatedFindings} -
-
- - {/* Findings section*/} -
Findings will be disseminated via:
-
- {workspace.researchPurpose.disseminateResearchFindingList.map( - (disseminateFinding, i) => ( -
- { - disseminateFindings.find( - (finding) => finding.shortName === disseminateFinding - ).label - } -
- ) - )} -
- - {/* Outcomes section*/} -
- Outcomes anticipated from the research: -
-
- {workspace.researchPurpose.researchOutcomeList.map( - (workspaceOutcome, i) => ( -
- { - researchOutcomes.find( - (outcome) => outcome.shortName === workspaceOutcome - ).label - } -
- ) - )} -
- - {/* Underserved populations section*/} - {workspace.researchPurpose.populationDetails.length > 0 && ( - -
Population of interest
-
-
- {getSelectedPopulations(workspace.researchPurpose)} -
-
-
- )} - - {/* AI/AN Research Approach section*/} -
AI/AN Research Approach
-
-
- {researchPurposeQuestions[10].header} -
-
- {aianResearchTypeMap.get(workspace.researchPurpose.aianResearchType)} -
-
- {researchPurposeQuestions[11].header} -
-
- {workspace.researchPurpose.aianResearchDetails} -
-
+ +
); }); From 1fb2bbf58bcf79c4e71fcd15fbb21ef6860259da Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 11:04:44 -0500 Subject: [PATCH 11/16] Add transparency --- ui/src/app/components/research-purpose-section.tsx | 2 +- ui/src/app/utils/research-purpose.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/app/components/research-purpose-section.tsx b/ui/src/app/components/research-purpose-section.tsx index fb26d0d47c2..8339f4dd134 100644 --- a/ui/src/app/components/research-purpose-section.tsx +++ b/ui/src/app/components/research-purpose-section.tsx @@ -46,7 +46,7 @@ const styles = reactStyles({ }, sectionItemWithBackground: { padding: '10px', - backgroundColor: colors.white, + backgroundColor: 'transparent', color: colors.primary, marginLeft: '0.75rem', borderRadius: '3px', diff --git a/ui/src/app/utils/research-purpose.tsx b/ui/src/app/utils/research-purpose.tsx index f389139efef..2cbfc79e912 100644 --- a/ui/src/app/utils/research-purpose.tsx +++ b/ui/src/app/utils/research-purpose.tsx @@ -25,7 +25,7 @@ const styles = { }, sectionItemWithBackground: { padding: '10px', - backgroundColor: colors.white, + backgroundColor: 'transparent', color: colors.primary, marginLeft: '0.75rem', borderRadius: '3px', From 0577b5eb6a0ffdbc59fcddc6655efab48d8d74d9 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 11:05:53 -0500 Subject: [PATCH 12/16] Cleanup --- ui/src/app/components/research-purpose-section.tsx | 1 - ui/src/app/pages/admin/workspace/admin-workspace.tsx | 9 +-------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/ui/src/app/components/research-purpose-section.tsx b/ui/src/app/components/research-purpose-section.tsx index 8339f4dd134..fee227ec4e0 100644 --- a/ui/src/app/components/research-purpose-section.tsx +++ b/ui/src/app/components/research-purpose-section.tsx @@ -83,7 +83,6 @@ interface Props { export const ResearchPurposeSection = ({ researchPurpose }: Props) => { const { - reasonForAllOfUs, intendedStudy, anticipatedFindings, populationDetails, diff --git a/ui/src/app/pages/admin/workspace/admin-workspace.tsx b/ui/src/app/pages/admin/workspace/admin-workspace.tsx index 0f00c99fb5d..be0acb0573c 100644 --- a/ui/src/app/pages/admin/workspace/admin-workspace.tsx +++ b/ui/src/app/pages/admin/workspace/admin-workspace.tsx @@ -152,14 +152,7 @@ export class AdminWorkspaceImpl extends React.Component { reload={async () => await this.populateWorkspaceDetails()} /> - ({ - style: { backgroundColor: 'pink' }, - }), - }} - > + From 454446631517b3c868265187f92deda58424ce4e Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 11:14:49 -0500 Subject: [PATCH 13/16] Remove old ts ignore --- ui/src/app/components/research-purpose-section.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/app/components/research-purpose-section.tsx b/ui/src/app/components/research-purpose-section.tsx index fee227ec4e0..5e449cc9cf8 100644 --- a/ui/src/app/components/research-purpose-section.tsx +++ b/ui/src/app/components/research-purpose-section.tsx @@ -8,7 +8,6 @@ import { getSelectedPopulations, getSelectedResearchPurposeItems, } from 'app/utils/research-purpose'; -// @ts-ignore import { aianResearchTypeMap, disseminateFindings, From eaa767a710c906bb15371ad31f8255a2151f2d0a Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 16:22:52 -0500 Subject: [PATCH 14/16] Split out research purpose and workspace-edit text files. --- .../components/research-purpose-section.tsx | 2 +- .../pages/workspace/workspace-about.spec.tsx | 2 +- .../workspace}/workspace-edit-text.tsx | 0 .../pages/workspace/workspace-edit.spec.tsx | 2 +- ui/src/app/pages/workspace/workspace-edit.tsx | 23 +- .../workspace/workspace-research-summary.tsx | 2 +- ui/src/app/utils/research-purpose-text.tsx | 626 ++++++++++++++++++ ui/src/app/utils/research-purpose.tsx | 2 +- 8 files changed, 643 insertions(+), 16 deletions(-) rename ui/src/app/{utils => pages/workspace}/workspace-edit-text.tsx (100%) create mode 100644 ui/src/app/utils/research-purpose-text.tsx diff --git a/ui/src/app/components/research-purpose-section.tsx b/ui/src/app/components/research-purpose-section.tsx index 5e449cc9cf8..18f59677779 100644 --- a/ui/src/app/components/research-purpose-section.tsx +++ b/ui/src/app/components/research-purpose-section.tsx @@ -13,7 +13,7 @@ import { disseminateFindings, researchOutcomes, researchPurposeQuestions, -} from 'app/utils/workspace-edit-text'; +} from 'app/utils/research-purpose-text'; const styles = reactStyles({ editIcon: { diff --git a/ui/src/app/pages/workspace/workspace-about.spec.tsx b/ui/src/app/pages/workspace/workspace-about.spec.tsx index f8b72c68ccd..445c858b88d 100644 --- a/ui/src/app/pages/workspace/workspace-about.spec.tsx +++ b/ui/src/app/pages/workspace/workspace-about.spec.tsx @@ -14,12 +14,12 @@ import userEvent from '@testing-library/user-event'; import { registerApiClient } from 'app/services/swagger-fetch-clients'; import { nowPlusDays } from 'app/utils/dates'; import { currentWorkspaceStore } from 'app/utils/navigation'; +import { SpecificPopulationItems } from 'app/utils/research-purpose-text'; import { cdrVersionStore, profileStore, serverConfigStore, } from 'app/utils/stores'; -import { SpecificPopulationItems } from 'app/utils/workspace-edit-text'; import { expectButtonElementDisabled, diff --git a/ui/src/app/utils/workspace-edit-text.tsx b/ui/src/app/pages/workspace/workspace-edit-text.tsx similarity index 100% rename from ui/src/app/utils/workspace-edit-text.tsx rename to ui/src/app/pages/workspace/workspace-edit-text.tsx diff --git a/ui/src/app/pages/workspace/workspace-edit.spec.tsx b/ui/src/app/pages/workspace/workspace-edit.spec.tsx index 0f8d22f98a1..d83c37b53ae 100644 --- a/ui/src/app/pages/workspace/workspace-edit.spec.tsx +++ b/ui/src/app/pages/workspace/workspace-edit.spec.tsx @@ -32,13 +32,13 @@ import colors from 'app/styles/colors'; import { AccessTierShortNames } from 'app/utils/access-tiers'; import * as Authentication from 'app/utils/authentication'; import { currentWorkspaceStore } from 'app/utils/navigation'; +import { aianResearchTypeMap } from 'app/utils/research-purpose-text'; import { cdrVersionStore, profileStore, serverConfigStore, } from 'app/utils/stores'; import { WorkspaceData } from 'app/utils/workspace-data'; -import { aianResearchTypeMap } from 'app/utils/workspace-edit-text'; import defaultServerConfig from 'testing/default-server-config'; import { diff --git a/ui/src/app/pages/workspace/workspace-edit.tsx b/ui/src/app/pages/workspace/workspace-edit.tsx index ab710667f36..bca39168746 100644 --- a/ui/src/app/pages/workspace/workspace-edit.tsx +++ b/ui/src/app/pages/workspace/workspace-edit.tsx @@ -45,6 +45,13 @@ import { AoU, AouTitle } from 'app/components/text-wrappers'; import { WithSpinnerOverlayProps } from 'app/components/with-spinner-overlay'; import { CreateBillingAccountModal } from 'app/pages/workspace/create-billing-account-modal'; import { WorkspaceEditSection } from 'app/pages/workspace/workspace-edit-section'; +import { + toolTipText, + tooltipTextBillingWarning, + toolTipTextDemographic, + toolTipTextDucc, + toolTipTextStigmatization, +} from 'app/pages/workspace/workspace-edit-text'; import { WorkspaceResearchSummary } from 'app/pages/workspace/workspace-research-summary'; import { userApi, workspacesApi } from 'app/services/swagger-fetch-clients'; import colors, { colorWithWhiteness } from 'app/styles/colors'; @@ -80,15 +87,10 @@ import { getBillingAccountInfo, GoogleBillingAccountInfo, } from 'app/utils/project-billing-info'; -import { serverConfigStore } from 'app/utils/stores'; -import { delay } from 'app/utils/subscribable'; -import { withNavigation } from 'app/utils/with-navigation-hoc'; -import { WorkspaceData } from 'app/utils/workspace-data'; import { aianResearchTypeMap, disseminateFindings, PrimaryPurposeItems, - RequestForReviewFooter, researchOutcomes, ResearchPurposeDescription, ResearchPurposeItem, @@ -96,12 +98,11 @@ import { researchPurposeQuestions, SpecificPopulationItem, SpecificPopulationItems, - toolTipText, - tooltipTextBillingWarning, - toolTipTextDemographic, - toolTipTextDucc, - toolTipTextStigmatization, -} from 'app/utils/workspace-edit-text'; +} from 'app/utils/research-purpose-text'; +import { serverConfigStore } from 'app/utils/stores'; +import { delay } from 'app/utils/subscribable'; +import { withNavigation } from 'app/utils/with-navigation-hoc'; +import { WorkspaceData } from 'app/utils/workspace-data'; import { supportUrls } from 'app/utils/zendesk'; import { OldCdrVersionModal } from './old-cdr-version-modal'; diff --git a/ui/src/app/pages/workspace/workspace-research-summary.tsx b/ui/src/app/pages/workspace/workspace-research-summary.tsx index 0cbe542bd64..2e381b3eec4 100644 --- a/ui/src/app/pages/workspace/workspace-research-summary.tsx +++ b/ui/src/app/pages/workspace/workspace-research-summary.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import { TextAreaWithLengthValidationMessage } from 'app/components/inputs'; +import { ResearchPurposeQuestion } from 'app/utils/research-purpose-text'; import { NOT_ENOUGH_CHARACTERS_RESEARCH_DESCRIPTION } from 'app/utils/strings'; -import { ResearchPurposeQuestion } from 'app/utils/workspace-edit-text'; import { WorkspaceEditSection } from './workspace-edit-section'; diff --git a/ui/src/app/utils/research-purpose-text.tsx b/ui/src/app/utils/research-purpose-text.tsx new file mode 100644 index 00000000000..6a3841b8aa2 --- /dev/null +++ b/ui/src/app/utils/research-purpose-text.tsx @@ -0,0 +1,626 @@ +import * as React from 'react'; +import * as fp from 'lodash/fp'; + +import { + AIANResearchType, + DisseminateResearchEnum, + ResearchOutcomeEnum, + SpecificPopulationEnum, +} from 'generated/fetch'; + +import { StyledExternalLink } from 'app/components/buttons'; +import { TooltipTrigger } from 'app/components/popups'; +import { AoU, AouTitle } from 'app/components/text-wrappers'; +import colors from 'app/styles/colors'; + +export const ResearchPurposeDescription = ( +
+ The requires each data user of the data to provide a + meaningful description of the intended purpose of data use for each + workspace they create. To provide transparency to participants, +  your answers below will be made available publicly in the{' '} + + Research Hub Directory{' '} + {' '} + on our public website.{' '} + Your responses will not be used to make decisions about data access. +
+ + Note that you are required to create separate workspaces for each project + for which you access{' '} + {' '} + All of Us{' '} + + data, hence the responses below are expected to be specific to the project + for which you are creating this particular workspace. + +
+); + +export interface ResearchPurposeItem { + shortName: string; + shortDescription: string; + longDescription: React.ReactNode; + uniqueId?: string; +} + +export const ResearchPurposeItems: Array = [ + { + shortName: 'diseaseFocusedResearch', + shortDescription: 'Disease-focused research', + longDescription: ( +
+ The primary purpose of the research is to learn more about a particular + disease or disorder (e.g. type 2 diabetes), a trait (e.g. blood + pressure), or a set of related conditions (e.g. autoimmune diseases, + psychiatric disorders). +
+ ), + }, + { + shortName: 'methodsDevelopment', + shortDescription: 'Methods development/validation study', + longDescription: ( +
+ The primary purpose of the use of data is to develop and/or + validate specific methods/tools for analyzing or interpreting data (e.g. + statistical methods for describing data trends, developing more powerful + methods to detect gene-environment, or other types of interactions in + genome-wide association studies). +
+ ), + }, + { + shortName: 'controlSet', + shortDescription: 'Research Control', + longDescription: ( +
+ data will be used as a reference or control dataset for + comparison with another dataset from a different resource (e.g. + Case-control studies). +
+ ), + }, + { + shortName: 'ancestry', + shortDescription: 'Genetic Research', + longDescription: ( +
+ Research concerning genetics (i.e. the study of genes, genetic + variations, and heredity) in the context of diseases or ancestry. +
+ ), + }, + { + shortName: 'socialBehavioral', + shortDescription: 'Social/Behavioral Research', + longDescription: ( +
+ The research focuses on the social or behavioral phenomena or + determinants of health. +
+ ), + }, + { + shortName: 'populationHealth', + shortDescription: 'Population Health/Public Health Research', + longDescription: ( +
+ The primary purpose of using data is to investigate health + behaviors, outcomes, access, and disparities in populations. +
+ ), + }, + { + shortName: 'ethics', + shortDescription: 'Ethical, Legal, and Social Implications (ELSI) Research', + longDescription: ( +
+ This research focuses on ethical, legal, and social implications (ELSI) + of or related to design, conduct, and translation of research. +
+ ), + }, + { + shortName: 'drugDevelopment', + shortDescription: 'Drug/Therapeutics Development Research', + longDescription: ( +
+ The primary focus of the research is drug/therapeutics development. The + data will be used to understand treatment-gene interactions or treatment + outcomes relevant to the therapeutic(s) of interest. +
+ ), + }, +]; +ResearchPurposeItems.forEach((item) => { + item.uniqueId = fp.uniqueId('research-purpose'); +}); + +export const PrimaryPurposeItems: Array = [ + { + shortName: 'educational', + shortDescription: 'Educational Purpose', + uniqueId: 'education-purpose', + longDescription: ( +
+ The data will be used for education purposes (e.g. for a college + research methods course, to educate students on population-based + research approaches). +
+ ), + }, + { + shortName: 'commercialPurpose', + shortDescription: 'For-Profit Purpose', + longDescription: ( +
+ The data will be used by a for-profit entity for research or product or + service development (e.g. for understanding drug responses as part of a + pharmaceutical company's drug development or market research efforts). +
+ ), + }, + { + shortName: 'otherPurpose', + shortDescription: 'Other Purpose', + uniqueId: 'other-purpose', + longDescription: ( +
+ If your purpose of use is different from the options listed above, + please select "Other Purpose" and provide details regarding your purpose + of data use here (500 character limit). +
+ ), + }, +]; + +export interface ResearchPurposeQuestion { + header: React.ReactNode; + description: React.ReactNode; +} + +export const researchPurposeQuestions: Array = [ + { + header: ' What is the primary purpose of your project?', + description: '', + }, + { + header: ( +
+ {' '} + Please provide a summary of your research purpose by responding to the + questions below. +
+ ), + description: ( +
+ Your responses should cover the major components of a research summary: + hypothesis, methods, and anticipated findings. Therefore, please provide + sufficiently detailed responses in plain language (without jargon), + using as few technical terms as possible.{' '} +
+ ), + }, + { + header: + 'What are the specific scientific question(s) you intend to study, and why is the ' + + 'question important (i.e. relevance to science or public health)? \n', + description: ( +
+ If you are exploring the data at this stage to formalize a specific + research question, please describe the reason for exploring the data, + and the scientific question you hope to be able to answer using the + data.
+ (Free text; 1000 character limit) +
+ ), + }, + { + header: + 'What are the scientific approaches you plan to use for your study? Describe the ' + + 'datasets, research methods, and tools you will use to answer your scientific question(s). \n', + description:
(Free text; 1000 character limit)
, + }, + { + header: + 'What are the anticipated findings from the study? How would your findings ' + + 'contribute to the body of scientific knowledge in the field?', + description:
(Free text; 1000 character limit)
, + }, + { + header: ( +
+ The Research Program encourages researchers to disseminate their + research findings to both scientific and lay/community audiences, to + maximize the value of the resource and to recognize the contributions of + participant partners. Please tell us how you plan to disseminate your + research findings. Choose as many options below as applicable, and + specify details in the text box, if available.{' '} +
+ ), + description: '', + }, + { + header: ( +
+ The Research Program would like to understand how (or if) your + research outcome may fit into the Research Program Scientific + Framework. Please select all of the statements below that describe the + outcomes you anticipate from your research. +
+ ), + description: '', + }, + { + header: 'Population of interest', + description: ( +
+ A primary aim of is to engage communities that have been + historically underrepresented in biomedical research. The next set of + questions is designed to help us assess how well we are serving + underrepresented communities—and to protect against potentially + stigmatizing research findings, to which these groups are more + vulnerable. supports well-designed and responsible research that + addresses questions relevant to underrepresented communities, as well as + research that compares different groups and populations. At the same + time, we recognize that research with underrepresented populations can + unintentionally result in harm, including the exacerbation of stigma. We + encourage researchers to consider whether their research design, + methods, and analyses could potentially cause harm to individuals, + groups, and communities. +
+ ), + }, + { + header: 'Request for Review of Research Purpose Description', + description: ( + +
+ Any research that focuses on certain population characteristics or +
+ +
+ {' '} + uses demographic variables{' '} +
+
+
+ in analyses can result, often unintentionally, in findings that may be + misinterpreted or misused by others to foster stigma. While it may not + be possible to completely prevent misuse of research for stigmatizing + purposes, data users can take important steps to minimize the risk of + this happening–taking this step is a condition of your +
+ +
Data User Code of Conduct agreement.
+
+
+ If you are concerned that your research could inadvertently stigmatize + participants or communities, or if you are unsure, let us know. We + encourage you to request a review of your research purpose statement + by the All of Us Resource Access Board (RAB) as a precaution. + The RAB will provide feedback and, if needed, guidance for modifying + your research purpose or scope.To learn more, please refer to the{' '} + All of Us + Stigmatizing Research Policy.If you request a review, you can expect + to receive an initial response within five business days. During the + RAB’s review, you may begin working in your workspace. +
+
+ ), + }, + { + header: ( +
+ has a{' '} + + {' '} + policy on respectful research involving American Indian and Alaska + Native (AI/AN) populations + + . The following questions are intended to assess the relevance of the + policy to your research. +
+ ), + description: '', + }, + { + header: + 'Does your research plan require any of the following with respect to individuals who ' + + 'self-identify as American Indian or Alaska Native (AI/AN) or who are genetically similar to ' + + 'populations with inferred Indigenous American genetic ancestry? Select the option that ' + + 'best describes your plans.', + description: '', + }, + { + header: + 'Please explain your response by sharing specific details about your study design.', + description:
(Free text; 1000 character limit)
, + }, +]; + +export interface SpecificPopulationItem { + label: string; + shortName: SpecificPopulationEnum; + ubrLabel: string; + ubrDescription: string; + subCategory: Array<{ label: string; shortName: SpecificPopulationEnum }>; +} + +export const SpecificPopulationItems: Array = [ + { + label: 'Race/Ethnicity', + shortName: SpecificPopulationEnum.RACE_ETHNICITY, + ubrLabel: 'Ancestry (Race/Ethnicity)', + ubrDescription: + 'American Indian and Alaska Native (AIAN); Black, African American, or ' + + 'African; Middle Eastern or North African (MENA); Native Hawaiian or Other Pacific ' + + 'Islander (NHPI); Hispanic, Latino, or Spanish (H/L/S); Multi-Ancestry (2+ Races)', + subCategory: [ + { label: 'Asian', shortName: SpecificPopulationEnum.RACE_ASIAN }, + { + label: 'Black, African, or African American', + shortName: SpecificPopulationEnum.RACE_AA, + }, + { + label: 'Hispanic, Latino, or Spanish', + shortName: SpecificPopulationEnum.RACE_HISPANIC, + }, + { + label: 'American Indian or Alaska Native (AIAN)', + shortName: SpecificPopulationEnum.RACE_AIAN, + }, + { + label: 'Middle Eastern or North African (MENA)', + shortName: SpecificPopulationEnum.RACE_MENA, + }, + { + label: 'Native Hawaiian or Pacific Islander (NHPI)', + shortName: SpecificPopulationEnum.RACE_NHPI, + }, + { + label: 'Multi-Ancestry or more than one race', + shortName: SpecificPopulationEnum.RACE_MORE_THAN_ONE, + }, + ], + }, + { + label: 'Age Groups', + shortName: SpecificPopulationEnum.AGE_GROUPS, + ubrLabel: 'Age', + ubrDescription: + 'Children (0-11); Adolescents (12-17); Older Adults (65-74); Older ' + + 'Adults (75+)', + subCategory: [ + { + label: 'Children (0-11)', + shortName: SpecificPopulationEnum.AGE_CHILDREN, + }, + { + label: 'Adolescents (12-17) ', + shortName: SpecificPopulationEnum.AGE_ADOLESCENTS, + }, + { + label: 'Older adults (65-74)', + shortName: SpecificPopulationEnum.AGE_OLDER, + }, + { + label: 'Older adults (75+) ', + shortName: SpecificPopulationEnum.AGE_OLDER_MORE_THAN_75, + }, + ], + }, + { + label: 'Sex at Birth', + shortName: SpecificPopulationEnum.SEX, + ubrLabel: 'Sex at Birth', + ubrDescription: 'Intersex', + subCategory: [ + { + label: + 'Participants who report something other than female or male as their sex at birth ' + + '(e.g. intersex)', + shortName: SpecificPopulationEnum.SEX, + }, + ], + }, + { + label: 'Gender Identity', + shortName: SpecificPopulationEnum.GENDER_IDENTITY, + ubrLabel: 'Gender Identity (GI)', + ubrDescription: 'Nonbinary; Transgender; or Other Gender Identity Choices', + subCategory: [ + { + label: + 'Participants who identify as gender variant, non-binary, transgender, or something ' + + 'else other than man or woman ', + shortName: SpecificPopulationEnum.GENDER_IDENTITY, + }, + ], + }, + { + label: 'Sexual Orientation', + shortName: SpecificPopulationEnum.SEXUAL_ORIENTATION, + ubrLabel: 'Sexual Orientation (SO)', + ubrDescription: + 'Gay; Lesbian; Bisexual; Queer; Other Sexual Orientation Choices', + subCategory: [ + { + label: + 'Participants who identify as asexual, bisexual, gay or lesbian, or something else ' + + 'other than straight ', + shortName: SpecificPopulationEnum.SEXUAL_ORIENTATION, + }, + ], + }, + { + label: 'Geography (e.g. Rural, urban, suburban, etc.)', + shortName: SpecificPopulationEnum.GEOGRAPHY, + ubrLabel: 'Geography', + ubrDescription: 'Rural and Non-Metropolitan Zip codes', + subCategory: [ + { + label: 'Participants who live in a rural or non-metropolitan setting', + shortName: SpecificPopulationEnum.GEOGRAPHY, + }, + ], + }, + { + label: 'Disability status', + shortName: SpecificPopulationEnum.DISABILITY_STATUS, + ubrLabel: 'Disability Status', + ubrDescription: 'Physical and Cognitive Disabilities', + subCategory: [ + { + label: 'Participants with a physical and/or cognitive disability', + shortName: SpecificPopulationEnum.DISABILITY_STATUS, + }, + ], + }, + { + label: 'Access to care', + shortName: SpecificPopulationEnum.ACCESS_TO_CARE, + ubrLabel: 'Access to Care', + ubrDescription: + 'Limited access to care; Cannot easily obtain or access medical care', + subCategory: [ + { + label: 'Participants who cannot easily obtain or access medical care', + shortName: SpecificPopulationEnum.ACCESS_TO_CARE, + }, + ], + }, + { + label: 'Education level', + shortName: SpecificPopulationEnum.EDUCATION_LEVEL, + ubrLabel: 'Educational Attainment', + ubrDescription: + 'Less than high school graduate or General Education Development (GED)', + subCategory: [ + { + label: 'Participants with less than a high school degree or equivalent', + shortName: SpecificPopulationEnum.EDUCATION_LEVEL, + }, + ], + }, + { + label: 'Income level', + shortName: SpecificPopulationEnum.INCOME_LEVEL, + ubrLabel: 'Income Level', + ubrDescription: 'Less than USD 25,000 [for a family of four]', + subCategory: [ + { + label: + 'Participants with household incomes equal to or below 200% of the Federal Poverty Level', + shortName: SpecificPopulationEnum.INCOME_LEVEL, + }, + ], + }, +]; + +export const disseminateFindings = [ + { + label: 'Publication in peer-reviewed scientific journals', + shortName: DisseminateResearchEnum.PUBLICATION_PEER_REVIEWED_JOURNALS, + }, + { + label: 'Social media (Facebook, Instagram, Twitter)', + shortName: DisseminateResearchEnum.SOCIAL_MEDIA, + }, + { + label: 'Presentation at national or international scientific conferences', + shortName: DisseminateResearchEnum.PRESENATATION_SCIENTIFIC_CONFERENCES, + }, + { + label: + 'Presentation at community forums or advisory groups (such as town halls, advocacy group ' + + 'meetings, or community advisory boards)', + shortName: DisseminateResearchEnum.PRESENTATION_ADVISORY_GROUPS, + }, + { + label: 'Press release or media article covering scientific publication', + shortName: DisseminateResearchEnum.PRESS_RELEASE, + }, + { + label: 'Publication in community-based journals or blog', + shortName: DisseminateResearchEnum.PUBLICATION_COMMUNITY_BASED_BLOG, + }, + { + label: 'Publication of article in a personal blog', + shortName: DisseminateResearchEnum.PUBLICATION_PERSONAL_BLOG, + }, + { label: 'Other', shortName: DisseminateResearchEnum.OTHER }, +]; + +export const researchOutcomes = [ + { + label: + 'This research project seeks to increase wellness and resilience, and promote ' + + 'healthy living', + shortName: ResearchOutcomeEnum.PROMOTE_HEALTHY_LIVING, + }, + { + label: + 'This research project seeks to reduce health disparities and improve health equity ' + + 'in underrepresented in biomedical research (UBR) populations', + shortName: ResearchOutcomeEnum.IMPROVE_HEALTH_EQUALITY_UBR_POPULATIONS, + }, + { + label: + 'This research project seeks to develop improved risk assessment and prevention ' + + 'strategies to preempt disease', + shortName: ResearchOutcomeEnum.IMPROVED_RISK_ASSESMENT, + }, + { + label: + 'This research project seeks to provide earlier and more accurate diagnosis to ' + + 'decrease illness burden', + shortName: ResearchOutcomeEnum.DECREASE_ILLNESS_BURDEN, + }, + { + label: + 'This research project seeks to improve health outcomes and reduce disease/illness burden' + + ' through improved treatment and development of precision intervention', + shortName: ResearchOutcomeEnum.PRECISION_INTERVENTION, + }, + { + label: 'None of these statements apply to this research project', + shortName: ResearchOutcomeEnum.NONE_APPLY, + }, +]; + +export const aianResearchTypeMap: Map = new Map([ + [ + AIANResearchType.EXCLUSIVE_AI_AN_POPULATION, + 'I am planning to conduct my study using a study population exclusively including individuals ' + + 'who self-identify as AI/AN and/or who exhibit genetic similarity to populations with inferred ' + + 'Indigenous American genetic ancestry.', + ], + [ + AIANResearchType.CASE_CONTROL_AI_AN, + 'I am planning to conduct a case/control study where either the “case” or the “control” ' + + 'population consists exclusively of individuals who self-identify as AI/AN and/or who exhibit ' + + 'genetic similarity to populations with inferred Indigenous American genetic ancestry.', + ], + [ + AIANResearchType.FINDINGS_BY_AI_AN, + 'I am planning to break down my findings by race/ethnicity and/or ancestral genetic similarity ' + + 'in such a way that may raise findings that are specific to individuals who self-identify as ' + + 'AI/AN and/or who exhibit genetic similarity to populations with inferred Indigenous American ' + + 'genetic ancestry.', + ], + [ + AIANResearchType.NO_AI_AN_ANALYSIS, + 'I will not conduct any analyses that would yield findings specific to AI/AN populations and/or ' + + 'populations who exhibit genetic similarity to populations with inferred Indigenous American ' + + 'genetic ancestry. If that changes, I will immediately update my responses on this form to ' + + 'reflect that change. ', + ], +]); diff --git a/ui/src/app/utils/research-purpose.tsx b/ui/src/app/utils/research-purpose.tsx index 2cbfc79e912..64c0befabb3 100644 --- a/ui/src/app/utils/research-purpose.tsx +++ b/ui/src/app/utils/research-purpose.tsx @@ -9,7 +9,7 @@ import { ResearchPurposeItem, ResearchPurposeItems, SpecificPopulationItems, -} from 'app/utils/workspace-edit-text'; +} from 'app/utils/research-purpose-text'; const styles = { researchPurposeItemHeader: { From f752777f6be1d443a793d8046e16e7617ff71719 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 16:28:42 -0500 Subject: [PATCH 15/16] Fix color --- ui/src/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/styles.css b/ui/src/styles.css index 5c9940ae396..250a240a313 100644 --- a/ui/src/styles.css +++ b/ui/src/styles.css @@ -357,7 +357,7 @@ form .form-block > label, border: 1px solid #c8c8c8 !important; background: transparent !important; box-shadow: none !important; - color: rgb(38, 34, 98) !important; + color: #262262 !important; } .p-accordion-content { From 99b7300704498d8e6797aa0cfd697fcae0d1da07 Mon Sep 17 00:00:00 2001 From: Eric Rollins Date: Tue, 21 Jan 2025 16:45:41 -0500 Subject: [PATCH 16/16] Cleanup --- ui/src/app/pages/workspace/workspace-edit.tsx | 1 + ui/src/app/utils/research-purpose-text.tsx | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ui/src/app/pages/workspace/workspace-edit.tsx b/ui/src/app/pages/workspace/workspace-edit.tsx index bca39168746..4bc03ad2226 100644 --- a/ui/src/app/pages/workspace/workspace-edit.tsx +++ b/ui/src/app/pages/workspace/workspace-edit.tsx @@ -46,6 +46,7 @@ import { WithSpinnerOverlayProps } from 'app/components/with-spinner-overlay'; import { CreateBillingAccountModal } from 'app/pages/workspace/create-billing-account-modal'; import { WorkspaceEditSection } from 'app/pages/workspace/workspace-edit-section'; import { + RequestForReviewFooter, toolTipText, tooltipTextBillingWarning, toolTipTextDemographic, diff --git a/ui/src/app/utils/research-purpose-text.tsx b/ui/src/app/utils/research-purpose-text.tsx index 6a3841b8aa2..74f6c3b3351 100644 --- a/ui/src/app/utils/research-purpose-text.tsx +++ b/ui/src/app/utils/research-purpose-text.tsx @@ -11,6 +11,10 @@ import { import { StyledExternalLink } from 'app/components/buttons'; import { TooltipTrigger } from 'app/components/popups'; import { AoU, AouTitle } from 'app/components/text-wrappers'; +import { + toolTipTextDemographic, + toolTipTextDucc, +} from 'app/pages/workspace/workspace-edit-text'; import colors from 'app/styles/colors'; export const ResearchPurposeDescription = (