diff --git a/typescript/packages/well-log-viewer/src/Storybook/ExternalLayout.stories.tsx b/typescript/packages/well-log-viewer/src/Storybook/ExternalLayout.stories.tsx index 59a003550..7b11c3ee3 100644 --- a/typescript/packages/well-log-viewer/src/Storybook/ExternalLayout.stories.tsx +++ b/typescript/packages/well-log-viewer/src/Storybook/ExternalLayout.stories.tsx @@ -38,7 +38,7 @@ export const RTCTabsLayout: StoryObj = { decorators: [tabDecorator], render: () => ( - , + ), }; diff --git a/typescript/packages/well-log-viewer/src/SyncLogViewer.stories.tsx b/typescript/packages/well-log-viewer/src/SyncLogViewer.stories.tsx index 39b4cf881..bc74f4241 100644 --- a/typescript/packages/well-log-viewer/src/SyncLogViewer.stories.tsx +++ b/typescript/packages/well-log-viewer/src/SyncLogViewer.stories.tsx @@ -10,8 +10,8 @@ const wellpick = require("../../../../example-data/wellpicks.json");// eslint-di import { ToggleButton } from "@mui/material"; import SyncLogViewer, { argTypesSyncLogViewerProp } from "./SyncLogViewer"; -import type WellLogView from "./components/WellLogView"; import type { + WellLogView, WellLogController, TrackMouseEvent, } from "./components/WellLogView"; @@ -129,7 +129,7 @@ const stories: Meta = { }; export default stories; -function fillInfo(controller) { +function fillInfo(controller: WellLogController | undefined) { if (!controller) return "-"; const baseDomain = controller.getContentBaseDomain(); const domain = controller.getContentDomain(); @@ -158,41 +158,41 @@ function fillInfo(controller) { const Template = (args) => { const infoRef = React.useRef(); - const setInfo = function (info) { + const setInfo = function (info: string) { if (infoRef.current) infoRef.current.innerHTML = info; }; - const [controller, setController] = - React.useState(null); // the first WellLog const [controllers, setControllers] = React.useState( [] ); // all WellLogs const onCreateController = React.useCallback( - (iWellLog, controller) => { - if (iWellLog === 0) setController(controller); - + (iWellLog: number, controller: WellLogController) => { setControllers((prev) => [...prev, controller]); }, - [controller] + [] + ); + const onDeleteController = React.useCallback( + (iWellLog: number, controller: WellLogController) => { + setControllers((prev) => prev.filter((c) => c !== controller)); + }, + [] ); const onContentRescale = React.useCallback( - (iWellLog) => { - if (iWellLog === 0) setInfo(fillInfo(controller)); + (iWellLog: number) => { + if (iWellLog === 0) setInfo(fillInfo(controllers[0])); }, - [controller] + [controllers] ); const onContentSelection = React.useCallback( (/*iWellLog*/) => { - /*if(iWellLog===0)*/ setInfo(fillInfo(controller)); + /*if(iWellLog===0)*/ setInfo(fillInfo(controllers[0])); }, - [controller] + [controllers] ); const handleClick = function () { for (const ctrl of controllers) { - if (ctrl) { - ctrl.setControllerDefaultZoom(); - } + if (ctrl) ctrl.setControllerDefaultZoom(); } }; const [checked, setChecked] = React.useState(false); @@ -217,6 +217,7 @@ const Template = (args) => { id="SyncLogViewer" {...args} onCreateController={onCreateController} + onDeleteController={onDeleteController} onContentRescale={onContentRescale} onContentSelection={onContentSelection} onTrackMouseEvent={checked ? onTrackMouseEventCustom : null} @@ -427,6 +428,7 @@ import WellLogZoomSlider from "./components/WellLogZoomSlider"; import WellLogScaleSelector from "./components/WellLogScaleSelector"; import WellInfoIcon from "@mui/icons-material/FormatListBulleted"; // WaterDrop ShowChart, SearchSharp import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward"; + const iconStyle = { fontSize: "18px", verticalAlign: "middle", @@ -514,7 +516,7 @@ CustomLayout.parameters = { Default.tags = ["no-screenshot-test"]; -const TemplateWithSelection = (args) => { +const TemplateWithSelection = (args: { welllogs: WellLog[] }) => { const [showWell1, setShowWell1] = React.useState(true); const [showWell2, setShowWell2] = React.useState(true); const [showWell3, setShowWell3] = React.useState(true); @@ -523,25 +525,27 @@ const TemplateWithSelection = (args) => { [] ); // all WellLogs - const onCreateController = React.useCallback((iWellLog, controller) => { - setControllers((prev) => [...prev, controller]); - }, []); + const onCreateController = React.useCallback( + (iWellLog: number, controller: WellLogController) => { + setControllers((prev) => [...prev, controller]); + }, + [] + ); + const onDeleteController = React.useCallback( + (iWellLog: number, controller: WellLogController) => { + setControllers((prev) => prev.filter((c) => c !== controller)); + }, + [] + ); const filtered: WellLog[] = []; - if (showWell1) { - filtered.push(args.welllogs[0]); - } - if (showWell2) { - filtered.push(args.welllogs[1]); - } - if (showWell3) { - filtered.push(args.welllogs[2]); - } + if (showWell1 && args.welllogs[0]) filtered.push(args.welllogs[0]); + if (showWell2 && args.welllogs[1]) filtered.push(args.welllogs[1]); + if (showWell3 && args.welllogs[2]) filtered.push(args.welllogs[2]); + const handleClick = function () { for (const ctrl of controllers) { - if (ctrl) { - ctrl.setControllerDefaultZoom(); - } + if (ctrl) ctrl.setControllerDefaultZoom(); } }; @@ -557,8 +561,9 @@ const TemplateWithSelection = (args) => {
{ + if (!args.welllogs[1]) alert("No args.welllogs[0]"); setShowWell1(!showWell1); }} > @@ -566,8 +571,9 @@ const TemplateWithSelection = (args) => { { + if (!args.welllogs[1]) alert("No args.welllogs[1]"); setShowWell2(!showWell2); }} > @@ -575,8 +581,9 @@ const TemplateWithSelection = (args) => { { + if (!args.welllogs[2]) alert("No args.welllogs[2]"); setShowWell3(!showWell3); }} > @@ -591,6 +598,7 @@ const TemplateWithSelection = (args) => { id="SyncLogViewer" {...argsWithSelection} onCreateController={onCreateController} + onDeleteController={onDeleteController} />
diff --git a/typescript/packages/well-log-viewer/src/SyncLogViewer.tsx b/typescript/packages/well-log-viewer/src/SyncLogViewer.tsx index 4d9e601a2..c5bca2e50 100644 --- a/typescript/packages/well-log-viewer/src/SyncLogViewer.tsx +++ b/typescript/packages/well-log-viewer/src/SyncLogViewer.tsx @@ -171,6 +171,10 @@ export interface SyncLogViewerProps { iWellLog: number, controller: WellLogController ) => void; + onDeleteController?: ( + iWellLog: number, + controller: WellLogController + ) => void; } export const argTypesSyncLogViewerProp = { @@ -276,6 +280,8 @@ class SyncLogViewer extends Component { onTemplateChangedBind: () => void; }[]; + controllers: WellLogController[]; // for onDeletecontroller implementation + _isMounted: boolean; _inInfoGroupClick: number; @@ -287,20 +293,22 @@ class SyncLogViewer extends Component { this.callbacks = []; this.callbackManagers = []; + this.controllers = []; + this._isMounted = false; this._inInfoGroupClick = 0; - const primaryAxis = this.getDefaultPrimaryAxis(); - this.state = { - primaryAxis: primaryAxis, //"md" + primaryAxis: this.getDefaultPrimaryAxis(), //"md" }; this.onChangePrimaryAxis = this.onChangePrimaryAxis.bind(this); - this.fillViewsCallbacks(this.props.welllogs.length); + this.beforeRender(this.props); } componentDidMount(): void { + this._isMounted = true; + if (this.props.welllogs.length) { this.syncTrackScrollPos(0); this.syncContentScrollPos(0); @@ -310,7 +318,6 @@ class SyncLogViewer extends Component { this.setControllersZoom(); } if (this.props.welllogs.length) this.syncContentSelection(0); - this._isMounted = true; } componentWillUnmount(): void { @@ -327,44 +334,21 @@ class SyncLogViewer extends Component { const ret = !Object.is(this.props, nextProps) || !Object.is(this.state, nextState); + + if (ret) this.beforeRender(nextProps); return ret; } - UNSAFE_componentWillUpdate( - nextProps: SyncLogViewerProps /*, nextState: State*/ - ): void { - // called before render() - if (this.props.welllogs.length === nextProps.welllogs.length) return; - if (this.callbackManagers.length === nextProps.welllogs.length) return; - /* - // move old controllers to new places in the controllers array - const controllers: (WellLogController | null)[] = []; - const spacers: (WellLogSpacer | null)[] = []; - for (const wellLog of nextProps.welllogs) { - const index = this.controllers.findIndex( - (controller) => controller?.getWellLog() === wellLog - ); - if (index < 0) { - controllers.push(null); - spacers.push(null); - } - else { - controllers.push(this.controllers.splice(index, 1)[0]); - spacers.push(this.spacers.splice(index, 1)[0]); - } - } - this.controllers = controllers; - this.spacers = spacers; - */ - // just resize arrays - - this.spacers.length = nextProps.welllogs.length; + beforeRender(props: SyncLogViewerProps): void { + // called before render() but not inside it to avoid onDeleteController notifications + if (this.callbackManagers.length === props.welllogs.length) return; + this.spacers.length = props.welllogs.length; - this.fillViewsCallbacks(nextProps.welllogs.length); // update this.callbackManagers and this.callbacks[] before render() + this.fillViewsCallbacks(props.welllogs.length); // update this.callbackManagers and this.callbacks[] before render() } componentDidUpdate( - prevProps: SyncLogViewerProps /*, prevState: State*/ + prevProps: SyncLogViewerProps /*, prevState: State, snapshot*/ ): void { if ( this.props.welllogs !== prevProps.welllogs || @@ -372,10 +356,8 @@ class SyncLogViewer extends Component { this.props.axisMnemos !== prevProps.axisMnemos || this.props.primaryAxis !== prevProps.primaryAxis ) { - const primaryAxis = this.getAxes().primaryAxis; - this.setState({ - primaryAxis: primaryAxis, - }); + const value = this.getDefaultPrimaryAxis(); + this.onChangePrimaryAxis(value); } if ( @@ -409,30 +391,6 @@ class SyncLogViewer extends Component { } } - getPrimaryAxis(axes: string[]): string { - if (axes) { - const template0 = this.props.templates[0]; - if (template0) { - const scale = template0.scale; - if (scale) { - const primary = scale.primary; - if (axes.indexOf(primary) >= 0) return primary; - } - } - return axes[0]; - } - return "tvd"; // some value - } - - getAxes() { - const _axes = this.props.welllogs.map((welllog: WellLog) => - getAvailableAxes(welllog, this.props.axisMnemos) - ); - const axes = _axes[0]; - const primaryAxis = this.props.primaryAxis || this.getPrimaryAxis(axes); - return { axes, primaryAxis }; - } - fillViewCallbacks(iView: number): void { const callbackManager = new CallbackManager( () => this.props.welllogs[iView] @@ -460,25 +418,37 @@ class SyncLogViewer extends Component { this.fillViewCallbacks(iView); this.callbacks.length = nViews; this.callbackManagers.length = nViews; + + for (let iView = nViews; iView < this.controllers.length; iView++) { + console.assert(this.controllers[iView]); + this.onDeleteController(iView, this.controllers[iView]); + } + this.controllers.length = nViews; + } + + getPrimaryAxis(): string { + return this.state.primaryAxis; } getDefaultPrimaryAxis(): string { + if (this.props.primaryAxis) return this.props.primaryAxis; + const _axes = this.props.welllogs?.map((welllog: WellLog) => getAvailableAxes(welllog, this.props.axisMnemos) ); const axes = _axes?.[0]; let primaryAxis = axes?.[0]; - if (this.props.templates) { - const template = this.props.templates[0]; - if (template) { - template.scale.primary = "tvd"; //!!!!! - if (template.scale.primary && axes) { - if (axes.indexOf(template.scale.primary) >= 0) - primaryAxis = template.scale.primary; + const template = this.props.templates?.[0]; + if (template) { + const scale = template.scale; + if (scale) { + let primary = scale.primary; + if (!primary) primary = "tvd"; //!!!!! + if (primary && axes) { + if (axes.indexOf(primary) >= 0) primaryAxis = primary; } } } - if (this.props.primaryAxis) primaryAxis = this.props.primaryAxis; return primaryAxis; } @@ -496,7 +466,7 @@ class SyncLogViewer extends Component { // callback function from WellLogView onCreateController(iWellLog: number, controller: WellLogController): void { - this.callbackManagers[iWellLog].onCreateController(controller); + this.callbackManagers[iWellLog]?.onCreateController(controller); // set callback to component's caller this.props.onCreateController?.(iWellLog, controller); @@ -504,6 +474,11 @@ class SyncLogViewer extends Component { this.syncTrackScrollPos(iWellLog); this.syncContentScrollPos(iWellLog); this.syncContentSelection(iWellLog); + + this.controllers[iWellLog] = controller; + } + onDeleteController(iWellLog: number, controller: WellLogController): void { + this.props.onDeleteController?.(iWellLog, controller); } // callback function from WellLogView onTrackScroll(iWellLog: number): void { @@ -525,14 +500,14 @@ class SyncLogViewer extends Component { } // callback function from WellLogView onContentSelection(iWellLog: number): void { - this.callbackManagers[iWellLog].onContentSelection(); + this.callbackManagers[iWellLog]?.onContentSelection(); this.syncContentSelection(iWellLog); this.props.onContentSelection?.(iWellLog); } // callback function from WellLogView onTemplateChanged(iWellLog: number): void { - this.callbackManagers[iWellLog].onTemplateChanged(); + this.callbackManagers[iWellLog]?.onTemplateChanged(); this.syncTemplate(iWellLog); @@ -901,6 +876,7 @@ class SyncLogViewer extends Component { selection={this.props.selection} primaryAxis={this.state.primaryAxis} options={options} + // callbacks onInfo={callbackManager.onInfo} onCreateController={callbacks.onCreateControllerBind} onTrackMouseEvent={ diff --git a/typescript/packages/well-log-viewer/src/WellLogViewer.stories.tsx b/typescript/packages/well-log-viewer/src/WellLogViewer.stories.tsx index 8a76c903a..638fa639d 100644 --- a/typescript/packages/well-log-viewer/src/WellLogViewer.stories.tsx +++ b/typescript/packages/well-log-viewer/src/WellLogViewer.stories.tsx @@ -87,7 +87,7 @@ const stories: Meta = { }; export default stories; -function fillInfo(controller) { +function fillInfo(controller: WellLogController | undefined) { if (!controller) return "-"; const baseDomain = controller.getContentBaseDomain(); const domain = controller.getContentDomain(); @@ -119,8 +119,9 @@ const StoryTemplate = (args) => { const setInfo = function (info) { if (infoRef.current) infoRef.current.innerHTML = info; }; - const [controller, setController] = - React.useState(null); + const [controller, setController] = React.useState< + WellLogController | undefined + >(undefined); const onCreateController = React.useCallback( (controller) => { setController(controller); diff --git a/typescript/packages/well-log-viewer/src/WellLogViewer.tsx b/typescript/packages/well-log-viewer/src/WellLogViewer.tsx index b8d737227..e57ee4edf 100644 --- a/typescript/packages/well-log-viewer/src/WellLogViewer.tsx +++ b/typescript/packages/well-log-viewer/src/WellLogViewer.tsx @@ -115,11 +115,17 @@ export default class WellLogViewer extends Component< } // callback function from Axis selector onChangePrimaryAxis(value: string): void { + this.setState({ primaryAxis: value }); this.callbackManager.onChangePrimaryAxis(value); } componentDidMount(): void { this.onContentRescale(); + const controller = this.callbackManager?.controller; + if (controller) { + const trackPos = controller.getTrackScrollPos(); + controller.scrollTrackTo(trackPos); + } } componentWillUnmount(): void { @@ -147,9 +153,8 @@ export default class WellLogViewer extends Component< this.props.axisMnemos !== prevProps.axisMnemos || this.props.primaryAxis !== prevProps.primaryAxis ) { - this.setState({ - primaryAxis: this.getDefaultPrimaryAxis(), - }); + const value = this.getDefaultPrimaryAxis(); + this.onChangePrimaryAxis(value); } } @@ -157,16 +162,24 @@ export default class WellLogViewer extends Component< return this.state.primaryAxis; } getDefaultPrimaryAxis(): string { + if (this.props.primaryAxis) return this.props.primaryAxis; + const axes = getAvailableAxes( this.props.welllog, this.props.axisMnemos ); let primaryAxis = axes[0]; - if (this.props.template && this.props.template.scale.primary) { - if (axes.indexOf(this.props.template.scale.primary) >= 0) - primaryAxis = this.props.template.scale.primary; + const template = this.props.template; + if (template) { + const scale = template.scale; + if (scale) { + let primary = scale.primary; + if (!primary) primary = "tvd"; //!!!!! + if (primary && axes) { + if (axes.indexOf(primary) >= 0) primaryAxis = primary; + } + } } - if (this.props.primaryAxis) primaryAxis = this.props.primaryAxis; return primaryAxis; } @@ -177,21 +190,26 @@ export default class WellLogViewer extends Component< center={ diff --git a/typescript/packages/well-log-viewer/src/components/WellLogAxesPanel.tsx b/typescript/packages/well-log-viewer/src/components/WellLogAxesPanel.tsx index 9c6fe8fce..1bc7f7868 100644 --- a/typescript/packages/well-log-viewer/src/components/WellLogAxesPanel.tsx +++ b/typescript/packages/well-log-viewer/src/components/WellLogAxesPanel.tsx @@ -50,21 +50,35 @@ export class WellLogAxesPanel extends Component { }; this.onChangePrimaryAxis = this.onChangePrimaryAxis.bind(this); + } - this.props.callbackManager.registerCallback( + registerCallbacks(callbackManager: CallbackManager): void { + callbackManager?.registerCallback( "onChangePrimaryAxis", this.onChangePrimaryAxis ); } - - componentWillUnmount(): void { - this.props.callbackManager.unregisterCallback( + unregisterCallbacks(callbackManager: CallbackManager): void { + callbackManager?.unregisterCallback( "onChangePrimaryAxis", this.onChangePrimaryAxis ); } + componentDidMount(): void { + this.registerCallbacks(this.props.callbackManager); + } + + componentWillUnmount(): void { + this.unregisterCallbacks(this.props.callbackManager); + } + componentDidUpdate(prevProps: Props): void { + if (prevProps.callbackManager !== this.props.callbackManager) { + this.unregisterCallbacks(prevProps.callbackManager); + this.registerCallbacks(this.props.callbackManager); + } + const wellog = this.props.callbackManager?.welllog(); if ( this.welllog !== wellog || diff --git a/typescript/packages/well-log-viewer/src/components/WellLogInfoPanel.tsx b/typescript/packages/well-log-viewer/src/components/WellLogInfoPanel.tsx index c310882a6..309fd81ed 100644 --- a/typescript/packages/well-log-viewer/src/components/WellLogInfoPanel.tsx +++ b/typescript/packages/well-log-viewer/src/components/WellLogInfoPanel.tsx @@ -29,7 +29,7 @@ function toggleId( } export class WellLogInfoPanel extends Component { - onGroupClick: (info: Info) => void; + onGroupClick?: (info: Info) => void; collapsedTrackIds: (string | number)[]; constructor(props: Props) { @@ -41,28 +41,25 @@ export class WellLogInfoPanel extends Component { this.onInfo = this.onInfo.bind(this); this.onInfoGroupClick = this.onInfoGroupClick.bind(this); + this.onGroupClick = undefined; + } - const callbackManager = this.props.callbackManager; + registerCallBacks(callbackManager: CallbackManager | undefined): void { + if (!callbackManager) return; this.onGroupClick = callbackManager.callCallbacks.bind( callbackManager, "onInfoGroupClick" ); - } - - componentDidMount(): void { - const callbackManager = this.props.callbackManager; callbackManager.registerCallback("onInfo", this.onInfo); callbackManager.registerCallback( "onInfoGroupClick", this.onInfoGroupClick, true ); - - this.props.callbackManager.updateInfo(); // force onInfo callback to be called } - - componentWillUnmount(): void { - const callbackManager = this.props.callbackManager; + unregisterCallBacks(callbackManager: CallbackManager | undefined): void { + if (!callbackManager) return; + this.onGroupClick = undefined; callbackManager.unregisterCallback("onInfo", this.onInfo); callbackManager.unregisterCallback( "onInfoGroupClick", @@ -70,7 +67,23 @@ export class WellLogInfoPanel extends Component { ); } + componentDidMount(): void { + const callbackManager = this.props.callbackManager; + this.registerCallBacks(callbackManager); + + callbackManager.updateInfo(); // force onInfo callback to be called + } + + componentWillUnmount(): void { + const callbackManager = this.props.callbackManager; + this.unregisterCallBacks(callbackManager); + } + componentDidUpdate(prevProps: Props /*, prevState: State*/): void { + if (prevProps.callbackManager !== this.props.callbackManager) { + this.unregisterCallBacks(prevProps.callbackManager); + this.registerCallBacks(this.props.callbackManager); + } if ( this.props.readoutOptions && (!prevProps.readoutOptions || diff --git a/typescript/packages/well-log-viewer/src/components/WellLogScaleSelector.tsx b/typescript/packages/well-log-viewer/src/components/WellLogScaleSelector.tsx index db1833f46..6fd76cf44 100644 --- a/typescript/packages/well-log-viewer/src/components/WellLogScaleSelector.tsx +++ b/typescript/packages/well-log-viewer/src/components/WellLogScaleSelector.tsx @@ -25,18 +25,37 @@ export class WellLogScaleSelector extends Component { this.onChange = this.onChange.bind(this); this.onContentRescale = this.onContentRescale.bind(this); - this.props.callbackManager?.registerCallback( + } + + registerCallbacks(callbackManager: CallbackManager | undefined): void { + callbackManager?.registerCallback( "onContentRescale", this.onContentRescale ); } - componentWillUnmount(): void { - this.props.callbackManager?.unregisterCallback( + + unregisterCallbacks(callbackManager: CallbackManager | undefined): void { + callbackManager?.unregisterCallback( "onContentRescale", this.onContentRescale ); } + componentDidMount(): void { + this.registerCallbacks(this.props.callbackManager); + } + + componentWillUnmount(): void { + this.unregisterCallbacks(this.props.callbackManager); + } + + componentDidUpdate(prevProps: Props): void { + if (prevProps.callbackManager !== this.props.callbackManager) { + this.unregisterCallbacks(prevProps.callbackManager); + this.registerCallbacks(this.props.callbackManager); + } + } + // callback function from Vertical Scale combobox onChange(value: number): void { const controller = this.props.callbackManager?.controller; diff --git a/typescript/packages/well-log-viewer/src/components/WellLogView.tsx b/typescript/packages/well-log-viewer/src/components/WellLogView.tsx index 7357f1367..aa0cafb60 100644 --- a/typescript/packages/well-log-viewer/src/components/WellLogView.tsx +++ b/typescript/packages/well-log-viewer/src/components/WellLogView.tsx @@ -948,6 +948,8 @@ export interface WellLogController { getTemplate(): Template; getWellLog(): WellLog | undefined; + + setControllerDefaultZoom(): void; // utility function } export function getContentBaseScale( @@ -1310,18 +1312,17 @@ class WellLogView // set callback to component's caller this.props.onCreateController?.(this); - this.setControllerZoom(); - this._isMount = false; } componentDidMount(): void { - this.createLogViewer(); - + this._isMount = true; this.template = deepCopy(this.props.template); // save external template content to current - this.setTracks(true); - this._isMount = true; + if (!this.logController) { + this.createLogViewer(); + this.setTracks(true); + } } componentWillUnmount(): void { diff --git a/typescript/packages/well-log-viewer/src/components/WellLogZoomSlider.tsx b/typescript/packages/well-log-viewer/src/components/WellLogZoomSlider.tsx index 1400d8a01..ff7681872 100644 --- a/typescript/packages/well-log-viewer/src/components/WellLogZoomSlider.tsx +++ b/typescript/packages/well-log-viewer/src/components/WellLogZoomSlider.tsx @@ -23,20 +23,37 @@ export class WellLogZoomSlider extends Component { this.onContentRescale = this.onContentRescale.bind(this); this.onZoomSliderChange = this.onZoomSliderChange.bind(this); + } - this.props.callbackManager?.registerCallback( + registerCallbacks(callbackManager: CallbackManager | undefined): void { + callbackManager?.registerCallback( "onContentRescale", this.onContentRescale ); } - componentWillUnmount(): void { - this.props.callbackManager?.unregisterCallback( + unregisterCallbacks(callbackManager: CallbackManager | undefined): void { + callbackManager?.unregisterCallback( "onContentRescale", this.onContentRescale ); } + componentDidMount(): void { + this.registerCallbacks(this.props.callbackManager); + } + + componentWillUnmount(): void { + this.unregisterCallbacks(this.props.callbackManager); + } + + componentDidUpdate(prevProps: Props): void { + if (prevProps.callbackManager !== this.props.callbackManager) { + this.unregisterCallbacks(prevProps.callbackManager); + this.registerCallbacks(this.props.callbackManager); + } + } + onContentRescale(): void { this.setState((state: Readonly) => { const controller = this.props.callbackManager?.controller; diff --git a/typescript/packages/well-log-viewer/src/utils/log-viewer.ts b/typescript/packages/well-log-viewer/src/utils/log-viewer.ts index 55d3566cb..a50505fc4 100644 --- a/typescript/packages/well-log-viewer/src/utils/log-viewer.ts +++ b/typescript/packages/well-log-viewer/src/utils/log-viewer.ts @@ -19,6 +19,13 @@ export function isEqDomains( d1: Domain /*[number, number]*/, d2: Domain /*[number, number]*/ ): boolean { + if ( + Number.isNaN(d1[1]) || + Number.isNaN(d1[0]) || + Number.isNaN(d2[1]) || + Number.isNaN(d2[0]) + ) + return true; // let's assume all invalid domains are equivalent const eps: number = Math.abs(d1[1] - d1[0] + (d2[1] - d2[0])) * 0.00001; return Math.abs(d1[0] - d2[0]) < eps && Math.abs(d1[1] - d2[1]) < eps; }