diff --git a/src/Charts/Scales.js b/src/Charts/Scales.js index c35057138bd..687d14af46f 100644 --- a/src/Charts/Scales.js +++ b/src/Charts/Scales.js @@ -14,11 +14,11 @@ const Scales = { /** * Calculates the appropriate d3 scales. * - * @param {Size} size Dimensions of plot area, as returned by Size class. - * @param {Object} [domain] Optional, object containing [minimum, maximum] arrays for each axis. + * @param {Object} size Dimensions of plot area, as returned by Size class. + * @param {Object} domain Optional, object containing [minimum, maximum] arrays for each axis. * @param {Number[]} domain.x [x-minimum, x-maximum]. * @param {Object} domain.y An object whose keys are units ("undefined" for unknown), values being [y-minimum, y-maximum]. - * @param {ChartData[]} data The data for each line. This is required to extract units. Also if no domain is provided, it is calculated from the data. + * @param {Object[]} data The data for each line. This is required to extract units. Also if no domain is provided, it is calculated from the data. * @return {Object} {x, y: { [unit1], [unit2] ... }} where values are D3-scale objects. */ calculate(size, domain, data, xPadding = 0) { @@ -172,8 +172,8 @@ const Scales = { /** * Return the automatically-generated tick values, but with the last one removed if it is too close to the end. - * @param {d3.scale} scale The scale along which to calculate the tick values. - * @param {Integer} numberOfTicks Number of ticks. + * @param {Object} scale The scale along which to calculate the tick values. + * @param {Number} numberOfTicks Number of ticks. * @return {Array} Tick values. */ truncatedTickValues(scale, numberOfTicks) { diff --git a/src/Core/loadText.js b/src/Core/loadText.js index 477a140e7e5..23ad9b34a00 100644 --- a/src/Core/loadText.js +++ b/src/Core/loadText.js @@ -1,6 +1,6 @@ import { Resource } from "cesium"; -function loadText(urlOrResource, headers) { +function loadText(urlOrResource, headers = undefined) { var resource = Resource.createIfNeeded(urlOrResource); return resource.fetchText({ headers: headers diff --git a/src/ReactViews/BottomDock/Timeline/DateTimePicker.tsx b/src/ReactViews/BottomDock/Timeline/DateTimePicker.tsx index ab40384385c..b0643281511 100644 --- a/src/ReactViews/BottomDock/Timeline/DateTimePicker.tsx +++ b/src/ReactViews/BottomDock/Timeline/DateTimePicker.tsx @@ -9,7 +9,7 @@ import { import { observer } from "mobx-react"; import moment from "moment"; import React from "react"; -import { withTranslation, WithTranslation } from "react-i18next"; +import { TFunction } from "react-i18next"; import styled from "styled-components"; import isDefined from "../../../Core/isDefined"; import { @@ -21,6 +21,7 @@ import { scrollBars } from "../../../Styled/mixins"; import Spacing from "../../../Styled/Spacing"; import Icon from "../../../Styled/Icon"; import { formatDateTime } from "./DateFormats"; +import workingWithTranslation from "../../workingWithTranslation"; const dateFormat = require("dateformat"); const DatePicker = require("react-datepicker").default; @@ -141,7 +142,7 @@ export const DateButton = styled(Button).attrs({ border-radius: 4px; `; -interface PropsType extends WithTranslation { +interface PropsType { dates: ObjectifiedDates; currentDate?: Date; // JS Date object - must be an element of props.dates, or null/undefined. onChange: (date: Date) => void; @@ -150,6 +151,7 @@ interface PropsType extends WithTranslation { onOpen: () => void; onClose: () => void; dateFormat?: string; + t: TFunction; } type Granularity = "century" | "year" | "month" | "day" | "time" | "hour"; @@ -732,4 +734,4 @@ class DateTimePicker extends React.Component { } } -export default withTranslation()(DateTimePicker); +export default workingWithTranslation(DateTimePicker); diff --git a/src/ReactViews/BottomDock/Timeline/Timeline.jsx b/src/ReactViews/BottomDock/Timeline/Timeline.jsx index 22d000ce936..0213e219e26 100644 --- a/src/ReactViews/BottomDock/Timeline/Timeline.jsx +++ b/src/ReactViews/BottomDock/Timeline/Timeline.jsx @@ -12,6 +12,7 @@ import { formatDateTime } from "./DateFormats"; import DateTimePicker from "./DateTimePicker"; import Styles from "./timeline.scss"; import TimelineControls from "./TimelineControls"; +import workingWithTranslation from "../../workingWithTranslation"; @observer class Timeline extends React.Component { @@ -130,4 +131,4 @@ class Timeline extends React.Component { } } -export default withControlledVisibility(withTranslation()(Timeline)); +export default withControlledVisibility(workingWithTranslation(Timeline)); diff --git a/src/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx b/src/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx index aa6772658d0..5e739f6456f 100644 --- a/src/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx +++ b/src/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx @@ -11,10 +11,11 @@ import Terria from "../../../Models/Terria"; import Icon from "../../../Styled/Icon"; import UrlTraits from "../../../Traits/TraitsClasses/UrlTraits"; import Styles from "./chart-expand-and-download-buttons.scss"; +import workingWithTranslation from "../../workingWithTranslation"; const Dropdown = require("../../Generic/Dropdown"); -interface PropsType extends WithTranslation { +interface PropsType { terria: Terria; sourceItems: Promise[]; // Array of items or Promise returning item sourceNames?: string[]; @@ -212,4 +213,4 @@ const ExpandAndDownloadButtons = function (props: { ); }; -export default withTranslation()(ChartExpandAndDownloadButtons); +export default workingWithTranslation(ChartExpandAndDownloadButtons); diff --git a/src/ReactViews/DataCatalog/DataCatalog.jsx b/src/ReactViews/DataCatalog/DataCatalog.jsx deleted file mode 100644 index bf15e7f7d02..00000000000 --- a/src/ReactViews/DataCatalog/DataCatalog.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from "react"; -import { observer } from "mobx-react"; - -import PropTypes from "prop-types"; -import { withTranslation } from "react-i18next"; - -import { defined } from "cesium"; - -import DataCatalogMember from "./DataCatalogMember"; -import SearchHeader from "../Search/SearchHeader"; - -import Styles from "./data-catalog.scss"; - -// Displays the data catalog. -@observer -class DataCatalog extends React.Component { - static propTypes = { - terria: PropTypes.object, - viewState: PropTypes.object, - items: PropTypes.array, - onActionButtonClicked: PropTypes.func, - removable: PropTypes.bool, - t: PropTypes.func.isRequired - }; - - render() { - const searchState = this.props.viewState.searchState; - const isSearching = searchState.catalogSearchText.length > 0; - const catalogSearchProvider = searchState.catalogSearchProvider; - const unfilteredItems = - isSearching && - catalogSearchProvider && - searchState.catalogSearchResults?.results - ? searchState.catalogSearchResults.results.map( - (result) => result.catalogItem - ) - : this.props.items; - const items = (unfilteredItems || []).filter(defined); - const { t } = this.props; - return ( - - ); - } -} - -export default withTranslation()(DataCatalog); diff --git a/src/ReactViews/DataCatalog/DataCatalog.tsx b/src/ReactViews/DataCatalog/DataCatalog.tsx new file mode 100644 index 00000000000..b2300e518a7 --- /dev/null +++ b/src/ReactViews/DataCatalog/DataCatalog.tsx @@ -0,0 +1,95 @@ +import React from "react"; +import { observer } from "mobx-react"; + +import { useTranslation } from "react-i18next"; + +import { defined } from "cesium"; + +import DataCatalogMember from "./DataCatalogMember"; +import SearchHeader from "../Search/SearchHeader"; + +import Styles from "./data-catalog.scss"; +import Terria from "../../Models/Terria"; +import ViewState from "../../ReactViewModels/ViewState"; +import { BaseModel } from "../../Models/Definition/Model"; +import SearchProvider from "../../Models/SearchProviders/SearchProvider"; + +interface PropsType { + terria: Terria; + viewState: ViewState; + items: BaseModel[]; + onActionButtonClicked?: () => void; + removable: boolean; +} + +interface ItemRenderDetails { + isSearching: boolean; + catalogSearchProvider: SearchProvider | undefined; +} + +function renderItem( + props: PropsType, + details: ItemRenderDetails, + item: BaseModel | undefined +) { + if (!item || item === props.terria.catalog.userAddedDataGroup) + return undefined; + + return ( + + ); +} + +// Displays the data catalog. + +const DataCatalog: React.FC = observer((props: PropsType) => { + const searchState = props.viewState.searchState; + const isSearching = searchState.catalogSearchText.length > 0; + const catalogSearchProvider = searchState.catalogSearchProvider; + const unfilteredItems = + isSearching && + catalogSearchProvider && + searchState.catalogSearchResults?.results + ? searchState.catalogSearchResults.results.map( + (result) => result.catalogItem + ) + : props.items; + const items = (unfilteredItems || []).filter(defined); + + const { t } = useTranslation(); + + return ( +
    + {isSearching && catalogSearchProvider + ? [ + , + + ] + : undefined} + {items.map((item) => + renderItem(props, { isSearching, catalogSearchProvider }, item) + )} +
+ ); +}); + +export default DataCatalog; diff --git a/src/ReactViews/FeatureInfo/FeatureInfoPanel.tsx b/src/ReactViews/FeatureInfo/FeatureInfoPanel.tsx index 9ef9d2e8186..89a73c7b6d2 100644 --- a/src/ReactViews/FeatureInfo/FeatureInfoPanel.tsx +++ b/src/ReactViews/FeatureInfo/FeatureInfoPanel.tsx @@ -3,7 +3,7 @@ import { TFunction } from "i18next"; import { action, reaction, runInAction, makeObservable } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import React from "react"; -import { withTranslation } from "react-i18next"; +import { useTranslation, withTranslation } from "react-i18next"; import { Cartesian3 } from "cesium"; import { Ellipsoid } from "cesium"; import { Math as CesiumMath } from "cesium"; @@ -33,6 +33,7 @@ import { withViewState } from "../StandardUserInterface/ViewStateContext"; import Styles from "./feature-info-panel.scss"; import FeatureInfoCatalogItem from "./FeatureInfoCatalogItem"; import DragWrapper from "../DragWrapper"; +import workingWithTranslation from "../workingWithTranslation"; interface Props { viewState: ViewState; @@ -465,4 +466,4 @@ function recurseIntoMembers(catalogItem: BaseModel): BaseModel[] { } export { FeatureInfoPanel }; -export default withTranslation()(withViewState(FeatureInfoPanel)); +export default workingWithTranslation(withViewState(FeatureInfoPanel)); diff --git a/src/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/src/ReactViews/FeatureInfo/FeatureInfoSection.tsx index 94655b6c76e..74a4f896e4c 100644 --- a/src/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/src/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -48,6 +48,8 @@ import { mustacheURLEncodeText, mustacheURLEncodeTextComponent } from "./mustacheExpressions"; +import workingWithTranslation from "../workingWithTranslation"; +import ViewState from "../../ReactViewModels/ViewState"; // We use Mustache templates inside React views, where React does the escaping; don't escape twice, or eg. " => " Mustache.escape = function (string) { @@ -526,4 +528,4 @@ const ButtonsContainer = styled.div` padding: 7px 0 10px 0; `; -export default withTranslation()(withViewState(FeatureInfoSection)); +export default workingWithTranslation(withViewState(FeatureInfoSection)); diff --git a/src/ReactViews/Loader.tsx b/src/ReactViews/Loader.tsx index 4f0ef816c68..e7913078ad1 100644 --- a/src/ReactViews/Loader.tsx +++ b/src/ReactViews/Loader.tsx @@ -1,19 +1,19 @@ import { TFunction } from "i18next"; import React from "react"; -import { withTranslation, WithTranslation } from "react-i18next"; +import { useTranslation } from "react-i18next"; import Box from "../Styled/Box"; import { TextSpan } from "../Styled/Text"; import AnimatedSpinnerIcon from "../Styled/AnimatedSpinnerIcon"; -export interface PropsType extends WithTranslation { +export interface PropsType { message?: string; boxProps?: any; textProps?: any; - t: TFunction; [spread: string]: any; } const Loader: React.FC = (props: PropsType) => { - const { message, t, boxProps, textProps, ...rest }: PropsType = props; + const { t } = useTranslation(); + const { message, boxProps, textProps, ...rest }: PropsType = props; return ( @@ -24,4 +24,4 @@ const Loader: React.FC = (props: PropsType) => { ); }; -export default withTranslation()(Loader); +export default Loader; diff --git a/src/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx b/src/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx index d93280354da..ba3f127b7b4 100644 --- a/src/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx +++ b/src/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx @@ -12,6 +12,7 @@ import Icon, { StyledIcon } from "../../../../Styled/Icon"; import Text from "../../../../Styled/Text"; import { applyTranslationIfExists } from "./../../../../Language/languageHelpers"; import HelpVideoPanel from "./HelpVideoPanel"; +import workingWithTranslation from "../../../workingWithTranslation"; @observer class HelpPanelItem extends React.Component { @@ -135,4 +136,4 @@ const MenuItemText = styled(Text).attrs({ text-align: left; `; -export default withTranslation()(withTheme(HelpPanelItem)); +export default workingWithTranslation(withTheme(HelpPanelItem)); diff --git a/src/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx b/src/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx index 1a4aac2c5e5..87e7ec02c3d 100644 --- a/src/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx +++ b/src/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx @@ -12,6 +12,7 @@ import VideoGuide from "./VideoGuide"; import TrainerPane from "./TrainerPane"; import StyledHtml from "./StyledHtml"; import SatelliteGuide from "../../../Guide/SatelliteGuide"; +import workingWithTranslation from "../../../workingWithTranslation"; const HELP_VIDEO_NAME = "helpVideo"; @@ -127,4 +128,4 @@ class HelpVideoPanel extends React.Component { } } -export default withTranslation()(withTheme(HelpVideoPanel)); +export default workingWithTranslation(withTheme(HelpVideoPanel)); diff --git a/src/ReactViews/Map/Panels/HelpPanel/StyledHtml.tsx b/src/ReactViews/Map/Panels/HelpPanel/StyledHtml.tsx index cb312e5e3e2..339a0fc39d0 100644 --- a/src/ReactViews/Map/Panels/HelpPanel/StyledHtml.tsx +++ b/src/ReactViews/Map/Panels/HelpPanel/StyledHtml.tsx @@ -7,6 +7,8 @@ import Box from "../../../../Styled/Box"; import styled, { withTheme, DefaultTheme } from "../../../../Styled/styled"; import { i18n, TFunction } from "i18next"; import ViewState from "../../../../ReactViewModels/ViewState"; +import { useTranslation } from "react-i18next"; +import { useTheme } from "styled-components"; import { applyTranslationIfExists } from "../../../../Language/languageHelpers"; import { parseCustomMarkdownToReactWithOptions } from "../../../Custom/parseCustomMarkdownToReact"; @@ -23,6 +25,13 @@ const Numbers = styled(Text)<{ darkBg: boolean }>` background-color: ${(props) => props.theme.textDarker}; `; +interface PropsType { + markdown: string; + viewState: ViewState; + styledTextProps?: any; + injectTooltips?: boolean; +} + const renderOrderedList = function (contents: any) { return contents.map((content: any, i: number) => { return ( @@ -41,16 +50,6 @@ const renderOrderedList = function (contents: any) { }); }; -interface PropsType extends WithTranslationProps, WithViewState { - markdown: string; - viewState: ViewState; - theme?: DefaultTheme; - styledTextProps?: any; - injectTooltips?: boolean; - t: TFunction; - i18n: i18n; -} - function renderContentItem(props: PropsType, item: any, i: number) { if (!item) return item; @@ -85,40 +84,30 @@ function renderContentItem(props: PropsType, item: any, i: number) { } } -@observer -export class StyledHtmlRaw extends React.Component { - static displayName = "StyledHtml"; - - static defaultProps = { - injectTooltips: true - }; - - constructor(props: PropsType) { - super(props); - } +const StyledHtml: React.FC = observer((props: PropsType) => { + const { i18n } = useTranslation(); + const theme = useTheme(); - override render() { - const { viewState, injectTooltips, i18n } = this.props; - const styledTextProps = this.props.styledTextProps || {}; + const { viewState, injectTooltips } = props; + const styledTextProps = props.styledTextProps || {}; - const markdownToParse = applyTranslationIfExists(this.props.markdown, i18n); + const markdownToParse = applyTranslationIfExists(props.markdown, i18n); - const parsed = parseCustomMarkdownToReactWithOptions(markdownToParse, { - injectTermsAsTooltips: injectTooltips, - tooltipTerms: viewState.terria.configParameters.helpContentTerms - }); - const content = Array.isArray(parsed.props.children) - ? parsed.props.children - : [parsed.props.children]; + const parsed = parseCustomMarkdownToReactWithOptions(markdownToParse, { + injectTermsAsTooltips: injectTooltips, + tooltipTerms: viewState.terria.configParameters.helpContentTerms + }); + const content = Array.isArray(parsed.props.children) + ? parsed.props.children + : [parsed.props.children]; - return ( -
- {content?.map((item: any, i: number) => - renderContentItem(this.props, item, i) - )} -
- ); - } -} + return ( +
+ {content?.map((item: any, i: number) => + renderContentItem(props, item, i) + )} +
+ ); +}); -export default withTranslation()(withTheme(StyledHtmlRaw)); +export default StyledHtml; diff --git a/src/ReactViews/Map/TrainerBar/TrainerBar.tsx b/src/ReactViews/Map/TrainerBar/TrainerBar.tsx index dc7f263c959..7c5667c39a6 100644 --- a/src/ReactViews/Map/TrainerBar/TrainerBar.tsx +++ b/src/ReactViews/Map/TrainerBar/TrainerBar.tsx @@ -1,7 +1,7 @@ -import { TFunction } from "i18next"; +import { TFunction, i18n } from "i18next"; import { observer } from "mobx-react"; import React from "react"; -import { Translation, WithTranslation, withTranslation } from "react-i18next"; +import { Translation } from "react-i18next"; import styled, { DefaultTheme, withTheme } from "styled-components"; import { HelpContentItem, @@ -22,6 +22,7 @@ import { withViewState } from "../../StandardUserInterface/ViewStateContext"; import { applyTranslationIfExists } from "./../../../Language/languageHelpers"; +import workingWithTranslation from "../../workingWithTranslation"; const StyledHtml: any = require("../../Map/Panels/HelpPanel/StyledHtml").default; @@ -147,7 +148,7 @@ interface StepAccordionState { // Originally written as a SFC but measureElement only supports class components at the moment class StepAccordionRaw extends React.Component< - StepAccordionProps & MeasureElementProps & WithTranslation & WithViewState, + StepAccordionProps & MeasureElementProps & WithViewState, StepAccordionState > { refToMeasure: any; @@ -298,12 +299,13 @@ class StepAccordionRaw extends React.Component< ); } } -const StepAccordion = withTranslation()( +const StepAccordion = workingWithTranslation( withViewState(measureElement(StepAccordionRaw)) ); -interface TrainerBarProps extends WithTranslation, WithViewState { +interface TrainerBarProps extends WithViewState { t: TFunction; + i18n: i18n; theme: DefaultTheme; } @@ -467,4 +469,4 @@ export const TrainerBar = observer((props: TrainerBarProps) => { ); }); -export default withTranslation()(withViewState(withTheme(TrainerBar))); +export default workingWithTranslation(withViewState(withTheme(TrainerBar))); diff --git a/src/ReactViews/Preview/Description.jsx b/src/ReactViews/Preview/Description.jsx index 4ad0d330e8b..77e451643ad 100644 --- a/src/ReactViews/Preview/Description.jsx +++ b/src/ReactViews/Preview/Description.jsx @@ -1,7 +1,7 @@ import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; -import { Trans, withTranslation } from "react-i18next"; +import { Trans } from "react-i18next"; import { defined } from "cesium"; import Box from "../../Styled/Box"; import Button from "../../Styled/Button"; @@ -12,6 +12,7 @@ import ExportData from "./ExportData"; import Styles from "./mappable-preview.scss"; import MetadataTable from "./MetadataTable"; import WarningBox from "./WarningBox"; +import workingWithTranslation from "../workingWithTranslation"; /** * CatalogItem description. @@ -294,4 +295,4 @@ class Description extends React.Component { } } -export default withTranslation()(Description); +export default workingWithTranslation(Description); diff --git a/src/ReactViews/Search/Breadcrumbs.jsx b/src/ReactViews/Search/Breadcrumbs.jsx index c70435a7b3d..5c0cce917d4 100644 --- a/src/ReactViews/Search/Breadcrumbs.jsx +++ b/src/ReactViews/Search/Breadcrumbs.jsx @@ -14,6 +14,7 @@ import getAncestors from "../../Models/getAncestors"; import getDereferencedIfExists from "../../Core/getDereferencedIfExists"; import { runInAction } from "mobx"; import CommonStrata from "../../Models/Definition/CommonStrata"; +import workingWithTranslation from "../workingWithTranslation"; const RawButtonAndUnderline = styled(RawButton)` ${(props) => ` @@ -114,4 +115,4 @@ class Breadcrumbs extends React.Component { } } -export default withTranslation()(withTheme(Breadcrumbs)); +export default workingWithTranslation(withTheme(Breadcrumbs)); diff --git a/src/ReactViews/Tools/ItemSearchTool/ItemSearchTool.tsx b/src/ReactViews/Tools/ItemSearchTool/ItemSearchTool.tsx index 7cf2b4cb760..56f45a60389 100644 --- a/src/ReactViews/Tools/ItemSearchTool/ItemSearchTool.tsx +++ b/src/ReactViews/Tools/ItemSearchTool/ItemSearchTool.tsx @@ -17,12 +17,15 @@ import ErrorComponent from "./ErrorComponent"; import Loading from "./Loading"; import SearchForm from "./SearchForm"; import SearchResults from "./SearchResults"; +import workingWithTranslation from "../../workingWithTranslation"; +import { TFunction } from "i18next"; -export interface PropsType extends WithTranslation { +export interface PropsType { item: SearchableItemMixin.Instance; itemSearchProvider: ItemSearchProvider; viewState: ViewState; afterLoad?: () => void; + t: TFunction; } type State = @@ -156,4 +159,4 @@ function onItemDisabledOrRemovedFromWorkbench( return disposer; } -export default withTranslation()(ItemSearchTool); +export default workingWithTranslation(ItemSearchTool); diff --git a/src/ReactViews/Tools/ItemSearchTool/SearchForm.tsx b/src/ReactViews/Tools/ItemSearchTool/SearchForm.tsx index a86ff8f2081..91254e61049 100644 --- a/src/ReactViews/Tools/ItemSearchTool/SearchForm.tsx +++ b/src/ReactViews/Tools/ItemSearchTool/SearchForm.tsx @@ -1,4 +1,4 @@ -import { WithT } from "i18next"; +import { TFunction, WithT } from "i18next"; import isEmpty from "lodash-es/isEmpty"; import React, { useEffect, useState } from "react"; import { @@ -26,14 +26,16 @@ import Loading from "./Loading"; import Text from "../../../Styled/Text"; import Box from "../../../Styled/Box"; import Button from "../../../Styled/Button"; +import workingWithTranslation from "../../workingWithTranslation"; -export interface SearchFormProps extends WithTranslation { +export interface SearchFormProps { itemSearchProvider: ItemSearchProvider; parameters: ItemSearchParameter[]; query: ItemSearchQuery; onResults: (query: ItemSearchQuery, results: ItemSearchResult[]) => void; onValueChange?: (parameterId: string, value: any) => void; afterLoad?: () => void; + t: TFunction; } type State = @@ -336,4 +338,4 @@ const Select = styled(ReactSelect).attrs({ } `; -export default withTranslation()(SearchForm); +export default workingWithTranslation(SearchForm); diff --git a/src/ReactViews/WelcomeMessage/WelcomeMessage.jsx b/src/ReactViews/WelcomeMessage/WelcomeMessage.jsx index 5cc78d90fa4..9c59b17ae1f 100644 --- a/src/ReactViews/WelcomeMessage/WelcomeMessage.jsx +++ b/src/ReactViews/WelcomeMessage/WelcomeMessage.jsx @@ -56,8 +56,7 @@ class WelcomeMessage extends React.Component { static propTypes = { viewState: PropTypes.object, - theme: PropTypes.object, - t: PropTypes.func.isRequired + theme: PropTypes.object }; constructor(props) { @@ -356,4 +355,4 @@ WelcomeMessagePure.propTypes = { viewState: PropTypes.object.isRequired }; -export default withTranslation()(withViewState(withTheme(WelcomeMessage))); +export default withViewState(withTheme(WelcomeMessage)); diff --git a/src/ReactViews/Workbench/Controls/DateTimeSelectorSection.tsx b/src/ReactViews/Workbench/Controls/DateTimeSelectorSection.tsx index c2275e27473..76f38b14e19 100644 --- a/src/ReactViews/Workbench/Controls/DateTimeSelectorSection.tsx +++ b/src/ReactViews/Workbench/Controls/DateTimeSelectorSection.tsx @@ -16,12 +16,13 @@ import Spacing from "../../../Styled/Spacing"; import Text, { TextSpan } from "../../../Styled/Text"; import { formatDateTime } from "../../BottomDock/Timeline/DateFormats"; import DateTimePicker from "../../BottomDock/Timeline/DateTimePicker"; +import workingWithTranslation from "../../workingWithTranslation"; interface IState { isOpen: boolean; } -interface IProps extends WithTranslation { +interface IProps { item: DiscretelyTimeVaryingMixin.Instance; t: TFunction; } @@ -282,4 +283,4 @@ const TimelineButton = styled(RawButton)<{ active: boolean }>` `} `; -export default withTranslation()(DateTimeSelectorSection); +export default workingWithTranslation(DateTimeSelectorSection); diff --git a/src/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx b/src/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx index 668196ec10d..4412d35862a 100644 --- a/src/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx +++ b/src/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx @@ -1,6 +1,5 @@ import { observer } from "mobx-react"; import React from "react"; -import { WithTranslation, withTranslation } from "react-i18next"; import isDefined from "../../../Core/isDefined"; import { BaseModel } from "../../../Models/Definition/Model"; import SelectableDimensions, { @@ -10,23 +9,22 @@ import SelectableDimensions, { import Box from "../../../Styled/Box"; import SelectableDimension from "../../SelectableDimensions/SelectableDimension"; -interface PropsType extends WithTranslation { +interface PropsType { item: BaseModel; /** Placement used to filter selectableDimensions.placement (eg 'belowLegend) */ placement: Placement; } -@observer -class SelectableDimensionSection extends React.Component { - override render() { - const item = this.props.item; +const SelectableDimensionSection: React.FC = observer( + (props: PropsType) => { + const item = props.item; if (!SelectableDimensions.is(item)) { return null; } - const selectableDimensions = filterSelectableDimensions( - this.props.placement - )(item.selectableDimensions); + const selectableDimensions = filterSelectableDimensions(props.placement)( + item.selectableDimensions + ); if (!isDefined(selectableDimensions) || selectableDimensions.length === 0) { return null; @@ -44,6 +42,6 @@ class SelectableDimensionSection extends React.Component {
); } -} +); -export default withTranslation()(SelectableDimensionSection); +export default SelectableDimensionSection; diff --git a/src/ReactViews/Workbench/Controls/ViewingControls.tsx b/src/ReactViews/Workbench/Controls/ViewingControls.tsx index 610460a9d46..c5df26f2ec0 100644 --- a/src/ReactViews/Workbench/Controls/ViewingControls.tsx +++ b/src/ReactViews/Workbench/Controls/ViewingControls.tsx @@ -2,7 +2,7 @@ import { sortBy, uniqBy } from "lodash"; import { action, computed, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; -import { withTranslation, WithTranslation } from "react-i18next"; +import { TFunction, withTranslation, WithTranslation } from "react-i18next"; import styled from "styled-components"; import { createGuid } from "cesium"; import { defined } from "cesium"; @@ -47,6 +47,7 @@ import SplitterTraits from "../../../Traits/TraitsClasses/SplitterTraits"; import { exportData } from "../../Preview/ExportData"; import LazyItemSearchTool from "../../Tools/ItemSearchTool/LazyItemSearchTool"; import WorkbenchButton from "../WorkbenchButton"; +import workingWithTranslation from "../../workingWithTranslation"; const BoxViewingControl = styled(Box).attrs({ centered: true, @@ -91,9 +92,10 @@ const ViewingControlMenuButton = styled(RawButton).attrs({ } `; -interface PropsType extends WithTranslation { +interface PropsType { viewState: ViewState; item: BaseModel; + t: TFunction; } @observer @@ -574,4 +576,4 @@ class ViewingControls extends React.Component< } } -export default withTranslation()(ViewingControls); +export default workingWithTranslation(ViewingControls); diff --git a/test/Map/StyledHtmlSpec.tsx b/test/Map/StyledHtmlSpec.tsx index 6416c925c4f..815669c1d56 100644 --- a/test/Map/StyledHtmlSpec.tsx +++ b/test/Map/StyledHtmlSpec.tsx @@ -6,7 +6,7 @@ import { act } from "react-dom/test-utils"; import Terria from "../../lib/Models/Terria"; import ViewState from "../../lib/ReactViewModels/ViewState"; import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; -import { StyledHtmlRaw } from "../../lib/ReactViews/Map/Panels/HelpPanel/StyledHtml"; +import StyledHtml from "../../lib/ReactViews/Map/Panels/HelpPanel/StyledHtml"; import { TooltipWithButtonLauncher } from "../../lib/ReactViews/Generic/TooltipWrapper"; import registerCustomComponentTypes from "../../lib/ReactViews/Custom/registerCustomComponentTypes"; @@ -32,7 +32,7 @@ describe("StyledHtml", function () { act(() => { testRenderer = create( - @@ -60,7 +60,7 @@ describe("StyledHtml", function () { act(() => { testRenderer = create( - diff --git a/test/ModelMixins/TileErrorHandlerMixinSpec.ts b/test/ModelMixins/TileErrorHandlerMixinSpec.ts index 45e84f7be8a..83a15d8f499 100644 --- a/test/ModelMixins/TileErrorHandlerMixinSpec.ts +++ b/test/ModelMixins/TileErrorHandlerMixinSpec.ts @@ -1,5 +1,11 @@ import i18next from "i18next"; -import { RequestErrorEvent, Resource, TileProviderError, ImageryProvider, WebMapServiceImageryProvider } from "cesium"; +import { + RequestErrorEvent, + Resource, + TileProviderError, + ImageryProvider, + WebMapServiceImageryProvider +} from "cesium"; import MappableMixin, { MapItem } from "../../lib/ModelMixins/MappableMixin"; import TileErrorHandlerMixin from "../../lib/ModelMixins/TileErrorHandlerMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; @@ -42,7 +48,7 @@ class TestCatalogItem extends TileErrorHandlerMixin( return Promise.resolve(); } - get mapItems(): MapItem[] { + override get mapItems(): MapItem[] { return [ { imageryProvider: this.imageryProvider, diff --git a/test/ModelMixins/TimeFilterMixinSpec.ts b/test/ModelMixins/TimeFilterMixinSpec.ts index 8550b2c49d0..6d1fb2b2a62 100644 --- a/test/ModelMixins/TimeFilterMixinSpec.ts +++ b/test/ModelMixins/TimeFilterMixinSpec.ts @@ -42,12 +42,12 @@ class TestTimeFilterableItem extends TimeFilterMixin( } override async _protected_forceLoadMapItems(): Promise {} - get discreteTimes() { + override get discreteTimes() { return undefined; } @computed - get mapItems() { + override get mapItems() { return []; } } diff --git a/test/Models/Catalog/CatalogItems/CzmlCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/CzmlCatalogItemSpec.ts index 875e9c33509..b6b3c9b9254 100644 --- a/test/Models/Catalog/CatalogItems/CzmlCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/CzmlCatalogItemSpec.ts @@ -22,7 +22,9 @@ describe("CzmlCatalogItem", function () { it("works by URL", async function () { czml.setTrait(CommonStrata.user, "url", "test/CZML/verysimple.czml"); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); it("proxies URLs", async function () { @@ -39,21 +41,27 @@ describe("CzmlCatalogItem", function () { const czmlString = await loadText("test/CZML/verysimple.czml"); czml.setTrait(CommonStrata.user, "czmlString", czmlString); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); it("works by json object", async function () { const czmlJson = await loadJson("test/CZML/verysimple.czml"); czml.setTrait(CommonStrata.user, "czmlData", czmlJson); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); it("works by blob", async function () { const blob = (await loadBlob("test/CZML/verysimple.czml")) as File; czml.setFileInput(blob); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); }); @@ -61,28 +69,36 @@ describe("CzmlCatalogItem", function () { it("works by URL", async function () { czml.setTrait(CommonStrata.user, "url", "test/CZML/Vehicle.czml"); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); it("works by string", async function () { - const czmlString = await loadText("test/CZML/Vehicle.czml"); + const czmlString = await loadText("test/CZML/Vehicle.czml", undefined); czml.setTrait(CommonStrata.user, "czmlString", czmlString); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); it("works by blob", async function () { const blob = (await loadBlob("test/CZML/Vehicle.czml")) as File; czml.setFileInput(blob); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); }); it("can load a CZML file with multiple moving and static objects", async function () { czml.setTrait(CommonStrata.user, "url", "test/CZML/simple.czml"); await czml.loadMapItems(); - expect(czml.mapItems[0].entities.values.length).toBeGreaterThan(0); + expect( + (czml.mapItems[0] as CzmlDataSource).entities.values.length + ).toBeGreaterThan(0); }); describe("Time varying traits", function () { diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 797d59d5d59..70fe1ed146f 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -1,6 +1,14 @@ import { autorun, runInAction } from "mobx"; -import { GeographicTilingScheme, Resource, WebMercatorTilingScheme, WebMapServiceImageryProvider } from "cesium"; -import { ImageryParts } from "../../../../lib/ModelMixins/MappableMixin"; +import { + GeographicTilingScheme, + Resource, + WebMercatorTilingScheme, + WebMapServiceImageryProvider +} from "cesium"; +import { + ImageryParts, + MapItem +} from "../../../../lib/ModelMixins/MappableMixin"; import WebMapServiceCatalogItem from "../../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import Terria from "../../../../lib/Models/Terria"; @@ -123,24 +131,28 @@ describe("WebMapServiceCatalogItem", function () { wms.setTrait("definition", "url", "test/WMS/single_metadata_url.xml"); wms.setTrait("definition", "layers", "single_period"); }); - let mapItems: ImageryParts[] = []; + let mapItems: MapItem[] = []; const cleanup = autorun(() => { mapItems = wms.mapItems.slice(); }); try { await wms.loadMetadata(); expect(mapItems.length).toBe(1); - expect(mapItems[0].alpha).toBeCloseTo(0.8); + expect((mapItems[0] as ImageryParts).alpha).toBeCloseTo(0.8); expect( - mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider ).toBeTruthy(); - if (mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider) { - expect(mapItems[0].imageryProvider.url).toBe( + if ( + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider + ) { + expect((mapItems[0] as any).imageryProvider.url).toBe( "test/WMS/single_metadata_url.xml" ); const tileProviderResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._tileProvider._resource; expect(tileProviderResource.queryParameters.version).toBe("1.3.0"); @@ -152,7 +164,7 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.format).toBe("image/png"); const getFeatureInfoResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._pickFeaturesResource; expect(getFeatureInfoResource.queryParameters.version).toBe("1.3.0"); @@ -166,8 +178,12 @@ describe("WebMapServiceCatalogItem", function () { terria.configParameters.defaultMaximumShownFeatureInfos + 1 ); - expect(mapItems[0].imageryProvider.tileHeight).toBe(256); - expect(mapItems[0].imageryProvider.tileWidth).toBe(256); + expect((mapItems[0] as ImageryParts).imageryProvider.tileHeight).toBe( + 256 + ); + expect((mapItems[0] as ImageryParts).imageryProvider.tileWidth).toBe( + 256 + ); } } finally { cleanup(); @@ -183,22 +199,28 @@ describe("WebMapServiceCatalogItem", function () { wms.setTrait("definition", "useWmsVersion130", false); wms.setTrait("definition", "layers", "IDZ10004"); }); - let mapItems: ImageryParts[] = []; + let mapItems: MapItem[] = []; const cleanup = autorun(() => { mapItems = wms.mapItems.slice(); }); try { await wms.loadMetadata(); expect(mapItems.length).toBe(1); - expect(mapItems[0].alpha).toBeCloseTo(0.8); + expect((mapItems[0] as ImageryParts).alpha).toBeCloseTo(0.8); expect( - mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider ).toBeTruthy(); - if (mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider) { - expect(mapItems[0].imageryProvider.url).toBe("test/WMS/wms_1_1_1.xml"); + if ( + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider + ) { + expect((mapItems[0] as any).imageryProvider.url).toBe( + "test/WMS/wms_1_1_1.xml" + ); const tileProviderResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._tileProvider._resource; expect(tileProviderResource.queryParameters.version).toBe("1.1.1"); @@ -213,7 +235,7 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.transparent).toBeTruthy(); const getFeatureInfoResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._pickFeaturesResource; expect(getFeatureInfoResource.queryParameters.version).toBe("1.1.1"); @@ -230,8 +252,12 @@ describe("WebMapServiceCatalogItem", function () { terria.configParameters.defaultMaximumShownFeatureInfos + 1 ); - expect(mapItems[0].imageryProvider.tileHeight).toBe(256); - expect(mapItems[0].imageryProvider.tileWidth).toBe(256); + expect((mapItems[0] as ImageryParts).imageryProvider.tileHeight).toBe( + 256 + ); + expect((mapItems[0] as ImageryParts).imageryProvider.tileWidth).toBe( + 256 + ); } } finally { cleanup(); @@ -254,24 +280,28 @@ describe("WebMapServiceCatalogItem", function () { }); wms.setTrait("definition", "getFeatureInfoUrl", "another/url"); }); - let mapItems: ImageryParts[] = []; + let mapItems: MapItem[] = []; const cleanup = autorun(() => { mapItems = wms.mapItems.slice(); }); try { await wms.loadMetadata(); expect(mapItems.length).toBe(1); - expect(mapItems[0].alpha).toBeCloseTo(0.8); + expect((mapItems[0] as ImageryParts).alpha).toBeCloseTo(0.8); expect( - mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider ).toBeTruthy(); - if (mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider) { - expect(mapItems[0].imageryProvider.url).toBe( + if ( + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider + ) { + expect((mapItems[0] as any).imageryProvider.url).toBe( "test/WMS/single_metadata_url.xml" ); const tileProviderResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._tileProvider._resource; expect(tileProviderResource.queryParameters.version).toBe("1.3.0"); @@ -285,7 +315,7 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.another).toBe("value"); const getFeatureInfoResource: Resource = ( - mapItems[0].imageryProvider as any + (mapItems[0] as ImageryParts).imageryProvider as any )._pickFeaturesResource; expect(getFeatureInfoResource.queryParameters.version).toBe("1.3.0"); @@ -301,8 +331,12 @@ describe("WebMapServiceCatalogItem", function () { expect(getFeatureInfoResource.queryParameters.some).toBe("thing else"); expect(getFeatureInfoResource.queryParameters.another).toBe("value"); - expect(mapItems[0].imageryProvider.tileHeight).toBe(256); - expect(mapItems[0].imageryProvider.tileWidth).toBe(256); + expect((mapItems[0] as ImageryParts).imageryProvider.tileHeight).toBe( + 256 + ); + expect((mapItems[0] as ImageryParts).imageryProvider.tileWidth).toBe( + 256 + ); } } finally { cleanup(); @@ -321,7 +355,7 @@ describe("WebMapServiceCatalogItem", function () { "Landsat 30+ Barest Earth 25m albers (Combined Landsat)" ); }); - let mapItems: ImageryParts[] = []; + let mapItems: MapItem[] = []; const cleanup = autorun(() => { mapItems = wms.mapItems.slice(); }); @@ -382,18 +416,26 @@ describe("WebMapServiceCatalogItem", function () { wms.setTrait("definition", "tileWidth", 512); wms.setTrait("definition", "tileHeight", 512); }); - let mapItems: ImageryParts[] = []; + let mapItems: MapItem[] = []; const cleanup = autorun(() => { mapItems = wms.mapItems.slice(); }); try { await wms.loadMetadata(); expect( - mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider ).toBeTruthy(); - if (mapItems[0].imageryProvider instanceof WebMapServiceImageryProvider) { - expect(mapItems[0].imageryProvider.tileHeight).toBe(512); - expect(mapItems[0].imageryProvider.tileWidth).toBe(512); + if ( + (mapItems[0] as ImageryParts).imageryProvider instanceof + WebMapServiceImageryProvider + ) { + expect((mapItems[0] as ImageryParts).imageryProvider.tileHeight).toBe( + 512 + ); + expect((mapItems[0] as ImageryParts).imageryProvider.tileWidth).toBe( + 512 + ); } } finally { cleanup(); @@ -823,7 +865,7 @@ describe("WebMapServiceCatalogItem", function () { true ); }); - imageryProvider = item.mapItems[0] + imageryProvider = (item.mapItems[0] as ImageryParts) .imageryProvider as WebMapServiceImageryProvider; }); @@ -890,7 +932,9 @@ describe("WebMapServiceCatalogItem", function () { function getWebMapServiceImageryProvider( item: WebMapServiceCatalogItem ): WebMapServiceImageryProvider | undefined { - const imageryProvider = runInAction(() => item.mapItems[0])?.imageryProvider; + const imageryProvider = runInAction( + () => item.mapItems[0] as ImageryParts + )?.imageryProvider; return imageryProvider instanceof WebMapServiceImageryProvider ? imageryProvider : undefined; diff --git a/test/Models/TerriaSpec.ts b/test/Models/TerriaSpec.ts index 2c2987c0df0..fdc4d6e895a 100644 --- a/test/Models/TerriaSpec.ts +++ b/test/Models/TerriaSpec.ts @@ -1,5 +1,10 @@ import { action, runInAction, toJS } from "mobx"; -import { buildModuleUrl, RequestScheduler, CustomDataSource, Entity } from "cesium"; +import { + buildModuleUrl, + RequestScheduler, + CustomDataSource, + Entity +} from "cesium"; import { SplitDirection } from "cesium"; import hashEntity from "../../lib/Core/hashEntity"; import _loadWithXhr from "../../lib/Core/loadWithXhr"; @@ -1635,7 +1640,7 @@ describe("Terria", function () { const ds = new CustomDataSource("ds"); const entity = new Entity({ name: "foo" }); ds.entities.add(entity); - testItem.mapItems = [ds]; + testItem._private_mapItems = [ds]; await terria.workbench.add(testItem); const entityHash = hashEntity(entity, terria); await terria.loadPickedFeatures({ diff --git a/test/ReactViews/Custom/Chart/ChartCustomComponentSpec.tsx b/test/ReactViews/Custom/Chart/ChartCustomComponentSpec.tsx index 49caebe1328..17d102e28d6 100644 --- a/test/ReactViews/Custom/Chart/ChartCustomComponentSpec.tsx +++ b/test/ReactViews/Custom/Chart/ChartCustomComponentSpec.tsx @@ -123,7 +123,7 @@ class TestChartCustomComponent extends ChartCustomComponent { @@ -1394,7 +1404,7 @@ class TestModel extends MappableMixin( } @observable _discreteTimes: string[] = []; - get discreteTimes() { + override get discreteTimes() { return this._discreteTimes.map((t) => ({ time: t, tag: undefined })); } } diff --git a/test/ReactViews/Tools/ItemSearchTool/MockSearchableItem.ts b/test/ReactViews/Tools/ItemSearchTool/MockSearchableItem.ts index a935ade25fb..a65ab99dd28 100644 --- a/test/ReactViews/Tools/ItemSearchTool/MockSearchableItem.ts +++ b/test/ReactViews/Tools/ItemSearchTool/MockSearchableItem.ts @@ -8,11 +8,11 @@ import SearchableItemTraits from "../../../../lib/Traits/TraitsClasses/Searchabl export default class MockSearchableItem extends SearchableItemMixin( CreateModel(mixTraits(SearchableItemTraits, MappableTraits)) ) { - highlightFeaturesFromItemSearchResults(results: ItemSearchResult[]) { + override highlightFeaturesFromItemSearchResults(results: ItemSearchResult[]) { return () => {}; } - hideFeaturesNotInItemSearchResults(results: ItemSearchResult[]) { + override hideFeaturesNotInItemSearchResults(results: ItemSearchResult[]) { return () => {}; } - zoomToItemSearchResult(result: ItemSearchResult) {} + override zoomToItemSearchResult(result: ItemSearchResult) {} } diff --git a/test/ReactViews/Workbench/Controls/ChartItemSelectorSpec.tsx b/test/ReactViews/Workbench/Controls/ChartItemSelectorSpec.tsx index 0501563ffe5..f26fd1203b0 100644 --- a/test/ReactViews/Workbench/Controls/ChartItemSelectorSpec.tsx +++ b/test/ReactViews/Workbench/Controls/ChartItemSelectorSpec.tsx @@ -17,7 +17,7 @@ import MappableTraits from "../../../../lib/Traits/TraitsClasses/MappableTraits" class SomeChartableItem extends ChartableMixin( CreateModel(mixTraits(UrlTraits, MappableTraits)) ) { - get chartItems() { + override get chartItems() { return [ { item: this,