Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions packages/terriajs/lib/ReactViews/Preview/DataPreview.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import MappablePreview from "./MappablePreview";
import WarningBox from "./WarningBox";
import Styles from "./data-preview.scss";
import Icon from "../../Styled/Icon";
import { getCustomPreviewRenderer } from "./PreviewRenderers";

/**
* Data preview section, for the preview map see DataPreviewMap
Expand Down Expand Up @@ -61,9 +62,11 @@ class DataPreview extends Component {
</div>
);
} else if (previewed && previewed.isMappable) {
const MappablePreviewRenderer =
getCustomPreviewRenderer(previewed.type) ?? MappablePreview;
return (
<div className={Styles.previewInner}>
<MappablePreview
<MappablePreviewRenderer
previewed={previewed}
terria={this.props.terria}
viewState={this.props.viewState}
Expand All @@ -90,17 +93,21 @@ class DataPreview extends Component {
</div>
);
} else if (previewed && CatalogFunctionMixin.isMixedInto(previewed)) {
const FunctionRenderer =
getCustomPreviewRenderer(previewed.type) ?? InvokeFunction;
return (
<InvokeFunction
<FunctionRenderer
previewed={previewed}
terria={this.props.terria}
viewState={this.props.viewState}
/>
);
} else if (previewed && previewed.isGroup) {
const GroupPreviewRenderer =
getCustomPreviewRenderer(previewed.type) ?? GroupPreview;
return (
<div className={Styles.previewInner}>
<GroupPreview
<GroupPreviewRenderer
previewed={previewed}
terria={this.props.terria}
viewState={this.props.viewState}
Expand Down
42 changes: 42 additions & 0 deletions packages/terriajs/lib/ReactViews/Preview/PreviewRenderers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { observable, runInAction } from "mobx";
import { FC } from "react";
import CatalogMemberMixin from "../../ModelMixins/CatalogMemberMixin";

/**
* Custom previewe renderer type
*/
export type PreviewRendererType = FC<{
previewed: CatalogMemberMixin.Instance;
}>;

/**
* Custom preview renderer registry.
*/
const PreviewRenderers = observable(new Map<string, PreviewRendererType>());

/**
* Register a custom preview renderer for the given catalog item type.
*
* Preview renderers, render the `About data` view.
*
* @param type Catalog item type
* @param renderer Preview rendere component
*/
export function registerCustomPreviewRenderer(
type: string,
renderer: PreviewRendererType
) {
runInAction(() => PreviewRenderers.set(type, renderer));
}

/**
* Get registered custom previewer renderer for the given catalog item type
*
* @param type Catalog item type
* @returns Registered custom renderer or `undefined` if no custom renderer is registered for the type.
*/
export function getCustomPreviewRenderer(
type: string
): PreviewRendererType | undefined {
return PreviewRenderers.get(type);
}