From 66f7b021b67e8ce0134c319b578f5647a479dacd Mon Sep 17 00:00:00 2001 From: ivan-aksamentov Date: Mon, 15 Jan 2024 20:41:44 +0100 Subject: [PATCH] feat(web): add dataset customization indicator to main page --- .../src/components/Link/Link.tsx | 6 ++- .../components/Main/DatasetCurrentSummary.tsx | 11 ++++ .../Main/DatasetCustomizationIndicator.tsx | 52 ++++++++++++++++++- .../nextclade-web/src/state/inputs.state.ts | 9 ++++ 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/packages_rs/nextclade-web/src/components/Link/Link.tsx b/packages_rs/nextclade-web/src/components/Link/Link.tsx index 565843efe..521b86b65 100644 --- a/packages_rs/nextclade-web/src/components/Link/Link.tsx +++ b/packages_rs/nextclade-web/src/components/Link/Link.tsx @@ -6,11 +6,13 @@ export interface LinkProps extends PropsWithChildren {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */} - {children} + + {children} + ) } diff --git a/packages_rs/nextclade-web/src/components/Main/DatasetCurrentSummary.tsx b/packages_rs/nextclade-web/src/components/Main/DatasetCurrentSummary.tsx index 247c75cb5..b69f3bbb7 100644 --- a/packages_rs/nextclade-web/src/components/Main/DatasetCurrentSummary.tsx +++ b/packages_rs/nextclade-web/src/components/Main/DatasetCurrentSummary.tsx @@ -4,6 +4,7 @@ import { useRecoilValue, useResetRecoilState } from 'recoil' import { MdClear as IconClearBase } from 'react-icons/md' import { ButtonTransparent } from 'src/components/Common/ButtonTransparent' import { ButtonLoadExample } from 'src/components/Main/ButtonLoadExample' +import { DatasetCustomizationsIndicatorLink } from 'src/components/Main/DatasetCustomizationIndicator' import { useTranslationSafe } from 'src/helpers/useTranslationSafe' import styled from 'styled-components' import { useUpdatedDataset } from 'src/io/fetchDatasets' @@ -45,6 +46,12 @@ export function DatasetCurrentSummary() { + + + + + + @@ -76,3 +83,7 @@ const IconClear = styled(IconClearBase)` color: ${(props) => props.theme.gray500}; } ` + +const DatasetCustomizationWrapper = styled.div` + margin-left: 90px; +` diff --git a/packages_rs/nextclade-web/src/components/Main/DatasetCustomizationIndicator.tsx b/packages_rs/nextclade-web/src/components/Main/DatasetCustomizationIndicator.tsx index 82c8eaab7..58c65e867 100644 --- a/packages_rs/nextclade-web/src/components/Main/DatasetCustomizationIndicator.tsx +++ b/packages_rs/nextclade-web/src/components/Main/DatasetCustomizationIndicator.tsx @@ -1,9 +1,12 @@ import React, { useMemo } from 'react' -import { useRecoilValue } from 'recoil' +import { useRecoilValue, useResetRecoilState } from 'recoil' import { ButtonProps } from 'reactstrap' import styled from 'styled-components' +import { MdClear as IconClearBase } from 'react-icons/md' +import { Link } from 'src/components/Link/Link' +import { ButtonTransparent } from 'src/components/Common/ButtonTransparent' import { useTranslationSafe } from 'src/helpers/useTranslationSafe' -import { inputCustomizationCounterAtom } from 'src/state/inputs.state' +import { datasetFilesResetAtom, inputCustomizationCounterAtom } from 'src/state/inputs.state' export interface ButtonCustomizeProps extends ButtonProps { isOpen: boolean @@ -38,3 +41,48 @@ export const DatasetCustomizationIndicatorIcon = styled.span<{ size: number }>` margin-left: 0.5rem; padding: 0 0.25rem; ` + +export function DatasetCustomizationsIndicatorLink() { + const { t } = useTranslationSafe() + const inputCustomizationCounter = useRecoilValue(inputCustomizationCounterAtom) + + const text = useMemo( + () => t('Dataset files currently customized: {{n}}', { n: inputCustomizationCounter }), + [inputCustomizationCounter, t], + ) + + const resetCustomizations = useResetRecoilState(datasetFilesResetAtom) + + if (inputCustomizationCounter === 0) { + return null + } + + return ( +
+ + {t('Customizations')} + + + + + +
+ ) +} + +const CustomizationLink = styled(Link)` + &:hover { + text-decoration: ${(props) => props.theme.danger} underline solid; + } +` + +const ButtonClear = styled(ButtonTransparent)` + display: flex; + margin-left: 0.5rem; +` + +const IconClear = styled(IconClearBase)` + * { + color: ${(props) => props.theme.gray500}; + } +` diff --git a/packages_rs/nextclade-web/src/state/inputs.state.ts b/packages_rs/nextclade-web/src/state/inputs.state.ts index ac70e4fa5..d3d91a4d1 100644 --- a/packages_rs/nextclade-web/src/state/inputs.state.ts +++ b/packages_rs/nextclade-web/src/state/inputs.state.ts @@ -117,6 +117,15 @@ export const inputResetAtom = selector({ get: () => undefined, set({ reset }) { reset(qrySeqInputsStorageAtom) + reset(datasetFilesResetAtom) + }, +}) + +/** Resets all dataset files */ +export const datasetFilesResetAtom = selector({ + key: 'datasetFilesResetAtom', + get: () => undefined, + set({ reset }) { reset(refSeqInputAtom) reset(geneMapInputAtom) reset(refTreeInputAtom)