@itwin/imodel-components-react 4.4.0 → 4.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/lib/cjs/imodel-components-react/UiIModelComponents.js +2 -4
- package/lib/cjs/imodel-components-react/UiIModelComponents.js.map +1 -1
- package/lib/cjs/imodel-components-react/color/ColorPickerButton.js +1 -1
- package/lib/cjs/imodel-components-react/color/ColorPickerButton.js.map +1 -1
- package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js +1 -1
- package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
- package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js +5 -10
- package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +1 -2
- package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js +2 -2
- package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +3 -2
- package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +1 -2
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js +6 -10
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +3 -7
- package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +1 -2
- package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
- package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js +7 -9
- package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
- package/lib/esm/imodel-components-react/UiIModelComponents.js +2 -4
- package/lib/esm/imodel-components-react/UiIModelComponents.js.map +1 -1
- package/lib/esm/imodel-components-react/color/ColorPickerButton.js +1 -1
- package/lib/esm/imodel-components-react/color/ColorPickerButton.js.map +1 -1
- package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js +1 -1
- package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
- package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js +5 -10
- package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +1 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatSample.js +2 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatType.js +3 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +1 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js +6 -10
- package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +3 -7
- package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +1 -2
- package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
- package/lib/esm/imodel-components-react/viewport/ViewportComponent.js +7 -9
- package/lib/esm/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPickerButton.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/color/ColorPickerButton.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Color\n */\n\nimport \"./ColorPickerButton.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { ColorByName, ColorDef } from \"@itwin/core-common\";\nimport { RelativePosition } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Icon, Popup, useRefs } from \"@itwin/core-react\";\nimport { ColorSwatch } from \"./Swatch\";\nimport { getCSSColorFromDef } from \"./getCSSColorFromDef\";\nimport { SvgCaretDownSmall, SvgCaretUpSmall } from \"@itwin/itwinui-icons-react\";\n\n// cSpell:ignore colorpicker\n\nfunction ColorOptions({\n handleColorPicked,\n options,\n numColumns,\n round,\n title,\n}: {\n handleColorPicked: (color: ColorDef) => void;\n options: ColorDef[];\n numColumns: number;\n round: boolean;\n title?: string;\n}) {\n const containerStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${numColumns}, 1fr)`,\n };\n return (\n <div className=\"components-colorpicker-popup-container\">\n {title && <h4>{title}</h4>}\n <div\n data-testid=\"components-colorpicker-popup-colors\"\n className=\"components-colorpicker-popup-colors\"\n style={containerStyle}\n >\n {options.map((color, index) => (\n <ColorSwatch\n className=\"components-colorpicker-swatch\"\n key={index}\n colorDef={color}\n onColorPick={handleColorPicked}\n round={round}\n />\n ))}\n </div>\n </div>\n );\n}\n\n/** Properties for the [[ColorPickerButton]] React component\n * @beta\n */\nexport interface ColorPickerProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n CommonProps {\n /** Active color */\n initialColor: ColorDef;\n /** Available colors */\n colorDefs?: ColorDef[];\n /** Function to run when user selects color swatch */\n onColorPick?: ((color: ColorDef) => void) | undefined;\n /** Show swatches as squares unless round is set to true */\n round?: boolean;\n /** Disabled or not */\n disabled?: boolean;\n /** Readonly or not */\n readonly?: boolean;\n /** Title to show at top of DropDown */\n dropDownTitle?: string;\n /** Number of columns */\n numColumns?: number;\n /** Provides ability to return reference to HTMLButtonElement */\n ref?: React.Ref<HTMLButtonElement>;\n /** If true show up/down caret next to color */\n showCaret?: boolean;\n}\n\n// Defined using following pattern (const ColorPickerButton at bottom) to ensure useful API documentation is extracted\nconst ForwardRefColorPickerButton = React.forwardRef<\n HTMLButtonElement,\n ColorPickerProps\n>(function ForwardRefColorPickerButton(\n {\n className,\n colorDefs,\n disabled,\n dropDownTitle,\n initialColor,\n numColumns,\n onColorPick,\n readonly,\n round,\n showCaret,\n style,\n },\n ref\n) {\n const target = React.useRef<HTMLButtonElement>(null);\n const refs = useRefs(target, ref); // combine ref needed for target with the forwardRef needed by the Parent when parent is a Type Editor.\n const [showPopup, setShowPopup] = React.useState(false);\n const [colorDef, setColorDef] = React.useState(initialColor);\n\n // See if new initialColor props have changed since component mounted\n React.useEffect(() => {\n setColorDef(initialColor);\n }, [initialColor]);\n\n const defaultColors = React.useRef([\n ColorDef.create(ColorByName.red),\n ColorDef.create(ColorByName.orange),\n ColorDef.create(ColorByName.yellow),\n ColorDef.create(ColorByName.green),\n ColorDef.create(ColorByName.blue),\n ColorDef.create(ColorByName.indigo),\n ColorDef.create(ColorByName.violet),\n ColorDef.create(ColorByName.black),\n ColorDef.create(ColorByName.white),\n ColorDef.create(ColorByName.cyan),\n ColorDef.create(ColorByName.fuchsia),\n ColorDef.create(ColorByName.tan),\n ColorDef.create(ColorByName.gray),\n ColorDef.create(ColorByName.brown),\n ColorDef.create(ColorByName.purple),\n ColorDef.create(ColorByName.olive),\n ]);\n\n const closePopup = React.useCallback(() => {\n setShowPopup(false);\n }, []);\n\n const togglePopup = React.useCallback(() => {\n setShowPopup(!showPopup);\n }, [showPopup]);\n\n const handleColorPicked = React.useCallback(\n (color: ColorDef) => {\n closePopup();\n\n // istanbul ignore else\n if (!color.equals(colorDef)) {\n setColorDef(color);\n onColorPick && onColorPick(color);\n }\n },\n [closePopup, colorDef, onColorPick]\n );\n\n const rgbaString = getCSSColorFromDef(colorDef);\n\n const buttonStyle = { ...style } as React.CSSProperties;\n const swatchStyle = { backgroundColor: rgbaString } as React.CSSProperties;\n\n const buttonClassNames = classnames(\n \"components-colorpicker-button\",\n round && \"round\",\n readonly && \"readonly\",\n className\n );\n\n const colorOptions =\n colorDefs && colorDefs.length ? colorDefs : defaultColors.current;\n return (\n <>\n <button\n data-testid=\"components-colorpicker-button\"\n data-value={rgbaString}\n onClick={togglePopup}\n className={buttonClassNames}\n style={buttonStyle}\n disabled={disabled}\n ref={refs}\n >\n <div className=\"components-colorpicker-button-container\">\n <div\n className=\"components-colorpicker-button-color-swatch\"\n style={swatchStyle}\n data-testid={showPopup ? \"caret-up\" : \"caret-down\"}\n />\n {showCaret && (\n <Icon\n className=\"components-caret\"\n iconSpec={showPopup ? <SvgCaretUpSmall /> : <SvgCaretDownSmall />}\n />\n )}\n </div>\n </button>\n <Popup\n className=\"components-colorpicker-popup\"\n isOpen={showPopup}\n position={RelativePosition.BottomLeft}\n onClose={closePopup}\n target={target.current}\n closeOnNestedPopupOutsideClick\n >\n <ColorOptions\n handleColorPicked={handleColorPicked}\n options={colorOptions}\n numColumns={numColumns ?? 4}\n round={!!round}\n title={dropDownTitle}\n />\n </Popup>\n </>\n );\n});\n\n/** ColorPickerButton component\n * @note Using forwardRef so the ColorEditor (Type Editor) can access the ref of the button element inside this component.\n * @beta\n */\nexport const ColorPickerButton: (\n props: ColorPickerProps\n) => React.ReactElement | null = ForwardRefColorPickerButton;\n"]}
|
|
1
|
+
{"version":3,"file":"ColorPickerButton.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/color/ColorPickerButton.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Color\n */\n\nimport \"./ColorPickerButton.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { ColorByName, ColorDef } from \"@itwin/core-common\";\nimport { RelativePosition } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Icon, Popup, useRefs } from \"@itwin/core-react\";\nimport { ColorSwatch } from \"./Swatch\";\nimport { getCSSColorFromDef } from \"./getCSSColorFromDef\";\nimport { SvgCaretDownSmall, SvgCaretUpSmall } from \"@itwin/itwinui-icons-react\";\n\n// cSpell:ignore colorpicker\n\nfunction ColorOptions({\n handleColorPicked,\n options,\n numColumns,\n round,\n title,\n}: {\n handleColorPicked: (color: ColorDef) => void;\n options: ColorDef[];\n numColumns: number;\n round: boolean;\n title?: string;\n}) {\n const containerStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${numColumns}, 1fr)`,\n };\n return (\n <div className=\"components-colorpicker-popup-container\">\n {title && <h4>{title}</h4>}\n <div\n data-testid=\"components-colorpicker-popup-colors\"\n className=\"components-colorpicker-popup-colors\"\n style={containerStyle}\n >\n {options.map((color, index) => (\n <ColorSwatch\n className=\"components-colorpicker-swatch\"\n key={index}\n colorDef={color}\n onColorPick={handleColorPicked}\n round={round}\n />\n ))}\n </div>\n </div>\n );\n}\n\n/** Properties for the [[ColorPickerButton]] React component\n * @beta\n */\nexport interface ColorPickerProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n CommonProps {\n /** Active color */\n initialColor: ColorDef;\n /** Available colors */\n colorDefs?: ColorDef[];\n /** Function to run when user selects color swatch */\n onColorPick?: ((color: ColorDef) => void) | undefined;\n /** Show swatches as squares unless round is set to true */\n round?: boolean;\n /** Disabled or not */\n disabled?: boolean;\n /** Readonly or not */\n readonly?: boolean;\n /** Title to show at top of DropDown */\n dropDownTitle?: string;\n /** Number of columns */\n numColumns?: number;\n /** Provides ability to return reference to HTMLButtonElement */\n ref?: React.Ref<HTMLButtonElement>;\n /** If true show up/down caret next to color */\n showCaret?: boolean;\n}\n\n// Defined using following pattern (const ColorPickerButton at bottom) to ensure useful API documentation is extracted\nconst ForwardRefColorPickerButton = React.forwardRef<\n HTMLButtonElement,\n ColorPickerProps\n>(function ForwardRefColorPickerButton(\n {\n className,\n colorDefs,\n disabled,\n dropDownTitle,\n initialColor,\n numColumns,\n onColorPick,\n readonly,\n round,\n showCaret,\n style,\n },\n ref\n) {\n const target = React.useRef<HTMLButtonElement>(null);\n const refs = useRefs(target, ref); // combine ref needed for target with the forwardRef needed by the Parent when parent is a Type Editor.\n const [showPopup, setShowPopup] = React.useState(false);\n const [colorDef, setColorDef] = React.useState(initialColor);\n\n // See if new initialColor props have changed since component mounted\n React.useEffect(() => {\n setColorDef(initialColor);\n }, [initialColor]);\n\n const defaultColors = React.useRef([\n ColorDef.create(ColorByName.red),\n ColorDef.create(ColorByName.orange),\n ColorDef.create(ColorByName.yellow),\n ColorDef.create(ColorByName.green),\n ColorDef.create(ColorByName.blue),\n ColorDef.create(ColorByName.indigo),\n ColorDef.create(ColorByName.violet),\n ColorDef.create(ColorByName.black),\n ColorDef.create(ColorByName.white),\n ColorDef.create(ColorByName.cyan),\n ColorDef.create(ColorByName.fuchsia),\n ColorDef.create(ColorByName.tan),\n ColorDef.create(ColorByName.gray),\n ColorDef.create(ColorByName.brown),\n ColorDef.create(ColorByName.purple),\n ColorDef.create(ColorByName.olive),\n ]);\n\n const closePopup = React.useCallback(() => {\n setShowPopup(false);\n }, []);\n\n const togglePopup = React.useCallback(() => {\n setShowPopup(!showPopup);\n }, [showPopup]);\n\n const handleColorPicked = React.useCallback(\n (color: ColorDef) => {\n closePopup();\n\n // istanbul ignore else\n if (!color.equals(colorDef)) {\n setColorDef(color);\n onColorPick && onColorPick(color);\n }\n },\n [closePopup, colorDef, onColorPick]\n );\n\n const rgbaString = getCSSColorFromDef(colorDef);\n\n const buttonStyle = { ...style } as React.CSSProperties;\n const swatchStyle = { backgroundColor: rgbaString } as React.CSSProperties;\n\n const buttonClassNames = classnames(\n \"components-colorpicker-button\",\n round && \"round\",\n readonly && \"readonly\",\n className\n );\n\n const colorOptions =\n colorDefs && colorDefs.length ? colorDefs : defaultColors.current;\n return (\n <>\n <button\n data-testid=\"components-colorpicker-button\"\n data-value={rgbaString}\n onClick={togglePopup}\n className={buttonClassNames}\n style={buttonStyle}\n disabled={disabled}\n ref={refs}\n >\n <div className=\"components-colorpicker-button-container\">\n <div\n className=\"components-colorpicker-button-color-swatch\"\n style={swatchStyle}\n data-testid={showPopup ? \"caret-up\" : \"caret-down\"}\n />\n {showCaret && (\n <Icon\n className=\"components-caret\"\n iconSpec={showPopup ? <SvgCaretUpSmall /> : <SvgCaretDownSmall />}\n />\n )}\n </div>\n </button>\n <Popup\n className=\"components-colorpicker-popup\"\n isOpen={showPopup}\n position={RelativePosition.BottomLeft}\n onClose={closePopup}\n target={target.current}\n closeOnNestedPopupOutsideClick\n >\n <ColorOptions\n handleColorPicked={handleColorPicked}\n options={colorOptions}\n numColumns={numColumns ?? 4}\n round={!!round}\n title={dropDownTitle}\n />\n </Popup>\n </>\n );\n});\n\n/** ColorPickerButton component\n * @note Using forwardRef so the ColorEditor (Type Editor) can access the ref of the button element inside this component.\n * @beta\n */\nexport const ColorPickerButton: (\n props: ColorPickerProps\n) => React.ReactElement | null = ForwardRefColorPickerButton;\n"]}
|
|
@@ -50,7 +50,7 @@ function getUnitLabel(parserSpec) {
|
|
|
50
50
|
return parserSpec.outUnit.label;
|
|
51
51
|
const [unit, label] = format.units[0];
|
|
52
52
|
// istanbul ignore next
|
|
53
|
-
return label
|
|
53
|
+
return label ?? unit.label;
|
|
54
54
|
}
|
|
55
55
|
const ForwardRefQuantityNumberInput = React.forwardRef(function ForwardRefQuantityNumberInput(props, ref) {
|
|
56
56
|
const { containerClassName, persistenceValue, min, max, onChange, onBlur, onKeyDown, step, snap, showTouchButtons, quantityType, ...otherProps } = props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuantityNumberInput.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/QuantityNumberInput.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Inputs\n */\n\nimport \"./QuantityNumberInput.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { Icon } from \"@itwin/core-react\";\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport type {\n QuantityFormatsChangedArgs,\n QuantityTypeArg,\n} from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type {\n ParserSpec,\n UnitConversionSpec,\n UnitProps,\n} from \"@itwin/core-quantity\";\nimport {\n DecimalPrecision,\n FormatterSpec,\n FormatTraits,\n FormatType,\n Parser,\n} from \"@itwin/core-quantity\";\nimport type { InputProps } from \"@itwin/itwinui-react\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport {\n SvgCaretDown,\n SvgCaretDownSmall,\n SvgCaretUp,\n SvgCaretUpSmall,\n} from \"@itwin/itwinui-icons-react\";\n\n/** Step function prototype for [[QuantityNumberInput]] component\n * @beta\n */\nexport type StepFunctionProp =\n | number\n | ((direction: string) => number | undefined);\n\n/** Properties for the [[QuantityNumberInput]] component\n * @beta\n */\nexport interface QuantityNumberInputProps\n extends Omit<\n InputProps,\n \"value\" | \"min\" | \"max\" | \"step\" | \"onFocus\" | \"onChange\"\n > {\n /** Initial magnitude in 'persistence' units. See `getPersistenceUnitByQuantityType` in [QuantityFormatter]($core-frontend).\n * Set to `undefined` to show placeholder text */\n persistenceValue?: number;\n /** CSS class name for the QuantityNumberInput component container div */\n containerClassName?: string;\n /** number or function\tNumber.MIN_SAFE_INTEGER */\n min?: number;\n /** number or function\tdefaults to Number.MAX_SAFE_INTEGER */\n max?: number;\n /** increment step value used while incrementing or decrementing (up/down buttons or arrow keys) defaults to 1. */\n step?: StepFunctionProp;\n /** Set to true to \"snap\" to the closest step value while incrementing or decrementing (up/down buttons or arrow keys). */\n snap?: boolean;\n /** Function to call when the quantity value is changed. The value returned will be in 'persistence' units. */\n onChange?: (value: number) => void;\n /** if true up/down buttons are shown larger and side by side */\n showTouchButtons?: boolean;\n /** Provides ability to return reference to HTMLInputElement */\n ref?: React.Ref<HTMLInputElement>;\n /** Type of quantity being input. */\n quantityType: QuantityTypeArg;\n}\n\n/** adjust formatter spec to show only primary unit without a label. */\nfunction adjustFormatterSpec(formatterSpec: FormatterSpec | undefined) {\n if (undefined === formatterSpec) return formatterSpec;\n const singleUnitConversion: UnitConversionSpec[] = [];\n singleUnitConversion.push(formatterSpec.unitConversions[0]);\n const newFormat = formatterSpec.format.clone({\n showOnlyPrimaryUnit: true,\n traits: formatterSpec.format.formatTraits & ~FormatTraits.ShowUnitLabel,\n type: FormatType.Decimal,\n precision:\n FormatType.Decimal !== formatterSpec.format.type\n ? DecimalPrecision.Four\n : formatterSpec.format.precision,\n });\n return new FormatterSpec(\n \"single-value\",\n newFormat,\n singleUnitConversion,\n formatterSpec.persistenceUnit\n );\n}\n\nfunction convertValueFromDisplayToPersistence(\n value: number,\n unitConversions: UnitConversionSpec[] | undefined,\n unit: UnitProps\n) {\n // istanbul ignore next\n if (!unitConversions || 0 === unitConversions.length) return value;\n\n const unitConversion = unitConversions.find(\n (spec) => spec.name === unit.name\n );\n // istanbul ignore next\n if (!unitConversion) return value;\n\n const convertedValue =\n value * unitConversion.conversion.factor + unitConversion.conversion.offset;\n return convertedValue;\n}\n\nfunction getUnitLabel(parserSpec: ParserSpec | undefined) {\n if (undefined === parserSpec) return \"\";\n\n const format = parserSpec.format;\n // istanbul ignore else\n if (!format.units || !format.units[0]) return parserSpec.outUnit.label;\n const [unit, label] = format.units[0];\n // istanbul ignore next\n return label ?? unit.label;\n}\n\nconst ForwardRefQuantityNumberInput = React.forwardRef<\n HTMLInputElement,\n QuantityNumberInputProps\n>(function ForwardRefQuantityNumberInput(props, ref) {\n const {\n containerClassName,\n persistenceValue,\n min,\n max,\n onChange,\n onBlur,\n onKeyDown,\n step,\n snap,\n showTouchButtons,\n quantityType,\n ...otherProps\n } = props;\n const rawValueRef = React.useRef(persistenceValue);\n\n const [formatterSpec, setFormatterSpec] = React.useState(() =>\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(quantityType)\n )\n );\n const [parserSpec, setParserSpec] = React.useState(() =>\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n\n const formatValue = React.useCallback(\n (value: number | undefined) => {\n if (undefined === value) return \"\";\n\n // istanbul ignore else\n if (formatterSpec) {\n return formatterSpec.applyFormatting(value);\n }\n // istanbul ignore next\n return value.toFixed(2);\n },\n [formatterSpec]\n );\n\n const lastFormattedValueRef = React.useRef(formatValue(persistenceValue));\n const [formattedValue, setFormattedValue] = React.useState(\n () => lastFormattedValueRef.current\n );\n\n React.useEffect(() => {\n const handleUnitSystemChanged = (): void => {\n setFormatterSpec(\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(\n quantityType\n )\n )\n );\n setParserSpec(\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n };\n\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(\n handleUnitSystemChanged\n );\n return () => {\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.removeListener(\n handleUnitSystemChanged\n );\n };\n }, [quantityType]);\n\n React.useEffect(() => {\n const handleUnitSystemChanged = (\n args: QuantityFormatsChangedArgs\n ): void => {\n const quantityKey =\n IModelApp.quantityFormatter.getQuantityTypeKey(quantityType);\n // istanbul ignore else\n if (args.quantityType === quantityKey) {\n setFormatterSpec(\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(\n quantityType\n )\n )\n );\n setParserSpec(\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n }\n };\n\n IModelApp.quantityFormatter.onQuantityFormatsChanged.addListener(\n handleUnitSystemChanged\n );\n return () => {\n IModelApp.quantityFormatter.onQuantityFormatsChanged.removeListener(\n handleUnitSystemChanged\n );\n };\n }, [quantityType]);\n\n const unitLabel = getUnitLabel(parserSpec);\n\n // See if new initialValue props have changed since component mounted\n React.useEffect(() => {\n rawValueRef.current = persistenceValue;\n const currentFormattedValue = formatValue(rawValueRef.current);\n setFormattedValue(currentFormattedValue);\n }, [formatValue, persistenceValue]);\n\n // this is the unprocessed input from user, it is not processed until blur or enter key press\n const handleDisplayValueChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setFormattedValue(event.currentTarget.value);\n },\n []\n );\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n let persistedValue = newValue;\n // istanbul ignore else\n if (parserSpec) {\n // convert value from display unit to persistence unit\n const [unit] = parserSpec.format.units\n ? parserSpec.format.units[0]\n : /* istanbul ignore next */ [parserSpec.outUnit];\n persistedValue = convertValueFromDisplayToPersistence(\n newValue,\n parserSpec.unitConversions,\n unit\n );\n rawValueRef.current = persistedValue;\n }\n const newFormattedVal = formatValue(persistedValue);\n onChange && onChange(persistedValue);\n setFormattedValue(newFormattedVal);\n },\n [formatValue, onChange, parserSpec]\n );\n\n /**\n * Used internally to parse the argument x to it's numeric representation.\n * If the argument cannot be converted to finite number returns 0; If a\n * \"precision\" prop is specified uses it round the number with that\n * precision (no fixed precision here because the return value is float, not\n * string).\n */\n const parseInternal = React.useCallback(\n (x: string | undefined) => {\n if (!x) return 0;\n\n let n = parseFloat(x);\n // istanbul ignore next\n if (isNaN(n) || !isFinite(n)) {\n n = 0;\n }\n\n const localPrecision = 6; // TODO get a reasonable value from format\n const q = Math.pow(10, localPrecision);\n const localMin = undefined === min ? Number.MIN_SAFE_INTEGER : min;\n const localMax = undefined === max ? Number.MAX_SAFE_INTEGER : max;\n n = Math.min(Math.max(n, localMin), localMax);\n n = Math.round(n * q) / q;\n\n return n;\n },\n [min, max]\n );\n\n const updateValueFromString = React.useCallback(\n (strValue: string) => {\n // istanbul ignore else\n if (parserSpec) {\n const parseResult = IModelApp.quantityFormatter.parseToQuantityValue(\n strValue,\n parserSpec\n );\n // at this point we should have a string value in persistence units without a label\n if (Parser.isParsedQuantity(parseResult)) {\n const persistedValue = parseResult.value; // in persistence units\n // set strValue and let it go through parseInternal which will ensure min/max limits are observed\n strValue = formatValue(persistedValue)!;\n } else {\n // istanbul ignore else\n if (rawValueRef.current) {\n // restore last known good value\n const lastKnownFormattedVal = formatValue(rawValueRef.current);\n setFormattedValue(lastKnownFormattedVal);\n return;\n }\n }\n }\n const newValue = parseInternal(strValue);\n // istanbul ignore else\n if (undefined !== newValue) updateValue(newValue);\n },\n [formatValue, parseInternal, parserSpec, updateValue]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n const newVal = parseInternal(event.target.value);\n onBlur && onBlur(event);\n updateValue(newVal);\n },\n [parseInternal, updateValue, onBlur]\n );\n\n const getIncrementValue = React.useCallback(\n (increment: boolean) => {\n if (typeof step === \"function\") {\n const stepVal = step(increment ? \"up\" : \"down\");\n return stepVal ? stepVal : 1;\n }\n\n return !step ? 1 : step;\n },\n [step]\n );\n\n /**\n * The internal method that actually sets the new value on the input\n */\n const applyStep = React.useCallback(\n (increment: boolean) => {\n const incrementValue = getIncrementValue(increment);\n\n let num =\n parseInternal(formattedValue) +\n (increment ? incrementValue : -incrementValue);\n if (snap) {\n num = Math.round(num / incrementValue) * incrementValue;\n }\n\n const localMin = undefined === min ? Number.MIN_SAFE_INTEGER : min;\n const localMax = undefined === max ? Number.MAX_SAFE_INTEGER : max;\n num = Math.min(Math.max(num, localMin), localMax);\n\n updateValue(num);\n },\n [\n formattedValue,\n getIncrementValue,\n max,\n min,\n parseInternal,\n snap,\n updateValue,\n ]\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n // istanbul ignore else\n if (event.key === SpecialKey.Enter) {\n updateValueFromString(event.currentTarget.value);\n event.preventDefault();\n } else if (event.key === SpecialKey.Escape) {\n setFormattedValue(formatValue(rawValueRef.current));\n event.preventDefault();\n } else if (event.key === SpecialKey.ArrowDown) {\n applyStep(false);\n event.preventDefault();\n } else if (event.key === SpecialKey.ArrowUp) {\n applyStep(true);\n event.preventDefault();\n }\n onKeyDown && onKeyDown(event);\n },\n [onKeyDown, updateValueFromString, formatValue, applyStep]\n );\n\n const handleDownClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n applyStep(false);\n event.preventDefault();\n },\n [applyStep]\n );\n\n const handleUpClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n applyStep(true);\n event.preventDefault();\n },\n [applyStep]\n );\n\n // istanbul ignore next\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n event.currentTarget.select();\n },\n []\n );\n\n const isDisabled = !!otherProps.disabled;\n const containerClasses = classnames(\n \"component-quantity-number-input-container\",\n containerClassName,\n showTouchButtons && \"component-number-buttons-for-touch\",\n isDisabled && \"component-quantity-number-input-disabled\"\n );\n\n const caretUp = showTouchButtons ? <SvgCaretUp /> : <SvgCaretUpSmall />;\n const caretDown = showTouchButtons ? <SvgCaretDown /> : <SvgCaretDownSmall />;\n\n return (\n <div className={containerClasses}>\n <div className=\"component-quantity-number-input-value-and-buttons-container\">\n <Input\n ref={ref}\n value={formattedValue}\n onChange={handleDisplayValueChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n size=\"small\"\n {...otherProps}\n />\n <div\n className={classnames(\n \"component-quantity-number-input-buttons-container\",\n showTouchButtons && \"component-number-buttons-for-touch\"\n )}\n >\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className=\"component-quantity-number-input-button component-quantity-number-input-button-up\"\n tabIndex={-1}\n onClick={handleUpClick}\n >\n <Icon iconSpec={caretUp} />\n </div>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className=\"component-quantity-number-input-button component-quantity-number-input-button-down\"\n tabIndex={-1}\n onClick={handleDownClick}\n >\n <Icon iconSpec={caretDown} />\n </div>\n </div>\n </div>\n <span className=\"component-quantity-number-input-suffix\">\n {unitLabel}\n </span>\n </div>\n );\n});\n\n/** The QuantityNumberInput component accepts input for quantity values. The quantity value is shown as a single numeric value and the quantity's\n * \"display\" unit is shown next to the input control. The \"display\" unit is determined by the active unit system as defined by the [QuantityFormatter]($frontend).\n * The control also display buttons to increment and decrement the \"displayed\" value. The value reported by via the onChange function is in \"persistence\"\n * units that can be stored in the iModel.\n * @beta\n */\nexport const QuantityNumberInput: (\n props: QuantityNumberInputProps\n) => React.ReactElement | null = ForwardRefQuantityNumberInput;\n"]}
|
|
1
|
+
{"version":3,"file":"QuantityNumberInput.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/QuantityNumberInput.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Inputs\n */\n\nimport \"./QuantityNumberInput.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { Icon } from \"@itwin/core-react\";\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport type {\n QuantityFormatsChangedArgs,\n QuantityTypeArg,\n} from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type {\n ParserSpec,\n UnitConversionSpec,\n UnitProps,\n} from \"@itwin/core-quantity\";\nimport {\n DecimalPrecision,\n FormatterSpec,\n FormatTraits,\n FormatType,\n Parser,\n} from \"@itwin/core-quantity\";\nimport type { InputProps } from \"@itwin/itwinui-react\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport {\n SvgCaretDown,\n SvgCaretDownSmall,\n SvgCaretUp,\n SvgCaretUpSmall,\n} from \"@itwin/itwinui-icons-react\";\n\n/** Step function prototype for [[QuantityNumberInput]] component\n * @beta\n */\nexport type StepFunctionProp =\n | number\n | ((direction: string) => number | undefined);\n\n/** Properties for the [[QuantityNumberInput]] component\n * @beta\n */\nexport interface QuantityNumberInputProps\n extends Omit<\n InputProps,\n \"value\" | \"min\" | \"max\" | \"step\" | \"onFocus\" | \"onChange\"\n > {\n /** Initial magnitude in 'persistence' units. See `getPersistenceUnitByQuantityType` in [QuantityFormatter]($core-frontend).\n * Set to `undefined` to show placeholder text */\n persistenceValue?: number;\n /** CSS class name for the QuantityNumberInput component container div */\n containerClassName?: string;\n /** number or function\tNumber.MIN_SAFE_INTEGER */\n min?: number;\n /** number or function\tdefaults to Number.MAX_SAFE_INTEGER */\n max?: number;\n /** increment step value used while incrementing or decrementing (up/down buttons or arrow keys) defaults to 1. */\n step?: StepFunctionProp;\n /** Set to true to \"snap\" to the closest step value while incrementing or decrementing (up/down buttons or arrow keys). */\n snap?: boolean;\n /** Function to call when the quantity value is changed. The value returned will be in 'persistence' units. */\n onChange?: (value: number) => void;\n /** if true up/down buttons are shown larger and side by side */\n showTouchButtons?: boolean;\n /** Provides ability to return reference to HTMLInputElement */\n ref?: React.Ref<HTMLInputElement>;\n /** Type of quantity being input. */\n quantityType: QuantityTypeArg;\n}\n\n/** adjust formatter spec to show only primary unit without a label. */\nfunction adjustFormatterSpec(formatterSpec: FormatterSpec | undefined) {\n if (undefined === formatterSpec) return formatterSpec;\n const singleUnitConversion: UnitConversionSpec[] = [];\n singleUnitConversion.push(formatterSpec.unitConversions[0]);\n const newFormat = formatterSpec.format.clone({\n showOnlyPrimaryUnit: true,\n traits: formatterSpec.format.formatTraits & ~FormatTraits.ShowUnitLabel,\n type: FormatType.Decimal,\n precision:\n FormatType.Decimal !== formatterSpec.format.type\n ? DecimalPrecision.Four\n : formatterSpec.format.precision,\n });\n return new FormatterSpec(\n \"single-value\",\n newFormat,\n singleUnitConversion,\n formatterSpec.persistenceUnit\n );\n}\n\nfunction convertValueFromDisplayToPersistence(\n value: number,\n unitConversions: UnitConversionSpec[] | undefined,\n unit: UnitProps\n) {\n // istanbul ignore next\n if (!unitConversions || 0 === unitConversions.length) return value;\n\n const unitConversion = unitConversions.find(\n (spec) => spec.name === unit.name\n );\n // istanbul ignore next\n if (!unitConversion) return value;\n\n const convertedValue =\n value * unitConversion.conversion.factor + unitConversion.conversion.offset;\n return convertedValue;\n}\n\nfunction getUnitLabel(parserSpec: ParserSpec | undefined) {\n if (undefined === parserSpec) return \"\";\n\n const format = parserSpec.format;\n // istanbul ignore else\n if (!format.units || !format.units[0]) return parserSpec.outUnit.label;\n const [unit, label] = format.units[0];\n // istanbul ignore next\n return label ?? unit.label;\n}\n\nconst ForwardRefQuantityNumberInput = React.forwardRef<\n HTMLInputElement,\n QuantityNumberInputProps\n>(function ForwardRefQuantityNumberInput(props, ref) {\n const {\n containerClassName,\n persistenceValue,\n min,\n max,\n onChange,\n onBlur,\n onKeyDown,\n step,\n snap,\n showTouchButtons,\n quantityType,\n ...otherProps\n } = props;\n const rawValueRef = React.useRef(persistenceValue);\n\n const [formatterSpec, setFormatterSpec] = React.useState(() =>\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(quantityType)\n )\n );\n const [parserSpec, setParserSpec] = React.useState(() =>\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n\n const formatValue = React.useCallback(\n (value: number | undefined) => {\n if (undefined === value) return \"\";\n\n // istanbul ignore else\n if (formatterSpec) {\n return formatterSpec.applyFormatting(value);\n }\n // istanbul ignore next\n return value.toFixed(2);\n },\n [formatterSpec]\n );\n\n const lastFormattedValueRef = React.useRef(formatValue(persistenceValue));\n const [formattedValue, setFormattedValue] = React.useState(\n () => lastFormattedValueRef.current\n );\n\n React.useEffect(() => {\n const handleUnitSystemChanged = (): void => {\n setFormatterSpec(\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(\n quantityType\n )\n )\n );\n setParserSpec(\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n };\n\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(\n handleUnitSystemChanged\n );\n return () => {\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.removeListener(\n handleUnitSystemChanged\n );\n };\n }, [quantityType]);\n\n React.useEffect(() => {\n const handleUnitSystemChanged = (\n args: QuantityFormatsChangedArgs\n ): void => {\n const quantityKey =\n IModelApp.quantityFormatter.getQuantityTypeKey(quantityType);\n // istanbul ignore else\n if (args.quantityType === quantityKey) {\n setFormatterSpec(\n adjustFormatterSpec(\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(\n quantityType\n )\n )\n );\n setParserSpec(\n IModelApp.quantityFormatter.findParserSpecByQuantityType(quantityType)\n );\n }\n };\n\n IModelApp.quantityFormatter.onQuantityFormatsChanged.addListener(\n handleUnitSystemChanged\n );\n return () => {\n IModelApp.quantityFormatter.onQuantityFormatsChanged.removeListener(\n handleUnitSystemChanged\n );\n };\n }, [quantityType]);\n\n const unitLabel = getUnitLabel(parserSpec);\n\n // See if new initialValue props have changed since component mounted\n React.useEffect(() => {\n rawValueRef.current = persistenceValue;\n const currentFormattedValue = formatValue(rawValueRef.current);\n setFormattedValue(currentFormattedValue);\n }, [formatValue, persistenceValue]);\n\n // this is the unprocessed input from user, it is not processed until blur or enter key press\n const handleDisplayValueChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setFormattedValue(event.currentTarget.value);\n },\n []\n );\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n let persistedValue = newValue;\n // istanbul ignore else\n if (parserSpec) {\n // convert value from display unit to persistence unit\n const [unit] = parserSpec.format.units\n ? parserSpec.format.units[0]\n : /* istanbul ignore next */ [parserSpec.outUnit];\n persistedValue = convertValueFromDisplayToPersistence(\n newValue,\n parserSpec.unitConversions,\n unit\n );\n rawValueRef.current = persistedValue;\n }\n const newFormattedVal = formatValue(persistedValue);\n onChange && onChange(persistedValue);\n setFormattedValue(newFormattedVal);\n },\n [formatValue, onChange, parserSpec]\n );\n\n /**\n * Used internally to parse the argument x to it's numeric representation.\n * If the argument cannot be converted to finite number returns 0; If a\n * \"precision\" prop is specified uses it round the number with that\n * precision (no fixed precision here because the return value is float, not\n * string).\n */\n const parseInternal = React.useCallback(\n (x: string | undefined) => {\n if (!x) return 0;\n\n let n = parseFloat(x);\n // istanbul ignore next\n if (isNaN(n) || !isFinite(n)) {\n n = 0;\n }\n\n const localPrecision = 6; // TODO get a reasonable value from format\n const q = Math.pow(10, localPrecision);\n const localMin = undefined === min ? Number.MIN_SAFE_INTEGER : min;\n const localMax = undefined === max ? Number.MAX_SAFE_INTEGER : max;\n n = Math.min(Math.max(n, localMin), localMax);\n n = Math.round(n * q) / q;\n\n return n;\n },\n [min, max]\n );\n\n const updateValueFromString = React.useCallback(\n (strValue: string) => {\n // istanbul ignore else\n if (parserSpec) {\n const parseResult = IModelApp.quantityFormatter.parseToQuantityValue(\n strValue,\n parserSpec\n );\n // at this point we should have a string value in persistence units without a label\n if (Parser.isParsedQuantity(parseResult)) {\n const persistedValue = parseResult.value; // in persistence units\n // set strValue and let it go through parseInternal which will ensure min/max limits are observed\n strValue = formatValue(persistedValue)!;\n } else {\n // istanbul ignore else\n if (rawValueRef.current) {\n // restore last known good value\n const lastKnownFormattedVal = formatValue(rawValueRef.current);\n setFormattedValue(lastKnownFormattedVal);\n return;\n }\n }\n }\n const newValue = parseInternal(strValue);\n // istanbul ignore else\n if (undefined !== newValue) updateValue(newValue);\n },\n [formatValue, parseInternal, parserSpec, updateValue]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n const newVal = parseInternal(event.target.value);\n onBlur && onBlur(event);\n updateValue(newVal);\n },\n [parseInternal, updateValue, onBlur]\n );\n\n const getIncrementValue = React.useCallback(\n (increment: boolean) => {\n if (typeof step === \"function\") {\n const stepVal = step(increment ? \"up\" : \"down\");\n return stepVal ? stepVal : 1;\n }\n\n return !step ? 1 : step;\n },\n [step]\n );\n\n /**\n * The internal method that actually sets the new value on the input\n */\n const applyStep = React.useCallback(\n (increment: boolean) => {\n const incrementValue = getIncrementValue(increment);\n\n let num =\n parseInternal(formattedValue) +\n (increment ? incrementValue : -incrementValue);\n if (snap) {\n num = Math.round(num / incrementValue) * incrementValue;\n }\n\n const localMin = undefined === min ? Number.MIN_SAFE_INTEGER : min;\n const localMax = undefined === max ? Number.MAX_SAFE_INTEGER : max;\n num = Math.min(Math.max(num, localMin), localMax);\n\n updateValue(num);\n },\n [\n formattedValue,\n getIncrementValue,\n max,\n min,\n parseInternal,\n snap,\n updateValue,\n ]\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n // istanbul ignore else\n if (event.key === SpecialKey.Enter) {\n updateValueFromString(event.currentTarget.value);\n event.preventDefault();\n } else if (event.key === SpecialKey.Escape) {\n setFormattedValue(formatValue(rawValueRef.current));\n event.preventDefault();\n } else if (event.key === SpecialKey.ArrowDown) {\n applyStep(false);\n event.preventDefault();\n } else if (event.key === SpecialKey.ArrowUp) {\n applyStep(true);\n event.preventDefault();\n }\n onKeyDown && onKeyDown(event);\n },\n [onKeyDown, updateValueFromString, formatValue, applyStep]\n );\n\n const handleDownClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n applyStep(false);\n event.preventDefault();\n },\n [applyStep]\n );\n\n const handleUpClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n applyStep(true);\n event.preventDefault();\n },\n [applyStep]\n );\n\n // istanbul ignore next\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n event.currentTarget.select();\n },\n []\n );\n\n const isDisabled = !!otherProps.disabled;\n const containerClasses = classnames(\n \"component-quantity-number-input-container\",\n containerClassName,\n showTouchButtons && \"component-number-buttons-for-touch\",\n isDisabled && \"component-quantity-number-input-disabled\"\n );\n\n const caretUp = showTouchButtons ? <SvgCaretUp /> : <SvgCaretUpSmall />;\n const caretDown = showTouchButtons ? <SvgCaretDown /> : <SvgCaretDownSmall />;\n\n return (\n <div className={containerClasses}>\n <div className=\"component-quantity-number-input-value-and-buttons-container\">\n <Input\n ref={ref}\n value={formattedValue}\n onChange={handleDisplayValueChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n size=\"small\"\n {...otherProps}\n />\n <div\n className={classnames(\n \"component-quantity-number-input-buttons-container\",\n showTouchButtons && \"component-number-buttons-for-touch\"\n )}\n >\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className=\"component-quantity-number-input-button component-quantity-number-input-button-up\"\n tabIndex={-1}\n onClick={handleUpClick}\n >\n <Icon iconSpec={caretUp} />\n </div>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className=\"component-quantity-number-input-button component-quantity-number-input-button-down\"\n tabIndex={-1}\n onClick={handleDownClick}\n >\n <Icon iconSpec={caretDown} />\n </div>\n </div>\n </div>\n <span className=\"component-quantity-number-input-suffix\">\n {unitLabel}\n </span>\n </div>\n );\n});\n\n/** The QuantityNumberInput component accepts input for quantity values. The quantity value is shown as a single numeric value and the quantity's\n * \"display\" unit is shown next to the input control. The \"display\" unit is determined by the active unit system as defined by the [QuantityFormatter]($frontend).\n * The control also display buttons to increment and decrement the \"displayed\" value. The value reported by via the onChange function is in \"persistence\"\n * units that can be stored in the iModel.\n * @beta\n */\nexport const QuantityNumberInput: (\n props: QuantityNumberInputProps\n) => React.ReactElement | null = ForwardRefQuantityNumberInput;\n"]}
|
|
@@ -175,9 +175,8 @@ class CubeNavigationAid extends React.Component {
|
|
|
175
175
|
}
|
|
176
176
|
};
|
|
177
177
|
this._handleCellHoverChange = (vect, state) => {
|
|
178
|
-
var _a, _b;
|
|
179
178
|
if (this._isInteractionLocked()) {
|
|
180
|
-
|
|
179
|
+
this.props.onAnimationEnd?.();
|
|
181
180
|
return;
|
|
182
181
|
}
|
|
183
182
|
const hoverMap = this.state.hoverMap;
|
|
@@ -193,10 +192,9 @@ class CubeNavigationAid extends React.Component {
|
|
|
193
192
|
return false;
|
|
194
193
|
};
|
|
195
194
|
this._onArrowClick = (arrow) => {
|
|
196
|
-
var _a, _b;
|
|
197
195
|
if (this._isInteractionLocked()) {
|
|
198
196
|
// istanbul ignore next
|
|
199
|
-
|
|
197
|
+
this.props.onAnimationEnd?.();
|
|
200
198
|
return;
|
|
201
199
|
}
|
|
202
200
|
const { newRotation, face } = this.getArrowRotationAndFace(arrow);
|
|
@@ -204,9 +202,8 @@ class CubeNavigationAid extends React.Component {
|
|
|
204
202
|
};
|
|
205
203
|
this._lastClientXY = Vector2d.createZero();
|
|
206
204
|
this._handleBoxMouseDown = (event) => {
|
|
207
|
-
var _a, _b;
|
|
208
205
|
if (this._isInteractionLocked()) {
|
|
209
|
-
|
|
206
|
+
this.props.onAnimationEnd?.();
|
|
210
207
|
return;
|
|
211
208
|
}
|
|
212
209
|
event.preventDefault();
|
|
@@ -231,9 +228,8 @@ class CubeNavigationAid extends React.Component {
|
|
|
231
228
|
};
|
|
232
229
|
// istanbul ignore next - unable to test touch
|
|
233
230
|
this._handleBoxTouchStart = (event) => {
|
|
234
|
-
var _a, _b;
|
|
235
231
|
if (this._isInteractionLocked()) {
|
|
236
|
-
|
|
232
|
+
this.props.onAnimationEnd?.();
|
|
237
233
|
return;
|
|
238
234
|
}
|
|
239
235
|
if (1 !== event.targetTouches.length)
|
|
@@ -262,9 +258,8 @@ class CubeNavigationAid extends React.Component {
|
|
|
262
258
|
window.removeEventListener("touchend", this._onTouchEnd);
|
|
263
259
|
};
|
|
264
260
|
this._handleFaceCellClick = (pos, face) => {
|
|
265
|
-
var _a, _b;
|
|
266
261
|
if (this._isInteractionLocked()) {
|
|
267
|
-
|
|
262
|
+
this.props.onAnimationEnd?.();
|
|
268
263
|
return;
|
|
269
264
|
}
|
|
270
265
|
const { endRotMatrix } = this.state;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CubeNavigationAid.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/navigationaids/CubeNavigationAid.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module NavigationAids\n */\n\nimport \"./CubeNavigationAid.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport type { XYAndZ } from \"@itwin/core-geometry\";\nimport {\n Angle,\n AxisIndex,\n AxisOrder,\n Geometry,\n Matrix3d,\n Point2d,\n Vector2d,\n Vector3d,\n} from \"@itwin/core-geometry\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type { CommonProps, IconSpec } from \"@itwin/core-react\";\nimport { Icon } from \"@itwin/core-react\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\nimport type { ViewRotationChangeEventArgs } from \"../viewport/ViewportComponentEvents\";\nimport { ViewportComponentEvents } from \"../viewport/ViewportComponentEvents\";\nimport { Cube, Face } from \"./Cube\";\nimport {\n SvgCaretDown,\n SvgCaretLeft,\n SvgCaretRight,\n SvgCaretUp,\n} from \"@itwin/itwinui-icons-react\";\n\n/** @public */\nexport enum CubeNavigationHitBoxX {\n None = 0,\n Right = 1,\n Left = -1,\n}\n\n/** @public */\nexport enum CubeNavigationHitBoxY {\n None = 0,\n Back = 1,\n Front = -1,\n}\n\n/** @public */\nexport enum CubeNavigationHitBoxZ {\n None = 0,\n Top = 1,\n Bottom = -1,\n}\n\ninterface CubeNavigationRotationMap {\n up: Face;\n down: Face;\n left: Face;\n right: Face;\n}\n\nconst cubeNavigationFaceLocs: { [key: string]: Vector3d } = {\n [Face.Left]: Vector3d.create(\n CubeNavigationHitBoxX.Left,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Right]: Vector3d.create(\n CubeNavigationHitBoxX.Right,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Back]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.Back,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Front]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.Front,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Bottom]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.Bottom\n ),\n [Face.Top]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.Top\n ),\n};\n\nconst cubeNavigationFaceRotations: { [key: string]: Matrix3d } = {\n [Face.Left]: Matrix3d.createRowValues(0, -1, 0, 0, 0, 1, -1, 0, 0),\n [Face.Right]: Matrix3d.createRowValues(0, 1, 0, 0, 0, 1, 1, 0, 0),\n [Face.Back]: Matrix3d.createRowValues(-1, 0, 0, 0, 0, 1, 0, 1, 0),\n [Face.Front]: Matrix3d.createRowValues(1, 0, 0, 0, 0, 1, 0, -1, 0),\n [Face.Bottom]: Matrix3d.createRowValues(1, 0, 0, 0, -1, 0, 0, 0, -1),\n [Face.Top]: Matrix3d.createRowValues(1, 0, 0, 0, 1, 0, 0, 0, 1),\n};\n\n// data relating Up/Down/Left/Right directions relative to every surface\nconst cubeNavigationRoutes: { [key: string]: CubeNavigationRotationMap } = {\n [Face.Front]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Back]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Right,\n right: Face.Left,\n },\n [Face.Top]: {\n up: Face.Back,\n down: Face.Front,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Bottom]: {\n up: Face.Front,\n down: Face.Back,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Right]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Front,\n right: Face.Back,\n },\n [Face.Left]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Back,\n right: Face.Front,\n },\n};\n\n/** The default tolerance (1.0e-6) is appropriate if very dirty viewing operations are expected. */\nconst DEFAULT_TOLERANCE = 1.0e-6;\n\n/** @internal */\nexport enum CubeHover {\n None = 0,\n Hover,\n Active,\n}\n\n/** Properties for the [[CubeNavigationAid]] component\n * @public\n */\nexport interface CubeNavigationAidProps extends CommonProps {\n iModelConnection: IModelConnection;\n viewport?: Viewport;\n\n // used only in testing\n\n /** @internal */\n onAnimationEnd?: () => void;\n /** @internal */\n animationTime?: number;\n favorHeadsUpRotation?: boolean;\n}\n\n/** @public */\ninterface CubeNavigationAidState {\n dragging: boolean;\n startRotMatrix: Matrix3d;\n endRotMatrix: Matrix3d;\n animation: number;\n hoverMap: { [key: string]: CubeHover };\n face: Face;\n}\n\n/** Cube Navigation Aid Component\n * @public\n */\nexport class CubeNavigationAid extends React.Component<\n CubeNavigationAidProps,\n CubeNavigationAidState\n> {\n private _start: Vector2d = Vector2d.createZero();\n /** @internal */\n public override readonly state: Readonly<CubeNavigationAidState> = {\n dragging: false,\n startRotMatrix: Matrix3d.createIdentity(),\n endRotMatrix: Matrix3d.createIdentity(),\n animation: 1,\n hoverMap: {},\n face: Face.Top,\n };\n\n private _lastTime: number | undefined;\n private _animationFrame: any;\n private _mounted: boolean = false;\n private _labels: { [key: string]: string } = {\n [Face.Right]: UiIModelComponents.translate(\"cube.right\"),\n [Face.Left]: UiIModelComponents.translate(\"cube.left\"),\n [Face.Back]: UiIModelComponents.translate(\"cube.back\"),\n [Face.Front]: UiIModelComponents.translate(\"cube.front\"),\n [Face.Top]: UiIModelComponents.translate(\"cube.top\"),\n [Face.Bottom]: UiIModelComponents.translate(\"cube.bottom\"),\n };\n\n /** @internal */\n public override componentDidMount() {\n this._mounted = true;\n ViewportComponentEvents.onViewRotationChangeEvent.addListener(\n this._handleViewRotationChangeEvent\n );\n\n // set initial rotation\n if (this.props.viewport) {\n const newMatrix = this.props.viewport.view.getRotation().clone();\n this.setState({\n startRotMatrix: newMatrix,\n endRotMatrix: newMatrix,\n animation: 1,\n });\n }\n }\n\n /** @internal */\n public override componentWillUnmount() {\n ViewportComponentEvents.onViewRotationChangeEvent.removeListener(\n this._handleViewRotationChangeEvent\n );\n clearTimeout(this._animationFrame);\n this._mounted = false;\n }\n\n // Synchronize with rotation coming from the Viewport\n private _handleViewRotationChangeEvent = (\n args: ViewRotationChangeEventArgs\n ) => {\n const { animation, dragging, endRotMatrix } = this.state;\n // istanbul ignore else\n if (this.props.viewport === args.viewport && animation >= 1 && !dragging) {\n const newMatrix = this.props.viewport.view.getRotation().clone();\n if (!endRotMatrix.isAlmostEqual(newMatrix)) {\n this.setState({\n startRotMatrix: newMatrix,\n endRotMatrix: newMatrix,\n animation: 1,\n face: Face.None,\n });\n }\n }\n };\n\n private _animation = () => {\n const t = Date.now();\n const delta = this._lastTime ? t - this._lastTime : 16;\n this._lastTime = t;\n if (this.state.animation !== 1) {\n const animation = Math.min(\n 1,\n this.state.animation +\n delta /\n (1000 *\n (this.props.animationTime || /* istanbul ignore next */ 0.4))\n );\n\n // istanbul ignore next\n if (this._mounted) {\n this.setState({ animation }, () => {\n this._animationFrame = setTimeout(this._animation, 16.667);\n });\n }\n } else {\n this._lastTime = undefined;\n this._animationEnd();\n }\n };\n\n private _animationEnd = () => {\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n this.state.face,\n true\n );\n const startRotMatrix = this.state.endRotMatrix.clone();\n // istanbul ignore next\n if (this._mounted) {\n this.setState({ startRotMatrix }, () => {\n // istanbul ignore else\n if (this.props.onAnimationEnd) this.props.onAnimationEnd();\n });\n }\n };\n\n private static _animationFn = (t: number) =>\n t < 0.5 ? 2 * t ** 2 : -1 + (4 - 2 * t) * t;\n\n private static _isMatrixFace = (matrix: Matrix3d): boolean => {\n let sum = 0;\n for (const coff of matrix.coffs) {\n if (Geometry.isAlmostEqualNumber(Math.abs(coff), 1)) sum++;\n }\n // Assuming matrix is a proper rotation matrix:\n // if matrix viewing a face, there will be a total of 3 values either almost -1, or almost 1.\n return sum === 3;\n };\n\n public override render(): React.ReactNode {\n const { animation, startRotMatrix, endRotMatrix } = this.state;\n const visible =\n CubeNavigationAid._isMatrixFace(endRotMatrix) && animation === 1.0;\n const rotMatrix = CubeNavigationAid._interpolateRotMatrix(\n startRotMatrix,\n animation,\n endRotMatrix\n );\n if (rotMatrix !== startRotMatrix && rotMatrix !== endRotMatrix)\n ViewportComponentEvents.setCubeMatrix(rotMatrix, Face.None);\n\n const faces: { [key: string]: React.ReactNode } = {};\n for (const key in this._labels) {\n // istanbul ignore else\n if (this._labels.hasOwnProperty(key)) {\n const f = key as Face;\n const label = this._labels[f];\n faces[f] = (\n <NavCubeFace\n face={f}\n label={label}\n hoverMap={this.state.hoverMap}\n onFaceCellClick={this._handleFaceCellClick}\n onFaceCellHoverChange={this._handleCellHoverChange}\n />\n );\n }\n }\n\n const cubeClassNames = classnames(\n \"nav-cube\",\n this.state.dragging && \"cube-dragging\"\n );\n\n const upTitle = this.getArrowTitle(Pointer.Up);\n const downTitle = this.getArrowTitle(Pointer.Down);\n const leftTitle = this.getArrowTitle(Pointer.Left);\n const rightTitle = this.getArrowTitle(Pointer.Right);\n\n return (\n <div\n className={classnames(\n \"components-cube-container\",\n this.props.className\n )}\n style={this.props.style}\n data-testid=\"components-cube-navigation-aid\"\n onMouseDown={this._handleBoxMouseDown}\n onTouchStart={this._handleBoxTouchStart}\n role=\"presentation\"\n >\n <div className={\"cube-element-container\"}>\n <Cube\n className={cubeClassNames}\n rotMatrix={rotMatrix}\n faces={faces}\n />\n </div>\n <PointerButton\n data-testid=\"cube-pointer-button-up\"\n visible={visible}\n pointerType={Pointer.Up}\n onArrowClick={this._onArrowClick}\n title={upTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-down\"\n visible={visible}\n pointerType={Pointer.Down}\n onArrowClick={this._onArrowClick}\n title={downTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-left\"\n visible={visible}\n pointerType={Pointer.Left}\n onArrowClick={this._onArrowClick}\n title={leftTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-right\"\n visible={visible}\n pointerType={Pointer.Right}\n onArrowClick={this._onArrowClick}\n title={rightTitle}\n />\n </div>\n );\n }\n\n private _handleCellHoverChange = (vect: Vector3d, state: CubeHover) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n const hoverMap = this.state.hoverMap;\n hoverMap[`${vect.x}-${vect.y}-${vect.z}`] = state;\n this.setState({ hoverMap });\n };\n\n private _isInteractionLocked = () => {\n // Locked by markup\n if (\n undefined !== this.props.viewport &&\n this.props.viewport === IModelApp.toolAdmin.markupView\n ) {\n return true;\n }\n return false;\n };\n\n private static _getMatrixFace = (rotMatrix: Matrix3d): Face => {\n if (!CubeNavigationAid._isMatrixFace(rotMatrix)) {\n return Face.None;\n }\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Top].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Top].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Top].coffs[8]\n )\n return Face.Top;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] ===\n cubeNavigationFaceRotations[Face.Bottom].coffs[6] &&\n rotMatrix.coffs[7] ===\n cubeNavigationFaceRotations[Face.Bottom].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Bottom].coffs[8]\n )\n return Face.Bottom;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Left].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Left].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Left].coffs[8]\n )\n return Face.Left;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Right].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Right].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Right].coffs[8]\n )\n return Face.Right;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Back].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Back].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Back].coffs[8]\n )\n return Face.Back;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Front].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Front].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Front].coffs[8]\n )\n return Face.Front;\n\n return Face.None;\n };\n\n private static _interpolateRotMatrix = (\n start: Matrix3d,\n anim: number,\n end: Matrix3d\n ): Matrix3d => {\n if (anim === 0) return start;\n if (anim === 1 || start.isAlmostEqual(end)) return end;\n const startInverse = start.transpose();\n const diff = end.multiplyMatrixMatrix(startInverse);\n const angleAxis = diff.getAxisAndAngleOfRotation();\n // istanbul ignore else\n if (angleAxis.ok) {\n const angle = Angle.createRadians(\n angleAxis.angle.radians * CubeNavigationAid._animationFn(anim)\n );\n const newDiff = Matrix3d.createRotationAroundVector(\n angleAxis.axis,\n angle\n );\n // istanbul ignore else\n if (newDiff) {\n const newMatrix = newDiff.multiplyMatrixMatrix(start);\n return newMatrix;\n }\n }\n // istanbul ignore next\n return end;\n };\n\n private static correctSmallNumber(value: number, tolerance: number): number {\n return Math.abs(value) < tolerance ? 0 : value;\n }\n\n /**\n * Snap coordinates of a vector to zero and to each other so that the vector prefers to be\n * * perpendicular to a face of the unit cube.\n * * or pass through a nearby vertex or edge of the unit cube.\n * @param zVector existing z vector.\n * @param tolerance tolerance to determine if a z vector component is close to zero or 1.\n */\n private static snapVectorToCubeFeatures(\n zVector: XYAndZ,\n tolerance: number\n ): Vector3d {\n const x = CubeNavigationAid.correctSmallNumber(zVector.x, tolerance);\n let y = CubeNavigationAid.correctSmallNumber(zVector.y, tolerance);\n let z = CubeNavigationAid.correctSmallNumber(zVector.z, tolerance);\n\n const xx = x === -0 ? Math.abs(x) : x;\n const yy = y === -0 ? Math.abs(y) : y;\n const zz = z === -0 ? Math.abs(z) : z;\n\n // adjust any adjacent pair of near equal values to the first.\n // istanbul ignore next\n if (Geometry.isSameCoordinate(xx, yy, tolerance)) {\n y = Geometry.split3WaySign(y, -xx, xx, xx);\n }\n if (Geometry.isSameCoordinate(yy, zz, tolerance)) {\n z = Geometry.split3WaySign(z, -yy, yy, yy);\n }\n if (Geometry.isSameCoordinate(xx, zz, tolerance)) {\n z = Geometry.split3WaySign(z, -xx, xx, xx);\n }\n return Vector3d.create(x, y, z);\n }\n\n /**\n * Adjust a worldToView matrix to favor both\n * * direct view at faces, edges, and corners of a view cube.\n * * heads up\n * @param worldToView candidate matrix\n * @param tolerance tolerance for cleaning up fuzz. The default (1.0e-6) is appropriate if very dirty viewing operations are expected.\n * @param result optional result.\n */\n private static snapWorldToViewMatrixToCubeFeatures(\n worldToView: Matrix3d,\n tolerance: number,\n result?: Matrix3d,\n favorHeadsUpRotation?: boolean\n ): Matrix3d {\n const oldZ = worldToView.rowZ();\n const newZ = CubeNavigationAid.snapVectorToCubeFeatures(oldZ, tolerance);\n const headsUp = !!favorHeadsUpRotation;\n // If newZ is true up or down, it will have true 0 for x and y.\n // special case this to take x direction from the input.\n // This methodology results in always \"righting\" the face when rotation from an upside-down cube.\n // The behavior was made opt-in in response to https://github.com/iTwin/appui/issues/259\n // istanbul ignore next\n if (!headsUp || (newZ.x === 0.0 && newZ.y === 0)) {\n const perpVector = worldToView.rowX();\n result = Matrix3d.createRigidFromColumns(\n newZ,\n perpVector,\n AxisOrder.ZXY,\n result\n )!;\n } else {\n result = Matrix3d.createRigidViewAxesZTowardsEye(\n newZ.x,\n newZ.y,\n newZ.z,\n result\n );\n }\n // istanbul ignore else\n if (result) result.transposeInPlace();\n return result;\n }\n\n private getArrowRotationAndFace(arrow: Pointer): {\n newRotation: Matrix3d;\n face: Face;\n } {\n const localRotationAxis = Vector3d.create(0, 0, 0);\n switch (arrow) {\n case Pointer.Up:\n localRotationAxis.x = -1.0;\n break;\n case Pointer.Down:\n localRotationAxis.x = 1.0;\n break;\n case Pointer.Left:\n localRotationAxis.y = -1.0;\n break;\n default:\n localRotationAxis.y = 1.0;\n break;\n }\n const localRotation = Matrix3d.createRotationAroundVector(\n localRotationAxis,\n Angle.createDegrees(-90)\n )!;\n const newRotation = localRotation.multiplyMatrixMatrix(\n this.state.endRotMatrix\n );\n CubeNavigationAid.snapWorldToViewMatrixToCubeFeatures(\n newRotation,\n DEFAULT_TOLERANCE,\n newRotation,\n this.props.favorHeadsUpRotation\n );\n const face = CubeNavigationAid._getMatrixFace(newRotation);\n return { newRotation, face };\n }\n\n private _onArrowClick = (arrow: Pointer) => {\n if (this._isInteractionLocked()) {\n // istanbul ignore next\n this.props.onAnimationEnd?.();\n return;\n }\n const { newRotation, face } = this.getArrowRotationAndFace(arrow);\n this._animateRotation(newRotation, face);\n };\n\n private getArrowTitle(arrow: Pointer) {\n const { face } = this.getArrowRotationAndFace(arrow);\n return this._labels[face];\n }\n\n private _lastClientXY: Vector2d = Vector2d.createZero();\n private _processDrag(mousePos: Vector2d) {\n // istanbul ignore else\n if (!this._start.isAlmostEqual(mousePos)) {\n const movement = mousePos.minus(this._lastClientXY);\n const diff = movement.scale(0.05);\n\n const yaw = Angle.createRadians(diff.x);\n const pitch = Angle.createRadians(diff.y);\n\n const matX = Matrix3d.createRotationAroundAxisIndex(AxisIndex.X, pitch);\n const matZ = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, yaw);\n\n const mat = matX\n .multiplyMatrixMatrix(this.state.startRotMatrix)\n .multiplyMatrixMatrix(matZ);\n this._setRotation(mat, CubeNavigationAid._getMatrixFace(mat));\n if (!this.state.dragging) this.setState({ dragging: true });\n }\n this._lastClientXY = mousePos;\n }\n\n private _handleBoxMouseDown = (event: any) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n event.preventDefault();\n // only start listening after drag is confirmed. Ie. the 3D box is clicked.\n window.addEventListener(\"mousemove\", this._onMouseMove, false);\n window.addEventListener(\"mouseup\", this._onMouseUp, false);\n this._lastClientXY = Vector2d.create(event.clientX, event.clientY);\n this._start = this._lastClientXY;\n };\n\n private _onMouseMove = (event: MouseEvent) => {\n const mousePos = Vector2d.create(event.clientX, event.clientY);\n this._processDrag(mousePos);\n };\n\n private _onMouseUp = () => {\n if (this.state.dragging) {\n this.setState({ dragging: false });\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n CubeNavigationAid._getMatrixFace(this.state.endRotMatrix),\n true\n );\n }\n\n // remove so event only triggers after this.onMouseStartDrag\n window.removeEventListener(\"mousemove\", this._onMouseMove);\n window.removeEventListener(\"mouseup\", this._onMouseUp);\n };\n\n // istanbul ignore next - unable to test touch\n private _handleBoxTouchStart = (event: any) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n if (1 !== event.targetTouches.length) return;\n window.addEventListener(\"touchmove\", this._onTouchMove, false);\n window.addEventListener(\"touchend\", this._onTouchEnd, false);\n this._lastClientXY = Vector2d.create(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n this._start = this._lastClientXY;\n };\n\n // istanbul ignore next - unable to test touch\n private _onTouchMove = (event: TouchEvent) => {\n if (1 !== event.targetTouches.length) return;\n const mousePos = Vector2d.create(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n this._processDrag(mousePos);\n };\n\n // istanbul ignore next - unable to test touch\n private _onTouchEnd = (event: TouchEvent) => {\n if (0 !== event.targetTouches.length) return;\n\n if (this.state.dragging) {\n this.setState({ dragging: false });\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n CubeNavigationAid._getMatrixFace(this.state.endRotMatrix),\n true\n );\n }\n\n window.removeEventListener(\"touchmove\", this._onTouchMove);\n window.removeEventListener(\"touchend\", this._onTouchEnd);\n };\n\n private _handleFaceCellClick = (pos: Vector3d, face: Face) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n const { endRotMatrix } = this.state;\n let rotMatrix = Matrix3d.createRigidViewAxesZTowardsEye(\n pos.x,\n pos.y,\n pos.z\n ).inverse();\n // istanbul ignore else\n if (rotMatrix) {\n // if isMatrixFace and user is clicking on top/bottom, the current matrix face must be top or bottom\n if (\n !CubeNavigationAid._isMatrixFace(endRotMatrix) &&\n (face === Face.Top || face === Face.Bottom)\n ) {\n const angleAxis = endRotMatrix.getAxisAndAngleOfRotation();\n // istanbul ignore else\n if (angleAxis.ok) {\n const xAx = endRotMatrix.columnX();\n const a = Math.atan2(xAx.y, xAx.x);\n const r = (Math.round((a * 2) / Math.PI) * Math.PI) / 2; // round to quarter turn intervals\n const rot = Matrix3d.createRotationAroundAxisIndex(\n AxisIndex.Z,\n Angle.createRadians(r)\n );\n rotMatrix = rot.multiplyMatrixMatrix(rotMatrix);\n }\n }\n this._animateRotation(rotMatrix, face);\n }\n window.removeEventListener(\"mousemove\", this._onMouseMove);\n };\n\n private _animateRotation = (endRotMatrix: Matrix3d, face: Face) => {\n if (this.state.endRotMatrix.isAlmostEqual(endRotMatrix)) return;\n // set animation variables, let css transitions animate it.\n this._animationFrame = setTimeout(this._animation, 16.667);\n this.setState((prevState) => ({\n startRotMatrix: prevState.endRotMatrix,\n endRotMatrix,\n animation: 0,\n face,\n }));\n };\n\n private _setRotation = (endRotMatrix: Matrix3d, face: Face) => {\n ViewportComponentEvents.setCubeMatrix(endRotMatrix, face);\n // set variables, with animTime at 0 to prevent animation.\n this.setState({\n startRotMatrix: endRotMatrix,\n endRotMatrix,\n animation: 1,\n face,\n });\n };\n}\n\n/** @internal */\nexport interface NavCubeFaceProps\n extends React.AllHTMLAttributes<HTMLDivElement> {\n face: Face;\n label: string;\n hoverMap: { [key: string]: CubeHover };\n onFaceCellClick: (vector: Vector3d, face: Face) => void;\n onFaceCellHoverChange: (vector: Vector3d, state: CubeHover) => void;\n}\n\n/** @internal */\nexport class NavCubeFace extends React.Component<NavCubeFaceProps> {\n private includeCell(vector: Vector3d): boolean {\n const { x, y, z } = vector;\n const omittedCell =\n (y === 0 && x !== 0 && z !== 0) ||\n (y !== 0 && x === 0 && z !== 0) ||\n (y !== 0 && x !== 0 && z === 0);\n return !omittedCell;\n }\n public override render(): React.ReactNode {\n const { face, hoverMap, onFaceCellClick, onFaceCellHoverChange, label } =\n this.props;\n return (\n <div className=\"nav-cube-face\" data-testid=\"nav-cube-face\">\n {[-1, 0, 1].map((y: number) => {\n return (\n <FaceRow key={y} center={y === 0}>\n {[-1, 0, 1].map((x: number) => {\n const vector = NavCubeFace.faceCellToPos(face, x, y);\n if (this.includeCell(vector)) {\n // return a fully functional cell\n return (\n <FaceCell\n key={x}\n onFaceCellHoverChange={onFaceCellHoverChange}\n onFaceCellClick={onFaceCellClick}\n hoverMap={hoverMap}\n vector={vector}\n face={face}\n center={x === 0}\n >\n {x === 0 && y === 0 && label}\n </FaceCell>\n );\n } else {\n // return a placeholder cell\n return (\n <FaceCell\n key={x}\n vector={vector}\n face={face}\n center={x === 0}\n />\n );\n }\n })}\n </FaceRow>\n );\n })}\n </div>\n );\n }\n public static faceCellToPos = (face: Face, x: number, y: number) => {\n const faceVect = cubeNavigationFaceLocs[face];\n const route = cubeNavigationRoutes[face];\n\n const faceX = x < 0 ? route.left : x > 0 ? route.right : Face.None;\n const xVect =\n faceX !== Face.None\n ? cubeNavigationFaceLocs[faceX]\n : Vector3d.createZero();\n\n const faceY = y < 0 ? route.up : y > 0 ? route.down : Face.None;\n const yVect =\n faceY !== Face.None\n ? cubeNavigationFaceLocs[faceY]\n : Vector3d.createZero();\n\n return faceVect.plus(xVect).plus(yVect);\n };\n}\n\ninterface FaceRowProps extends React.AllHTMLAttributes<HTMLDivElement> {\n center?: boolean;\n}\n\nclass FaceRow extends React.Component<FaceRowProps> {\n public override render(): React.ReactNode {\n const { center, children, ...props } = this.props;\n const classNames = classnames(\"face-row\", center && \"cube-center\");\n return (\n <div className={classNames} {...props}>\n {children}\n </div>\n );\n }\n}\n\n/** @internal */\nexport interface FaceCellProps extends React.AllHTMLAttributes<HTMLDivElement> {\n center?: boolean;\n onFaceCellClick?: (vector: Vector3d, face: Face) => void;\n onFaceCellHoverChange?: (vector: Vector3d, state: CubeHover) => void;\n hoverMap?: { [key: string]: CubeHover };\n vector: Vector3d;\n face: Face;\n}\n\n/** @internal */\nexport class FaceCell extends React.Component<FaceCellProps> {\n private _startMouse: Point2d | undefined;\n public override render(): React.ReactNode {\n const {\n center,\n children,\n onFaceCellClick,\n onFaceCellHoverChange,\n hoverMap,\n face,\n vector,\n ...props\n } = this.props;\n const { x, y, z } = vector;\n const n = `${x}-${y}-${z}`;\n const hover = hoverMap && hoverMap[n] === CubeHover.Hover;\n const active = hoverMap && hoverMap[n] === CubeHover.Active;\n const classNames = classnames(\n \"face-cell\",\n center && \"cube-center\",\n hover && \"cube-hover\",\n active && \"cube-active\"\n );\n\n return (\n <div // eslint-disable-line jsx-a11y/mouse-events-have-key-events\n onMouseDown={this._handleMouseDown}\n onMouseUp={this._handleMouseUp}\n onMouseOver={this._handleMouseOver}\n onMouseOut={this._handleMouseOut}\n onTouchStart={this._handleTouchStart}\n onTouchEnd={this._handleTouchEnd}\n data-testid={`nav-cube-face-cell-${face}-${n}`}\n className={classNames}\n role=\"presentation\"\n {...props}\n >\n {children}\n </div>\n );\n }\n private _handleMouseOver = () => {\n const { vector } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.Hover);\n };\n private _handleMouseOut = () => {\n const { vector } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.None);\n };\n private _handleMouseDown = (event: React.MouseEvent) => {\n const { clientX, clientY } = event;\n this.handlePointerDown(clientX, clientY);\n };\n private _handleMouseUp = (event: React.MouseEvent) => {\n const { clientX, clientY } = event;\n this.handlePointerUp(clientX, clientY);\n };\n\n private _handleTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.targetTouches.length === 1 &&\n this.handlePointerDown(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n };\n\n private _handleTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.changedTouches.length === 1 &&\n this.handlePointerUp(\n event.changedTouches[0].clientX,\n event.changedTouches[0].clientY\n );\n };\n\n private handlePointerDown(x: number, y: number) {\n const { vector } = this.props;\n this._startMouse = Point2d.create(x, y);\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.Active);\n }\n\n private handlePointerUp(x: number, y: number) {\n const { vector, face } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.None);\n const mouse = Point2d.create(x, y);\n if (this._startMouse && this._startMouse.isAlmostEqual(mouse)) {\n const isFace =\n Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z) === 1;\n this.props.onFaceCellClick &&\n this.props.onFaceCellClick(vector, isFace ? face : Face.None);\n }\n }\n}\n\nenum Pointer {\n None = 0,\n Up,\n Down,\n Left,\n Right,\n}\n\nconst pointerIconSpec: { [key: number]: IconSpec } = {\n [Pointer.Up]: <SvgCaretDown />,\n [Pointer.Down]: <SvgCaretUp />,\n [Pointer.Left]: <SvgCaretRight />,\n [Pointer.Right]: <SvgCaretLeft />,\n};\n\nconst pointerClass: { [key: number]: string } = {\n [Pointer.Up]: \"cube-up\",\n [Pointer.Down]: \"cube-down\",\n [Pointer.Left]: \"cube-left\",\n [Pointer.Right]: \"cube-right\",\n};\n\ninterface PointerProps extends React.AllHTMLAttributes<HTMLDivElement> {\n visible: boolean;\n pointerType: Pointer;\n onArrowClick(pointer: Pointer): void;\n title: string;\n [\"data-testid\"]?: string;\n}\n\nclass PointerButton extends React.Component<PointerProps> {\n public override render(): React.ReactNode {\n const { visible, pointerType, onArrowClick, title, ...props } = this.props;\n const classes = classnames(\n \"cube-pointer\",\n \"icon\",\n pointerClass[pointerType],\n visible && \"cube-visible\"\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <div\n className={classes}\n role=\"button\"\n tabIndex={-1}\n title={title}\n {...props}\n onClick={this._handleClick}\n >\n <Icon iconSpec={pointerIconSpec[pointerType]} />{\" \"}\n </div>\n );\n }\n private _handleClick = (event: React.MouseEvent) => {\n const { pointerType } = this.props;\n event.preventDefault();\n this.props.onArrowClick(pointerType);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CubeNavigationAid.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/navigationaids/CubeNavigationAid.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module NavigationAids\n */\n\nimport \"./CubeNavigationAid.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport type { XYAndZ } from \"@itwin/core-geometry\";\nimport {\n Angle,\n AxisIndex,\n AxisOrder,\n Geometry,\n Matrix3d,\n Point2d,\n Vector2d,\n Vector3d,\n} from \"@itwin/core-geometry\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type { CommonProps, IconSpec } from \"@itwin/core-react\";\nimport { Icon } from \"@itwin/core-react\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\nimport type { ViewRotationChangeEventArgs } from \"../viewport/ViewportComponentEvents\";\nimport { ViewportComponentEvents } from \"../viewport/ViewportComponentEvents\";\nimport { Cube, Face } from \"./Cube\";\nimport {\n SvgCaretDown,\n SvgCaretLeft,\n SvgCaretRight,\n SvgCaretUp,\n} from \"@itwin/itwinui-icons-react\";\n\n/** @public */\nexport enum CubeNavigationHitBoxX {\n None = 0,\n Right = 1,\n Left = -1,\n}\n\n/** @public */\nexport enum CubeNavigationHitBoxY {\n None = 0,\n Back = 1,\n Front = -1,\n}\n\n/** @public */\nexport enum CubeNavigationHitBoxZ {\n None = 0,\n Top = 1,\n Bottom = -1,\n}\n\ninterface CubeNavigationRotationMap {\n up: Face;\n down: Face;\n left: Face;\n right: Face;\n}\n\nconst cubeNavigationFaceLocs: { [key: string]: Vector3d } = {\n [Face.Left]: Vector3d.create(\n CubeNavigationHitBoxX.Left,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Right]: Vector3d.create(\n CubeNavigationHitBoxX.Right,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Back]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.Back,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Front]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.Front,\n CubeNavigationHitBoxZ.None\n ),\n [Face.Bottom]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.Bottom\n ),\n [Face.Top]: Vector3d.create(\n CubeNavigationHitBoxX.None,\n CubeNavigationHitBoxY.None,\n CubeNavigationHitBoxZ.Top\n ),\n};\n\nconst cubeNavigationFaceRotations: { [key: string]: Matrix3d } = {\n [Face.Left]: Matrix3d.createRowValues(0, -1, 0, 0, 0, 1, -1, 0, 0),\n [Face.Right]: Matrix3d.createRowValues(0, 1, 0, 0, 0, 1, 1, 0, 0),\n [Face.Back]: Matrix3d.createRowValues(-1, 0, 0, 0, 0, 1, 0, 1, 0),\n [Face.Front]: Matrix3d.createRowValues(1, 0, 0, 0, 0, 1, 0, -1, 0),\n [Face.Bottom]: Matrix3d.createRowValues(1, 0, 0, 0, -1, 0, 0, 0, -1),\n [Face.Top]: Matrix3d.createRowValues(1, 0, 0, 0, 1, 0, 0, 0, 1),\n};\n\n// data relating Up/Down/Left/Right directions relative to every surface\nconst cubeNavigationRoutes: { [key: string]: CubeNavigationRotationMap } = {\n [Face.Front]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Back]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Right,\n right: Face.Left,\n },\n [Face.Top]: {\n up: Face.Back,\n down: Face.Front,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Bottom]: {\n up: Face.Front,\n down: Face.Back,\n left: Face.Left,\n right: Face.Right,\n },\n [Face.Right]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Front,\n right: Face.Back,\n },\n [Face.Left]: {\n up: Face.Top,\n down: Face.Bottom,\n left: Face.Back,\n right: Face.Front,\n },\n};\n\n/** The default tolerance (1.0e-6) is appropriate if very dirty viewing operations are expected. */\nconst DEFAULT_TOLERANCE = 1.0e-6;\n\n/** @internal */\nexport enum CubeHover {\n None = 0,\n Hover,\n Active,\n}\n\n/** Properties for the [[CubeNavigationAid]] component\n * @public\n */\nexport interface CubeNavigationAidProps extends CommonProps {\n iModelConnection: IModelConnection;\n viewport?: Viewport;\n\n // used only in testing\n\n /** @internal */\n onAnimationEnd?: () => void;\n /** @internal */\n animationTime?: number;\n favorHeadsUpRotation?: boolean;\n}\n\n/** @public */\ninterface CubeNavigationAidState {\n dragging: boolean;\n startRotMatrix: Matrix3d;\n endRotMatrix: Matrix3d;\n animation: number;\n hoverMap: { [key: string]: CubeHover };\n face: Face;\n}\n\n/** Cube Navigation Aid Component\n * @public\n */\nexport class CubeNavigationAid extends React.Component<\n CubeNavigationAidProps,\n CubeNavigationAidState\n> {\n private _start: Vector2d = Vector2d.createZero();\n /** @internal */\n public override readonly state: Readonly<CubeNavigationAidState> = {\n dragging: false,\n startRotMatrix: Matrix3d.createIdentity(),\n endRotMatrix: Matrix3d.createIdentity(),\n animation: 1,\n hoverMap: {},\n face: Face.Top,\n };\n\n private _lastTime: number | undefined;\n private _animationFrame: any;\n private _mounted: boolean = false;\n private _labels: { [key: string]: string } = {\n [Face.Right]: UiIModelComponents.translate(\"cube.right\"),\n [Face.Left]: UiIModelComponents.translate(\"cube.left\"),\n [Face.Back]: UiIModelComponents.translate(\"cube.back\"),\n [Face.Front]: UiIModelComponents.translate(\"cube.front\"),\n [Face.Top]: UiIModelComponents.translate(\"cube.top\"),\n [Face.Bottom]: UiIModelComponents.translate(\"cube.bottom\"),\n };\n\n /** @internal */\n public override componentDidMount() {\n this._mounted = true;\n ViewportComponentEvents.onViewRotationChangeEvent.addListener(\n this._handleViewRotationChangeEvent\n );\n\n // set initial rotation\n if (this.props.viewport) {\n const newMatrix = this.props.viewport.view.getRotation().clone();\n this.setState({\n startRotMatrix: newMatrix,\n endRotMatrix: newMatrix,\n animation: 1,\n });\n }\n }\n\n /** @internal */\n public override componentWillUnmount() {\n ViewportComponentEvents.onViewRotationChangeEvent.removeListener(\n this._handleViewRotationChangeEvent\n );\n clearTimeout(this._animationFrame);\n this._mounted = false;\n }\n\n // Synchronize with rotation coming from the Viewport\n private _handleViewRotationChangeEvent = (\n args: ViewRotationChangeEventArgs\n ) => {\n const { animation, dragging, endRotMatrix } = this.state;\n // istanbul ignore else\n if (this.props.viewport === args.viewport && animation >= 1 && !dragging) {\n const newMatrix = this.props.viewport.view.getRotation().clone();\n if (!endRotMatrix.isAlmostEqual(newMatrix)) {\n this.setState({\n startRotMatrix: newMatrix,\n endRotMatrix: newMatrix,\n animation: 1,\n face: Face.None,\n });\n }\n }\n };\n\n private _animation = () => {\n const t = Date.now();\n const delta = this._lastTime ? t - this._lastTime : 16;\n this._lastTime = t;\n if (this.state.animation !== 1) {\n const animation = Math.min(\n 1,\n this.state.animation +\n delta /\n (1000 *\n (this.props.animationTime || /* istanbul ignore next */ 0.4))\n );\n\n // istanbul ignore next\n if (this._mounted) {\n this.setState({ animation }, () => {\n this._animationFrame = setTimeout(this._animation, 16.667);\n });\n }\n } else {\n this._lastTime = undefined;\n this._animationEnd();\n }\n };\n\n private _animationEnd = () => {\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n this.state.face,\n true\n );\n const startRotMatrix = this.state.endRotMatrix.clone();\n // istanbul ignore next\n if (this._mounted) {\n this.setState({ startRotMatrix }, () => {\n // istanbul ignore else\n if (this.props.onAnimationEnd) this.props.onAnimationEnd();\n });\n }\n };\n\n private static _animationFn = (t: number) =>\n t < 0.5 ? 2 * t ** 2 : -1 + (4 - 2 * t) * t;\n\n private static _isMatrixFace = (matrix: Matrix3d): boolean => {\n let sum = 0;\n for (const coff of matrix.coffs) {\n if (Geometry.isAlmostEqualNumber(Math.abs(coff), 1)) sum++;\n }\n // Assuming matrix is a proper rotation matrix:\n // if matrix viewing a face, there will be a total of 3 values either almost -1, or almost 1.\n return sum === 3;\n };\n\n public override render(): React.ReactNode {\n const { animation, startRotMatrix, endRotMatrix } = this.state;\n const visible =\n CubeNavigationAid._isMatrixFace(endRotMatrix) && animation === 1.0;\n const rotMatrix = CubeNavigationAid._interpolateRotMatrix(\n startRotMatrix,\n animation,\n endRotMatrix\n );\n if (rotMatrix !== startRotMatrix && rotMatrix !== endRotMatrix)\n ViewportComponentEvents.setCubeMatrix(rotMatrix, Face.None);\n\n const faces: { [key: string]: React.ReactNode } = {};\n for (const key in this._labels) {\n // istanbul ignore else\n if (this._labels.hasOwnProperty(key)) {\n const f = key as Face;\n const label = this._labels[f];\n faces[f] = (\n <NavCubeFace\n face={f}\n label={label}\n hoverMap={this.state.hoverMap}\n onFaceCellClick={this._handleFaceCellClick}\n onFaceCellHoverChange={this._handleCellHoverChange}\n />\n );\n }\n }\n\n const cubeClassNames = classnames(\n \"nav-cube\",\n this.state.dragging && \"cube-dragging\"\n );\n\n const upTitle = this.getArrowTitle(Pointer.Up);\n const downTitle = this.getArrowTitle(Pointer.Down);\n const leftTitle = this.getArrowTitle(Pointer.Left);\n const rightTitle = this.getArrowTitle(Pointer.Right);\n\n return (\n <div\n className={classnames(\n \"components-cube-container\",\n this.props.className\n )}\n style={this.props.style}\n data-testid=\"components-cube-navigation-aid\"\n onMouseDown={this._handleBoxMouseDown}\n onTouchStart={this._handleBoxTouchStart}\n role=\"presentation\"\n >\n <div className={\"cube-element-container\"}>\n <Cube\n className={cubeClassNames}\n rotMatrix={rotMatrix}\n faces={faces}\n />\n </div>\n <PointerButton\n data-testid=\"cube-pointer-button-up\"\n visible={visible}\n pointerType={Pointer.Up}\n onArrowClick={this._onArrowClick}\n title={upTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-down\"\n visible={visible}\n pointerType={Pointer.Down}\n onArrowClick={this._onArrowClick}\n title={downTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-left\"\n visible={visible}\n pointerType={Pointer.Left}\n onArrowClick={this._onArrowClick}\n title={leftTitle}\n />\n <PointerButton\n data-testid=\"cube-pointer-button-right\"\n visible={visible}\n pointerType={Pointer.Right}\n onArrowClick={this._onArrowClick}\n title={rightTitle}\n />\n </div>\n );\n }\n\n private _handleCellHoverChange = (vect: Vector3d, state: CubeHover) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n const hoverMap = this.state.hoverMap;\n hoverMap[`${vect.x}-${vect.y}-${vect.z}`] = state;\n this.setState({ hoverMap });\n };\n\n private _isInteractionLocked = () => {\n // Locked by markup\n if (\n undefined !== this.props.viewport &&\n this.props.viewport === IModelApp.toolAdmin.markupView\n ) {\n return true;\n }\n return false;\n };\n\n private static _getMatrixFace = (rotMatrix: Matrix3d): Face => {\n if (!CubeNavigationAid._isMatrixFace(rotMatrix)) {\n return Face.None;\n }\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Top].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Top].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Top].coffs[8]\n )\n return Face.Top;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] ===\n cubeNavigationFaceRotations[Face.Bottom].coffs[6] &&\n rotMatrix.coffs[7] ===\n cubeNavigationFaceRotations[Face.Bottom].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Bottom].coffs[8]\n )\n return Face.Bottom;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Left].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Left].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Left].coffs[8]\n )\n return Face.Left;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Right].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Right].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Right].coffs[8]\n )\n return Face.Right;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Back].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Back].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Back].coffs[8]\n )\n return Face.Back;\n\n // istanbul ignore else\n if (\n rotMatrix.coffs[6] === cubeNavigationFaceRotations[Face.Front].coffs[6] &&\n rotMatrix.coffs[7] === cubeNavigationFaceRotations[Face.Front].coffs[7] &&\n rotMatrix.coffs[8] === cubeNavigationFaceRotations[Face.Front].coffs[8]\n )\n return Face.Front;\n\n return Face.None;\n };\n\n private static _interpolateRotMatrix = (\n start: Matrix3d,\n anim: number,\n end: Matrix3d\n ): Matrix3d => {\n if (anim === 0) return start;\n if (anim === 1 || start.isAlmostEqual(end)) return end;\n const startInverse = start.transpose();\n const diff = end.multiplyMatrixMatrix(startInverse);\n const angleAxis = diff.getAxisAndAngleOfRotation();\n // istanbul ignore else\n if (angleAxis.ok) {\n const angle = Angle.createRadians(\n angleAxis.angle.radians * CubeNavigationAid._animationFn(anim)\n );\n const newDiff = Matrix3d.createRotationAroundVector(\n angleAxis.axis,\n angle\n );\n // istanbul ignore else\n if (newDiff) {\n const newMatrix = newDiff.multiplyMatrixMatrix(start);\n return newMatrix;\n }\n }\n // istanbul ignore next\n return end;\n };\n\n private static correctSmallNumber(value: number, tolerance: number): number {\n return Math.abs(value) < tolerance ? 0 : value;\n }\n\n /**\n * Snap coordinates of a vector to zero and to each other so that the vector prefers to be\n * * perpendicular to a face of the unit cube.\n * * or pass through a nearby vertex or edge of the unit cube.\n * @param zVector existing z vector.\n * @param tolerance tolerance to determine if a z vector component is close to zero or 1.\n */\n private static snapVectorToCubeFeatures(\n zVector: XYAndZ,\n tolerance: number\n ): Vector3d {\n const x = CubeNavigationAid.correctSmallNumber(zVector.x, tolerance);\n let y = CubeNavigationAid.correctSmallNumber(zVector.y, tolerance);\n let z = CubeNavigationAid.correctSmallNumber(zVector.z, tolerance);\n\n const xx = x === -0 ? Math.abs(x) : x;\n const yy = y === -0 ? Math.abs(y) : y;\n const zz = z === -0 ? Math.abs(z) : z;\n\n // adjust any adjacent pair of near equal values to the first.\n // istanbul ignore next\n if (Geometry.isSameCoordinate(xx, yy, tolerance)) {\n y = Geometry.split3WaySign(y, -xx, xx, xx);\n }\n if (Geometry.isSameCoordinate(yy, zz, tolerance)) {\n z = Geometry.split3WaySign(z, -yy, yy, yy);\n }\n if (Geometry.isSameCoordinate(xx, zz, tolerance)) {\n z = Geometry.split3WaySign(z, -xx, xx, xx);\n }\n return Vector3d.create(x, y, z);\n }\n\n /**\n * Adjust a worldToView matrix to favor both\n * * direct view at faces, edges, and corners of a view cube.\n * * heads up\n * @param worldToView candidate matrix\n * @param tolerance tolerance for cleaning up fuzz. The default (1.0e-6) is appropriate if very dirty viewing operations are expected.\n * @param result optional result.\n */\n private static snapWorldToViewMatrixToCubeFeatures(\n worldToView: Matrix3d,\n tolerance: number,\n result?: Matrix3d,\n favorHeadsUpRotation?: boolean\n ): Matrix3d {\n const oldZ = worldToView.rowZ();\n const newZ = CubeNavigationAid.snapVectorToCubeFeatures(oldZ, tolerance);\n const headsUp = !!favorHeadsUpRotation;\n // If newZ is true up or down, it will have true 0 for x and y.\n // special case this to take x direction from the input.\n // This methodology results in always \"righting\" the face when rotation from an upside-down cube.\n // The behavior was made opt-in in response to https://github.com/iTwin/appui/issues/259\n // istanbul ignore next\n if (!headsUp || (newZ.x === 0.0 && newZ.y === 0)) {\n const perpVector = worldToView.rowX();\n result = Matrix3d.createRigidFromColumns(\n newZ,\n perpVector,\n AxisOrder.ZXY,\n result\n )!;\n } else {\n result = Matrix3d.createRigidViewAxesZTowardsEye(\n newZ.x,\n newZ.y,\n newZ.z,\n result\n );\n }\n // istanbul ignore else\n if (result) result.transposeInPlace();\n return result;\n }\n\n private getArrowRotationAndFace(arrow: Pointer): {\n newRotation: Matrix3d;\n face: Face;\n } {\n const localRotationAxis = Vector3d.create(0, 0, 0);\n switch (arrow) {\n case Pointer.Up:\n localRotationAxis.x = -1.0;\n break;\n case Pointer.Down:\n localRotationAxis.x = 1.0;\n break;\n case Pointer.Left:\n localRotationAxis.y = -1.0;\n break;\n default:\n localRotationAxis.y = 1.0;\n break;\n }\n const localRotation = Matrix3d.createRotationAroundVector(\n localRotationAxis,\n Angle.createDegrees(-90)\n )!;\n const newRotation = localRotation.multiplyMatrixMatrix(\n this.state.endRotMatrix\n );\n CubeNavigationAid.snapWorldToViewMatrixToCubeFeatures(\n newRotation,\n DEFAULT_TOLERANCE,\n newRotation,\n this.props.favorHeadsUpRotation\n );\n const face = CubeNavigationAid._getMatrixFace(newRotation);\n return { newRotation, face };\n }\n\n private _onArrowClick = (arrow: Pointer) => {\n if (this._isInteractionLocked()) {\n // istanbul ignore next\n this.props.onAnimationEnd?.();\n return;\n }\n const { newRotation, face } = this.getArrowRotationAndFace(arrow);\n this._animateRotation(newRotation, face);\n };\n\n private getArrowTitle(arrow: Pointer) {\n const { face } = this.getArrowRotationAndFace(arrow);\n return this._labels[face];\n }\n\n private _lastClientXY: Vector2d = Vector2d.createZero();\n private _processDrag(mousePos: Vector2d) {\n // istanbul ignore else\n if (!this._start.isAlmostEqual(mousePos)) {\n const movement = mousePos.minus(this._lastClientXY);\n const diff = movement.scale(0.05);\n\n const yaw = Angle.createRadians(diff.x);\n const pitch = Angle.createRadians(diff.y);\n\n const matX = Matrix3d.createRotationAroundAxisIndex(AxisIndex.X, pitch);\n const matZ = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, yaw);\n\n const mat = matX\n .multiplyMatrixMatrix(this.state.startRotMatrix)\n .multiplyMatrixMatrix(matZ);\n this._setRotation(mat, CubeNavigationAid._getMatrixFace(mat));\n if (!this.state.dragging) this.setState({ dragging: true });\n }\n this._lastClientXY = mousePos;\n }\n\n private _handleBoxMouseDown = (event: any) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n event.preventDefault();\n // only start listening after drag is confirmed. Ie. the 3D box is clicked.\n window.addEventListener(\"mousemove\", this._onMouseMove, false);\n window.addEventListener(\"mouseup\", this._onMouseUp, false);\n this._lastClientXY = Vector2d.create(event.clientX, event.clientY);\n this._start = this._lastClientXY;\n };\n\n private _onMouseMove = (event: MouseEvent) => {\n const mousePos = Vector2d.create(event.clientX, event.clientY);\n this._processDrag(mousePos);\n };\n\n private _onMouseUp = () => {\n if (this.state.dragging) {\n this.setState({ dragging: false });\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n CubeNavigationAid._getMatrixFace(this.state.endRotMatrix),\n true\n );\n }\n\n // remove so event only triggers after this.onMouseStartDrag\n window.removeEventListener(\"mousemove\", this._onMouseMove);\n window.removeEventListener(\"mouseup\", this._onMouseUp);\n };\n\n // istanbul ignore next - unable to test touch\n private _handleBoxTouchStart = (event: any) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n if (1 !== event.targetTouches.length) return;\n window.addEventListener(\"touchmove\", this._onTouchMove, false);\n window.addEventListener(\"touchend\", this._onTouchEnd, false);\n this._lastClientXY = Vector2d.create(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n this._start = this._lastClientXY;\n };\n\n // istanbul ignore next - unable to test touch\n private _onTouchMove = (event: TouchEvent) => {\n if (1 !== event.targetTouches.length) return;\n const mousePos = Vector2d.create(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n this._processDrag(mousePos);\n };\n\n // istanbul ignore next - unable to test touch\n private _onTouchEnd = (event: TouchEvent) => {\n if (0 !== event.targetTouches.length) return;\n\n if (this.state.dragging) {\n this.setState({ dragging: false });\n ViewportComponentEvents.setCubeMatrix(\n this.state.endRotMatrix,\n CubeNavigationAid._getMatrixFace(this.state.endRotMatrix),\n true\n );\n }\n\n window.removeEventListener(\"touchmove\", this._onTouchMove);\n window.removeEventListener(\"touchend\", this._onTouchEnd);\n };\n\n private _handleFaceCellClick = (pos: Vector3d, face: Face) => {\n if (this._isInteractionLocked()) {\n this.props.onAnimationEnd?.();\n return;\n }\n const { endRotMatrix } = this.state;\n let rotMatrix = Matrix3d.createRigidViewAxesZTowardsEye(\n pos.x,\n pos.y,\n pos.z\n ).inverse();\n // istanbul ignore else\n if (rotMatrix) {\n // if isMatrixFace and user is clicking on top/bottom, the current matrix face must be top or bottom\n if (\n !CubeNavigationAid._isMatrixFace(endRotMatrix) &&\n (face === Face.Top || face === Face.Bottom)\n ) {\n const angleAxis = endRotMatrix.getAxisAndAngleOfRotation();\n // istanbul ignore else\n if (angleAxis.ok) {\n const xAx = endRotMatrix.columnX();\n const a = Math.atan2(xAx.y, xAx.x);\n const r = (Math.round((a * 2) / Math.PI) * Math.PI) / 2; // round to quarter turn intervals\n const rot = Matrix3d.createRotationAroundAxisIndex(\n AxisIndex.Z,\n Angle.createRadians(r)\n );\n rotMatrix = rot.multiplyMatrixMatrix(rotMatrix);\n }\n }\n this._animateRotation(rotMatrix, face);\n }\n window.removeEventListener(\"mousemove\", this._onMouseMove);\n };\n\n private _animateRotation = (endRotMatrix: Matrix3d, face: Face) => {\n if (this.state.endRotMatrix.isAlmostEqual(endRotMatrix)) return;\n // set animation variables, let css transitions animate it.\n this._animationFrame = setTimeout(this._animation, 16.667);\n this.setState((prevState) => ({\n startRotMatrix: prevState.endRotMatrix,\n endRotMatrix,\n animation: 0,\n face,\n }));\n };\n\n private _setRotation = (endRotMatrix: Matrix3d, face: Face) => {\n ViewportComponentEvents.setCubeMatrix(endRotMatrix, face);\n // set variables, with animTime at 0 to prevent animation.\n this.setState({\n startRotMatrix: endRotMatrix,\n endRotMatrix,\n animation: 1,\n face,\n });\n };\n}\n\n/** @internal */\nexport interface NavCubeFaceProps\n extends React.AllHTMLAttributes<HTMLDivElement> {\n face: Face;\n label: string;\n hoverMap: { [key: string]: CubeHover };\n onFaceCellClick: (vector: Vector3d, face: Face) => void;\n onFaceCellHoverChange: (vector: Vector3d, state: CubeHover) => void;\n}\n\n/** @internal */\nexport class NavCubeFace extends React.Component<NavCubeFaceProps> {\n private includeCell(vector: Vector3d): boolean {\n const { x, y, z } = vector;\n const omittedCell =\n (y === 0 && x !== 0 && z !== 0) ||\n (y !== 0 && x === 0 && z !== 0) ||\n (y !== 0 && x !== 0 && z === 0);\n return !omittedCell;\n }\n public override render(): React.ReactNode {\n const { face, hoverMap, onFaceCellClick, onFaceCellHoverChange, label } =\n this.props;\n return (\n <div className=\"nav-cube-face\" data-testid=\"nav-cube-face\">\n {[-1, 0, 1].map((y: number) => {\n return (\n <FaceRow key={y} center={y === 0}>\n {[-1, 0, 1].map((x: number) => {\n const vector = NavCubeFace.faceCellToPos(face, x, y);\n if (this.includeCell(vector)) {\n // return a fully functional cell\n return (\n <FaceCell\n key={x}\n onFaceCellHoverChange={onFaceCellHoverChange}\n onFaceCellClick={onFaceCellClick}\n hoverMap={hoverMap}\n vector={vector}\n face={face}\n center={x === 0}\n >\n {x === 0 && y === 0 && label}\n </FaceCell>\n );\n } else {\n // return a placeholder cell\n return (\n <FaceCell\n key={x}\n vector={vector}\n face={face}\n center={x === 0}\n />\n );\n }\n })}\n </FaceRow>\n );\n })}\n </div>\n );\n }\n public static faceCellToPos = (face: Face, x: number, y: number) => {\n const faceVect = cubeNavigationFaceLocs[face];\n const route = cubeNavigationRoutes[face];\n\n const faceX = x < 0 ? route.left : x > 0 ? route.right : Face.None;\n const xVect =\n faceX !== Face.None\n ? cubeNavigationFaceLocs[faceX]\n : Vector3d.createZero();\n\n const faceY = y < 0 ? route.up : y > 0 ? route.down : Face.None;\n const yVect =\n faceY !== Face.None\n ? cubeNavigationFaceLocs[faceY]\n : Vector3d.createZero();\n\n return faceVect.plus(xVect).plus(yVect);\n };\n}\n\ninterface FaceRowProps extends React.AllHTMLAttributes<HTMLDivElement> {\n center?: boolean;\n}\n\nclass FaceRow extends React.Component<FaceRowProps> {\n public override render(): React.ReactNode {\n const { center, children, ...props } = this.props;\n const classNames = classnames(\"face-row\", center && \"cube-center\");\n return (\n <div className={classNames} {...props}>\n {children}\n </div>\n );\n }\n}\n\n/** @internal */\nexport interface FaceCellProps extends React.AllHTMLAttributes<HTMLDivElement> {\n center?: boolean;\n onFaceCellClick?: (vector: Vector3d, face: Face) => void;\n onFaceCellHoverChange?: (vector: Vector3d, state: CubeHover) => void;\n hoverMap?: { [key: string]: CubeHover };\n vector: Vector3d;\n face: Face;\n}\n\n/** @internal */\nexport class FaceCell extends React.Component<FaceCellProps> {\n private _startMouse: Point2d | undefined;\n public override render(): React.ReactNode {\n const {\n center,\n children,\n onFaceCellClick,\n onFaceCellHoverChange,\n hoverMap,\n face,\n vector,\n ...props\n } = this.props;\n const { x, y, z } = vector;\n const n = `${x}-${y}-${z}`;\n const hover = hoverMap && hoverMap[n] === CubeHover.Hover;\n const active = hoverMap && hoverMap[n] === CubeHover.Active;\n const classNames = classnames(\n \"face-cell\",\n center && \"cube-center\",\n hover && \"cube-hover\",\n active && \"cube-active\"\n );\n\n return (\n <div // eslint-disable-line jsx-a11y/mouse-events-have-key-events\n onMouseDown={this._handleMouseDown}\n onMouseUp={this._handleMouseUp}\n onMouseOver={this._handleMouseOver}\n onMouseOut={this._handleMouseOut}\n onTouchStart={this._handleTouchStart}\n onTouchEnd={this._handleTouchEnd}\n data-testid={`nav-cube-face-cell-${face}-${n}`}\n className={classNames}\n role=\"presentation\"\n {...props}\n >\n {children}\n </div>\n );\n }\n private _handleMouseOver = () => {\n const { vector } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.Hover);\n };\n private _handleMouseOut = () => {\n const { vector } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.None);\n };\n private _handleMouseDown = (event: React.MouseEvent) => {\n const { clientX, clientY } = event;\n this.handlePointerDown(clientX, clientY);\n };\n private _handleMouseUp = (event: React.MouseEvent) => {\n const { clientX, clientY } = event;\n this.handlePointerUp(clientX, clientY);\n };\n\n private _handleTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.targetTouches.length === 1 &&\n this.handlePointerDown(\n event.targetTouches[0].clientX,\n event.targetTouches[0].clientY\n );\n };\n\n private _handleTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.changedTouches.length === 1 &&\n this.handlePointerUp(\n event.changedTouches[0].clientX,\n event.changedTouches[0].clientY\n );\n };\n\n private handlePointerDown(x: number, y: number) {\n const { vector } = this.props;\n this._startMouse = Point2d.create(x, y);\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.Active);\n }\n\n private handlePointerUp(x: number, y: number) {\n const { vector, face } = this.props;\n this.props.onFaceCellHoverChange &&\n this.props.onFaceCellHoverChange(vector, CubeHover.None);\n const mouse = Point2d.create(x, y);\n if (this._startMouse && this._startMouse.isAlmostEqual(mouse)) {\n const isFace =\n Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z) === 1;\n this.props.onFaceCellClick &&\n this.props.onFaceCellClick(vector, isFace ? face : Face.None);\n }\n }\n}\n\nenum Pointer {\n None = 0,\n Up,\n Down,\n Left,\n Right,\n}\n\nconst pointerIconSpec: { [key: number]: IconSpec } = {\n [Pointer.Up]: <SvgCaretDown />,\n [Pointer.Down]: <SvgCaretUp />,\n [Pointer.Left]: <SvgCaretRight />,\n [Pointer.Right]: <SvgCaretLeft />,\n};\n\nconst pointerClass: { [key: number]: string } = {\n [Pointer.Up]: \"cube-up\",\n [Pointer.Down]: \"cube-down\",\n [Pointer.Left]: \"cube-left\",\n [Pointer.Right]: \"cube-right\",\n};\n\ninterface PointerProps extends React.AllHTMLAttributes<HTMLDivElement> {\n visible: boolean;\n pointerType: Pointer;\n onArrowClick(pointer: Pointer): void;\n title: string;\n [\"data-testid\"]?: string;\n}\n\nclass PointerButton extends React.Component<PointerProps> {\n public override render(): React.ReactNode {\n const { visible, pointerType, onArrowClick, title, ...props } = this.props;\n const classes = classnames(\n \"cube-pointer\",\n \"icon\",\n pointerClass[pointerType],\n visible && \"cube-visible\"\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <div\n className={classes}\n role=\"button\"\n tabIndex={-1}\n title={title}\n {...props}\n onClick={this._handleClick}\n >\n <Icon iconSpec={pointerIconSpec[pointerType]} />{\" \"}\n </div>\n );\n }\n private _handleClick = (event: React.MouseEvent) => {\n const { pointerType } = this.props;\n event.preventDefault();\n this.props.onArrowClick(pointerType);\n };\n}\n"]}
|
|
@@ -72,7 +72,7 @@ export function FormatPanel(props) {
|
|
|
72
72
|
}, []);
|
|
73
73
|
return (React.createElement("div", { className: "components-quantityFormat-panel" },
|
|
74
74
|
showSample && (React.createElement(FormatSample, { formatSpec: formatSpec, initialMagnitude: initialMagnitude })),
|
|
75
|
-
React.createElement(FormatUnits, { unitsProvider: unitsProvider, persistenceUnit: formatSpec
|
|
75
|
+
React.createElement(FormatUnits, { unitsProvider: unitsProvider, persistenceUnit: formatSpec?.persistenceUnit, initialFormat: formatProps, onUnitsChange: handleFormatChange }),
|
|
76
76
|
React.createElement(FormatUnitLabel, { formatProps: formatProps, onUnitLabelChange: handleFormatChange }),
|
|
77
77
|
React.createElement(FormatTypeOption, { formatProps: formatProps, onChange: handleFormatChange }),
|
|
78
78
|
React.createElement(FormatPrecision, { formatProps: formatProps, onChange: handleFormatChange }),
|