@itwin/imodel-components-react 4.2.1 → 4.3.0-dev.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 +1 -6
- 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/color/ColorPickerButton.scss +3 -3
- package/lib/cjs/imodel-components-react/color/ColorPickerPopup.scss +3 -3
- package/lib/cjs/imodel-components-react/color/Swatch.scss +3 -3
- package/lib/cjs/imodel-components-react/editors/ColorEditor.scss +3 -3
- package/lib/cjs/imodel-components-react/editors/WeightEditor.scss +3 -3
- 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/inputs/QuantityNumberInput.scss +3 -3
- package/lib/cjs/imodel-components-react/lineweight/Swatch.scss +3 -3
- package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.scss +3 -3
- package/lib/cjs/imodel-components-react/navigationaids/Cube.scss +3 -3
- 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/navigationaids/CubeNavigationAid.scss +3 -3
- package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.scss +3 -3
- 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/FormatPanel.scss +3 -3
- 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/timeline/PlayerButton.scss +3 -3
- package/lib/cjs/imodel-components-react/timeline/Scrubber.scss +3 -3
- package/lib/cjs/imodel-components-react/timeline/SolarTimeline.scss +3 -3
- 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/color/ColorPickerButton.scss +3 -3
- package/lib/esm/imodel-components-react/color/ColorPickerPopup.scss +3 -3
- package/lib/esm/imodel-components-react/color/Swatch.scss +3 -3
- package/lib/esm/imodel-components-react/editors/ColorEditor.scss +3 -3
- package/lib/esm/imodel-components-react/editors/WeightEditor.scss +3 -3
- 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/inputs/QuantityNumberInput.scss +3 -3
- package/lib/esm/imodel-components-react/lineweight/Swatch.scss +3 -3
- package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.scss +3 -3
- package/lib/esm/imodel-components-react/navigationaids/Cube.scss +3 -3
- 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/navigationaids/CubeNavigationAid.scss +3 -3
- package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.scss +3 -3
- 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/FormatPanel.scss +3 -3
- 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/timeline/PlayerButton.scss +3 -3
- package/lib/esm/imodel-components-react/timeline/Scrubber.scss +3 -3
- package/lib/esm/imodel-components-react/timeline/SolarTimeline.scss +3 -3
- 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 +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormatUnitLabel.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/FormatUnitLabel.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 QuantityFormat\n */\n\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type { FormatProps } from \"@itwin/core-quantity\";\nimport { Format, FormatTraits, getTraitString } from \"@itwin/core-quantity\";\nimport type { SelectOption } from \"@itwin/itwinui-react\";\nimport { Checkbox, Select } from \"@itwin/itwinui-react\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\ninterface UomSeparatorSelectorProps extends CommonProps {\n separator: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n}\n\nfunction UomSeparatorSelector(props: UomSeparatorSelectorProps) {\n const { separator, onChange, ...otherProps } = props;\n const uomDefaultEntries = React.useRef<SelectOption<string>[]>([\n { value: \"\", label: UiIModelComponents.translate(\"QuantityFormat.none\") },\n { value: \" \", label: UiIModelComponents.translate(\"QuantityFormat.space\") },\n { value: \"-\", label: UiIModelComponents.translate(\"QuantityFormat.dash\") },\n ]);\n\n const handleOnChange = React.useCallback(\n (newValue: string) => {\n onChange && onChange(newValue);\n },\n [onChange]\n );\n\n const separatorOptions = React.useMemo(() => {\n const completeListOfEntries: SelectOption<string>[] = [];\n // istanbul ignore next (only used if format already has a character that does not match standard options)\n if (\n undefined ===\n uomDefaultEntries.current.find((option) => option.value === separator)\n ) {\n completeListOfEntries.push({ value: separator, label: separator });\n }\n completeListOfEntries.push(...uomDefaultEntries.current);\n return completeListOfEntries;\n }, [separator]);\n\n return (\n <Select\n options={separatorOptions}\n value={separator}\n onChange={handleOnChange}\n size=\"small\"\n {...otherProps}\n />\n );\n}\n\n/** Properties of [[FormatUnitLabel]] component.\n * @alpha\n */\nexport interface FormatUnitLabelProps extends CommonProps {\n formatProps: FormatProps;\n onUnitLabelChange?: (format: FormatProps) => void;\n}\n\n/** Component to set the label separator definition in a Quantity Format and if it the label is to be displayed.\n * @alpha\n */\nexport function FormatUnitLabel(props: FormatUnitLabelProps) {\n const { formatProps, onUnitLabelChange } = props;\n\n const handleSetFormatProps = React.useCallback(\n (newProps: FormatProps) => {\n onUnitLabelChange && onUnitLabelChange(newProps);\n },\n [onUnitLabelChange]\n );\n\n const isFormatTraitSet = React.useCallback(\n (trait: FormatTraits) => {\n return Format.isFormatTraitSetInProps(formatProps, trait);\n },\n [formatProps]\n );\n\n const setFormatTrait = React.useCallback(\n (trait: FormatTraits, setActive: boolean) => {\n const traitStr = getTraitString(trait);\n let formatTraits: string[] = [traitStr];\n if (setActive) {\n // setting trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n // istanbul ignore else\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\n formatTraits = [...traits, traitStr];\n }\n }\n } else {\n // clearing trait\n // istanbul ignore next\n if (!formatProps.formatTraits) return;\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\n }\n const newFormatProps = { ...formatProps, formatTraits };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleUomSeparatorChange = React.useCallback(\n (newSeparator: string) => {\n const newFormatProps = { ...formatProps, uomSeparator: newSeparator };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleShowUnitLabelChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.ShowUnitLabel, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const appendUnitLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.appendUnitLabel\")\n );\n const labelSeparator = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.labelSeparator\")\n );\n\n return (\n <>\n <span className={\"uicore-label\"}>{appendUnitLabel.current}</span>\n <Checkbox\n data-testid=\"show-unit-label-checkbox\"\n checked={isFormatTraitSet(FormatTraits.ShowUnitLabel)}\n onChange={handleShowUnitLabelChange}\n />\n <span\n className={classnames(\n \"uicore-label\",\n !isFormatTraitSet(FormatTraits.ShowUnitLabel) && \"uicore-disabled\"\n )}\n >\n {labelSeparator.current}\n </span>\n <UomSeparatorSelector\n data-testid=\"uom-separator-select\"\n separator={formatProps.uomSeparator ?? \"\"}\n onChange={handleUomSeparatorChange}\n disabled={!isFormatTraitSet(FormatTraits.ShowUnitLabel)}\n />\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FormatUnitLabel.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/FormatUnitLabel.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 QuantityFormat\n */\n\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type { FormatProps } from \"@itwin/core-quantity\";\nimport { Format, FormatTraits, getTraitString } from \"@itwin/core-quantity\";\nimport type { SelectOption } from \"@itwin/itwinui-react\";\nimport { Checkbox, Select } from \"@itwin/itwinui-react\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\ninterface UomSeparatorSelectorProps extends CommonProps {\n separator: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n}\n\nfunction UomSeparatorSelector(props: UomSeparatorSelectorProps) {\n const { separator, onChange, ...otherProps } = props;\n const uomDefaultEntries = React.useRef<SelectOption<string>[]>([\n { value: \"\", label: UiIModelComponents.translate(\"QuantityFormat.none\") },\n { value: \" \", label: UiIModelComponents.translate(\"QuantityFormat.space\") },\n { value: \"-\", label: UiIModelComponents.translate(\"QuantityFormat.dash\") },\n ]);\n\n const handleOnChange = React.useCallback(\n (newValue: string) => {\n onChange && onChange(newValue);\n },\n [onChange]\n );\n\n const separatorOptions = React.useMemo(() => {\n const completeListOfEntries: SelectOption<string>[] = [];\n // istanbul ignore next (only used if format already has a character that does not match standard options)\n if (\n undefined ===\n uomDefaultEntries.current.find((option) => option.value === separator)\n ) {\n completeListOfEntries.push({ value: separator, label: separator });\n }\n completeListOfEntries.push(...uomDefaultEntries.current);\n return completeListOfEntries;\n }, [separator]);\n\n return (\n <Select\n options={separatorOptions}\n value={separator}\n onChange={handleOnChange}\n size=\"small\"\n {...otherProps}\n />\n );\n}\n\n/** Properties of [[FormatUnitLabel]] component.\n * @alpha\n */\nexport interface FormatUnitLabelProps extends CommonProps {\n formatProps: FormatProps;\n onUnitLabelChange?: (format: FormatProps) => void;\n}\n\n/** Component to set the label separator definition in a Quantity Format and if it the label is to be displayed.\n * @alpha\n */\nexport function FormatUnitLabel(props: FormatUnitLabelProps) {\n const { formatProps, onUnitLabelChange } = props;\n\n const handleSetFormatProps = React.useCallback(\n (newProps: FormatProps) => {\n onUnitLabelChange && onUnitLabelChange(newProps);\n },\n [onUnitLabelChange]\n );\n\n const isFormatTraitSet = React.useCallback(\n (trait: FormatTraits) => {\n return Format.isFormatTraitSetInProps(formatProps, trait);\n },\n [formatProps]\n );\n\n const setFormatTrait = React.useCallback(\n (trait: FormatTraits, setActive: boolean) => {\n const traitStr = getTraitString(trait);\n let formatTraits: string[] = [traitStr];\n if (setActive) {\n // setting trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n // istanbul ignore else\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\n formatTraits = [...traits, traitStr];\n }\n }\n } else {\n // clearing trait\n // istanbul ignore next\n if (!formatProps.formatTraits) return;\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\n }\n const newFormatProps = { ...formatProps, formatTraits };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleUomSeparatorChange = React.useCallback(\n (newSeparator: string) => {\n const newFormatProps = { ...formatProps, uomSeparator: newSeparator };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleShowUnitLabelChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.ShowUnitLabel, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const appendUnitLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.appendUnitLabel\")\n );\n const labelSeparator = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.labelSeparator\")\n );\n\n return (\n <>\n <span className={\"uicore-label\"}>{appendUnitLabel.current}</span>\n <Checkbox\n data-testid=\"show-unit-label-checkbox\"\n checked={isFormatTraitSet(FormatTraits.ShowUnitLabel)}\n onChange={handleShowUnitLabelChange}\n />\n <span\n className={classnames(\n \"uicore-label\",\n !isFormatTraitSet(FormatTraits.ShowUnitLabel) && \"uicore-disabled\"\n )}\n >\n {labelSeparator.current}\n </span>\n <UomSeparatorSelector\n data-testid=\"uom-separator-select\"\n separator={formatProps.uomSeparator ?? \"\"}\n onChange={handleUomSeparatorChange}\n disabled={!isFormatTraitSet(FormatTraits.ShowUnitLabel)}\n />\n </>\n );\n}\n"]}
|
|
@@ -13,7 +13,6 @@ import { UiIModelComponents } from "../UiIModelComponents";
|
|
|
13
13
|
* @alpha
|
|
14
14
|
*/
|
|
15
15
|
export function FormatUnits(props) {
|
|
16
|
-
var _a, _b, _c;
|
|
17
16
|
const { initialFormat, persistenceUnit, unitsProvider, onUnitsChange } = props;
|
|
18
17
|
const initialFormatRef = React.useRef(initialFormat);
|
|
19
18
|
const [formatProps, setFormatProps] = React.useState(initialFormat);
|
|
@@ -107,17 +106,14 @@ export function FormatUnits(props) {
|
|
|
107
106
|
}, [formatProps, handleSetFormatProps]);
|
|
108
107
|
const compositeSpacer = React.useRef(UiIModelComponents.translate("QuantityFormat.labels.compositeSpacer"));
|
|
109
108
|
return (React.createElement(React.Fragment, null,
|
|
110
|
-
|
|
111
|
-
? formatProps.composite.units.map((value, index) => {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
? formatProps.composite.units[index - 1].name
|
|
115
|
-
: undefined, unitsProvider: unitsProvider, index: index, onUnitChange: handleUnitChange, onLabelChange: handleUnitLabelChange, readonly: index < formatProps.composite.units.length - 1 }));
|
|
116
|
-
})
|
|
109
|
+
formatProps.composite?.units
|
|
110
|
+
? formatProps.composite.units.map((value, index) => (React.createElement(UnitDescr, { key: value.name, name: value.name, label: value.label ?? "", parentUnitName: index > 0
|
|
111
|
+
? formatProps.composite.units[index - 1].name
|
|
112
|
+
: undefined, unitsProvider: unitsProvider, index: index, onUnitChange: handleUnitChange, onLabelChange: handleUnitLabelChange, readonly: index < formatProps.composite.units.length - 1 })))
|
|
117
113
|
: persistenceUnit && (React.createElement(UnitDescr, { key: persistenceUnit.name, name: persistenceUnit.name, label: persistenceUnit.label, unitsProvider: unitsProvider, index: 0, onUnitChange: handleUnitChange, onLabelChange: handleUnitLabelChange })),
|
|
118
|
-
|
|
114
|
+
formatProps.composite?.units &&
|
|
119
115
|
formatProps.composite.units.length > 1 && (React.createElement(React.Fragment, null,
|
|
120
116
|
React.createElement("span", { key: "composite-spacer-label", className: "uicore-label" }, compositeSpacer.current),
|
|
121
|
-
React.createElement(Input, { key: "composite-spacer", "data-testid": "composite-spacer", value:
|
|
117
|
+
React.createElement(Input, { key: "composite-spacer", "data-testid": "composite-spacer", value: formatProps.composite.spacer ?? "", onChange: handleOnSpacerChange, size: "small" })))));
|
|
122
118
|
}
|
|
123
119
|
//# sourceMappingURL=FormatUnits.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormatUnits.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/FormatUnits.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAY3D;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;;IACjD,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,GACpE,KAAK,CAAC;IACR,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAc,aAAa,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEpE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,gBAAgB,CAAC,OAAO,KAAK,aAAa,EAAE;YAC9C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;YACzC,cAAc,CAAC,aAAa,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAC5C,CAAC,QAAqB,EAAE,EAAE;QACxB,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,EACD,CAAC,aAAa,CAAC,CAChB,CAAC;IAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAC7C,CAAC,QAAgB,EAAE,KAAa,EAAE,EAAE;QAClC,uBAAuB;QACvB,IACE,WAAW,CAAC,SAAS;YACrB,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;YAC1C,KAAK,IAAI,CAAC,EACV;YACA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC3D,uBAAuB;gBACvB,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;oBAC3D,OAAO,KAAK,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;YACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;SACtC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,oBAAoB,CAAC,CACpC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CACxC,CAAC,OAAe,EAAE,KAAa,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;YACjC,uBAAuB;YACvB,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnE,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC/C,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;gBACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;aACtC;SACF;aAAM,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;YACxC,MAAM,KAAK,GACT,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;gBACzD,CAAC,CAAC;oBACE,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK;oBAC9B,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;iBAC5C;gBACH,CAAC,CAAC,yBAAyB,CAAC;oBACxB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;iBAC5C,CAAC;YACR,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;YACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;SACtC;aAAM;YACL,uBAAuB;YACvB,IACE,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;gBAC1C,KAAK,IAAI,CAAC,EACV;gBACA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBAC3D,uBAAuB;oBACvB,IAAI,KAAK,KAAK,GAAG;wBACf,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;;wBAChD,OAAO,KAAK,CAAC;gBACpB,CAAC,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;gBACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;aACtC;iBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBACjC,MAAM,SAAS,GAAG;oBAChB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD,CAAC;gBACF,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;gBACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;aACtC;SACF;IACH,CAAC,EACD,CAAC,WAAW,EAAE,oBAAoB,CAAC,CACpC,CAAC;IAEF,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAC5C,CAAC,CAAsC,EAAE,EAAE;QACzC,uBAAuB;QACvB,IAAI,WAAW,CAAC,SAAS,EAAE;YACzB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBACvC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,iDAAiD;YACpF,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACpE,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;YACrD,oBAAoB,CAAC,cAAc,CAAC,CAAC;SACtC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,oBAAoB,CAAC,CACpC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAClC,kBAAkB,CAAC,SAAS,CAAC,uCAAuC,CAAC,CACtE,CAAC;IAEF,OAAO,CACL;QACG,CAAA,MAAA,WAAW,CAAC,SAAS,0CAAE,KAAK;YAC3B,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;gBAAC,OAAA,CAChD,oBAAC,SAAS,IACR,GAAG,EAAE,KAAK,CAAC,IAAI,EACf,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,MAAA,KAAK,CAAC,KAAK,mCAAI,EAAE,EACxB,cAAc,EACZ,KAAK,GAAG,CAAC;wBACP,CAAC,CAAC,WAAW,CAAC,SAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI;wBAC9C,CAAC,CAAC,SAAS,EAEf,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,qBAAqB,EACpC,QAAQ,EAAE,KAAK,GAAG,WAAW,CAAC,SAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GACzD,CACH,CAAA;aAAA,CAAC;YACJ,CAAC,CAAC,eAAe,IAAI,CACjB,oBAAC,SAAS,IACR,GAAG,EAAE,eAAe,CAAC,IAAI,EACzB,IAAI,EAAE,eAAe,CAAC,IAAI,EAC1B,KAAK,EAAE,eAAe,CAAC,KAAK,EAC5B,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,CAAC,EACR,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,qBAAqB,GACpC,CACH;QAEJ,CAAA,MAAA,WAAW,CAAC,SAAS,0CAAE,KAAK;YAC3B,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACxC;YACE,8BAAM,GAAG,EAAE,wBAAwB,EAAE,SAAS,EAAE,cAAc,IAC3D,eAAe,CAAC,OAAO,CACnB;YACP,oBAAC,KAAK,IACJ,GAAG,EAAE,kBAAkB,iBACX,kBAAkB,EAC9B,KAAK,EAAE,MAAA,WAAW,CAAC,SAAS,CAAC,MAAM,mCAAI,EAAE,EACzC,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAC,OAAO,GACZ,CACD,CACJ,CACF,CACJ,CAAC;AACJ,CAAC","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 QuantityFormat\n */\n\nimport * as React from \"react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type {\n FormatProps,\n UnitProps,\n UnitsProvider,\n} from \"@itwin/core-quantity\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport { UnitDescr } from \"./misc/UnitDescr\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\n/** Properties of [[FormatUnits]] component.\n * @alpha\n */\nexport interface FormatUnitsProps extends CommonProps {\n initialFormat: FormatProps;\n persistenceUnit?: UnitProps;\n unitsProvider: UnitsProvider;\n onUnitsChange?: (format: FormatProps) => void;\n}\n\n/** Component to show/edit Units used for Quantity Formatting.\n * @alpha\n */\nexport function FormatUnits(props: FormatUnitsProps) {\n const { initialFormat, persistenceUnit, unitsProvider, onUnitsChange } =\n props;\n const initialFormatRef = React.useRef<FormatProps>(initialFormat);\n const [formatProps, setFormatProps] = React.useState(initialFormat);\n\n React.useEffect(() => {\n if (initialFormatRef.current !== initialFormat) {\n initialFormatRef.current = initialFormat;\n setFormatProps(initialFormat);\n }\n }, [initialFormat]);\n\n const handleSetFormatProps = React.useCallback(\n (newProps: FormatProps) => {\n setFormatProps(newProps);\n onUnitsChange && onUnitsChange(newProps);\n },\n [onUnitsChange]\n );\n\n const handleUnitLabelChange = React.useCallback(\n (newLabel: string, index: number) => {\n // istanbul ignore else\n if (\n formatProps.composite &&\n formatProps.composite.units.length > index &&\n index >= 0\n ) {\n const units = formatProps.composite.units.map((entry, ndx) => {\n // istanbul ignore else\n if (index === ndx) return { name: entry.name, label: newLabel };\n else return entry;\n });\n\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleUnitChange = React.useCallback(\n (newUnit: string, index: number) => {\n const unitParts = newUnit.split(/:/);\n if (unitParts[0] === \"REMOVEUNIT\") {\n // istanbul ignore else\n if (formatProps.composite && formatProps.composite.units.length > 1) {\n const units = [...formatProps.composite.units];\n units.pop();\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n } else if (unitParts[0] === \"ADDSUBUNIT\") {\n const units =\n formatProps.composite && formatProps.composite.units.length\n ? [\n ...formatProps.composite.units,\n { name: unitParts[1], label: unitParts[2] },\n ]\n : /* istanbul ignore next*/ [\n { name: unitParts[1], label: unitParts[2] },\n ];\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n } else {\n // istanbul ignore else\n if (\n formatProps.composite &&\n formatProps.composite.units.length > index &&\n index >= 0\n ) {\n const units = formatProps.composite.units.map((entry, ndx) => {\n // istanbul ignore else\n if (index === ndx)\n return { name: unitParts[0], label: unitParts[1] };\n else return entry;\n });\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n } else if (!formatProps.composite) {\n const composite = {\n units: [{ name: unitParts[0], label: unitParts[1] }],\n };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleOnSpacerChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n // istanbul ignore else\n if (formatProps.composite) {\n const spacerValue = e.target.value.length\n ? e.target.value[0]\n : /* istanbul ignore next */ \"\"; // spacer can only be empty or a single character\n const composite = { ...formatProps.composite, spacer: spacerValue };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const compositeSpacer = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.compositeSpacer\")\n );\n\n return (\n <>\n {formatProps.composite?.units\n ? formatProps.composite.units.map((value, index) => (\n <UnitDescr\n key={value.name}\n name={value.name}\n label={value.label ?? \"\"}\n parentUnitName={\n index > 0\n ? formatProps.composite!.units[index - 1].name\n : undefined\n }\n unitsProvider={unitsProvider}\n index={index}\n onUnitChange={handleUnitChange}\n onLabelChange={handleUnitLabelChange}\n readonly={index < formatProps.composite!.units.length - 1}\n />\n ))\n : persistenceUnit && (\n <UnitDescr\n key={persistenceUnit.name}\n name={persistenceUnit.name}\n label={persistenceUnit.label}\n unitsProvider={unitsProvider}\n index={0}\n onUnitChange={handleUnitChange}\n onLabelChange={handleUnitLabelChange}\n />\n )}\n\n {formatProps.composite?.units &&\n formatProps.composite.units.length > 1 && (\n <>\n <span key={\"composite-spacer-label\"} className={\"uicore-label\"}>\n {compositeSpacer.current}\n </span>\n <Input\n key={\"composite-spacer\"}\n data-testid=\"composite-spacer\"\n value={formatProps.composite.spacer ?? \"\"}\n onChange={handleOnSpacerChange}\n size=\"small\"\n />\n </>\n )}\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FormatUnits.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/FormatUnits.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 QuantityFormat\n */\n\nimport * as React from \"react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type {\n FormatProps,\n UnitProps,\n UnitsProvider,\n} from \"@itwin/core-quantity\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport { UnitDescr } from \"./misc/UnitDescr\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\n/** Properties of [[FormatUnits]] component.\n * @alpha\n */\nexport interface FormatUnitsProps extends CommonProps {\n initialFormat: FormatProps;\n persistenceUnit?: UnitProps;\n unitsProvider: UnitsProvider;\n onUnitsChange?: (format: FormatProps) => void;\n}\n\n/** Component to show/edit Units used for Quantity Formatting.\n * @alpha\n */\nexport function FormatUnits(props: FormatUnitsProps) {\n const { initialFormat, persistenceUnit, unitsProvider, onUnitsChange } =\n props;\n const initialFormatRef = React.useRef<FormatProps>(initialFormat);\n const [formatProps, setFormatProps] = React.useState(initialFormat);\n\n React.useEffect(() => {\n if (initialFormatRef.current !== initialFormat) {\n initialFormatRef.current = initialFormat;\n setFormatProps(initialFormat);\n }\n }, [initialFormat]);\n\n const handleSetFormatProps = React.useCallback(\n (newProps: FormatProps) => {\n setFormatProps(newProps);\n onUnitsChange && onUnitsChange(newProps);\n },\n [onUnitsChange]\n );\n\n const handleUnitLabelChange = React.useCallback(\n (newLabel: string, index: number) => {\n // istanbul ignore else\n if (\n formatProps.composite &&\n formatProps.composite.units.length > index &&\n index >= 0\n ) {\n const units = formatProps.composite.units.map((entry, ndx) => {\n // istanbul ignore else\n if (index === ndx) return { name: entry.name, label: newLabel };\n else return entry;\n });\n\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleUnitChange = React.useCallback(\n (newUnit: string, index: number) => {\n const unitParts = newUnit.split(/:/);\n if (unitParts[0] === \"REMOVEUNIT\") {\n // istanbul ignore else\n if (formatProps.composite && formatProps.composite.units.length > 1) {\n const units = [...formatProps.composite.units];\n units.pop();\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n } else if (unitParts[0] === \"ADDSUBUNIT\") {\n const units =\n formatProps.composite && formatProps.composite.units.length\n ? [\n ...formatProps.composite.units,\n { name: unitParts[1], label: unitParts[2] },\n ]\n : /* istanbul ignore next*/ [\n { name: unitParts[1], label: unitParts[2] },\n ];\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n } else {\n // istanbul ignore else\n if (\n formatProps.composite &&\n formatProps.composite.units.length > index &&\n index >= 0\n ) {\n const units = formatProps.composite.units.map((entry, ndx) => {\n // istanbul ignore else\n if (index === ndx)\n return { name: unitParts[0], label: unitParts[1] };\n else return entry;\n });\n const composite = { ...formatProps.composite, units };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n } else if (!formatProps.composite) {\n const composite = {\n units: [{ name: unitParts[0], label: unitParts[1] }],\n };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleOnSpacerChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n // istanbul ignore else\n if (formatProps.composite) {\n const spacerValue = e.target.value.length\n ? e.target.value[0]\n : /* istanbul ignore next */ \"\"; // spacer can only be empty or a single character\n const composite = { ...formatProps.composite, spacer: spacerValue };\n const newFormatProps = { ...formatProps, composite };\n handleSetFormatProps(newFormatProps);\n }\n },\n [formatProps, handleSetFormatProps]\n );\n\n const compositeSpacer = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.compositeSpacer\")\n );\n\n return (\n <>\n {formatProps.composite?.units\n ? formatProps.composite.units.map((value, index) => (\n <UnitDescr\n key={value.name}\n name={value.name}\n label={value.label ?? \"\"}\n parentUnitName={\n index > 0\n ? formatProps.composite!.units[index - 1].name\n : undefined\n }\n unitsProvider={unitsProvider}\n index={index}\n onUnitChange={handleUnitChange}\n onLabelChange={handleUnitLabelChange}\n readonly={index < formatProps.composite!.units.length - 1}\n />\n ))\n : persistenceUnit && (\n <UnitDescr\n key={persistenceUnit.name}\n name={persistenceUnit.name}\n label={persistenceUnit.label}\n unitsProvider={unitsProvider}\n index={0}\n onUnitChange={handleUnitChange}\n onLabelChange={handleUnitLabelChange}\n />\n )}\n\n {formatProps.composite?.units &&\n formatProps.composite.units.length > 1 && (\n <>\n <span key={\"composite-spacer-label\"} className={\"uicore-label\"}>\n {compositeSpacer.current}\n </span>\n <Input\n key={\"composite-spacer\"}\n data-testid=\"composite-spacer\"\n value={formatProps.composite.spacer ?? \"\"}\n onChange={handleOnSpacerChange}\n size=\"small\"\n />\n </>\n )}\n </>\n );\n}\n"]}
|
|
@@ -21,7 +21,6 @@ import { UiIModelComponents } from "../UiIModelComponents";
|
|
|
21
21
|
* @alpha
|
|
22
22
|
*/
|
|
23
23
|
export function MiscFormatOptions(props) {
|
|
24
|
-
var _a, _b;
|
|
25
24
|
const { formatProps, onChange, showOptions, onShowHideOptions, enableMinimumProperties, } = props;
|
|
26
25
|
const handleSetFormatProps = React.useCallback((newFormatProps) => {
|
|
27
26
|
onChange && onChange(newFormatProps);
|
|
@@ -113,10 +112,7 @@ export function MiscFormatOptions(props) {
|
|
|
113
112
|
handleSetFormatProps(newFormatProps);
|
|
114
113
|
}, [handleSetFormatProps]);
|
|
115
114
|
const formatType = React.useMemo(() => parseFormatType(formatProps.type, "format"), [formatProps.type]);
|
|
116
|
-
const showSignOption = React.useMemo(() =>
|
|
117
|
-
var _a;
|
|
118
|
-
return parseShowSignOption((_a = formatProps.showSignOption) !== null && _a !== void 0 ? _a : "onlyNegative", "format");
|
|
119
|
-
}, [formatProps.showSignOption]);
|
|
115
|
+
const showSignOption = React.useMemo(() => parseShowSignOption(formatProps.showSignOption ?? "onlyNegative", "format"), [formatProps.showSignOption]);
|
|
120
116
|
const handleToggleButtonClick = React.useCallback(() => {
|
|
121
117
|
onShowHideOptions(!showOptions);
|
|
122
118
|
}, [onShowHideOptions, showOptions]);
|
|
@@ -153,14 +149,14 @@ export function MiscFormatOptions(props) {
|
|
|
153
149
|
React.createElement("span", { className: "uicore-label" }, signOptionLabel.current),
|
|
154
150
|
React.createElement(SignOptionSelector, { "data-testid": "sign-option-selector", signOption: showSignOption, onChange: handleShowSignChange }),
|
|
155
151
|
React.createElement("span", { className: classnames("uicore-label", formatType !== FormatType.Station && "uicore-disabled") }, stationOffsetLabel.current),
|
|
156
|
-
React.createElement(StationSizeSelector, { "data-testid": "station-size-selector", value:
|
|
152
|
+
React.createElement(StationSizeSelector, { "data-testid": "station-size-selector", value: formatProps.stationOffsetSize ?? 2, disabled: formatType !== FormatType.Station, onChange: handleStationOffsetChange }),
|
|
157
153
|
React.createElement("span", { className: classnames("uicore-label", formatType !== FormatType.Station && "uicore-disabled") }, stationSeparatorLabel.current),
|
|
158
154
|
React.createElement(StationSeparatorSelector, { "data-testid": "station-separator-selector", separator: undefined !== formatProps.stationSeparator
|
|
159
155
|
? formatProps.stationSeparator
|
|
160
156
|
: "+", disabled: formatType !== FormatType.Station, onChange: handleStationSeparatorChange }),
|
|
161
157
|
React.createElement(ThousandsSeparator, { formatProps: formatProps, onChange: handleFormatChange }),
|
|
162
158
|
React.createElement("span", { className: classnames("uicore-label", formatType === FormatType.Fractional && "uicore-disabled") }, decimalSeparatorLabel.current),
|
|
163
|
-
React.createElement(DecimalSeparatorSelector, { "data-testid": "decimal-separator-selector", separator:
|
|
159
|
+
React.createElement(DecimalSeparatorSelector, { "data-testid": "decimal-separator-selector", separator: formatProps.decimalSeparator ?? ".", onChange: handleDecimalSeparatorChange, disabled: formatType === FormatType.Fractional }),
|
|
164
160
|
React.createElement("span", { className: "uicore-label" }, showTrailZerosLabel.current),
|
|
165
161
|
React.createElement(Checkbox, { "data-testid": "show-trail-zeros", checked: isFormatTraitSet(FormatTraits.TrailZeroes), onChange: handleShowTrailingZeroesChange }),
|
|
166
162
|
React.createElement("span", { className: classnames("uicore-label", formatType === FormatType.Fractional && "uicore-disabled") }, keepDecimalPointLabel.current),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiscFormatOptions.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/MiscFormatOptions.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 QuantityFormat\n */\n\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Checkbox } from \"@itwin/itwinui-react\";\nimport type { FormatProps, ShowSignOption } from \"@itwin/core-quantity\";\nimport {\n Format,\n FormatTraits,\n FormatType,\n getTraitString,\n parseFormatType,\n parseScientificType,\n parseShowSignOption,\n ScientificType,\n scientificTypeToString,\n showSignOptionToString,\n} from \"@itwin/core-quantity\";\nimport { SignOptionSelector } from \"./misc/SignOption\";\nimport { ThousandsSeparator } from \"./misc/ThousandsSeparator\";\nimport { DecimalSeparatorSelector } from \"./misc/DecimalSeparator\";\nimport { ScientificTypeSelector } from \"./misc/ScientificType\";\nimport { StationSeparatorSelector } from \"./misc/StationSeparatorSelector\";\nimport { StationSizeSelector } from \"./misc/StationSizeSelector\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\n/** Properties of [[MiscFormatOptions]] component.\n * @alpha\n */\nexport interface MiscFormatOptionsProps extends CommonProps {\n formatProps: FormatProps;\n onChange?: (format: FormatProps) => void;\n enableMinimumProperties?: boolean;\n showOptions: boolean;\n onShowHideOptions: (show: boolean) => void;\n children?: React.ReactNode;\n}\n\n/** Component use to set miscellaneous properties is a Formatted Quantity.\n * @alpha\n */\nexport function MiscFormatOptions(props: MiscFormatOptionsProps) {\n const {\n formatProps,\n onChange,\n showOptions,\n onShowHideOptions,\n enableMinimumProperties,\n } = props;\n\n const handleSetFormatProps = React.useCallback(\n (newFormatProps: FormatProps) => {\n onChange && onChange(newFormatProps);\n },\n [onChange]\n );\n\n const isFormatTraitSet = React.useCallback(\n (trait: FormatTraits) => {\n return Format.isFormatTraitSetInProps(formatProps, trait);\n },\n [formatProps]\n );\n\n const handleShowSignChange = React.useCallback(\n (option: ShowSignOption) => {\n const newShowSignOption = showSignOptionToString(option);\n const newFormatProps = {\n ...formatProps,\n showSignOption: newShowSignOption,\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const setFormatTrait = React.useCallback(\n (trait: FormatTraits, setActive: boolean) => {\n const traitStr = getTraitString(trait);\n let formatTraits: string[] = [traitStr];\n if (setActive) {\n // setting trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n // istanbul ignore else\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\n formatTraits = [...traits, traitStr];\n }\n }\n } else {\n // clearing trait\n // istanbul ignore next\n if (!formatProps.formatTraits) return;\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\n }\n const newFormatProps = { ...formatProps, formatTraits };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleShowTrailingZeroesChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.TrailZeroes, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleKeepDecimalPointChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.KeepDecimalPoint, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleKeepSingleZeroChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.KeepSingleZero, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleZeroEmptyChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.ZeroEmpty, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleUseFractionDashChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.FractionDash, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleDecimalSeparatorChange = React.useCallback(\n (decimalSeparator: string) => {\n let thousandSeparator = formatProps.thousandSeparator;\n // make sure 1000 and decimal separator do not match\n // istanbul ignore else\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\n switch (decimalSeparator) {\n case \".\":\n thousandSeparator = \",\";\n break;\n case \",\":\n thousandSeparator = \".\";\n break;\n }\n }\n const newFormatProps = {\n ...formatProps,\n thousandSeparator,\n decimalSeparator,\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, isFormatTraitSet, handleSetFormatProps]\n );\n\n const handleScientificTypeChange = React.useCallback(\n (type: ScientificType) => {\n const newFormatProps = {\n ...formatProps,\n scientificType: scientificTypeToString(type),\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleFormatChange = React.useCallback(\n (newFormatProps: FormatProps) => {\n handleSetFormatProps(newFormatProps);\n },\n [handleSetFormatProps]\n );\n\n const formatType = React.useMemo(\n () => parseFormatType(formatProps.type, \"format\"),\n [formatProps.type]\n );\n const showSignOption = React.useMemo(\n () =>\n parseShowSignOption(\n formatProps.showSignOption ?? \"onlyNegative\",\n \"format\"\n ),\n [formatProps.showSignOption]\n );\n\n const handleToggleButtonClick = React.useCallback(() => {\n onShowHideOptions(!showOptions);\n }, [onShowHideOptions, showOptions]);\n\n const handleKeyUpOnLink = React.useCallback(\n (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n // istanbul ignore else\n if (e.key === SpecialKey.Enter || e.key === SpecialKey.Space) {\n onShowHideOptions(!showOptions);\n e.preventDefault();\n }\n },\n [onShowHideOptions, showOptions]\n );\n\n const handleStationSeparatorChange = React.useCallback(\n (value: string) => {\n const newFormatProps = { ...formatProps, stationSeparator: value };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleStationOffsetChange = React.useCallback(\n (value: number) => {\n const newFormatProps = { ...formatProps, stationOffsetSize: value };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const signOptionLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.signOptionLabel\")\n );\n const stationOffsetLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.stationOffsetLabel\")\n );\n const stationSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.stationSeparatorLabel\")\n );\n const decimalSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.decimalSeparatorLabel\")\n );\n const showTrailZerosLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.showTrailZerosLabel\")\n );\n const keepSingleZeroLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.keepSingleZeroLabel\")\n );\n const zeroEmptyLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.zeroEmptyLabel\")\n );\n const moreLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.moreLabel\")\n );\n const lessLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.lessLabel\")\n );\n const keepDecimalPointLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.keepDecimalPointLabel\")\n );\n const fractionDashLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.fractionDashLabel\")\n );\n const scientificTypeLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.scientificTypeLabel\")\n );\n\n return (\n <>\n {enableMinimumProperties && !showOptions && (\n <a // eslint-disable-line jsx-a11y/anchor-is-valid\n onClick={handleToggleButtonClick}\n onKeyUp={handleKeyUpOnLink}\n className={\"components-quantityFormat-more-less\"}\n role=\"link\"\n data-testid=\"quantityFormat-more\"\n tabIndex={0}\n >\n {moreLabel.current}\n </a>\n )}\n {(!enableMinimumProperties || showOptions) && (\n <>\n <span className={\"uicore-label\"}>{signOptionLabel.current}</span>\n <SignOptionSelector\n data-testid=\"sign-option-selector\"\n signOption={showSignOption}\n onChange={handleShowSignChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Station && \"uicore-disabled\"\n )}\n >\n {stationOffsetLabel.current}\n </span>\n <StationSizeSelector\n data-testid=\"station-size-selector\"\n value={formatProps.stationOffsetSize ?? 2}\n disabled={formatType !== FormatType.Station}\n onChange={handleStationOffsetChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Station && \"uicore-disabled\"\n )}\n >\n {stationSeparatorLabel.current}\n </span>\n <StationSeparatorSelector\n data-testid=\"station-separator-selector\"\n separator={\n undefined !== formatProps.stationSeparator\n ? formatProps.stationSeparator\n : \"+\"\n }\n disabled={formatType !== FormatType.Station}\n onChange={handleStationSeparatorChange}\n />\n\n <ThousandsSeparator\n formatProps={formatProps}\n onChange={handleFormatChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType === FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {decimalSeparatorLabel.current}\n </span>\n <DecimalSeparatorSelector\n data-testid=\"decimal-separator-selector\"\n separator={formatProps.decimalSeparator ?? \".\"}\n onChange={handleDecimalSeparatorChange}\n disabled={formatType === FormatType.Fractional}\n />\n\n <span className={\"uicore-label\"}>{showTrailZerosLabel.current}</span>\n <Checkbox\n data-testid=\"show-trail-zeros\"\n checked={isFormatTraitSet(FormatTraits.TrailZeroes)}\n onChange={handleShowTrailingZeroesChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType === FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {keepDecimalPointLabel.current}\n </span>\n <Checkbox\n data-testid=\"keep-decimal-point\"\n checked={isFormatTraitSet(FormatTraits.KeepDecimalPoint)}\n onChange={handleKeepDecimalPointChange}\n />\n\n <span className={\"uicore-label\"}>{keepSingleZeroLabel.current}</span>\n <Checkbox\n data-testid=\"keep-single-zero\"\n checked={isFormatTraitSet(FormatTraits.KeepSingleZero)}\n onChange={handleKeepSingleZeroChange}\n />\n\n <span className={\"uicore-label\"}>{zeroEmptyLabel.current}</span>\n <Checkbox\n data-testid=\"zero-empty\"\n checked={isFormatTraitSet(FormatTraits.ZeroEmpty)}\n onChange={handleZeroEmptyChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {fractionDashLabel.current}\n </span>\n <Checkbox\n data-testid=\"fraction-dash\"\n checked={isFormatTraitSet(FormatTraits.FractionDash)}\n onChange={handleUseFractionDashChange}\n disabled={formatType !== FormatType.Fractional}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Scientific && \"uicore-disabled\"\n )}\n >\n {scientificTypeLabel.current}\n </span>\n <ScientificTypeSelector\n data-testid=\"scientific-type-selector\"\n type={\n formatProps.scientificType &&\n formatProps.scientificType.length > 0\n ? parseScientificType(formatProps.scientificType, \"custom\")\n : ScientificType.Normalized\n }\n disabled={formatType !== FormatType.Scientific}\n onChange={handleScientificTypeChange}\n />\n\n {props.children}\n\n {enableMinimumProperties && showOptions && (\n <a // eslint-disable-line jsx-a11y/anchor-is-valid\n onClick={handleToggleButtonClick}\n onKeyUp={handleKeyUpOnLink}\n className={\"components-quantityFormat-more-less\"}\n role=\"link\"\n data-testid=\"quantityFormat-less\"\n tabIndex={0}\n >\n {lessLabel.current}\n </a>\n )}\n </>\n )}\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MiscFormatOptions.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/MiscFormatOptions.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 QuantityFormat\n */\n\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Checkbox } from \"@itwin/itwinui-react\";\nimport type { FormatProps, ShowSignOption } from \"@itwin/core-quantity\";\nimport {\n Format,\n FormatTraits,\n FormatType,\n getTraitString,\n parseFormatType,\n parseScientificType,\n parseShowSignOption,\n ScientificType,\n scientificTypeToString,\n showSignOptionToString,\n} from \"@itwin/core-quantity\";\nimport { SignOptionSelector } from \"./misc/SignOption\";\nimport { ThousandsSeparator } from \"./misc/ThousandsSeparator\";\nimport { DecimalSeparatorSelector } from \"./misc/DecimalSeparator\";\nimport { ScientificTypeSelector } from \"./misc/ScientificType\";\nimport { StationSeparatorSelector } from \"./misc/StationSeparatorSelector\";\nimport { StationSizeSelector } from \"./misc/StationSizeSelector\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\n\n/** Properties of [[MiscFormatOptions]] component.\n * @alpha\n */\nexport interface MiscFormatOptionsProps extends CommonProps {\n formatProps: FormatProps;\n onChange?: (format: FormatProps) => void;\n enableMinimumProperties?: boolean;\n showOptions: boolean;\n onShowHideOptions: (show: boolean) => void;\n children?: React.ReactNode;\n}\n\n/** Component use to set miscellaneous properties is a Formatted Quantity.\n * @alpha\n */\nexport function MiscFormatOptions(props: MiscFormatOptionsProps) {\n const {\n formatProps,\n onChange,\n showOptions,\n onShowHideOptions,\n enableMinimumProperties,\n } = props;\n\n const handleSetFormatProps = React.useCallback(\n (newFormatProps: FormatProps) => {\n onChange && onChange(newFormatProps);\n },\n [onChange]\n );\n\n const isFormatTraitSet = React.useCallback(\n (trait: FormatTraits) => {\n return Format.isFormatTraitSetInProps(formatProps, trait);\n },\n [formatProps]\n );\n\n const handleShowSignChange = React.useCallback(\n (option: ShowSignOption) => {\n const newShowSignOption = showSignOptionToString(option);\n const newFormatProps = {\n ...formatProps,\n showSignOption: newShowSignOption,\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const setFormatTrait = React.useCallback(\n (trait: FormatTraits, setActive: boolean) => {\n const traitStr = getTraitString(trait);\n let formatTraits: string[] = [traitStr];\n if (setActive) {\n // setting trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n // istanbul ignore else\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\n formatTraits = [...traits, traitStr];\n }\n }\n } else {\n // clearing trait\n // istanbul ignore next\n if (!formatProps.formatTraits) return;\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\n }\n const newFormatProps = { ...formatProps, formatTraits };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleShowTrailingZeroesChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.TrailZeroes, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleKeepDecimalPointChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.KeepDecimalPoint, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleKeepSingleZeroChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.KeepSingleZero, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleZeroEmptyChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.ZeroEmpty, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleUseFractionDashChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.FractionDash, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const handleDecimalSeparatorChange = React.useCallback(\n (decimalSeparator: string) => {\n let thousandSeparator = formatProps.thousandSeparator;\n // make sure 1000 and decimal separator do not match\n // istanbul ignore else\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\n switch (decimalSeparator) {\n case \".\":\n thousandSeparator = \",\";\n break;\n case \",\":\n thousandSeparator = \".\";\n break;\n }\n }\n const newFormatProps = {\n ...formatProps,\n thousandSeparator,\n decimalSeparator,\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, isFormatTraitSet, handleSetFormatProps]\n );\n\n const handleScientificTypeChange = React.useCallback(\n (type: ScientificType) => {\n const newFormatProps = {\n ...formatProps,\n scientificType: scientificTypeToString(type),\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleFormatChange = React.useCallback(\n (newFormatProps: FormatProps) => {\n handleSetFormatProps(newFormatProps);\n },\n [handleSetFormatProps]\n );\n\n const formatType = React.useMemo(\n () => parseFormatType(formatProps.type, \"format\"),\n [formatProps.type]\n );\n const showSignOption = React.useMemo(\n () =>\n parseShowSignOption(\n formatProps.showSignOption ?? \"onlyNegative\",\n \"format\"\n ),\n [formatProps.showSignOption]\n );\n\n const handleToggleButtonClick = React.useCallback(() => {\n onShowHideOptions(!showOptions);\n }, [onShowHideOptions, showOptions]);\n\n const handleKeyUpOnLink = React.useCallback(\n (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n // istanbul ignore else\n if (e.key === SpecialKey.Enter || e.key === SpecialKey.Space) {\n onShowHideOptions(!showOptions);\n e.preventDefault();\n }\n },\n [onShowHideOptions, showOptions]\n );\n\n const handleStationSeparatorChange = React.useCallback(\n (value: string) => {\n const newFormatProps = { ...formatProps, stationSeparator: value };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleStationOffsetChange = React.useCallback(\n (value: number) => {\n const newFormatProps = { ...formatProps, stationOffsetSize: value };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const signOptionLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.signOptionLabel\")\n );\n const stationOffsetLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.stationOffsetLabel\")\n );\n const stationSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.stationSeparatorLabel\")\n );\n const decimalSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.decimalSeparatorLabel\")\n );\n const showTrailZerosLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.showTrailZerosLabel\")\n );\n const keepSingleZeroLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.keepSingleZeroLabel\")\n );\n const zeroEmptyLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.zeroEmptyLabel\")\n );\n const moreLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.moreLabel\")\n );\n const lessLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.lessLabel\")\n );\n const keepDecimalPointLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.keepDecimalPointLabel\")\n );\n const fractionDashLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.fractionDashLabel\")\n );\n const scientificTypeLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.scientificTypeLabel\")\n );\n\n return (\n <>\n {enableMinimumProperties && !showOptions && (\n <a // eslint-disable-line jsx-a11y/anchor-is-valid\n onClick={handleToggleButtonClick}\n onKeyUp={handleKeyUpOnLink}\n className={\"components-quantityFormat-more-less\"}\n role=\"link\"\n data-testid=\"quantityFormat-more\"\n tabIndex={0}\n >\n {moreLabel.current}\n </a>\n )}\n {(!enableMinimumProperties || showOptions) && (\n <>\n <span className={\"uicore-label\"}>{signOptionLabel.current}</span>\n <SignOptionSelector\n data-testid=\"sign-option-selector\"\n signOption={showSignOption}\n onChange={handleShowSignChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Station && \"uicore-disabled\"\n )}\n >\n {stationOffsetLabel.current}\n </span>\n <StationSizeSelector\n data-testid=\"station-size-selector\"\n value={formatProps.stationOffsetSize ?? 2}\n disabled={formatType !== FormatType.Station}\n onChange={handleStationOffsetChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Station && \"uicore-disabled\"\n )}\n >\n {stationSeparatorLabel.current}\n </span>\n <StationSeparatorSelector\n data-testid=\"station-separator-selector\"\n separator={\n undefined !== formatProps.stationSeparator\n ? formatProps.stationSeparator\n : \"+\"\n }\n disabled={formatType !== FormatType.Station}\n onChange={handleStationSeparatorChange}\n />\n\n <ThousandsSeparator\n formatProps={formatProps}\n onChange={handleFormatChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType === FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {decimalSeparatorLabel.current}\n </span>\n <DecimalSeparatorSelector\n data-testid=\"decimal-separator-selector\"\n separator={formatProps.decimalSeparator ?? \".\"}\n onChange={handleDecimalSeparatorChange}\n disabled={formatType === FormatType.Fractional}\n />\n\n <span className={\"uicore-label\"}>{showTrailZerosLabel.current}</span>\n <Checkbox\n data-testid=\"show-trail-zeros\"\n checked={isFormatTraitSet(FormatTraits.TrailZeroes)}\n onChange={handleShowTrailingZeroesChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType === FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {keepDecimalPointLabel.current}\n </span>\n <Checkbox\n data-testid=\"keep-decimal-point\"\n checked={isFormatTraitSet(FormatTraits.KeepDecimalPoint)}\n onChange={handleKeepDecimalPointChange}\n />\n\n <span className={\"uicore-label\"}>{keepSingleZeroLabel.current}</span>\n <Checkbox\n data-testid=\"keep-single-zero\"\n checked={isFormatTraitSet(FormatTraits.KeepSingleZero)}\n onChange={handleKeepSingleZeroChange}\n />\n\n <span className={\"uicore-label\"}>{zeroEmptyLabel.current}</span>\n <Checkbox\n data-testid=\"zero-empty\"\n checked={isFormatTraitSet(FormatTraits.ZeroEmpty)}\n onChange={handleZeroEmptyChange}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Fractional && \"uicore-disabled\"\n )}\n >\n {fractionDashLabel.current}\n </span>\n <Checkbox\n data-testid=\"fraction-dash\"\n checked={isFormatTraitSet(FormatTraits.FractionDash)}\n onChange={handleUseFractionDashChange}\n disabled={formatType !== FormatType.Fractional}\n />\n\n <span\n className={classnames(\n \"uicore-label\",\n formatType !== FormatType.Scientific && \"uicore-disabled\"\n )}\n >\n {scientificTypeLabel.current}\n </span>\n <ScientificTypeSelector\n data-testid=\"scientific-type-selector\"\n type={\n formatProps.scientificType &&\n formatProps.scientificType.length > 0\n ? parseScientificType(formatProps.scientificType, \"custom\")\n : ScientificType.Normalized\n }\n disabled={formatType !== FormatType.Scientific}\n onChange={handleScientificTypeChange}\n />\n\n {props.children}\n\n {enableMinimumProperties && showOptions && (\n <a // eslint-disable-line jsx-a11y/anchor-is-valid\n onClick={handleToggleButtonClick}\n onKeyUp={handleKeyUpOnLink}\n className={\"components-quantityFormat-more-less\"}\n role=\"link\"\n data-testid=\"quantityFormat-less\"\n tabIndex={0}\n >\n {lessLabel.current}\n </a>\n )}\n </>\n )}\n </>\n );\n}\n"]}
|
|
@@ -15,7 +15,6 @@ import { UiIModelComponents } from "../../UiIModelComponents";
|
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
17
|
export function ThousandsSeparator(props) {
|
|
18
|
-
var _a;
|
|
19
18
|
const { formatProps, onChange } = props;
|
|
20
19
|
const handleSetFormatProps = React.useCallback((newProps) => {
|
|
21
20
|
onChange && onChange(newProps);
|
|
@@ -76,6 +75,6 @@ export function ThousandsSeparator(props) {
|
|
|
76
75
|
React.createElement("span", { className: "uicore-label" }, useThousandSeparatorLabel.current),
|
|
77
76
|
React.createElement(Checkbox, { "data-testid": "use-thousands-separator", checked: isFormatTraitSet(FormatTraits.Use1000Separator), onChange: handleUseThousandsSeparatorChange }),
|
|
78
77
|
React.createElement("span", { className: classnames("uicore-label", !isFormatTraitSet(FormatTraits.Use1000Separator) && "uicore-disabled") }, thousandSeparatorLabel.current),
|
|
79
|
-
React.createElement(ThousandsSelector, { "data-testid": "thousands-separator-selector", separator:
|
|
78
|
+
React.createElement(ThousandsSelector, { "data-testid": "thousands-separator-selector", separator: formatProps.thousandSeparator ?? ",", disabled: !isFormatTraitSet(FormatTraits.Use1000Separator), onChange: handleThousandSeparatorChange })));
|
|
80
79
|
}
|
|
81
80
|
//# sourceMappingURL=ThousandsSeparator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThousandsSeparator.js","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAU9D;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B
|
|
1
|
+
{"version":3,"file":"ThousandsSeparator.js","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.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 QuantityFormat\n */\n\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type { FormatProps } from \"@itwin/core-quantity\";\nimport { Format, FormatTraits, getTraitString } from \"@itwin/core-quantity\";\nimport { Checkbox } from \"@itwin/itwinui-react\";\nimport { ThousandsSelector } from \"./ThousandsSelector\";\nimport { UiIModelComponents } from \"../../UiIModelComponents\";\n\n/** Properties of [[ThousandsSeparator]] component.\n * @internal\n */\nexport interface ThousandsSeparatorProps extends CommonProps {\n formatProps: FormatProps;\n onChange?: (format: FormatProps) => void;\n}\n\n/** Component use to set Quantity Format thousand group separator.\n * @internal\n */\nexport function ThousandsSeparator(props: ThousandsSeparatorProps) {\n const { formatProps, onChange } = props;\n\n const handleSetFormatProps = React.useCallback(\n (newProps: FormatProps) => {\n onChange && onChange(newProps);\n },\n [onChange]\n );\n\n const setFormatTrait = React.useCallback(\n (trait: FormatTraits, setActive: boolean) => {\n const traitStr = getTraitString(trait);\n let formatTraits: string[] = [traitStr];\n if (setActive) {\n // setting trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n formatTraits = [...traits, traitStr];\n }\n } else {\n // clearing trait\n // istanbul ignore else\n if (formatProps.formatTraits) {\n const traits = Array.isArray(formatProps.formatTraits)\n ? formatProps.formatTraits\n : /* istanbul ignore next */ formatProps.formatTraits.split(\n /,|;|\\|/\n );\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\n }\n }\n const newFormatProps = { ...formatProps, formatTraits };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, handleSetFormatProps]\n );\n\n const handleUseThousandsSeparatorChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormatTrait(FormatTraits.Use1000Separator, e.target.checked);\n },\n [setFormatTrait]\n );\n\n const isFormatTraitSet = React.useCallback(\n (trait: FormatTraits) => {\n return Format.isFormatTraitSetInProps(formatProps, trait);\n },\n [formatProps]\n );\n\n const handleThousandSeparatorChange = React.useCallback(\n (thousandSeparator: string) => {\n let decimalSeparator = formatProps.decimalSeparator;\n // make sure 1000 and decimal separator do not match\n // istanbul ignore else\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\n if (thousandSeparator === \".\") decimalSeparator = \",\";\n // thousandSeparator === \",\"\n else decimalSeparator = \".\";\n }\n const newFormatProps = {\n ...formatProps,\n thousandSeparator,\n decimalSeparator,\n };\n handleSetFormatProps(newFormatProps);\n },\n [formatProps, isFormatTraitSet, handleSetFormatProps]\n );\n\n const useThousandSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\n \"QuantityFormat.labels.useThousandSeparatorLabel\"\n )\n );\n const thousandSeparatorLabel = React.useRef(\n UiIModelComponents.translate(\"QuantityFormat.labels.thousandSeparatorLabel\")\n );\n\n return (\n <>\n <span className={\"uicore-label\"}>\n {useThousandSeparatorLabel.current}\n </span>\n <Checkbox\n data-testid=\"use-thousands-separator\"\n checked={isFormatTraitSet(FormatTraits.Use1000Separator)}\n onChange={handleUseThousandsSeparatorChange}\n />\n <span\n className={classnames(\n \"uicore-label\",\n !isFormatTraitSet(FormatTraits.Use1000Separator) && \"uicore-disabled\"\n )}\n >\n {thousandSeparatorLabel.current}\n </span>\n <ThousandsSelector\n data-testid=\"thousands-separator-selector\"\n separator={formatProps.thousandSeparator ?? \",\"}\n disabled={!isFormatTraitSet(FormatTraits.Use1000Separator)}\n onChange={handleThousandSeparatorChange}\n />\n </>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
6
|
.player-button {
|
|
7
7
|
width: 38px;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
@import "~@itwin/core-react/lib/cjs/core-react/z-index";
|
|
6
6
|
// the following overrides default iui-slider-thumb settings from iTwinUI
|
|
7
7
|
div.components-timeline-thumb.iui-slider-thumb {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
@import "~@itwin/core-react/lib/cjs/core-react/style/themecolors";
|
|
6
6
|
|
|
7
7
|
$top-position: 6px;
|
|
@@ -18,7 +18,7 @@ import { ViewportComponentEvents } from "./ViewportComponentEvents";
|
|
|
18
18
|
export function ViewportComponent(props) {
|
|
19
19
|
const { viewState, imodel, viewDefinitionId, getViewOverlay, viewManagerOverride, tentativePointOverride, onContextMenu, style, className, screenViewportOverride, controlId, viewportRef, } = props;
|
|
20
20
|
// istanbul ignore next
|
|
21
|
-
const viewManagerRef = React.useRef(viewManagerOverride
|
|
21
|
+
const viewManagerRef = React.useRef(viewManagerOverride ?? IModelApp.viewManager);
|
|
22
22
|
const tentativePointOverrideRef = React.useRef(tentativePointOverride);
|
|
23
23
|
const screenViewportCreated = React.useRef(false);
|
|
24
24
|
const viewportDiv = React.useRef(null);
|
|
@@ -76,10 +76,9 @@ export function ViewportComponent(props) {
|
|
|
76
76
|
};
|
|
77
77
|
const targetPoint = React.useRef(null);
|
|
78
78
|
const getRotatePoint = (vp) => {
|
|
79
|
-
var _a, _b;
|
|
80
79
|
const lastTargetPoint = targetPoint.current;
|
|
81
80
|
// istanbul ignore next
|
|
82
|
-
const tentativePoint =
|
|
81
|
+
const tentativePoint = tentativePointOverrideRef.current ?? IModelApp.tentativePoint;
|
|
83
82
|
// istanbul ignore else
|
|
84
83
|
if (tentativePoint.isActive)
|
|
85
84
|
return tentativePoint.getPoint();
|
|
@@ -97,7 +96,7 @@ export function ViewportComponent(props) {
|
|
|
97
96
|
targetPoint.current =
|
|
98
97
|
undefined !== visiblePoint ? visiblePoint : vp.view.getTargetPoint();
|
|
99
98
|
// istanbul ignore next
|
|
100
|
-
return
|
|
99
|
+
return targetPoint.current ?? vp.view.getCenter();
|
|
101
100
|
};
|
|
102
101
|
const handleCubeRotationChangeEvent = (args) => {
|
|
103
102
|
const viewManager = viewManagerRef.current;
|
|
@@ -209,8 +208,8 @@ export function ViewportComponent(props) {
|
|
|
209
208
|
}
|
|
210
209
|
// istanbul ignore next
|
|
211
210
|
if (isMounted.current &&
|
|
212
|
-
(
|
|
213
|
-
setInitialViewState(currentViewState
|
|
211
|
+
(currentViewState?.iModel.isOpen || currentViewState?.iModel.isBlank)) {
|
|
212
|
+
setInitialViewState(currentViewState?.clone());
|
|
214
213
|
}
|
|
215
214
|
}
|
|
216
215
|
if (undefined === initialViewState)
|
|
@@ -219,13 +218,12 @@ export function ViewportComponent(props) {
|
|
|
219
218
|
const [viewOverlay, setViewOverlay] = React.useState(null);
|
|
220
219
|
// This useEffect connects to ViewManger as soon as initialViewState is available once component is mounted.
|
|
221
220
|
React.useEffect(() => {
|
|
222
|
-
var _a;
|
|
223
221
|
const parentDiv = viewportDiv.current;
|
|
224
222
|
const viewManager = viewManagerRef.current;
|
|
225
223
|
// istanbul ignore next
|
|
226
224
|
if (parentDiv &&
|
|
227
225
|
initialViewState &&
|
|
228
|
-
(
|
|
226
|
+
(initialViewState?.iModel.isOpen || initialViewState?.iModel.isBlank)) {
|
|
229
227
|
if (!screenViewportCreated.current) {
|
|
230
228
|
const screenViewport = getScreenViewport(parentDiv, initialViewState);
|
|
231
229
|
screenViewportRef.current = screenViewport;
|
|
@@ -238,7 +236,7 @@ export function ViewportComponent(props) {
|
|
|
238
236
|
}
|
|
239
237
|
else {
|
|
240
238
|
// istanbul ignore next
|
|
241
|
-
|
|
239
|
+
screenViewportRef.current?.changeView(initialViewState);
|
|
242
240
|
}
|
|
243
241
|
}
|
|
244
242
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewportComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.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 Viewport\n */\n\nimport * as React from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport { Logger } from \"@itwin/core-bentley\";\nimport type { Point3d } from \"@itwin/core-geometry\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { NpcCenter } from \"@itwin/core-common\";\nimport type {\n IModelConnection,\n TentativePoint,\n ViewManager,\n Viewport,\n ViewState,\n} from \"@itwin/core-frontend\";\nimport {\n IModelApp,\n ScreenViewport,\n StandardView,\n ToolSettings,\n} from \"@itwin/core-frontend\";\n\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type {\n CubeRotationChangeEventArgs,\n DrawingViewportChangeEventArgs,\n StandardRotationChangeEventArgs,\n} from \"./ViewportComponentEvents\";\nimport { ViewportComponentEvents } from \"./ViewportComponentEvents\";\n\n/** Type for a ViewState prop\n * @public\n */\nexport type ViewStateProp = ViewState | (() => ViewState);\n\n/**\n * Properties for [[ViewportComponent]] component.\n * @public\n */\nexport interface ViewportProps extends CommonProps {\n /** IModel to display */\n imodel: IModelConnection;\n /** Id of a default view definition to load as a starting point */\n viewDefinitionId?: Id64String;\n /** ViewState to use as a starting point */\n viewState?: ViewStateProp;\n /** Function to get a reference to the ScreenViewport */\n viewportRef?: (v: ScreenViewport) => void;\n /** controlId for this content component @internal */\n controlId?: string;\n /** @internal */\n onContextMenu?: (e: React.MouseEvent) => boolean;\n /** @internal */\n getViewOverlay?: (viewport: ScreenViewport) => React.ReactNode;\n /** @internal used only for testing */\n viewManagerOverride?: ViewManager;\n /** @internal used only for testing */\n screenViewportOverride?: typeof ScreenViewport;\n /** @internal used only for testing */\n tentativePointOverride?: TentativePoint;\n}\n\n/**\n * A viewport React component that creates a ScreenViewport.\n * @public\n */\nexport function ViewportComponent(props: ViewportProps) {\n const {\n viewState,\n imodel,\n viewDefinitionId,\n getViewOverlay,\n viewManagerOverride,\n tentativePointOverride,\n onContextMenu,\n style,\n className,\n screenViewportOverride,\n controlId,\n viewportRef,\n } = props;\n // istanbul ignore next\n const viewManagerRef = React.useRef(\n viewManagerOverride ?? IModelApp.viewManager\n );\n const tentativePointOverrideRef = React.useRef(tentativePointOverride);\n const screenViewportCreated = React.useRef(false);\n const viewportDiv = React.useRef<HTMLDivElement>(null);\n const screenViewportRef = React.useRef<ScreenViewport | null>(null);\n const isMounted = React.useRef(false);\n const viewClassFullName = React.useRef(\"\");\n const viewId = React.useRef(\"0\");\n\n // istanbul ignore next\n const handleViewChanged = (vp: Viewport) => {\n // istanbul ignore next\n if (!(vp.iModel.isOpen || vp.iModel.isBlank)) return;\n ViewportComponentEvents.setViewMatrix(vp);\n if (viewClassFullName.current !== vp.view.classFullName) {\n setTimeout(() => {\n ViewportComponentEvents.onViewClassFullNameChangedEvent.emit({\n viewport: vp,\n oldName: viewClassFullName.current,\n newName: vp.view.classFullName,\n });\n viewClassFullName.current = vp.view.classFullName;\n });\n }\n if (viewId.current !== vp.view.id) {\n setTimeout(() => {\n ViewportComponentEvents.onViewIdChangedEvent.emit({\n viewport: vp,\n oldId: viewId.current,\n newId: vp.view.id,\n });\n viewId.current = vp.view.id;\n });\n }\n };\n\n const handleStandardRotationChangeEvent = (\n args: StandardRotationChangeEventArgs\n ) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n currentScreenViewport.view.setRotationAboutPoint(\n StandardView.getStandardRotation(args.standardRotation)\n );\n currentScreenViewport.synchWithView();\n }\n };\n\n const handleDrawingViewportChangeEvent = (\n args: DrawingViewportChangeEventArgs\n ) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n currentScreenViewport.view.setOrigin(args.origin);\n currentScreenViewport.view.setRotation(args.rotation);\n currentScreenViewport.synchWithView({\n noSaveInUndo: args.complete !== true,\n });\n }\n };\n\n const targetPoint = React.useRef<Point3d | null>(null);\n\n const getRotatePoint = (vp: ScreenViewport): Point3d => {\n const lastTargetPoint = targetPoint.current;\n // istanbul ignore next\n const tentativePoint =\n tentativePointOverrideRef.current ?? IModelApp.tentativePoint;\n // istanbul ignore else\n if (tentativePoint.isActive) return tentativePoint.getPoint();\n\n // istanbul ignore else\n if (null !== lastTargetPoint) {\n const testPt = vp.worldToView(lastTargetPoint);\n const viewRect = vp.viewRect.clone();\n viewRect.scaleAboutCenter(0.25, 0.25);\n // istanbul ignore next hard to reach because of mocks\n if (viewRect.containsPoint(testPt)) return lastTargetPoint;\n targetPoint.current = null;\n }\n\n const visiblePoint = vp.pickNearestVisibleGeometry(\n vp.npcToWorld(NpcCenter),\n vp.pixelsFromInches(ToolSettings.viewToolPickRadiusInches)\n );\n targetPoint.current =\n undefined !== visiblePoint ? visiblePoint : vp.view.getTargetPoint();\n // istanbul ignore next\n return targetPoint.current ?? vp.view.getCenter();\n };\n\n const handleCubeRotationChangeEvent = (args: CubeRotationChangeEventArgs) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n // istanbul ignore else\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n const rotMatrix = args.rotMatrix;\n // istanbul ignore else\n if (currentScreenViewport.rotation !== rotMatrix) {\n const inverse = rotMatrix.transpose(); // rotation is from current nav cube state...\n const center = getRotatePoint(currentScreenViewport);\n const targetMatrix = inverse.multiplyMatrixMatrix(\n currentScreenViewport.view.getRotation()\n );\n const worldTransform = Transform.createFixedPointAndMatrix(\n center,\n targetMatrix\n );\n const frustum = currentScreenViewport.getWorldFrustum();\n frustum.multiply(worldTransform);\n currentScreenViewport.view.setupFromFrustum(frustum);\n currentScreenViewport.synchWithView({ noSaveInUndo: !args.complete });\n }\n }\n };\n\n const handleDisconnectFromViewManager = () => {\n const screenViewport = screenViewportRef.current;\n if (screenViewport) {\n const viewManager = IModelApp.viewManager;\n screenViewport.onViewChanged.removeListener(handleViewChanged);\n screenViewportRef.current = null;\n screenViewportCreated.current = false;\n ViewportComponentEvents.onDrawingViewportChangeEvent.removeListener(\n handleDrawingViewportChangeEvent\n );\n ViewportComponentEvents.onCubeRotationChangeEvent.removeListener(\n handleCubeRotationChangeEvent\n );\n ViewportComponentEvents.onStandardRotationChangeEvent.removeListener(\n handleStandardRotationChangeEvent\n );\n viewManager.dropViewport(screenViewport, true);\n }\n };\n\n // istanbul ignore next\n const handleWindowUnload = () => {\n const parentDiv = viewportDiv.current;\n if (parentDiv) {\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\n if (parentWindow !== window) {\n handleDisconnectFromViewManager();\n }\n }\n };\n\n const getScreenViewport = (\n parentDiv: HTMLDivElement,\n inViewState: ViewState\n ) => {\n // istanbul ignore next\n const screenViewportFactory = screenViewportOverride\n ? screenViewportOverride\n : ScreenViewport;\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\n parentWindow.addEventListener(\"unload\", handleWindowUnload, true); // listener clear after being called\n ViewportComponentEvents.initialize();\n ViewportComponentEvents.onDrawingViewportChangeEvent.addListener(\n handleDrawingViewportChangeEvent\n );\n ViewportComponentEvents.onCubeRotationChangeEvent.addListener(\n handleCubeRotationChangeEvent\n );\n ViewportComponentEvents.onStandardRotationChangeEvent.addListener(\n handleStandardRotationChangeEvent\n );\n const screenViewport = screenViewportFactory.create(parentDiv, inViewState);\n screenViewportCreated.current = true;\n viewClassFullName.current = screenViewport.view.classFullName;\n viewId.current = screenViewport.view.id;\n screenViewport.onViewChanged.addListener(handleViewChanged);\n return screenViewport;\n };\n\n React.useEffect(() => {\n isMounted.current = true;\n Logger.logInfo(\n \"ViewportComponent\",\n `mounting ViewportComponent for controlId=${controlId}`\n );\n\n return () => {\n isMounted.current = false;\n Logger.logInfo(\n \"ViewportComponent\",\n `un-mounting ViewportComponent for controlId=${controlId}`\n );\n handleDisconnectFromViewManager();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [initialViewState, setInitialViewState] = React.useState<\n ViewState | undefined\n >(() => {\n if (viewState) {\n if (typeof viewState === \"function\") return viewState().clone();\n else return viewState.clone();\n }\n return undefined;\n });\n\n React.useEffect(() => {\n setInitialViewState(undefined);\n }, [viewDefinitionId, viewState]);\n React.useEffect(() => {\n async function fetchInitialViewstate() {\n let currentViewState: ViewState | undefined;\n if (viewState) {\n if (typeof viewState === \"function\") currentViewState = viewState();\n else currentViewState = viewState;\n } else if (viewDefinitionId && imodel) {\n try {\n currentViewState = await imodel.views.load(viewDefinitionId);\n // istanbul ignore next\n if (!currentViewState) {\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\n }\n } catch (_e) {\n // istanbul ignore next\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\n }\n } else {\n Logger.logError(\n \"ViewportComponent\",\n `A Viewstate or a viewId and imodel must be provided`\n );\n }\n // istanbul ignore next\n if (\n isMounted.current &&\n (currentViewState?.iModel.isOpen || currentViewState?.iModel.isBlank)\n ) {\n setInitialViewState(currentViewState?.clone());\n }\n }\n if (undefined === initialViewState) void fetchInitialViewstate();\n }, [imodel, initialViewState, viewDefinitionId, viewState]);\n\n const [viewOverlay, setViewOverlay] = React.useState<React.ReactNode>(null);\n\n // This useEffect connects to ViewManger as soon as initialViewState is available once component is mounted.\n React.useEffect(() => {\n const parentDiv = viewportDiv.current;\n const viewManager = viewManagerRef.current;\n // istanbul ignore next\n if (\n parentDiv &&\n initialViewState &&\n (initialViewState?.iModel.isOpen || initialViewState?.iModel.isBlank)\n ) {\n if (!screenViewportCreated.current) {\n const screenViewport = getScreenViewport(parentDiv, initialViewState);\n screenViewportRef.current = screenViewport;\n\n if (viewportRef) viewportRef(screenViewport);\n\n Logger.logInfo(\n \"ViewportComponent\",\n `processing viewManager.addViewport for controlId=${controlId}`\n );\n viewManager.addViewport(screenViewport);\n\n // overlay component is set up once a ScreenViewport is available. The overlay component must handle any view changes itself.\n setViewOverlay(getViewOverlay ? getViewOverlay(screenViewport) : null);\n } else {\n // istanbul ignore next\n screenViewportRef.current?.changeView(initialViewState);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlId, initialViewState, viewportRef]);\n\n const handleContextMenu = React.useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (onContextMenu) onContextMenu(e);\n },\n [onContextMenu]\n );\n\n const parentDivStyle: React.CSSProperties = {\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n };\n\n const viewportDivStyle: React.CSSProperties = {\n ...style,\n height: \"100%\",\n width: \"100%\",\n };\n\n return (\n <div style={parentDivStyle} data-item-id={controlId}>\n <>\n <div\n ref={viewportDiv}\n data-testid=\"viewport-component\"\n className={className}\n style={viewportDivStyle}\n onContextMenu={handleContextMenu}\n />\n {viewOverlay}\n </>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ViewportComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.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 Viewport\n */\n\nimport * as React from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport { Logger } from \"@itwin/core-bentley\";\nimport type { Point3d } from \"@itwin/core-geometry\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { NpcCenter } from \"@itwin/core-common\";\nimport type {\n IModelConnection,\n TentativePoint,\n ViewManager,\n Viewport,\n ViewState,\n} from \"@itwin/core-frontend\";\nimport {\n IModelApp,\n ScreenViewport,\n StandardView,\n ToolSettings,\n} from \"@itwin/core-frontend\";\n\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type {\n CubeRotationChangeEventArgs,\n DrawingViewportChangeEventArgs,\n StandardRotationChangeEventArgs,\n} from \"./ViewportComponentEvents\";\nimport { ViewportComponentEvents } from \"./ViewportComponentEvents\";\n\n/** Type for a ViewState prop\n * @public\n */\nexport type ViewStateProp = ViewState | (() => ViewState);\n\n/**\n * Properties for [[ViewportComponent]] component.\n * @public\n */\nexport interface ViewportProps extends CommonProps {\n /** IModel to display */\n imodel: IModelConnection;\n /** Id of a default view definition to load as a starting point */\n viewDefinitionId?: Id64String;\n /** ViewState to use as a starting point */\n viewState?: ViewStateProp;\n /** Function to get a reference to the ScreenViewport */\n viewportRef?: (v: ScreenViewport) => void;\n /** controlId for this content component @internal */\n controlId?: string;\n /** @internal */\n onContextMenu?: (e: React.MouseEvent) => boolean;\n /** @internal */\n getViewOverlay?: (viewport: ScreenViewport) => React.ReactNode;\n /** @internal used only for testing */\n viewManagerOverride?: ViewManager;\n /** @internal used only for testing */\n screenViewportOverride?: typeof ScreenViewport;\n /** @internal used only for testing */\n tentativePointOverride?: TentativePoint;\n}\n\n/**\n * A viewport React component that creates a ScreenViewport.\n * @public\n */\nexport function ViewportComponent(props: ViewportProps) {\n const {\n viewState,\n imodel,\n viewDefinitionId,\n getViewOverlay,\n viewManagerOverride,\n tentativePointOverride,\n onContextMenu,\n style,\n className,\n screenViewportOverride,\n controlId,\n viewportRef,\n } = props;\n // istanbul ignore next\n const viewManagerRef = React.useRef(\n viewManagerOverride ?? IModelApp.viewManager\n );\n const tentativePointOverrideRef = React.useRef(tentativePointOverride);\n const screenViewportCreated = React.useRef(false);\n const viewportDiv = React.useRef<HTMLDivElement>(null);\n const screenViewportRef = React.useRef<ScreenViewport | null>(null);\n const isMounted = React.useRef(false);\n const viewClassFullName = React.useRef(\"\");\n const viewId = React.useRef(\"0\");\n\n // istanbul ignore next\n const handleViewChanged = (vp: Viewport) => {\n // istanbul ignore next\n if (!(vp.iModel.isOpen || vp.iModel.isBlank)) return;\n ViewportComponentEvents.setViewMatrix(vp);\n if (viewClassFullName.current !== vp.view.classFullName) {\n setTimeout(() => {\n ViewportComponentEvents.onViewClassFullNameChangedEvent.emit({\n viewport: vp,\n oldName: viewClassFullName.current,\n newName: vp.view.classFullName,\n });\n viewClassFullName.current = vp.view.classFullName;\n });\n }\n if (viewId.current !== vp.view.id) {\n setTimeout(() => {\n ViewportComponentEvents.onViewIdChangedEvent.emit({\n viewport: vp,\n oldId: viewId.current,\n newId: vp.view.id,\n });\n viewId.current = vp.view.id;\n });\n }\n };\n\n const handleStandardRotationChangeEvent = (\n args: StandardRotationChangeEventArgs\n ) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n currentScreenViewport.view.setRotationAboutPoint(\n StandardView.getStandardRotation(args.standardRotation)\n );\n currentScreenViewport.synchWithView();\n }\n };\n\n const handleDrawingViewportChangeEvent = (\n args: DrawingViewportChangeEventArgs\n ) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n currentScreenViewport.view.setOrigin(args.origin);\n currentScreenViewport.view.setRotation(args.rotation);\n currentScreenViewport.synchWithView({\n noSaveInUndo: args.complete !== true,\n });\n }\n };\n\n const targetPoint = React.useRef<Point3d | null>(null);\n\n const getRotatePoint = (vp: ScreenViewport): Point3d => {\n const lastTargetPoint = targetPoint.current;\n // istanbul ignore next\n const tentativePoint =\n tentativePointOverrideRef.current ?? IModelApp.tentativePoint;\n // istanbul ignore else\n if (tentativePoint.isActive) return tentativePoint.getPoint();\n\n // istanbul ignore else\n if (null !== lastTargetPoint) {\n const testPt = vp.worldToView(lastTargetPoint);\n const viewRect = vp.viewRect.clone();\n viewRect.scaleAboutCenter(0.25, 0.25);\n // istanbul ignore next hard to reach because of mocks\n if (viewRect.containsPoint(testPt)) return lastTargetPoint;\n targetPoint.current = null;\n }\n\n const visiblePoint = vp.pickNearestVisibleGeometry(\n vp.npcToWorld(NpcCenter),\n vp.pixelsFromInches(ToolSettings.viewToolPickRadiusInches)\n );\n targetPoint.current =\n undefined !== visiblePoint ? visiblePoint : vp.view.getTargetPoint();\n // istanbul ignore next\n return targetPoint.current ?? vp.view.getCenter();\n };\n\n const handleCubeRotationChangeEvent = (args: CubeRotationChangeEventArgs) => {\n const viewManager = viewManagerRef.current;\n const currentScreenViewport = screenViewportRef.current;\n // istanbul ignore else\n if (\n currentScreenViewport &&\n viewManager.selectedView === currentScreenViewport\n ) {\n const rotMatrix = args.rotMatrix;\n // istanbul ignore else\n if (currentScreenViewport.rotation !== rotMatrix) {\n const inverse = rotMatrix.transpose(); // rotation is from current nav cube state...\n const center = getRotatePoint(currentScreenViewport);\n const targetMatrix = inverse.multiplyMatrixMatrix(\n currentScreenViewport.view.getRotation()\n );\n const worldTransform = Transform.createFixedPointAndMatrix(\n center,\n targetMatrix\n );\n const frustum = currentScreenViewport.getWorldFrustum();\n frustum.multiply(worldTransform);\n currentScreenViewport.view.setupFromFrustum(frustum);\n currentScreenViewport.synchWithView({ noSaveInUndo: !args.complete });\n }\n }\n };\n\n const handleDisconnectFromViewManager = () => {\n const screenViewport = screenViewportRef.current;\n if (screenViewport) {\n const viewManager = IModelApp.viewManager;\n screenViewport.onViewChanged.removeListener(handleViewChanged);\n screenViewportRef.current = null;\n screenViewportCreated.current = false;\n ViewportComponentEvents.onDrawingViewportChangeEvent.removeListener(\n handleDrawingViewportChangeEvent\n );\n ViewportComponentEvents.onCubeRotationChangeEvent.removeListener(\n handleCubeRotationChangeEvent\n );\n ViewportComponentEvents.onStandardRotationChangeEvent.removeListener(\n handleStandardRotationChangeEvent\n );\n viewManager.dropViewport(screenViewport, true);\n }\n };\n\n // istanbul ignore next\n const handleWindowUnload = () => {\n const parentDiv = viewportDiv.current;\n if (parentDiv) {\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\n if (parentWindow !== window) {\n handleDisconnectFromViewManager();\n }\n }\n };\n\n const getScreenViewport = (\n parentDiv: HTMLDivElement,\n inViewState: ViewState\n ) => {\n // istanbul ignore next\n const screenViewportFactory = screenViewportOverride\n ? screenViewportOverride\n : ScreenViewport;\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\n parentWindow.addEventListener(\"unload\", handleWindowUnload, true); // listener clear after being called\n ViewportComponentEvents.initialize();\n ViewportComponentEvents.onDrawingViewportChangeEvent.addListener(\n handleDrawingViewportChangeEvent\n );\n ViewportComponentEvents.onCubeRotationChangeEvent.addListener(\n handleCubeRotationChangeEvent\n );\n ViewportComponentEvents.onStandardRotationChangeEvent.addListener(\n handleStandardRotationChangeEvent\n );\n const screenViewport = screenViewportFactory.create(parentDiv, inViewState);\n screenViewportCreated.current = true;\n viewClassFullName.current = screenViewport.view.classFullName;\n viewId.current = screenViewport.view.id;\n screenViewport.onViewChanged.addListener(handleViewChanged);\n return screenViewport;\n };\n\n React.useEffect(() => {\n isMounted.current = true;\n Logger.logInfo(\n \"ViewportComponent\",\n `mounting ViewportComponent for controlId=${controlId}`\n );\n\n return () => {\n isMounted.current = false;\n Logger.logInfo(\n \"ViewportComponent\",\n `un-mounting ViewportComponent for controlId=${controlId}`\n );\n handleDisconnectFromViewManager();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [initialViewState, setInitialViewState] = React.useState<\n ViewState | undefined\n >(() => {\n if (viewState) {\n if (typeof viewState === \"function\") return viewState().clone();\n else return viewState.clone();\n }\n return undefined;\n });\n\n React.useEffect(() => {\n setInitialViewState(undefined);\n }, [viewDefinitionId, viewState]);\n React.useEffect(() => {\n async function fetchInitialViewstate() {\n let currentViewState: ViewState | undefined;\n if (viewState) {\n if (typeof viewState === \"function\") currentViewState = viewState();\n else currentViewState = viewState;\n } else if (viewDefinitionId && imodel) {\n try {\n currentViewState = await imodel.views.load(viewDefinitionId);\n // istanbul ignore next\n if (!currentViewState) {\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\n }\n } catch (_e) {\n // istanbul ignore next\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\n }\n } else {\n Logger.logError(\n \"ViewportComponent\",\n `A Viewstate or a viewId and imodel must be provided`\n );\n }\n // istanbul ignore next\n if (\n isMounted.current &&\n (currentViewState?.iModel.isOpen || currentViewState?.iModel.isBlank)\n ) {\n setInitialViewState(currentViewState?.clone());\n }\n }\n if (undefined === initialViewState) void fetchInitialViewstate();\n }, [imodel, initialViewState, viewDefinitionId, viewState]);\n\n const [viewOverlay, setViewOverlay] = React.useState<React.ReactNode>(null);\n\n // This useEffect connects to ViewManger as soon as initialViewState is available once component is mounted.\n React.useEffect(() => {\n const parentDiv = viewportDiv.current;\n const viewManager = viewManagerRef.current;\n // istanbul ignore next\n if (\n parentDiv &&\n initialViewState &&\n (initialViewState?.iModel.isOpen || initialViewState?.iModel.isBlank)\n ) {\n if (!screenViewportCreated.current) {\n const screenViewport = getScreenViewport(parentDiv, initialViewState);\n screenViewportRef.current = screenViewport;\n\n if (viewportRef) viewportRef(screenViewport);\n\n Logger.logInfo(\n \"ViewportComponent\",\n `processing viewManager.addViewport for controlId=${controlId}`\n );\n viewManager.addViewport(screenViewport);\n\n // overlay component is set up once a ScreenViewport is available. The overlay component must handle any view changes itself.\n setViewOverlay(getViewOverlay ? getViewOverlay(screenViewport) : null);\n } else {\n // istanbul ignore next\n screenViewportRef.current?.changeView(initialViewState);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [controlId, initialViewState, viewportRef]);\n\n const handleContextMenu = React.useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (onContextMenu) onContextMenu(e);\n },\n [onContextMenu]\n );\n\n const parentDivStyle: React.CSSProperties = {\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n };\n\n const viewportDivStyle: React.CSSProperties = {\n ...style,\n height: \"100%\",\n width: \"100%\",\n };\n\n return (\n <div style={parentDivStyle} data-item-id={controlId}>\n <>\n <div\n ref={viewportDiv}\n data-testid=\"viewport-component\"\n className={className}\n style={viewportDivStyle}\n onContextMenu={handleContextMenu}\n />\n {viewOverlay}\n </>\n </div>\n );\n}\n"]}
|