@itwin/imodel-components-react 5.20.0 → 5.21.0

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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Change Log - @itwin/imodel-components-react
2
2
 
3
+ ## 5.21.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 43acfb9: Quantity editor now displays values with precision of 12 when focused and reverts to consumer precision when unfocused.
8
+ - Updated dependencies [43acfb9]
9
+ - @itwin/components-react@5.21.0
10
+ - @itwin/core-react@5.21.0
11
+
3
12
  ## 5.20.0
4
13
 
5
14
  ### Patch Changes
@@ -22,13 +22,14 @@ export const QuantityEditorSpec = createEditorSpec({
22
22
  Editor: QuantityEditor,
23
23
  });
24
24
  function QuantityEditor({ metadata, value, onChange, size, }) {
25
- const { formatter, parser } = useQuantityInfo({
25
+ const { defaultFormatter, highPrecisionFormatter, parser } = useQuantityInfo({
26
26
  type: metadata.quantityType,
27
27
  });
28
+ const [isEditing, setEditing] = React.useState(false);
28
29
  const currentValue = value
29
30
  ? value
30
31
  : { rawValue: undefined, displayValue: "" };
31
- return (React.createElement(QuantityInput, { value: currentValue, onChange: onChange, size: size, formatter: formatter, parser: parser }));
32
+ return (React.createElement(QuantityInput, { value: currentValue, onChange: onChange, size: size, formatter: isEditing ? highPrecisionFormatter : defaultFormatter, parser: parser, onBlur: () => setEditing(false), onFocus: () => setEditing(true) }));
32
33
  }
33
34
  /* v8 ignore stop */
34
35
  //# sourceMappingURL=QuantityEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuantityEditor.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/QuantityEditor.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAKhB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AAErB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,gBAAgB,CAAC;IAC7D,mBAAmB,EAAE,CAAC,QAAQ,EAAqC,EAAE,CACnE,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC1B,cAAc,IAAI,QAAQ;QAC1B,QAAQ,CAAC,YAAY,KAAK,SAAS;IACrC,gBAAgB,EAAE,cAAc,CAAC,SAAS;IAC1C,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC;AAWH,SAAS,cAAc,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,IAAI,GAC6C;IACjD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;QAC5C,IAAI,EAAE,QAAQ,CAAC,YAAY;KAC5B,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,KAAK;QACxB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAE9C,OAAO,CACL,oBAAC,aAAa,IACZ,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACd,CACH,CAAC;AACJ,CAAC;AAED,oBAAoB","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 PropertyEditors\n */\n\nimport * as React from \"react\";\nimport { type QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { useQuantityInfo } from \"./UseQuantityInfo.js\";\nimport {\n createEditorSpec,\n type EditorProps,\n type EditorSpec,\n type NumericValue,\n type ValueMetadata,\n ValueUtilities,\n} from \"@itwin/components-react\";\nimport { QuantityInput } from \"./QuantityInput.js\";\n\n/* v8 ignore start */\n\n/**\n * Editor specification for quantity values based on `IModelApp.quantityFormatter`.\n * @beta\n */\nexport const QuantityEditorSpec: EditorSpec = createEditorSpec({\n isMetadataSupported: (metadata): metadata is QuantityValueMetadata =>\n metadata.type === \"number\" &&\n \"quantityType\" in metadata &&\n metadata.quantityType !== undefined,\n isValueSupported: ValueUtilities.isNumeric,\n Editor: QuantityEditor,\n});\n\n/**\n * Metadata for quantity values.\n * @beta\n */\nexport interface QuantityValueMetadata extends ValueMetadata {\n type: \"number\";\n quantityType: QuantityTypeArg;\n}\n\nfunction QuantityEditor({\n metadata,\n value,\n onChange,\n size,\n}: EditorProps<QuantityValueMetadata, NumericValue>) {\n const { formatter, parser } = useQuantityInfo({\n type: metadata.quantityType,\n });\n const currentValue = value\n ? value\n : { rawValue: undefined, displayValue: \"\" };\n\n return (\n <QuantityInput\n value={currentValue}\n onChange={onChange}\n size={size}\n formatter={formatter}\n parser={parser}\n />\n );\n}\n\n/* v8 ignore stop */\n"]}
1
+ {"version":3,"file":"QuantityEditor.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/QuantityEditor.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAKhB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AAErB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,gBAAgB,CAAC;IAC7D,mBAAmB,EAAE,CAAC,QAAQ,EAAqC,EAAE,CACnE,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC1B,cAAc,IAAI,QAAQ;QAC1B,QAAQ,CAAC,YAAY,KAAK,SAAS;IACrC,gBAAgB,EAAE,cAAc,CAAC,SAAS;IAC1C,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC;AAWH,SAAS,cAAc,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,IAAI,GAC6C;IACjD,MAAM,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;QAC3E,IAAI,EAAE,QAAQ,CAAC,YAAY;KAC5B,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,KAAK;QACxB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAE9C,OAAO,CACL,oBAAC,aAAa,IACZ,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,EAChE,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAC/B,CACH,CAAC;AACJ,CAAC;AAED,oBAAoB","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 PropertyEditors\n */\n\nimport * as React from \"react\";\nimport { type QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { useQuantityInfo } from \"./UseQuantityInfo.js\";\nimport {\n createEditorSpec,\n type EditorProps,\n type EditorSpec,\n type NumericValue,\n type ValueMetadata,\n ValueUtilities,\n} from \"@itwin/components-react\";\nimport { QuantityInput } from \"./QuantityInput.js\";\n\n/* v8 ignore start */\n\n/**\n * Editor specification for quantity values based on `IModelApp.quantityFormatter`.\n * @beta\n */\nexport const QuantityEditorSpec: EditorSpec = createEditorSpec({\n isMetadataSupported: (metadata): metadata is QuantityValueMetadata =>\n metadata.type === \"number\" &&\n \"quantityType\" in metadata &&\n metadata.quantityType !== undefined,\n isValueSupported: ValueUtilities.isNumeric,\n Editor: QuantityEditor,\n});\n\n/**\n * Metadata for quantity values.\n * @beta\n */\nexport interface QuantityValueMetadata extends ValueMetadata {\n type: \"number\";\n quantityType: QuantityTypeArg;\n}\n\nfunction QuantityEditor({\n metadata,\n value,\n onChange,\n size,\n}: EditorProps<QuantityValueMetadata, NumericValue>) {\n const { defaultFormatter, highPrecisionFormatter, parser } = useQuantityInfo({\n type: metadata.quantityType,\n });\n const [isEditing, setEditing] = React.useState(false);\n const currentValue = value\n ? value\n : { rawValue: undefined, displayValue: \"\" };\n\n return (\n <QuantityInput\n value={currentValue}\n onChange={onChange}\n size={size}\n formatter={isEditing ? highPrecisionFormatter : defaultFormatter}\n parser={parser}\n onBlur={() => setEditing(false)}\n onFocus={() => setEditing(true)}\n />\n );\n}\n\n/* v8 ignore stop */\n"]}
@@ -8,7 +8,8 @@ interface UseQuantityInfoProps {
8
8
  * @internal
9
9
  */
10
10
  export declare function useQuantityInfo({ type }: UseQuantityInfoProps): {
11
- formatter: FormatterSpec | undefined;
11
+ defaultFormatter: FormatterSpec | undefined;
12
+ highPrecisionFormatter: FormatterSpec | undefined;
12
13
  parser: ParserSpec | undefined;
13
14
  };
14
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"UseQuantityInfo.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAO9B,UAAU,oBAAoB;IAC5B,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB;;;EA8D7D"}
1
+ {"version":3,"file":"UseQuantityInfo.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAO9B,UAAU,oBAAoB;IAC5B,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB;;;;EAwE7D"}
@@ -11,27 +11,33 @@ import { useIModelConnection } from "../../IModelConnectionContext.js";
11
11
  * @internal
12
12
  */
13
13
  export function useQuantityInfo({ type }) {
14
- const [{ formatter, parser }, setState] = React.useState(() => ({
15
- formatter: undefined,
14
+ const [{ defaultFormatter, highPrecisionFormatter, parser }, setState] = React.useState(() => ({
15
+ defaultFormatter: undefined,
16
+ highPrecisionFormatter: undefined,
16
17
  parser: undefined,
17
18
  }));
18
19
  const imodel = useIModelConnection();
19
20
  React.useEffect(() => {
20
21
  if (type === undefined) {
21
22
  setState({
22
- formatter: undefined,
23
+ defaultFormatter: undefined,
24
+ highPrecisionFormatter: undefined,
23
25
  parser: undefined,
24
26
  });
25
27
  return;
26
28
  }
27
29
  let disposed = false;
28
30
  const loadFormatterParser = async () => {
29
- const { formatterSpec, parserSpec } = await getFormatterParserSpec({
31
+ const { defaultFormatterSpec, highPrecisionFormatterSpec, parserSpec } = await getFormatterParserSpec({
30
32
  imodel,
31
33
  type,
32
34
  });
33
35
  if (!disposed) {
34
- setState({ formatter: formatterSpec, parser: parserSpec });
36
+ setState({
37
+ defaultFormatter: defaultFormatterSpec,
38
+ highPrecisionFormatter: highPrecisionFormatterSpec,
39
+ parser: parserSpec,
40
+ });
35
41
  }
36
42
  };
37
43
  void loadFormatterParser();
@@ -53,7 +59,7 @@ export function useQuantityInfo({ type }) {
53
59
  });
54
60
  };
55
61
  }, [imodel, type]);
56
- return { formatter, parser };
62
+ return { defaultFormatter, highPrecisionFormatter, parser };
57
63
  }
58
64
  async function getFormatterParserSpec({ imodel, type, }) {
59
65
  // fallback to IModelApp.quantityFormatter:
@@ -64,23 +70,32 @@ async function getFormatterParserSpec({ imodel, type, }) {
64
70
  const quantityFormatterSpec = IModelApp.quantityFormatter.findFormatterSpecByQuantityType(type);
65
71
  const quantityParserSpec = IModelApp.quantityFormatter.findParserSpecByQuantityType(type);
66
72
  return {
67
- formatterSpec: quantityFormatterSpec,
73
+ highPrecisionFormatterSpec: quantityFormatterSpec,
74
+ defaultFormatterSpec: quantityFormatterSpec,
68
75
  parserSpec: quantityParserSpec,
69
76
  };
70
77
  }
71
78
  const koq = await imodel.schemaContext.getSchemaItem(type);
72
79
  if (!koq) {
73
- return { formatter: undefined, parser: undefined };
80
+ return {
81
+ highPrecisionFormatterSpec: undefined,
82
+ defaultFormatterSpec: undefined,
83
+ parser: undefined,
84
+ };
74
85
  }
75
86
  // TODO: `KindOfQuantity` here is used only as a type because we don't have peerDep on `ecschema-metadata`
76
87
  // It should be added when dropping `itwinjs-core` v4 support
77
88
  const persistenceUnit = await koq.persistenceUnit;
78
89
  const formatProps = await IModelApp.formatsProvider.getFormat(type);
79
90
  if (!persistenceUnit || !formatProps) {
80
- return { formatter: undefined, parser: undefined };
91
+ return {
92
+ highPrecisionFormatterSpec: undefined,
93
+ defaultFormatterSpec: undefined,
94
+ parser: undefined,
95
+ };
81
96
  }
82
97
  const persistenceUnitName = persistenceUnit.fullName;
83
- const formatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({
98
+ const highPrecisionFormatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({
84
99
  formatProps: {
85
100
  ...formatProps,
86
101
  precision: parseFormatType(formatProps.type, "") === FormatType.Decimal
@@ -89,12 +104,17 @@ async function getFormatterParserSpec({ imodel, type, }) {
89
104
  },
90
105
  persistenceUnitName,
91
106
  });
107
+ const defaultFormatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({
108
+ formatProps,
109
+ persistenceUnitName,
110
+ });
92
111
  const parserSpec = await IModelApp.quantityFormatter.createParserSpec({
93
112
  formatProps,
94
113
  persistenceUnitName,
95
114
  });
96
115
  return {
97
- formatterSpec,
116
+ highPrecisionFormatterSpec,
117
+ defaultFormatterSpec,
98
118
  parserSpec,
99
119
  };
100
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UseQuantityInfo.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"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\nimport type { IModelConnection, QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport {\n type FormatterSpec,\n FormatType,\n parseFormatType,\n type ParserSpec,\n} from \"@itwin/core-quantity\";\nimport * as React from \"react\";\nimport { useIModelConnection } from \"../../IModelConnectionContext.js\";\nimport type { KindOfQuantity } from \"@itwin/ecschema-metadata\";\n\n/* v8 ignore start */\n\ninterface UseQuantityInfoProps {\n type: QuantityTypeArg | undefined;\n}\n\n/**\n * Hook that finds the formatter and parser in `IModelApp.quantityFormatter` for a given quantity type.\n * @internal\n */\nexport function useQuantityInfo({ type }: UseQuantityInfoProps) {\n const [{ formatter, parser }, setState] = React.useState<{\n formatter: FormatterSpec | undefined;\n parser: ParserSpec | undefined;\n }>(() => ({\n formatter: undefined,\n parser: undefined,\n }));\n\n const imodel = useIModelConnection();\n\n React.useEffect(() => {\n if (type === undefined) {\n setState({\n formatter: undefined,\n parser: undefined,\n });\n return;\n }\n\n let disposed = false;\n const loadFormatterParser = async () => {\n const { formatterSpec, parserSpec } = await getFormatterParserSpec({\n imodel,\n type,\n });\n if (!disposed) {\n setState({ formatter: formatterSpec, parser: parserSpec });\n }\n };\n\n void loadFormatterParser();\n\n const removeListeners = [\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(\n loadFormatterParser\n ),\n IModelApp.quantityFormatter.onQuantityFormatsChanged.addListener(\n ({ quantityType }) => {\n if (quantityType === type) {\n void loadFormatterParser();\n }\n }\n ),\n ];\n if (IModelApp.formatsProvider) {\n removeListeners.push(\n IModelApp.formatsProvider.onFormatsChanged.addListener(async () =>\n loadFormatterParser()\n )\n );\n }\n\n return () => {\n disposed = true;\n removeListeners.forEach((remove) => {\n remove();\n });\n };\n }, [imodel, type]);\n\n return { formatter, parser };\n}\n\nasync function getFormatterParserSpec({\n imodel,\n type,\n}: {\n imodel?: IModelConnection;\n type: QuantityTypeArg;\n}) {\n // fallback to IModelApp.quantityFormatter:\n // - if `itwinjs-core` v4 is used\n // - don't have an iModelConnection to look up KOQ\n // - old quantity type enum is used instead of KOQ name\n if (!IModelApp.formatsProvider || !imodel || typeof type !== \"string\") {\n const quantityFormatterSpec =\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(type);\n const quantityParserSpec =\n IModelApp.quantityFormatter.findParserSpecByQuantityType(type);\n\n return {\n formatterSpec: quantityFormatterSpec,\n parserSpec: quantityParserSpec,\n };\n }\n\n const koq = await imodel.schemaContext.getSchemaItem(type);\n if (!koq) {\n return { formatter: undefined, parser: undefined };\n }\n\n // TODO: `KindOfQuantity` here is used only as a type because we don't have peerDep on `ecschema-metadata`\n // It should be added when dropping `itwinjs-core` v4 support\n const persistenceUnit = await (koq as KindOfQuantity).persistenceUnit;\n const formatProps = await IModelApp.formatsProvider.getFormat(type);\n if (!persistenceUnit || !formatProps) {\n return { formatter: undefined, parser: undefined };\n }\n\n const persistenceUnitName = persistenceUnit.fullName;\n const formatterSpec = await IModelApp.quantityFormatter.createFormatterSpec({\n formatProps: {\n ...formatProps,\n precision:\n parseFormatType(formatProps.type, \"\") === FormatType.Decimal\n ? 12\n : formatProps.precision,\n },\n persistenceUnitName,\n });\n const parserSpec = await IModelApp.quantityFormatter.createParserSpec({\n formatProps,\n persistenceUnitName,\n });\n return {\n formatterSpec,\n parserSpec,\n };\n}\n\n/* v8 ignore stop */\n"]}
1
+ {"version":3,"file":"UseQuantityInfo.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/inputs/new-editors/UseQuantityInfo.ts"],"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\nimport type { IModelConnection, QuantityTypeArg } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport {\n type FormatterSpec,\n FormatType,\n parseFormatType,\n type ParserSpec,\n} from \"@itwin/core-quantity\";\nimport * as React from \"react\";\nimport { useIModelConnection } from \"../../IModelConnectionContext.js\";\nimport type { KindOfQuantity } from \"@itwin/ecschema-metadata\";\n\n/* v8 ignore start */\n\ninterface UseQuantityInfoProps {\n type: QuantityTypeArg | undefined;\n}\n\n/**\n * Hook that finds the formatter and parser in `IModelApp.quantityFormatter` for a given quantity type.\n * @internal\n */\nexport function useQuantityInfo({ type }: UseQuantityInfoProps) {\n const [{ defaultFormatter, highPrecisionFormatter, parser }, setState] =\n React.useState<{\n defaultFormatter: FormatterSpec | undefined;\n highPrecisionFormatter: FormatterSpec | undefined;\n parser: ParserSpec | undefined;\n }>(() => ({\n defaultFormatter: undefined,\n highPrecisionFormatter: undefined,\n parser: undefined,\n }));\n\n const imodel = useIModelConnection();\n\n React.useEffect(() => {\n if (type === undefined) {\n setState({\n defaultFormatter: undefined,\n highPrecisionFormatter: undefined,\n parser: undefined,\n });\n return;\n }\n\n let disposed = false;\n const loadFormatterParser = async () => {\n const { defaultFormatterSpec, highPrecisionFormatterSpec, parserSpec } =\n await getFormatterParserSpec({\n imodel,\n type,\n });\n\n if (!disposed) {\n setState({\n defaultFormatter: defaultFormatterSpec,\n highPrecisionFormatter: highPrecisionFormatterSpec,\n parser: parserSpec,\n });\n }\n };\n\n void loadFormatterParser();\n\n const removeListeners = [\n IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(\n loadFormatterParser\n ),\n IModelApp.quantityFormatter.onQuantityFormatsChanged.addListener(\n ({ quantityType }) => {\n if (quantityType === type) {\n void loadFormatterParser();\n }\n }\n ),\n ];\n if (IModelApp.formatsProvider) {\n removeListeners.push(\n IModelApp.formatsProvider.onFormatsChanged.addListener(async () =>\n loadFormatterParser()\n )\n );\n }\n\n return () => {\n disposed = true;\n removeListeners.forEach((remove) => {\n remove();\n });\n };\n }, [imodel, type]);\n\n return { defaultFormatter, highPrecisionFormatter, parser };\n}\n\nasync function getFormatterParserSpec({\n imodel,\n type,\n}: {\n imodel?: IModelConnection;\n type: QuantityTypeArg;\n}) {\n // fallback to IModelApp.quantityFormatter:\n // - if `itwinjs-core` v4 is used\n // - don't have an iModelConnection to look up KOQ\n // - old quantity type enum is used instead of KOQ name\n if (!IModelApp.formatsProvider || !imodel || typeof type !== \"string\") {\n const quantityFormatterSpec =\n IModelApp.quantityFormatter.findFormatterSpecByQuantityType(type);\n const quantityParserSpec =\n IModelApp.quantityFormatter.findParserSpecByQuantityType(type);\n\n return {\n highPrecisionFormatterSpec: quantityFormatterSpec,\n defaultFormatterSpec: quantityFormatterSpec,\n parserSpec: quantityParserSpec,\n };\n }\n\n const koq = await imodel.schemaContext.getSchemaItem(type);\n if (!koq) {\n return {\n highPrecisionFormatterSpec: undefined,\n defaultFormatterSpec: undefined,\n parser: undefined,\n };\n }\n\n // TODO: `KindOfQuantity` here is used only as a type because we don't have peerDep on `ecschema-metadata`\n // It should be added when dropping `itwinjs-core` v4 support\n const persistenceUnit = await (koq as KindOfQuantity).persistenceUnit;\n const formatProps = await IModelApp.formatsProvider.getFormat(type);\n if (!persistenceUnit || !formatProps) {\n return {\n highPrecisionFormatterSpec: undefined,\n defaultFormatterSpec: undefined,\n parser: undefined,\n };\n }\n\n const persistenceUnitName = persistenceUnit.fullName;\n const highPrecisionFormatterSpec =\n await IModelApp.quantityFormatter.createFormatterSpec({\n formatProps: {\n ...formatProps,\n precision:\n parseFormatType(formatProps.type, \"\") === FormatType.Decimal\n ? 12\n : formatProps.precision,\n },\n persistenceUnitName,\n });\n const defaultFormatterSpec =\n await IModelApp.quantityFormatter.createFormatterSpec({\n formatProps,\n\n persistenceUnitName,\n });\n const parserSpec = await IModelApp.quantityFormatter.createParserSpec({\n formatProps,\n persistenceUnitName,\n });\n return {\n highPrecisionFormatterSpec,\n defaultFormatterSpec,\n parserSpec,\n };\n}\n\n/* v8 ignore stop */\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/imodel-components-react",
3
- "version": "5.20.0",
3
+ "version": "5.21.0",
4
4
  "description": "A react component library of iTwin.js UI iModel components",
5
5
  "type": "module",
6
6
  "types": "./lib/imodel-components-react.d.ts",
@@ -44,8 +44,8 @@
44
44
  "@itwin/itwinui-react": "^3.15.0",
45
45
  "react": "^18.0.0 || ^19.0.0",
46
46
  "react-dom": "^18.0.0 || ^19.0.0",
47
- "@itwin/components-react": "5.20.0",
48
- "@itwin/core-react": "5.20.0"
47
+ "@itwin/components-react": "5.21.0",
48
+ "@itwin/core-react": "5.21.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@itwin/appui-abstract": "^5.1.0",
@@ -84,8 +84,8 @@
84
84
  "typescript": "~5.6.2",
85
85
  "upath": "^2.0.1",
86
86
  "vitest": "^3.2.4",
87
- "@itwin/components-react": "5.20.0",
88
- "@itwin/core-react": "5.20.0"
87
+ "@itwin/components-react": "5.21.0",
88
+ "@itwin/core-react": "5.21.0"
89
89
  },
90
90
  "dependencies": {
91
91
  "@itwin/itwinui-icons-react": "^2.8.0",