diff --git a/package.json b/package.json index 1c740c61ba..0adacae9c2 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,10 @@ "packages/sites/*" ], "resolutions": { - "@types/react": "<18", - "@types/react-dom": "<18", - "react": "<18", - "react-dom": "<18", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-error-overlay": "6.0.9" }, "devDependencies": { diff --git a/packages/configs/cra-template/template.json b/packages/configs/cra-template/template.json index 1ab80a82d1..d47b0e7690 100644 --- a/packages/configs/cra-template/template.json +++ b/packages/configs/cra-template/template.json @@ -1,8 +1,8 @@ { "package": { "dependencies": { - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", "@veupathdb/wdk-client": "workspace:^", "@veupathdb/web-common": "workspace:^" }, @@ -23,8 +23,8 @@ "@testing-library/react": "12.1.2", "@testing-library/user-event": "13.5.0", "@types/node": "^14.0.0", - "@types/react": "^17.0.38", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-router-dom": "^5.3.3", "@veupathdb/browserslist-config": "workspace:^", "@veupathdb/components": "workspace:^", diff --git a/packages/libs/blast-summary-view/package.json b/packages/libs/blast-summary-view/package.json index d8a13a1dd3..9d99f30f02 100644 --- a/packages/libs/blast-summary-view/package.json +++ b/packages/libs/blast-summary-view/package.json @@ -47,10 +47,10 @@ "@babel/core": "^7.17.9", "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", - "@emotion/babel-preset-css-prop": "^11.10.0", - "@emotion/react": "^11.10.0", + "@emotion/babel-preset-css-prop": "^11.11.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@emotion/utils": "^1.1.0", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", @@ -60,8 +60,8 @@ "@testing-library/react": "12.1.2", "@testing-library/user-event": "13.5.0", "@types/node": "^14.0.0", - "@types/react": "^17.0.47", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.20", "@types/react-router-dom": "^5.3.3", "@veupathdb/browserslist-config": "workspace:^", @@ -81,14 +81,14 @@ "eslint-config-react-app": "^7.0.0", "ify-loader": "^1.1.0", "jquery": "1.9.1", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "path-browserify": "^1.0.1", "popper.js": "^1.16.1", "postcss": "^8.1.0", "querystring-es3": "^0.2.1", - "react": "^17.0.2", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.3.1", "react-redux": "^7.1.3", "react-router": "^5.2.0", "react-router-dom": "^5.3.0", diff --git a/packages/libs/components/package.json b/packages/libs/components/package.json index e9be2fb6fb..c8d6c7cdf3 100755 --- a/packages/libs/components/package.json +++ b/packages/libs/components/package.json @@ -75,7 +75,7 @@ "@babel/core": "^7.17.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", "@babel/preset-env": "^7.16.11", - "@emotion/react": "^11.10.0", + "@emotion/react": "^11.11.4", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", @@ -99,8 +99,8 @@ "@types/leaflet": "^1.7.9", "@types/lodash": "^4.14.164", "@types/md5": "^2.2.0", - "@types/react": "^16.9.0", - "@types/react-dom": "^16.9.0", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-leaflet": "^2.5.2", "@types/react-plotly.js": "^2.2.4", "@types/stats-lite": "^2.2.0", @@ -116,8 +116,8 @@ "lodash": "^4.17.21", "md5": "^2.3.0", "npm-run-all": "^4.1.5", - "react": "^16.13.1", - "react-dom": "^16.13.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-query": "^3.39.3", "stats-lite": "^2.2.0", "storybook": "^6.5.14", diff --git a/packages/libs/components/src/plots/PlotlyPlot.tsx b/packages/libs/components/src/plots/PlotlyPlot.tsx index 442a4e4b3d..a59d7b6a06 100755 --- a/packages/libs/components/src/plots/PlotlyPlot.tsx +++ b/packages/libs/components/src/plots/PlotlyPlot.tsx @@ -8,7 +8,7 @@ import React, { useImperativeHandle, useMemo, } from 'react'; -import { PlotParams } from 'react-plotly.js'; +import { Figure, PlotParams } from 'react-plotly.js'; import { legendSpecification } from '../utils/plotly'; import Spinner from '../components/Spinner'; import { PlotRef } from '../types/plots'; @@ -220,7 +220,7 @@ function PlotlyPlot( // ellipsis with tooltip for legend, legend title, and independent axis tick labels const onRender = useCallback( - (figure, graphDiv: Readonly) => { + (figure: Figure, graphDiv: Readonly) => { onPlotlyRender && onPlotlyRender(figure, graphDiv); // legend tooltip // remove pre-existing title to avoid duplicates @@ -344,7 +344,7 @@ function PlotlyPlot( ); const onInitialized = useCallback( - (figure, graphDiv: Readonly) => { + (figure: Figure, graphDiv: Readonly) => { onRender(figure, graphDiv); sharedPlotCreation.run(); }, diff --git a/packages/libs/components/src/plots/facetedPlots/FacetedPiePlot.tsx b/packages/libs/components/src/plots/facetedPlots/FacetedPiePlot.tsx index 5a22195eb4..f7a784abc3 100644 --- a/packages/libs/components/src/plots/facetedPlots/FacetedPiePlot.tsx +++ b/packages/libs/components/src/plots/facetedPlots/FacetedPiePlot.tsx @@ -26,7 +26,7 @@ type FacetedPiePlotProps = Omit< const FacetedPiePlot = (facetedPiePlotProps: FacetedPiePlotProps) => { const { componentProps } = facetedPiePlotProps; - const onPlotlyRender = useCallback((_, graphDiv) => { + const onPlotlyRender = useCallback((_: any, graphDiv: HTMLElement) => { // Replace each slice DOM node with a copy of itself. // This removes the existing click event handler, which // otherwise blocks the click handler that opens the modal diff --git a/packages/libs/components/src/stories/widgets/DateInput.stories.tsx b/packages/libs/components/src/stories/widgets/DateInput.stories.tsx index c68e54cb90..9238da40aa 100644 --- a/packages/libs/components/src/stories/widgets/DateInput.stories.tsx +++ b/packages/libs/components/src/stories/widgets/DateInput.stories.tsx @@ -14,7 +14,7 @@ export default { const ControlledTemplate: Story = (args) => { const [value, setValue] = useState('2005-01-03'); const onValueChange = useCallback( - (newValue) => { + (newValue: any) => { console.log(`new value = ${newValue}`); setValue(newValue as string); }, diff --git a/packages/libs/components/src/stories/widgets/DateRangeInput.stories.tsx b/packages/libs/components/src/stories/widgets/DateRangeInput.stories.tsx index 62d2d08a54..eaaf6771e6 100644 --- a/packages/libs/components/src/stories/widgets/DateRangeInput.stories.tsx +++ b/packages/libs/components/src/stories/widgets/DateRangeInput.stories.tsx @@ -21,7 +21,7 @@ export const ControlledLinked: Story = () => { // there must be a cleverer way to do this // avoiding the cut and paste const handleChangeA = useCallback( - (newRange) => { + (newRange: any) => { console.log(`A: new range = ${newRange.min} to ${newRange.max}`); setRange(newRange); }, @@ -29,7 +29,7 @@ export const ControlledLinked: Story = () => { ); const handleChangeB = useCallback( - (newRange) => { + (newRange: any) => { console.log(`B: new range = ${newRange.min} to ${newRange.max}`); setRange(newRange); }, diff --git a/packages/libs/components/src/stories/widgets/NumberInput.stories.tsx b/packages/libs/components/src/stories/widgets/NumberInput.stories.tsx index ef1ac8945d..0e7fe73499 100644 --- a/packages/libs/components/src/stories/widgets/NumberInput.stories.tsx +++ b/packages/libs/components/src/stories/widgets/NumberInput.stories.tsx @@ -14,7 +14,7 @@ export default { const ControlledTemplate: Story = (args) => { const [value, setValue] = useState(args.value ?? 1); const onValueChange = useCallback( - (newValue) => { + (newValue: any) => { console.log(`new value = ${newValue}`); setValue(newValue as number); }, diff --git a/packages/libs/components/src/stories/widgets/NumberRangeInput.stories.tsx b/packages/libs/components/src/stories/widgets/NumberRangeInput.stories.tsx index 7876f295ec..853d259ab1 100644 --- a/packages/libs/components/src/stories/widgets/NumberRangeInput.stories.tsx +++ b/packages/libs/components/src/stories/widgets/NumberRangeInput.stories.tsx @@ -16,7 +16,7 @@ export const EmptyAtStart: Story = () => { const [range, setRange] = useState(); const handleChange = useCallback( - (newRange) => { + (newRange: any) => { console.log(`new range = ${newRange?.min} to ${newRange?.max}`); setRange(newRange); }, @@ -32,7 +32,7 @@ export const NoPartialRangesWithClear: Story = () => { const [range, setRange] = useState(); const handleChange = useCallback( - (newRange) => { + (newRange: any) => { console.log(`new range = ${newRange?.min} to ${newRange?.max}`); setRange(newRange); }, @@ -57,7 +57,7 @@ export const ControlledLinked: Story = () => { // there must be a cleverer way to do this // avoiding the cut and paste const handleChangeA = useCallback( - (newRange) => { + (newRange: any) => { console.log(`A: new range = ${newRange?.min} to ${newRange?.max}`); setRange(newRange); }, @@ -65,7 +65,7 @@ export const ControlledLinked: Story = () => { ); const handleChangeB = useCallback( - (newRange) => { + (newRange: any) => { console.log(`B: new range = ${newRange?.min} to ${newRange?.max}`); setRange(newRange); }, @@ -101,14 +101,14 @@ export const CustomValidator: Story = () => { const [range, setRange] = useState(); const handleChange = useCallback( - (newRange) => { + (newRange: any) => { console.log(`new range = ${newRange?.min} to ${newRange?.max}`); setRange(newRange); }, [setRange] ); const validate = useCallback( - (range) => { + (range: any) => { console.log(`validating range ${range.min} to ${range.max}`); if (range && range.max != null && range.min != null) { if (range.max - range.min === 5) { diff --git a/packages/libs/coreui/package.json b/packages/libs/coreui/package.json index c38d610550..40c13c90c4 100644 --- a/packages/libs/coreui/package.json +++ b/packages/libs/coreui/package.json @@ -49,10 +49,10 @@ "@babel/preset-react": "^7.14.5", "@babel/preset-typescript": "^7.15.0", "@emotion/babel-plugin": "^11.3.0", - "@emotion/babel-preset-css-prop": "^11.10.0", - "@emotion/react": "^11.10.0", + "@emotion/babel-preset-css-prop": "^11.11.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@storybook/addon-actions": "^6.5.14", @@ -76,10 +76,10 @@ "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-storybook": "^0.5.7", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "npm-run-all": "^4.1.5", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", "resize-observer-polyfill": "^1.5.1", "sass-loader": "^7.3.1", "typescript": "4.5.5" diff --git a/packages/libs/coreui/src/components/Mesa/Ui/DataCell.jsx b/packages/libs/coreui/src/components/Mesa/Ui/DataCell.jsx index 468227edc0..62fa58732d 100644 --- a/packages/libs/coreui/src/components/Mesa/Ui/DataCell.jsx +++ b/packages/libs/coreui/src/components/Mesa/Ui/DataCell.jsx @@ -68,12 +68,11 @@ class DataCell extends React.PureComponent { const props = { style, children, - key, className, ...(isChildRow ? { colSpan: childRowColSpan } : null), }; - return column.hidden ? null : ; + return column.hidden ? null : ; } } diff --git a/packages/libs/coreui/src/components/Mesa/Ui/HeadingCell.jsx b/packages/libs/coreui/src/components/Mesa/Ui/HeadingCell.jsx index a89f807e02..4a8c46b822 100644 --- a/packages/libs/coreui/src/components/Mesa/Ui/HeadingCell.jsx +++ b/packages/libs/coreui/src/components/Mesa/Ui/HeadingCell.jsx @@ -287,9 +287,9 @@ class HeadingCell extends React.PureComponent { !column.primary && typeof eventHandlers.onColumnReorder === 'function'; - const props = { style, key, ref, draggable, children, className }; + const props = { style, ref, draggable, children, className }; - return column.hidden ? null : ; + return column.hidden ? null : ; } } diff --git a/packages/libs/coreui/src/components/inputs/SelectTree/Utils.tsx b/packages/libs/coreui/src/components/inputs/SelectTree/Utils.tsx index 5218d07a5b..6c0ec06408 100644 --- a/packages/libs/coreui/src/components/inputs/SelectTree/Utils.tsx +++ b/packages/libs/coreui/src/components/inputs/SelectTree/Utils.tsx @@ -78,7 +78,7 @@ export function mapStructure( getChildren: ChildrenGetter, root: T ): U { - let mappedChildren = Seq.from(getChildren(root)) + const mappedChildren = Seq.from(getChildren(root)) .map((child) => mapStructure(mapFn, getChildren, child)) .toArray(); return mapFn(root, mappedChildren); @@ -136,8 +136,8 @@ export function* preorder( getChildren: ChildrenGetter ): Iterable { yield root; - let children = getChildren(root); - let length = children.length; + const children = getChildren(root); + const length = children.length; for (let i = 0; i < length; i++) { yield* preorder(children[i], getChildren); } @@ -293,7 +293,7 @@ export function* concat(...iterables: Iterable[]) { export function* map(fn: Mapper, iterable: Iterable) { for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; yield fn(value); } @@ -301,16 +301,16 @@ export function* map(fn: Mapper, iterable: Iterable) { export function* flatMap(fn: FlatMapper, iterable: Iterable) { for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; yield* fn(value); } } export function* uniq(iterable: Iterable) { - let values = new Set(); + const values = new Set(); for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; if (values.has(value) === false) { values.add(value); @@ -326,7 +326,7 @@ export function filter( export function filter(fn: Predicate, iterable: Iterable): Iterable; export function* filter(fn: Predicate, iterable: Iterable) { for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; if (fn(value)) yield value; } @@ -334,7 +334,7 @@ export function* filter(fn: Predicate, iterable: Iterable) { export function some(test: Predicate, iterable: Iterable): boolean { for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; if (test(value) === true) return true; } @@ -351,7 +351,7 @@ export function reduce( ): U { let result = seedValue; for (let iter = iterable[Symbol.iterator](); ; ) { - let { done, value } = iter.next(); + const { done, value } = iter.next(); if (done) break; result = fn(result, value); } @@ -369,7 +369,7 @@ export function safeHtml

( export function safeHtml

( str: string, props?: P, - Component?: React.StatelessComponent

+ Component?: React.FunctionComponent

): JSX.Element; export function safeHtml

( str: string, @@ -385,7 +385,7 @@ export function safeHtml

( return {str}; } // Use innerHTML to auto close tags - let container = document.createElement('div'); + const container = document.createElement('div'); container.innerHTML = str; return ( (array: T[], value: T): T[] { * @returns {Array} A set of query terms parsed from searchQueryString */ export function parseSearchQueryString(searchQueryString: string) { - let match = searchQueryString.match(/[^\s"]+|"[^"]*"/g); + const match = searchQueryString.match(/[^\s"]+|"[^"]*"/g); if (match == null) return []; return match.map(function (queryTerm) { if (queryTerm.startsWith('"')) { diff --git a/packages/libs/coreui/src/components/notifications/SnackbarProvider.tsx b/packages/libs/coreui/src/components/notifications/SnackbarProvider.tsx index 9e71f75f0d..af33be76da 100644 --- a/packages/libs/coreui/src/components/notifications/SnackbarProvider.tsx +++ b/packages/libs/coreui/src/components/notifications/SnackbarProvider.tsx @@ -1,12 +1,12 @@ import { useMemo } from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles, styled } from '@material-ui/core'; import { CSSProperties, StyleRules } from '@material-ui/core/styles/withStyles'; import { CombinedClassKey, SnackbarProvider, SnackbarProviderProps, - VariantClassKey, + MaterialDesignContent, } from 'notistack'; import { @@ -36,19 +36,10 @@ export interface WrappedSnackbarProviderProps export default function makeSnackbarProvider< StyleProps extends { theme?: UITheme }, ClassKey extends CombinedClassKey ->( - styles?: StyleRules, - displayName: string = 'SnackbarProvider' -) { +>(styles?: StyleRules, displayName = 'SnackbarProvider') { const useStyles = makeStyles({ - variantSuccess: makeSnackbarVariantStyles(success), - variantError: makeSnackbarVariantStyles(error), - variantWarning: makeSnackbarVariantStyles(warning), - variantInfo({ theme }) { - return makeSnackbarVariantStyles(theme?.palette.primary.hue ?? mutedBlue); - }, ...styles, - } as StyleRules); + } as StyleRules); function WrappedSnackbarProvider({ styleProps, @@ -65,10 +56,28 @@ export default function makeSnackbarProvider< [theme, styleProps] ); + const StyledSnackbarContent = styled(MaterialDesignContent)({ + '&.notistack-MuiContent-success': makeSnackbarVariantStyles(success), + '&.notistack-MuiContent-error': makeSnackbarVariantStyles(error), + '&.notistack-MuiContent-warning': makeSnackbarVariantStyles(warning), + '&.notistack-MuiContent-info': makeSnackbarVariantStyles( + theme?.palette.primary.hue ?? mutedBlue + ), + }); + const classes = useStyles(fullStyleProps); return ( - + {snackbarProps.children} ); @@ -90,7 +99,7 @@ export function makeSnackbarVariantStyles(variantHue: ColorHue): CSSProperties { fontWeight: 'bold', }, '& svg': { - fill: variantHue[600], + fill: `${variantHue[600]} !important`, }, }; } diff --git a/packages/libs/eda/package.json b/packages/libs/eda/package.json index 5759d3650c..815c829d77 100644 --- a/packages/libs/eda/package.json +++ b/packages/libs/eda/package.json @@ -55,9 +55,9 @@ "extends @veupathdb/browserslist-config" ], "devDependencies": { - "@emotion/babel-preset-css-prop": "^11.10.0", - "@emotion/react": "^11.10.0", - "@emotion/styled": "^11.10.0", + "@emotion/babel-preset-css-prop": "^11.11.0", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", @@ -71,8 +71,8 @@ "@types/lodash": "^4.14.182", "@types/luxon": "^3.0.1", "@types/node": "^12.0.0", - "@types/react": "^16.9.53", - "@types/react-dom": "^16.9.8", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-leaflet": "^2.5.2", "@types/react-resizable": "^1.7.2", "@types/react-router-dom": "^5.3.3", @@ -88,14 +88,14 @@ "buffer": "^6.0.3", "http-proxy-middleware": "^2.0.6", "ify-loader": "^1.1.0", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "path-browserify": "^1.0.1", "postcss-normalize": "^10.0.1", "process": "^0.11.10", "querystring-es3": "^0.2.1", - "react": "^17.0.1", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.1", + "react-dom": "^18.3.1", "react-router": "^5.2.1", "react-router-dom": "^5.3.0", "react-scripts": "5.0.1", diff --git a/packages/libs/eda/src/lib/core/components/filter/HistogramFilter.tsx b/packages/libs/eda/src/lib/core/components/filter/HistogramFilter.tsx index 696fd7e14d..7695eaf376 100755 --- a/packages/libs/eda/src/lib/core/components/filter/HistogramFilter.tsx +++ b/packages/libs/eda/src/lib/core/components/filter/HistogramFilter.tsx @@ -337,7 +337,7 @@ export function HistogramFilter(props: Props) { className="filter-param" style={{ position: 'relative', marginTop: '2em' }} > - {data.error &&

{String(data.error)}
} + {data.error != null &&
{String(data.error)}
}
{ - setSort(sort); - }, []); + const onMemberSort = useCallback( + ( + _: unknown, + sort: { + columnKey: string; + direction: 'asc' | 'desc'; + } + ) => { + setSort(sort); + }, + [] + ); - const onMemberSearch = useCallback((_, searchTerm: string) => { + const onMemberSearch = useCallback((_: unknown, searchTerm: string) => { setSearchTerm(searchTerm); }, []); diff --git a/packages/libs/eda/src/lib/core/components/filter/TableFilter.tsx b/packages/libs/eda/src/lib/core/components/filter/TableFilter.tsx index ee45db24b4..6049f4b5e6 100644 --- a/packages/libs/eda/src/lib/core/components/filter/TableFilter.tsx +++ b/packages/libs/eda/src/lib/core/components/filter/TableFilter.tsx @@ -329,7 +329,7 @@ export function TableFilter({ {tableSummary.pending && ( )} - {tableSummary.error &&
{String(tableSummary.error)}
} + {tableSummary.error != null &&
{String(tableSummary.error)}
} {tableSummary.value && tableSummary.value.entityId === entity.id && tableSummary.value.variableId === variable.id && ( diff --git a/packages/libs/eda/src/lib/core/components/visualizations/PluginError.tsx b/packages/libs/eda/src/lib/core/components/visualizations/PluginError.tsx index 628a4cfcb8..a1e343c512 100644 --- a/packages/libs/eda/src/lib/core/components/visualizations/PluginError.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/PluginError.tsx @@ -1,5 +1,5 @@ import Banner from '@veupathdb/coreui/lib/components/banners/Banner'; -import { ReactFragment } from 'react'; +import { ReactNode } from 'react'; import { NoDataError } from '../../api/DataClient/NoDataError'; interface Props { @@ -9,7 +9,7 @@ interface Props { bannerType?: 'warning' | 'error'; } -type Case = (error: unknown) => string | ReactFragment | undefined; +type Case = (error: unknown) => string | ReactNode | undefined; const defaultCases: Case[] = [ (error) => (error instanceof NoDataError ? error.message : undefined), @@ -34,7 +34,7 @@ export default function PluginError({ const errorContent = (customCases ?? []) .concat([emptyCase, ...defaultCases]) - .reduce( + .reduce( (prev, caseFunction) => prev ?? caseFunction(error), undefined ) ?? fallbackErrorMessage; diff --git a/packages/libs/eda/src/lib/core/utils/show-hide-variable-context.tsx b/packages/libs/eda/src/lib/core/utils/show-hide-variable-context.tsx index 355b89a316..da31dc7f5b 100644 --- a/packages/libs/eda/src/lib/core/utils/show-hide-variable-context.tsx +++ b/packages/libs/eda/src/lib/core/utils/show-hide-variable-context.tsx @@ -7,7 +7,8 @@ export const ShowHideVariableContext = createContext({ ) => {}, }); -const ShowHideVariableContextProvider: React.FC = ({ +// const ShowHideVariableContextProvider: React.FC = ({ +const ShowHideVariableContextProvider: React.FC = ({ children, }) => { const [showOnlyCompatibleVariables, setShowOnlyCompatibleVariables] = diff --git a/packages/libs/eda/src/lib/workspace/Variable.tsx b/packages/libs/eda/src/lib/workspace/Variable.tsx index 9ab451b5ff..0e8e5b3507 100644 --- a/packages/libs/eda/src/lib/workspace/Variable.tsx +++ b/packages/libs/eda/src/lib/workspace/Variable.tsx @@ -83,7 +83,7 @@ export function VariableDetails(props: Props) {
{/* showing three variables for multifilter or single variable */} -  {threeProviderLabel} + <> {threeProviderLabel} {/* generalize Show/Hide more: there is a case that providerLabel is string */} {Array.isArray(providerLabel) && providerLabel.length > 3 ? ( <> @@ -199,18 +199,20 @@ function truncateProviderLabel( } else { return (
- {variable} - {isThreeLabel && - ((providerLabel as string[]).length > 3 - ? i === 2 + <> + {variable} + {isThreeLabel && + ((providerLabel as string[]).length > 3 + ? i === 2 + ? '' + : ',' + : i === (providerLabel as string[]).length - 1 ? '' - : ',' - : i === (providerLabel as string[]).length - 1 - ? '' - : ',')} - {!isThreeLabel && - (i === (providerLabel as string[]).length - 4 ? '' : ',')} -   + : ',')} + {!isThreeLabel && + (i === (providerLabel as string[]).length - 4 ? '' : ',')} +   +
); } diff --git a/packages/libs/multi-blast/package.json b/packages/libs/multi-blast/package.json index 944bf26d54..e105dc2848 100644 --- a/packages/libs/multi-blast/package.json +++ b/packages/libs/multi-blast/package.json @@ -52,9 +52,9 @@ ], "devDependencies": { "@babel/core": "^7.17.9", - "@emotion/react": "^11.10.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", @@ -66,8 +66,8 @@ "@types/jest": "^26.0.15", "@types/lodash": "^4.14.181", "@types/node": "^12.0.0", - "@types/react": "^16.9.53", - "@types/react-dom": "^16.9.8", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.5", "@types/react-router": "^5.1.17", "@types/react-router-dom": "^5.3.3", @@ -93,9 +93,9 @@ "eslint-plugin-react-hooks": "^4.0.8", "eslint-plugin-testing-library": "^5.9.1", "http-proxy-middleware": "^1.0.6", - "react": "^17.0.2", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": ">=16.14.0", + "react-dom": "^18.3.1", "react-redux": "^7.2.6", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", diff --git a/packages/libs/preferred-organisms/package.json b/packages/libs/preferred-organisms/package.json index 57603a2497..d547d6809d 100644 --- a/packages/libs/preferred-organisms/package.json +++ b/packages/libs/preferred-organisms/package.json @@ -45,9 +45,9 @@ ], "devDependencies": { "@babel/core": "^7.17.9", - "@emotion/react": "^11.10.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", @@ -57,8 +57,8 @@ "@testing-library/user-event": "^12.1.10", "@types/jest": "^26.0.15", "@types/node": "^12.0.0", - "@types/react": "^16.9.53", - "@types/react-dom": "^16.9.8", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-router": "^5.1.8", "@types/react-router-dom": "^5.3.0", "@typescript-eslint/eslint-plugin": "^4.0.0", @@ -80,10 +80,10 @@ "eslint-plugin-react": "^7.20.3", "eslint-plugin-react-hooks": "^4.0.8", "http-proxy-middleware": "^1.0.6", - "notistack": "^1.0.10", - "react": "^17.0.2", + "notistack": "^3.0.1", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.3.1", "react-redux": "^7.2.6", "react-router": "^5.2.0", "react-router-dom": "^5.3.0", diff --git a/packages/libs/user-datasets-legacy/package.json b/packages/libs/user-datasets-legacy/package.json index 723f39e15c..0aa7918bfe 100644 --- a/packages/libs/user-datasets-legacy/package.json +++ b/packages/libs/user-datasets-legacy/package.json @@ -44,10 +44,10 @@ "@babel/core": "^7.17.9", "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", - "@emotion/babel-preset-css-prop": "^11.10.0", - "@emotion/react": "^11.10.0", + "@emotion/babel-preset-css-prop": "^11.11.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@emotion/utils": "^1.1.0", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", @@ -58,8 +58,8 @@ "@testing-library/user-event": "13.5.0", "@types/history": "^4.7.4", "@types/node": "^14.0.0", - "@types/react": "^17.0.38", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.20", "@types/react-router-dom": "^5.3.3", "@veupathdb/browserslist-config": "workspace:^", @@ -78,13 +78,13 @@ "eslint": "^8.7.0", "eslint-config-react-app": "^7.0.0", "ify-loader": "^1.1.0", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "path-browserify": "^1.0.1", "postcss": "^8.1.0", "querystring-es3": "^0.2.1", - "react": "^17.0.2", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.3.1", "react-redux": "^7.1.3", "react-router-dom": "^5.3.0", "react-scripts": "5.0.0", diff --git a/packages/libs/user-datasets/package.json b/packages/libs/user-datasets/package.json index c49455a229..8fe7f9f856 100644 --- a/packages/libs/user-datasets/package.json +++ b/packages/libs/user-datasets/package.json @@ -44,10 +44,10 @@ "@babel/core": "^7.17.9", "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", - "@emotion/babel-preset-css-prop": "^11.10.0", - "@emotion/react": "^11.10.0", + "@emotion/babel-preset-css-prop": "^11.11.0", + "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.10.0", + "@emotion/styled": "^11.11.5", "@emotion/utils": "^1.1.0", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", @@ -58,8 +58,8 @@ "@testing-library/user-event": "13.5.0", "@types/history": "^4.7.4", "@types/node": "^14.0.0", - "@types/react": "^17.0.38", - "@types/react-dom": "^17.0.11", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.20", "@types/react-router-dom": "^5.3.3", "@veupathdb/browserslist-config": "workspace:^", @@ -78,13 +78,13 @@ "eslint": "^8.7.0", "eslint-config-react-app": "^7.0.0", "ify-loader": "^1.1.0", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "path-browserify": "^1.0.1", "postcss": "^8.1.0", "querystring-es3": "^0.2.1", - "react": "^17.0.2", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.3.1", "react-redux": "^7.1.3", "react-router-dom": "^5.3.0", "react-scripts": "5.0.0", diff --git a/packages/libs/user-datasets/src/lib/Components/Detail/BigwigDatasetDetail.jsx b/packages/libs/user-datasets/src/lib/Components/Detail/BigwigDatasetDetail.jsx index 2ffc3e962d..f9c39c47e1 100644 --- a/packages/libs/user-datasets/src/lib/Components/Detail/BigwigDatasetDetail.jsx +++ b/packages/libs/user-datasets/src/lib/Components/Detail/BigwigDatasetDetail.jsx @@ -133,6 +133,8 @@ class BigwigDatasetDetail extends UserDatasetDetail { ); } + // See note in the base class, UserDatasetDetail + /** @return {import("react").ReactNode[]} */ getPageSections() { const [headerSection, compatSection, fileSection] = super.getPageSections(); return [ diff --git a/packages/libs/user-datasets/src/lib/Components/Detail/BiomDatasetDetail.jsx b/packages/libs/user-datasets/src/lib/Components/Detail/BiomDatasetDetail.jsx index f26ed689b1..fffcc9662b 100644 --- a/packages/libs/user-datasets/src/lib/Components/Detail/BiomDatasetDetail.jsx +++ b/packages/libs/user-datasets/src/lib/Components/Detail/BiomDatasetDetail.jsx @@ -31,6 +31,8 @@ class BiomDatasetDetail extends UserDatasetDetail { ); } + // See note in the base class, UserDatasetDetail + /** @return {import("react").ReactNode[]} */ getPageSections() { const [headerSection, , fileSection] = super.getPageSections(); diff --git a/packages/libs/user-datasets/src/lib/Components/Detail/IsaDatasetDetail.jsx b/packages/libs/user-datasets/src/lib/Components/Detail/IsaDatasetDetail.jsx index 2c52557f47..6dc37df326 100644 --- a/packages/libs/user-datasets/src/lib/Components/Detail/IsaDatasetDetail.jsx +++ b/packages/libs/user-datasets/src/lib/Components/Detail/IsaDatasetDetail.jsx @@ -47,6 +47,8 @@ class IsaDatasetDetail extends UserDatasetDetail { ); } + // See note in the base class, UserDatasetDetail + /** @return {import("react").ReactNode[]} */ getPageSections() { const [headerSection, , fileSection] = super.getPageSections(); diff --git a/packages/libs/wdk-client/package.json b/packages/libs/wdk-client/package.json index 65e5ed1505..407fcd33e7 100644 --- a/packages/libs/wdk-client/package.json +++ b/packages/libs/wdk-client/package.json @@ -40,7 +40,7 @@ "uuid": "^8.3.2" }, "devDependencies": { - "@emotion/react": "^11.10.0", + "@emotion/react": "^11.11.4", "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", @@ -56,8 +56,8 @@ "@types/node": "^14.14.7", "@types/prop-types": "^15.7.3", "@types/qtip2": "^2.2.29", - "@types/react": "^16.9.18", - "@types/react-dom": "^16.9.5", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.5", "@types/react-router": "^5.1.4", "@types/react-router-dom": "^5.1.3", @@ -74,10 +74,10 @@ "eslint-plugin-react": "^7.4.0", "jest": "^23.4.2", "jest-tap-reporter": "^1.9.0", - "notistack": "^1.0.10", + "notistack": "^3.0.1", "npm-run-all": "^4.1.5", - "react": "^16.12.0", - "react-dom": "^16.12.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-router-dom": "^5.1.2", "react-test-renderer": "^16.9.0", "shelljs": "^0.8.4", diff --git a/packages/libs/wdk-client/src/Components/CheckboxTree/CategoriesCheckboxTree.tsx b/packages/libs/wdk-client/src/Components/CheckboxTree/CategoriesCheckboxTree.tsx index 2205b58226..08d628d502 100644 --- a/packages/libs/wdk-client/src/Components/CheckboxTree/CategoriesCheckboxTree.tsx +++ b/packages/libs/wdk-client/src/Components/CheckboxTree/CategoriesCheckboxTree.tsx @@ -72,18 +72,18 @@ type Props = { let CategoriesCheckboxTree: FunctionComponent = (props) => { let { autoFocusSearchBox, - disableHelp, + disableHelp = false, expandedBranches, visibilityFilter, - isMultiPick, - isSelectable, - leafType, + isMultiPick = true, + isSelectable = true, + leafType = 'column', name, onChange, onSearchTermChange, onUiChange, renderNoResults, - renderNode, + renderNode = (node: CategoryTreeNode) => , searchBoxPlaceholder, searchTerm, searchIconName = 'filter', @@ -170,14 +170,6 @@ let CategoriesCheckboxTree: FunctionComponent = (props) => { ); }; -CategoriesCheckboxTree.defaultProps = { - renderNode: (node: CategoryTreeNode) => , - isMultiPick: true, - isSelectable: true, - leafType: 'column', // TODO remove once all consumers are passing in a value for this - disableHelp: false, -} as Props; - export default wrappable(CategoriesCheckboxTree); const getFilteredCategoryNodeChildren = partial( diff --git a/packages/libs/wdk-client/src/Components/Display/CollapsibleSection.tsx b/packages/libs/wdk-client/src/Components/Display/CollapsibleSection.tsx index d224c5e764..71f0ef9d92 100644 --- a/packages/libs/wdk-client/src/Components/Display/CollapsibleSection.tsx +++ b/packages/libs/wdk-client/src/Components/Display/CollapsibleSection.tsx @@ -15,7 +15,7 @@ interface Props { isCollapsed?: boolean; onCollapsedChange: (isCollapsed: boolean) => void; headerContent: React.ReactNode; - headerComponent?: React.ReactType; + headerComponent?: React.ComponentType; className?: string; children: React.ReactNode; } diff --git a/packages/libs/wdk-client/src/Components/Display/TabbableContainer.tsx b/packages/libs/wdk-client/src/Components/Display/TabbableContainer.tsx index 42fa18660d..30e2be98e3 100644 --- a/packages/libs/wdk-client/src/Components/Display/TabbableContainer.tsx +++ b/packages/libs/wdk-client/src/Components/Display/TabbableContainer.tsx @@ -6,6 +6,7 @@ type Props = { autoFocus: boolean; className?: string; onKeyDown?: (event: RKeyboardEvent) => void; + children: React.ReactNode; }; /** diff --git a/packages/libs/wdk-client/src/Components/InputControls/TextArea.tsx b/packages/libs/wdk-client/src/Components/InputControls/TextArea.tsx index a8d2f48375..07fd9ace6e 100644 --- a/packages/libs/wdk-client/src/Components/InputControls/TextArea.tsx +++ b/packages/libs/wdk-client/src/Components/InputControls/TextArea.tsx @@ -15,7 +15,7 @@ type Props = InputPropsWithoutOnChange & { onChange: (value: string) => void; }; -let TextArea: React.SFC = function (props) { +let TextArea: React.FC = function (props) { return (