@itwin/components-react 3.3.0-dev.4 → 3.3.0-dev.40

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.
Files changed (24) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/lib/cjs/components-react/converters/NumericTypeConverter.d.ts +4 -2
  3. package/lib/cjs/components-react/converters/NumericTypeConverter.d.ts.map +1 -1
  4. package/lib/cjs/components-react/converters/NumericTypeConverter.js +14 -4
  5. package/lib/cjs/components-react/converters/NumericTypeConverter.js.map +1 -1
  6. package/lib/cjs/components-react/converters/TypeConverter.js +1 -1
  7. package/lib/cjs/components-react/converters/TypeConverter.js.map +1 -1
  8. package/lib/cjs/components-react/editors/CustomNumberEditor.js +3 -3
  9. package/lib/cjs/components-react/editors/CustomNumberEditor.js.map +1 -1
  10. package/lib/cjs/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  11. package/lib/cjs/components-react/tree/controlled/TreeHooks.js +5 -8
  12. package/lib/cjs/components-react/tree/controlled/TreeHooks.js.map +1 -1
  13. package/lib/esm/components-react/converters/NumericTypeConverter.d.ts +4 -2
  14. package/lib/esm/components-react/converters/NumericTypeConverter.d.ts.map +1 -1
  15. package/lib/esm/components-react/converters/NumericTypeConverter.js +14 -4
  16. package/lib/esm/components-react/converters/NumericTypeConverter.js.map +1 -1
  17. package/lib/esm/components-react/converters/TypeConverter.js +1 -1
  18. package/lib/esm/components-react/converters/TypeConverter.js.map +1 -1
  19. package/lib/esm/components-react/editors/CustomNumberEditor.js +3 -3
  20. package/lib/esm/components-react/editors/CustomNumberEditor.js.map +1 -1
  21. package/lib/esm/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  22. package/lib/esm/components-react/tree/controlled/TreeHooks.js +6 -9
  23. package/lib/esm/components-react/tree/controlled/TreeHooks.js.map +1 -1
  24. package/package.json +14 -14
package/CHANGELOG.md CHANGED
@@ -1,6 +1,26 @@
1
1
  # Change Log - @itwin/components-react
2
2
 
3
- This log was last generated on Fri, 15 Apr 2022 13:49:25 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 10 Jun 2022 16:11:36 GMT and should not be manually modified.
4
+
5
+ ## 3.2.2
6
+ Fri, 10 Jun 2022 16:11:36 GMT
7
+
8
+ ### Updates
9
+
10
+ - Fix `useTreeModel` returning stale model for the given model source
11
+
12
+ ## 3.2.1
13
+ Tue, 07 Jun 2022 15:02:56 GMT
14
+
15
+ _Version update only_
16
+
17
+ ## 3.2.0
18
+ Fri, 20 May 2022 13:10:54 GMT
19
+
20
+ ### Updates
21
+
22
+ - Add ability to pass parameters to UiItemsManager when loading items provider to specify what stages allow the provider to supply items.
23
+ - Update UI to new UX design to allow only 2 sections of widgets per panel.
4
24
 
5
25
  ## 3.1.3
6
26
  Fri, 15 Apr 2022 13:49:25 GMT
@@ -20,15 +20,17 @@ export declare abstract class NumericTypeConverterBase extends TypeConverter imp
20
20
  * @public
21
21
  */
22
22
  export declare class FloatTypeConverter extends NumericTypeConverterBase {
23
+ private static parseString;
23
24
  convertToString(value?: Primitives.Float): string;
24
- convertFromString(value: string): number;
25
+ convertFromString(value: string): number | undefined;
25
26
  }
26
27
  /**
27
28
  * Int Type Converter.
28
29
  * @public
29
30
  */
30
31
  export declare class IntTypeConverter extends NumericTypeConverterBase {
32
+ private static parseString;
31
33
  convertToString(value?: Primitives.Int): string;
32
- convertFromString(value: string): number;
34
+ convertFromString(value: string): number | undefined;
33
35
  }
34
36
  //# sourceMappingURL=NumericTypeConverter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumericTypeConverter.d.ts","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9E;;;GAGG;AACH,8BAAsB,wBAAyB,SAAQ,aAAc,YAAW,4BAA4B;IAC1G,IAAoB,iBAAiB,IAAI,OAAO,CAAiB;IAE1D,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIjE,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI1E,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIpE,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI7E,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;CAGhG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9C,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK;IAwBxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGzD;AAKD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5C,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAkBtC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGzD"}
1
+ {"version":3,"file":"NumericTypeConverter.d.ts","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9E;;;GAGG;AACH,8BAAsB,wBAAyB,SAAQ,aAAc,YAAW,4BAA4B;IAC1G,IAAoB,iBAAiB,IAAI,OAAO,CAAiB;IAE1D,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIjE,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI1E,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIpE,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI7E,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;CAGhG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,OAAO,CAAC,MAAM,CAAC,WAAW;IAKV,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK;IAwBxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGrE;AAKD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5D,OAAO,CAAC,MAAM,CAAC,WAAW;IAKV,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAkBtC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGrE"}
@@ -39,7 +39,12 @@ exports.NumericTypeConverterBase = NumericTypeConverterBase;
39
39
  * @public
40
40
  */
41
41
  class FloatTypeConverter extends NumericTypeConverterBase {
42
+ static parseString(value) {
43
+ const parsedValue = parseFloat(value);
44
+ return Number.isNaN(parsedValue) ? undefined : parsedValue;
45
+ }
42
46
  convertToString(value) {
47
+ var _a;
43
48
  if (value === undefined)
44
49
  return "";
45
50
  let numericValue = 0;
@@ -49,7 +54,7 @@ class FloatTypeConverter extends NumericTypeConverterBase {
49
54
  numericValue = 0;
50
55
  }
51
56
  else {
52
- numericValue = parseFloat(value);
57
+ numericValue = (_a = FloatTypeConverter.parseString(value)) !== null && _a !== void 0 ? _a : 0;
53
58
  }
54
59
  }
55
60
  else {
@@ -64,7 +69,7 @@ class FloatTypeConverter extends NumericTypeConverterBase {
64
69
  return stringValue;
65
70
  }
66
71
  convertFromString(value) {
67
- return parseFloat(value);
72
+ return FloatTypeConverter.parseString(value);
68
73
  }
69
74
  }
70
75
  exports.FloatTypeConverter = FloatTypeConverter;
@@ -76,7 +81,12 @@ TypeConverterManager_1.TypeConverterManager.registerConverter(appui_abstract_1.S
76
81
  * @public
77
82
  */
78
83
  class IntTypeConverter extends NumericTypeConverterBase {
84
+ static parseString(value) {
85
+ const parsedValue = parseInt(value, 10);
86
+ return Number.isNaN(parsedValue) ? undefined : parsedValue;
87
+ }
79
88
  convertToString(value) {
89
+ var _a;
80
90
  if (value === undefined)
81
91
  return "";
82
92
  let numericValue = 0;
@@ -86,7 +96,7 @@ class IntTypeConverter extends NumericTypeConverterBase {
86
96
  numericValue = 0;
87
97
  }
88
98
  else {
89
- numericValue = parseInt(value, 10);
99
+ numericValue = (_a = IntTypeConverter.parseString(value)) !== null && _a !== void 0 ? _a : 0;
90
100
  }
91
101
  }
92
102
  else {
@@ -95,7 +105,7 @@ class IntTypeConverter extends NumericTypeConverterBase {
95
105
  return Math.round(numericValue).toString();
96
106
  }
97
107
  convertFromString(value) {
98
- return parseInt(value, 10);
108
+ return IntTypeConverter.parseString(value);
99
109
  }
100
110
  }
101
111
  exports.IntTypeConverter = IntTypeConverter;
@@ -1 +1 @@
1
- {"version":3,"file":"NumericTypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\nimport { Primitives, StandardTypeNames } from \"@itwin/appui-abstract\";\r\nimport { LessGreaterOperatorProcessor, TypeConverter } from \"./TypeConverter\";\r\nimport { TypeConverterManager } from \"./TypeConverterManager\";\r\n\r\n/**\r\n * Base Numeric Type Converter.\r\n * @public\r\n */\r\nexport abstract class NumericTypeConverterBase extends TypeConverter implements LessGreaterOperatorProcessor {\r\n public override get isLessGreaterType(): boolean { return true; }\r\n\r\n public isLessThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a < b;\r\n }\r\n\r\n public isLessThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a <= b;\r\n }\r\n\r\n public isGreaterThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a > b;\r\n }\r\n\r\n public isGreaterThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a >= b;\r\n }\r\n\r\n public sortCompare(a: Primitives.Numeric, b: Primitives.Numeric, _ignoreCase?: boolean): number {\r\n return (+a) - (+b);\r\n }\r\n}\r\n\r\n/**\r\n * Float Type Converter.\r\n * @public\r\n */\r\nexport class FloatTypeConverter extends NumericTypeConverterBase {\r\n public override convertToString(value?: Primitives.Float) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0.0\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = parseFloat(value);\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n // this is close to calling `toFixed(2)`, but cuts of any trailing zeros\r\n let stringValue = (Math.round(100 * numericValue) / 100).toString();\r\n // because this is a _float_ converter, we want to emphasize the number is a float - make\r\n // sure there's a decimal part\r\n if (stringValue.indexOf(\".\") === -1)\r\n stringValue += \".0\";\r\n return stringValue;\r\n }\r\n\r\n public override convertFromString(value: string): number {\r\n return parseFloat(value);\r\n }\r\n}\r\nTypeConverterManager.registerConverter(StandardTypeNames.Float, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Double, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Number, FloatTypeConverter);\r\n\r\n/**\r\n * Int Type Converter.\r\n * @public\r\n */\r\nexport class IntTypeConverter extends NumericTypeConverterBase {\r\n public override convertToString(value?: Primitives.Int) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = parseInt(value, 10);\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n return Math.round(numericValue).toString();\r\n }\r\n\r\n public override convertFromString(value: string): number {\r\n return parseInt(value, 10);\r\n }\r\n}\r\n\r\nTypeConverterManager.registerConverter(StandardTypeNames.Int, IntTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Integer, IntTypeConverter);\r\n"]}
1
+ {"version":3,"file":"NumericTypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\nimport { Primitives, StandardTypeNames } from \"@itwin/appui-abstract\";\r\nimport { LessGreaterOperatorProcessor, TypeConverter } from \"./TypeConverter\";\r\nimport { TypeConverterManager } from \"./TypeConverterManager\";\r\n\r\n/**\r\n * Base Numeric Type Converter.\r\n * @public\r\n */\r\nexport abstract class NumericTypeConverterBase extends TypeConverter implements LessGreaterOperatorProcessor {\r\n public override get isLessGreaterType(): boolean { return true; }\r\n\r\n public isLessThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a < b;\r\n }\r\n\r\n public isLessThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a <= b;\r\n }\r\n\r\n public isGreaterThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a > b;\r\n }\r\n\r\n public isGreaterThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a >= b;\r\n }\r\n\r\n public sortCompare(a: Primitives.Numeric, b: Primitives.Numeric, _ignoreCase?: boolean): number {\r\n return (+a) - (+b);\r\n }\r\n}\r\n\r\n/**\r\n * Float Type Converter.\r\n * @public\r\n */\r\nexport class FloatTypeConverter extends NumericTypeConverterBase {\r\n private static parseString(value: string): number | undefined {\r\n const parsedValue = parseFloat(value);\r\n return Number.isNaN(parsedValue) ? undefined : parsedValue;\r\n }\r\n\r\n public override convertToString(value?: Primitives.Float) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0.0\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = FloatTypeConverter.parseString(value) ?? 0;\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n // this is close to calling `toFixed(2)`, but cuts of any trailing zeros\r\n let stringValue = (Math.round(100 * numericValue) / 100).toString();\r\n // because this is a _float_ converter, we want to emphasize the number is a float - make\r\n // sure there's a decimal part\r\n if (stringValue.indexOf(\".\") === -1)\r\n stringValue += \".0\";\r\n return stringValue;\r\n }\r\n\r\n public override convertFromString(value: string): number | undefined {\r\n return FloatTypeConverter.parseString(value);\r\n }\r\n}\r\nTypeConverterManager.registerConverter(StandardTypeNames.Float, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Double, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Number, FloatTypeConverter);\r\n\r\n/**\r\n * Int Type Converter.\r\n * @public\r\n */\r\nexport class IntTypeConverter extends NumericTypeConverterBase {\r\n private static parseString(value: string): number | undefined {\r\n const parsedValue = parseInt(value, 10);\r\n return Number.isNaN(parsedValue) ? undefined : parsedValue;\r\n }\r\n\r\n public override convertToString(value?: Primitives.Int) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = IntTypeConverter.parseString(value) ?? 0;\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n return Math.round(numericValue).toString();\r\n }\r\n\r\n public override convertFromString(value: string): number | undefined {\r\n return IntTypeConverter.parseString(value);\r\n }\r\n}\r\n\r\nTypeConverterManager.registerConverter(StandardTypeNames.Int, IntTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Integer, IntTypeConverter);\r\n"]}
@@ -44,7 +44,7 @@ class TypeConverter {
44
44
  const stringValue = await this.convertFromStringWithOptions(value, converterOptions);
45
45
  const propertyValue = {
46
46
  valueFormat: appui_abstract_1.PropertyValueFormat.Primitive,
47
- value: stringValue ? stringValue : "",
47
+ value: stringValue,
48
48
  displayValue: "",
49
49
  };
50
50
  return propertyValue;
@@ -1 +1 @@
1
- {"version":3,"file":"TypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/TypeConverter.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,qCAAqC;AAErC,0DAA4I;AA6C5I;;;GAGG;AACH,MAAsB,aAAa;IACjC,6CAA6C;IACtC,eAAe,CAAC,KAAwB;QAC7C,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACjE,0BAA0B,CAAC,KAAwB,EAAE,QAAiC;QAC3F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IACtC,iBAAiB,CAAC,MAAc;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IACnE,4BAA4B,CAAC,KAAa,EAAE,QAAiC;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,0EAA0E;IACnE,uBAAuB,CAAC,mBAAwC,EAAE,KAAwB;;QAC/F,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAA,mBAAmB,CAAC,SAAS,0CAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IAED,mEAAmE;IAC5D,KAAK,CAAC,gCAAgC,CAAC,KAAa,EAAE,cAA+B;QAC1F,MAAM,gBAAgB,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACvI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACrF,MAAM,aAAa,GAAmB;YACpC,WAAW,EAAE,oCAAmB,CAAC,SAAS;YAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YACrC,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAKD,mDAAmD;IAC5C,SAAS,CAAC,MAAwB,EAAE,MAAwB;QACjE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,uDAAuD;IAChD,YAAY,CAAC,MAAwB,EAAE,MAAwB;QACpE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,2DAA2D;IACpD,MAAM,CAAC,KAAuB;QACnC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,mEAAmE;IAC5D,SAAS,CAAC,KAAuB;QACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,uDAAuD;IACvD,IAAW,YAAY,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACpD,wDAAwD;IACxD,IAAW,iBAAiB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACzD,wDAAwD;IACxD,IAAW,aAAa,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,IAAW,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;CACtD;AAvED,sCAuEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\n// cSpell:ignore valuetypes shortdate\r\n\r\nimport { Primitives, PrimitiveValue, PropertyDescription, PropertyRecord, PropertyValue, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { ConvertedPrimitives } from \"./valuetypes/ConvertedTypes\";\r\n\r\n/** Sort compare method for types that support sorting\r\n * @public\r\n */\r\nexport interface SortComparer {\r\n /** Sort function for two primitive values */\r\n sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, ignoreCase?: boolean): number;\r\n}\r\n\r\n/** Operators for all filterable types\r\n * @public\r\n */\r\nexport interface OperatorProcessor {\r\n /** Determines if two primitive values are equal */\r\n isEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if two primitive values are not equal */\r\n isNotEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for Numeric types, DateTime, TimeSpan, or any type that supports these comparisons\r\n * @public\r\n */\r\nexport interface LessGreaterOperatorProcessor {\r\n /** Determines if a primitive values is less than another primitive value */\r\n isLessThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is less than or equal to another primitive value */\r\n isLessThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than another primitive value */\r\n isGreaterThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than or equal to another primitive value */\r\n isGreaterThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for all filterable null-able types\r\n * @public\r\n */\r\nexport interface NullableOperatorProcessor {\r\n /** Determines if a primitive value is null or undefined */\r\n isNull(value: Primitives.Value): boolean;\r\n /** Determines if a primitive value is not null or not undefined */\r\n isNotNull(value: Primitives.Value): boolean;\r\n}\r\n\r\n/**\r\n * Type Converter base class.\r\n * @public\r\n */\r\nexport abstract class TypeConverter implements SortComparer, OperatorProcessor, NullableOperatorProcessor {\r\n /** Converts a primitive value to a string */\r\n public convertToString(value?: Primitives.Value): string | Promise<string> {\r\n if (value === undefined)\r\n return \"\";\r\n return value.toString();\r\n }\r\n\r\n /** Default implementation just calls convertToString with no options */\r\n public convertToStringWithOptions(value?: Primitives.Value, _options?: { [key: string]: any }): string | Promise<string> {\r\n return this.convertToString(value);\r\n }\r\n\r\n /** Converts a string to a primitive value */\r\n public convertFromString(_value: string): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return undefined;\r\n }\r\n\r\n /** Default implementation just calls convertFromString with no options */\r\n public convertFromStringWithOptions(value: string, _options?: { [key: string]: any }): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return this.convertFromString(value);\r\n }\r\n\r\n /** Converts a value associated with a property description to a string */\r\n public convertPropertyToString(propertyDescription: PropertyDescription, value?: Primitives.Value): string | Promise<string> {\r\n return this.convertToStringWithOptions(value, propertyDescription.converter?.options);\r\n }\r\n\r\n /** Converts a string with a property record to a property value */\r\n public async convertFromStringToPropertyValue(value: string, propertyRecord?: PropertyRecord): Promise<PropertyValue> {\r\n const converterOptions = (propertyRecord && propertyRecord.property.converter) ? propertyRecord.property.converter.options : undefined;\r\n const stringValue = await this.convertFromStringWithOptions(value, converterOptions);\r\n const propertyValue: PrimitiveValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: stringValue ? stringValue : \"\",\r\n displayValue: \"\",\r\n };\r\n return propertyValue;\r\n }\r\n\r\n /** Sort function for two primitive values */\r\n public abstract sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, _ignoreCase?: boolean): number;\r\n\r\n /** Determines if two primitive values are equal */\r\n public isEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA === valueB;\r\n }\r\n\r\n /** Determines if two primitive values are not equal */\r\n public isNotEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA !== valueB;\r\n }\r\n\r\n /** Determines if a primitive value is null or undefined */\r\n public isNull(value: Primitives.Value): boolean {\r\n return value === null || value === undefined;\r\n }\r\n\r\n /** Determines if a primitive value is not null or not undefined */\r\n public isNotNull(value: Primitives.Value): boolean {\r\n return value !== null && value !== undefined;\r\n }\r\n\r\n /** Determines if the converter is for a string type */\r\n public get isStringType(): boolean { return false; }\r\n /** Determines if the converter is for a numeric type */\r\n public get isLessGreaterType(): boolean { return false; }\r\n /** Determines if the converter is for a boolean type */\r\n public get isBooleanType(): boolean { return false; }\r\n /** Determines if the converter is for a nullable type */\r\n public get isNullableType(): boolean { return true; }\r\n}\r\n"]}
1
+ {"version":3,"file":"TypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/TypeConverter.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,qCAAqC;AAErC,0DAA4I;AA6C5I;;;GAGG;AACH,MAAsB,aAAa;IACjC,6CAA6C;IACtC,eAAe,CAAC,KAAwB;QAC7C,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACjE,0BAA0B,CAAC,KAAwB,EAAE,QAAiC;QAC3F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IACtC,iBAAiB,CAAC,MAAc;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IACnE,4BAA4B,CAAC,KAAa,EAAE,QAAiC;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,0EAA0E;IACnE,uBAAuB,CAAC,mBAAwC,EAAE,KAAwB;;QAC/F,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAA,mBAAmB,CAAC,SAAS,0CAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IAED,mEAAmE;IAC5D,KAAK,CAAC,gCAAgC,CAAC,KAAa,EAAE,cAA+B;QAC1F,MAAM,gBAAgB,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACvI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACrF,MAAM,aAAa,GAAmB;YACpC,WAAW,EAAE,oCAAmB,CAAC,SAAS;YAC1C,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAKD,mDAAmD;IAC5C,SAAS,CAAC,MAAwB,EAAE,MAAwB;QACjE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,uDAAuD;IAChD,YAAY,CAAC,MAAwB,EAAE,MAAwB;QACpE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,2DAA2D;IACpD,MAAM,CAAC,KAAuB;QACnC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,mEAAmE;IAC5D,SAAS,CAAC,KAAuB;QACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,uDAAuD;IACvD,IAAW,YAAY,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACpD,wDAAwD;IACxD,IAAW,iBAAiB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACzD,wDAAwD;IACxD,IAAW,aAAa,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,IAAW,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;CACtD;AAvED,sCAuEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\n// cSpell:ignore valuetypes shortdate\r\n\r\nimport { Primitives, PrimitiveValue, PropertyDescription, PropertyRecord, PropertyValue, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { ConvertedPrimitives } from \"./valuetypes/ConvertedTypes\";\r\n\r\n/** Sort compare method for types that support sorting\r\n * @public\r\n */\r\nexport interface SortComparer {\r\n /** Sort function for two primitive values */\r\n sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, ignoreCase?: boolean): number;\r\n}\r\n\r\n/** Operators for all filterable types\r\n * @public\r\n */\r\nexport interface OperatorProcessor {\r\n /** Determines if two primitive values are equal */\r\n isEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if two primitive values are not equal */\r\n isNotEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for Numeric types, DateTime, TimeSpan, or any type that supports these comparisons\r\n * @public\r\n */\r\nexport interface LessGreaterOperatorProcessor {\r\n /** Determines if a primitive values is less than another primitive value */\r\n isLessThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is less than or equal to another primitive value */\r\n isLessThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than another primitive value */\r\n isGreaterThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than or equal to another primitive value */\r\n isGreaterThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for all filterable null-able types\r\n * @public\r\n */\r\nexport interface NullableOperatorProcessor {\r\n /** Determines if a primitive value is null or undefined */\r\n isNull(value: Primitives.Value): boolean;\r\n /** Determines if a primitive value is not null or not undefined */\r\n isNotNull(value: Primitives.Value): boolean;\r\n}\r\n\r\n/**\r\n * Type Converter base class.\r\n * @public\r\n */\r\nexport abstract class TypeConverter implements SortComparer, OperatorProcessor, NullableOperatorProcessor {\r\n /** Converts a primitive value to a string */\r\n public convertToString(value?: Primitives.Value): string | Promise<string> {\r\n if (value === undefined)\r\n return \"\";\r\n return value.toString();\r\n }\r\n\r\n /** Default implementation just calls convertToString with no options */\r\n public convertToStringWithOptions(value?: Primitives.Value, _options?: { [key: string]: any }): string | Promise<string> {\r\n return this.convertToString(value);\r\n }\r\n\r\n /** Converts a string to a primitive value */\r\n public convertFromString(_value: string): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return undefined;\r\n }\r\n\r\n /** Default implementation just calls convertFromString with no options */\r\n public convertFromStringWithOptions(value: string, _options?: { [key: string]: any }): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return this.convertFromString(value);\r\n }\r\n\r\n /** Converts a value associated with a property description to a string */\r\n public convertPropertyToString(propertyDescription: PropertyDescription, value?: Primitives.Value): string | Promise<string> {\r\n return this.convertToStringWithOptions(value, propertyDescription.converter?.options);\r\n }\r\n\r\n /** Converts a string with a property record to a property value */\r\n public async convertFromStringToPropertyValue(value: string, propertyRecord?: PropertyRecord): Promise<PropertyValue> {\r\n const converterOptions = (propertyRecord && propertyRecord.property.converter) ? propertyRecord.property.converter.options : undefined;\r\n const stringValue = await this.convertFromStringWithOptions(value, converterOptions);\r\n const propertyValue: PrimitiveValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: stringValue,\r\n displayValue: \"\",\r\n };\r\n return propertyValue;\r\n }\r\n\r\n /** Sort function for two primitive values */\r\n public abstract sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, _ignoreCase?: boolean): number;\r\n\r\n /** Determines if two primitive values are equal */\r\n public isEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA === valueB;\r\n }\r\n\r\n /** Determines if two primitive values are not equal */\r\n public isNotEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA !== valueB;\r\n }\r\n\r\n /** Determines if a primitive value is null or undefined */\r\n public isNull(value: Primitives.Value): boolean {\r\n return value === null || value === undefined;\r\n }\r\n\r\n /** Determines if a primitive value is not null or not undefined */\r\n public isNotNull(value: Primitives.Value): boolean {\r\n return value !== null && value !== undefined;\r\n }\r\n\r\n /** Determines if the converter is for a string type */\r\n public get isStringType(): boolean { return false; }\r\n /** Determines if the converter is for a numeric type */\r\n public get isLessGreaterType(): boolean { return false; }\r\n /** Determines if the converter is for a boolean type */\r\n public get isBooleanType(): boolean { return false; }\r\n /** Determines if the converter is for a nullable type */\r\n public get isNullableType(): boolean { return true; }\r\n}\r\n"]}
@@ -59,7 +59,7 @@ class CustomNumberEditor extends React.PureComponent {
59
59
  var _a;
60
60
  // istanbul ignore else
61
61
  if (e.key === appui_abstract_1.SpecialKey.Escape) {
62
- const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : this._getInitialDisplayValue();
62
+ const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : ( /* istanbul ignore next */this._getInitialDisplayValue());
63
63
  if (initialDisplayValue !== this.state.inputValue) {
64
64
  e.preventDefault();
65
65
  e.stopPropagation();
@@ -118,7 +118,7 @@ class CustomNumberEditor extends React.PureComponent {
118
118
  appui_abstract_1.UiAdmin.messagePresenter.displayMessage(appui_abstract_1.MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents_1.UiComponents.translate("errors.unable-to-parse-quantity"));
119
119
  }
120
120
  const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ this._formatParams.formatFunction(record.value.value);
121
- propertyValue = this._lastValidValue ? { ...this._lastValidValue } : {
121
+ propertyValue = this._lastValidValue ? { ...this._lastValidValue } : /* istanbul ignore next */ {
122
122
  valueFormat: appui_abstract_1.PropertyValueFormat.Primitive,
123
123
  value: record.value.value,
124
124
  displayValue,
@@ -238,7 +238,7 @@ class CustomNumberEditor extends React.PureComponent {
238
238
  }
239
239
  _resetToLastValidDisplayValue() {
240
240
  var _a;
241
- const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : this._getInitialDisplayValue();
241
+ const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : ( /* istanbul ignore next */this._getInitialDisplayValue());
242
242
  this.setState({ inputValue: initialDisplayValue });
243
243
  }
244
244
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"CustomNumberEditor.js","sourceRoot":"","sources":["../../../../src/components-react/editors/CustomNumberEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module PropertyEditors\r\n */\r\n\r\n// cSpell:ignore customnumber testid\r\n\r\nimport \"./CustomNumberEditor.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CustomFormattedNumberParams, IconEditorParams, InputEditorSizeParams, MessageSeverity, PrimitiveValue, PropertyEditorParams, PropertyEditorParamTypes,\r\n PropertyRecord, PropertyValue, PropertyValueFormat, SpecialKey, StandardEditorNames, StandardTypeNames, UiAdmin,\r\n} from \"@itwin/appui-abstract\";\r\nimport { Icon, IconInput } from \"@itwin/core-react\";\r\nimport { Input, InputProps } from \"@itwin/itwinui-react\";\r\n\r\nimport { UiComponents } from \"../UiComponents\";\r\nimport { PropertyEditorProps, TypeEditor } from \"./EditorContainer\";\r\nimport { PropertyEditorBase, PropertyEditorManager } from \"./PropertyEditorManager\";\r\n\r\n/** @internal */\r\ninterface CustomNumberEditorState {\r\n inputValue: string;\r\n size?: number;\r\n maxLength?: number;\r\n iconSpec?: string;\r\n}\r\n\r\n/** CustomNumberEditor is a React component that is a property editor for numbers that specify custom formatting and parsing functions.\r\n * @alpha\r\n */\r\nexport class CustomNumberEditor extends React.PureComponent<PropertyEditorProps, CustomNumberEditorState> implements TypeEditor {\r\n private _isMounted = false;\r\n private _formatParams: CustomFormattedNumberParams | undefined;\r\n private _inputElement = React.createRef<HTMLInputElement>();\r\n private _lastValidValue: PropertyValue | undefined;\r\n\r\n /** @internal */\r\n public override readonly state: Readonly<CustomNumberEditorState> = {\r\n inputValue: \"\",\r\n };\r\n\r\n public async getPropertyValue(): Promise<PropertyValue | undefined> {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n let propertyValue: PropertyValue | undefined;\r\n\r\n if (record.isReadonly) {\r\n return {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: (record.value as PrimitiveValue).displayValue,\r\n };\r\n }\r\n\r\n // istanbul ignore else\r\n if (record && record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const parseResults = (this._formatParams as CustomFormattedNumberParams).parseFunction(this.state.inputValue);\r\n if (!parseResults.parseError && undefined !== parseResults.value) {\r\n const newDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(parseResults.value as number);\r\n propertyValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: parseResults.value,\r\n displayValue: newDisplayValue,\r\n };\r\n this._lastValidValue = { ...propertyValue };\r\n // make sure the text in the input item matches the latest formatted text... this could get out if the input string say 1.5 === the display string of 1'-6\"\r\n // istanbul ignore else\r\n if (newDisplayValue !== this.state.inputValue) {\r\n this.setState({ inputValue: newDisplayValue });\r\n }\r\n } else {\r\n // istanbul ignore else\r\n if (this.htmlElement) {\r\n UiAdmin.messagePresenter.displayInputFieldMessage(this.htmlElement, MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n this.htmlElement.focus();\r\n } else {\r\n UiAdmin.messagePresenter.displayMessage(MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n }\r\n\r\n const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ (this._formatParams as CustomFormattedNumberParams).formatFunction(record.value.value as number);\r\n propertyValue = this._lastValidValue ? { ...this._lastValidValue } : {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: record.value.value,\r\n displayValue,\r\n };\r\n }\r\n }\r\n\r\n return propertyValue;\r\n }\r\n\r\n public get htmlElement(): HTMLElement | null {\r\n return this._inputElement.current;\r\n }\r\n\r\n public get hasFocus(): boolean {\r\n return document.activeElement === this._inputElement.current;\r\n }\r\n\r\n private shouldSetFocus(): boolean {\r\n if (!this.props.setFocus)\r\n return false;\r\n\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n\r\n return (!disabled && !readonly);\r\n }\r\n\r\n private _applyUpdatedValue(userInput: string) {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n\r\n if (readonly || disabled)\r\n return;\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({\r\n inputValue: userInput,\r\n });\r\n }\r\n\r\n private _updateInputValue = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n this._applyUpdatedValue(e.target.value);\r\n };\r\n\r\n /** @internal */\r\n public override componentDidMount() {\r\n this._isMounted = true;\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n /** @internal */\r\n public override componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n /** @internal */\r\n public override componentDidUpdate(prevProps: PropertyEditorProps) {\r\n if (this.props.propertyRecord !== prevProps.propertyRecord) {\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n }\r\n\r\n private _getInitialDisplayValue(): string {\r\n const record = this.props.propertyRecord;\r\n let initialDisplayValue = \"\";\r\n let numberValue = 0;\r\n // istanbul ignore else\r\n if (record) {\r\n // istanbul ignore else\r\n if (record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const primitiveValue = record.value;\r\n numberValue = (undefined !== primitiveValue.value) ? primitiveValue.value as number : /* istanbul ignore next */ 0;\r\n // istanbul ignore else\r\n if (primitiveValue.displayValue)\r\n initialDisplayValue = primitiveValue.displayValue;\r\n else\r\n initialDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(numberValue);\r\n }\r\n }\r\n\r\n return initialDisplayValue;\r\n }\r\n\r\n private async setStateFromProps() {\r\n const record = this.props.propertyRecord;\r\n // istanbul ignore next\r\n if (!record || !record.property) {\r\n Logger.logError(UiComponents.loggerCategory(this), \"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n // eslint-disable-next-line no-console\r\n // console.log(\"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n return;\r\n }\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n this._formatParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.CustomFormattedNumber) as CustomFormattedNumberParams;\r\n }\r\n\r\n if (!this._formatParams) {\r\n Logger.logError(UiComponents.loggerCategory(this), `CustomFormattedNumberParams must be defined for property ${record.property.name}`);\r\n // eslint-disable-next-line no-console\r\n // console.log(`CustomFormattedNumberParams must be defined for property ${record!.property!.name}`);\r\n return;\r\n }\r\n\r\n const initialDisplayValue = this._getInitialDisplayValue();\r\n this._lastValidValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: initialDisplayValue,\r\n };\r\n let size: number | undefined;\r\n let maxLength: number | undefined;\r\n let iconSpec: string | undefined;\r\n\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n const editorSizeParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.InputEditorSize) as InputEditorSizeParams;\r\n // istanbul ignore else\r\n if (editorSizeParams) {\r\n // istanbul ignore else\r\n if (editorSizeParams.size)\r\n size = editorSizeParams.size;\r\n // istanbul ignore else\r\n if (editorSizeParams.maxLength)\r\n maxLength = editorSizeParams.maxLength;\r\n }\r\n\r\n const iconParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.Icon) as IconEditorParams;\r\n if (iconParams) {\r\n iconSpec = iconParams.definition.iconSpec;\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({ inputValue: initialDisplayValue, size, maxLength, iconSpec });\r\n }\r\n\r\n private _resetToLastValidDisplayValue() {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? this._getInitialDisplayValue();\r\n this.setState({ inputValue: initialDisplayValue });\r\n }\r\n\r\n private _onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Escape) {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? this._getInitialDisplayValue();\r\n if (initialDisplayValue !== this.state.inputValue) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this._resetToLastValidDisplayValue();\r\n } else {\r\n // istanbul ignore else\r\n if (this.props.onCancel)\r\n this.props.onCancel();\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (e.key !== SpecialKey.Enter) {\r\n UiAdmin.messagePresenter.closeInputFieldMessage();\r\n }\r\n };\r\n\r\n // istanbul ignore next\r\n private _onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n e.target.select();\r\n };\r\n\r\n /** @internal */\r\n public override render(): React.ReactNode {\r\n const minSize = this.state.size ? this.state.size : 8;\r\n const minWidthStyle: React.CSSProperties = {\r\n minWidth: `${minSize * 0.75}em`,\r\n };\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n if (!record || !this._formatParams)\r\n return null;\r\n\r\n const readOnly = !record.isReadonly ? false : true;\r\n const disabled = !record.isDisabled ? false : true;\r\n\r\n const className = classnames(\"components-cell-editor\", \"components-customnumber-editor\", this.props.className);\r\n\r\n const inputProps: Omit<InputProps, \"size\"> = { // eslint-disable-line deprecation/deprecation\r\n className,\r\n style: this.props.style ? this.props.style : minWidthStyle,\r\n readOnly,\r\n disabled,\r\n maxLength: this.state.maxLength,\r\n value: this.state.inputValue,\r\n onChange: this._updateInputValue,\r\n onBlur: this.props.onBlur,\r\n onFocus: this._onFocus,\r\n setFocus: this.shouldSetFocus(),\r\n onKeyDown: this._onKeyPress,\r\n };\r\n\r\n let reactNode: React.ReactNode;\r\n if (this.state.iconSpec) {\r\n const icon = <Icon iconSpec={this.state.iconSpec} />;\r\n reactNode = (\r\n <IconInput\r\n {...inputProps}\r\n ref={this._inputElement}\r\n icon={icon}\r\n data-testid=\"components-customnumber-editor\"\r\n />\r\n );\r\n } else {\r\n // NEEDSWORK: still using core-react Input component because of `nativeKeyHandler` prop\r\n reactNode = (\r\n <Input\r\n {...inputProps}\r\n ref={this._inputElement}\r\n data-testid=\"components-customnumber-editor\"\r\n size=\"small\"\r\n />\r\n );\r\n }\r\n\r\n return reactNode;\r\n }\r\n}\r\n\r\n/** Custom Property Editor registered for the \"number\" type name and the \"number-custom\" editor name.\r\n * It uses the [[CustomNumberEditor]] React component.\r\n * @alpha\r\n */\r\nexport class CustomNumberPropertyEditor extends PropertyEditorBase {\r\n public get reactNode(): React.ReactNode {\r\n return <CustomNumberEditor />;\r\n }\r\n public override get containerHandlesEscape(): boolean {\r\n return false;\r\n }\r\n}\r\nPropertyEditorManager.registerEditor(StandardTypeNames.Number, CustomNumberPropertyEditor, StandardEditorNames.NumberCustom);\r\n"]}
1
+ {"version":3,"file":"CustomNumberEditor.js","sourceRoot":"","sources":["../../../../src/components-react/editors/CustomNumberEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module PropertyEditors\r\n */\r\n\r\n// cSpell:ignore customnumber testid\r\n\r\nimport \"./CustomNumberEditor.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CustomFormattedNumberParams, IconEditorParams, InputEditorSizeParams, MessageSeverity, PrimitiveValue, PropertyEditorParams, PropertyEditorParamTypes,\r\n PropertyRecord, PropertyValue, PropertyValueFormat, SpecialKey, StandardEditorNames, StandardTypeNames, UiAdmin,\r\n} from \"@itwin/appui-abstract\";\r\nimport { Icon, IconInput } from \"@itwin/core-react\";\r\nimport { Input, InputProps } from \"@itwin/itwinui-react\";\r\n\r\nimport { UiComponents } from \"../UiComponents\";\r\nimport { PropertyEditorProps, TypeEditor } from \"./EditorContainer\";\r\nimport { PropertyEditorBase, PropertyEditorManager } from \"./PropertyEditorManager\";\r\n\r\n/** @internal */\r\ninterface CustomNumberEditorState {\r\n inputValue: string;\r\n size?: number;\r\n maxLength?: number;\r\n iconSpec?: string;\r\n}\r\n\r\n/** CustomNumberEditor is a React component that is a property editor for numbers that specify custom formatting and parsing functions.\r\n * @alpha\r\n */\r\nexport class CustomNumberEditor extends React.PureComponent<PropertyEditorProps, CustomNumberEditorState> implements TypeEditor {\r\n private _isMounted = false;\r\n private _formatParams: CustomFormattedNumberParams | undefined;\r\n private _inputElement = React.createRef<HTMLInputElement>();\r\n private _lastValidValue: PropertyValue | undefined;\r\n\r\n /** @internal */\r\n public override readonly state: Readonly<CustomNumberEditorState> = {\r\n inputValue: \"\",\r\n };\r\n\r\n public async getPropertyValue(): Promise<PropertyValue | undefined> {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n let propertyValue: PropertyValue | undefined;\r\n\r\n if (record.isReadonly) {\r\n return {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: (record.value as PrimitiveValue).displayValue,\r\n };\r\n }\r\n\r\n // istanbul ignore else\r\n if (record && record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const parseResults = (this._formatParams as CustomFormattedNumberParams).parseFunction(this.state.inputValue);\r\n if (!parseResults.parseError && undefined !== parseResults.value) {\r\n const newDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(parseResults.value as number);\r\n propertyValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: parseResults.value,\r\n displayValue: newDisplayValue,\r\n };\r\n this._lastValidValue = { ...propertyValue };\r\n // make sure the text in the input item matches the latest formatted text... this could get out if the input string say 1.5 === the display string of 1'-6\"\r\n // istanbul ignore else\r\n if (newDisplayValue !== this.state.inputValue) {\r\n this.setState({ inputValue: newDisplayValue });\r\n }\r\n } else {\r\n // istanbul ignore else\r\n if (this.htmlElement) {\r\n UiAdmin.messagePresenter.displayInputFieldMessage(this.htmlElement, MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n this.htmlElement.focus();\r\n } else {\r\n UiAdmin.messagePresenter.displayMessage(MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n }\r\n\r\n const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ (this._formatParams as CustomFormattedNumberParams).formatFunction(record.value.value as number);\r\n propertyValue = this._lastValidValue ? { ...this._lastValidValue } : /* istanbul ignore next */ {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: record.value.value,\r\n displayValue,\r\n };\r\n }\r\n }\r\n\r\n return propertyValue;\r\n }\r\n\r\n public get htmlElement(): HTMLElement | null {\r\n return this._inputElement.current;\r\n }\r\n\r\n public get hasFocus(): boolean {\r\n return document.activeElement === this._inputElement.current;\r\n }\r\n\r\n private shouldSetFocus(): boolean {\r\n if (!this.props.setFocus)\r\n return false;\r\n\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n\r\n return (!disabled && !readonly);\r\n }\r\n\r\n private _applyUpdatedValue(userInput: string) {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n\r\n if (readonly || disabled)\r\n return;\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({\r\n inputValue: userInput,\r\n });\r\n }\r\n\r\n private _updateInputValue = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n this._applyUpdatedValue(e.target.value);\r\n };\r\n\r\n /** @internal */\r\n public override componentDidMount() {\r\n this._isMounted = true;\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n /** @internal */\r\n public override componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n /** @internal */\r\n public override componentDidUpdate(prevProps: PropertyEditorProps) {\r\n if (this.props.propertyRecord !== prevProps.propertyRecord) {\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n }\r\n\r\n private _getInitialDisplayValue(): string {\r\n const record = this.props.propertyRecord;\r\n let initialDisplayValue = \"\";\r\n let numberValue = 0;\r\n // istanbul ignore else\r\n if (record) {\r\n // istanbul ignore else\r\n if (record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const primitiveValue = record.value;\r\n numberValue = (undefined !== primitiveValue.value) ? primitiveValue.value as number : /* istanbul ignore next */ 0;\r\n // istanbul ignore else\r\n if (primitiveValue.displayValue)\r\n initialDisplayValue = primitiveValue.displayValue;\r\n else\r\n initialDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(numberValue);\r\n }\r\n }\r\n\r\n return initialDisplayValue;\r\n }\r\n\r\n private async setStateFromProps() {\r\n const record = this.props.propertyRecord;\r\n // istanbul ignore next\r\n if (!record || !record.property) {\r\n Logger.logError(UiComponents.loggerCategory(this), \"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n // eslint-disable-next-line no-console\r\n // console.log(\"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n return;\r\n }\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n this._formatParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.CustomFormattedNumber) as CustomFormattedNumberParams;\r\n }\r\n\r\n if (!this._formatParams) {\r\n Logger.logError(UiComponents.loggerCategory(this), `CustomFormattedNumberParams must be defined for property ${record.property.name}`);\r\n // eslint-disable-next-line no-console\r\n // console.log(`CustomFormattedNumberParams must be defined for property ${record!.property!.name}`);\r\n return;\r\n }\r\n\r\n const initialDisplayValue = this._getInitialDisplayValue();\r\n this._lastValidValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: initialDisplayValue,\r\n };\r\n let size: number | undefined;\r\n let maxLength: number | undefined;\r\n let iconSpec: string | undefined;\r\n\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n const editorSizeParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.InputEditorSize) as InputEditorSizeParams;\r\n // istanbul ignore else\r\n if (editorSizeParams) {\r\n // istanbul ignore else\r\n if (editorSizeParams.size)\r\n size = editorSizeParams.size;\r\n // istanbul ignore else\r\n if (editorSizeParams.maxLength)\r\n maxLength = editorSizeParams.maxLength;\r\n }\r\n\r\n const iconParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.Icon) as IconEditorParams;\r\n if (iconParams) {\r\n iconSpec = iconParams.definition.iconSpec;\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({ inputValue: initialDisplayValue, size, maxLength, iconSpec });\r\n }\r\n\r\n private _resetToLastValidDisplayValue() {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? (/* istanbul ignore next */ this._getInitialDisplayValue());\r\n this.setState({ inputValue: initialDisplayValue });\r\n }\r\n\r\n private _onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Escape) {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? (/* istanbul ignore next */ this._getInitialDisplayValue());\r\n if (initialDisplayValue !== this.state.inputValue) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this._resetToLastValidDisplayValue();\r\n } else {\r\n // istanbul ignore else\r\n if (this.props.onCancel)\r\n this.props.onCancel();\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (e.key !== SpecialKey.Enter) {\r\n UiAdmin.messagePresenter.closeInputFieldMessage();\r\n }\r\n };\r\n\r\n // istanbul ignore next\r\n private _onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n e.target.select();\r\n };\r\n\r\n /** @internal */\r\n public override render(): React.ReactNode {\r\n const minSize = this.state.size ? this.state.size : 8;\r\n const minWidthStyle: React.CSSProperties = {\r\n minWidth: `${minSize * 0.75}em`,\r\n };\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n if (!record || !this._formatParams)\r\n return null;\r\n\r\n const readOnly = !record.isReadonly ? false : true;\r\n const disabled = !record.isDisabled ? false : true;\r\n\r\n const className = classnames(\"components-cell-editor\", \"components-customnumber-editor\", this.props.className);\r\n\r\n const inputProps: Omit<InputProps, \"size\"> = { // eslint-disable-line deprecation/deprecation\r\n className,\r\n style: this.props.style ? this.props.style : minWidthStyle,\r\n readOnly,\r\n disabled,\r\n maxLength: this.state.maxLength,\r\n value: this.state.inputValue,\r\n onChange: this._updateInputValue,\r\n onBlur: this.props.onBlur,\r\n onFocus: this._onFocus,\r\n setFocus: this.shouldSetFocus(),\r\n onKeyDown: this._onKeyPress,\r\n };\r\n\r\n let reactNode: React.ReactNode;\r\n if (this.state.iconSpec) {\r\n const icon = <Icon iconSpec={this.state.iconSpec} />;\r\n reactNode = (\r\n <IconInput\r\n {...inputProps}\r\n ref={this._inputElement}\r\n icon={icon}\r\n data-testid=\"components-customnumber-editor\"\r\n />\r\n );\r\n } else {\r\n // NEEDSWORK: still using core-react Input component because of `nativeKeyHandler` prop\r\n reactNode = (\r\n <Input\r\n {...inputProps}\r\n ref={this._inputElement}\r\n data-testid=\"components-customnumber-editor\"\r\n size=\"small\"\r\n />\r\n );\r\n }\r\n\r\n return reactNode;\r\n }\r\n}\r\n\r\n/** Custom Property Editor registered for the \"number\" type name and the \"number-custom\" editor name.\r\n * It uses the [[CustomNumberEditor]] React component.\r\n * @alpha\r\n */\r\nexport class CustomNumberPropertyEditor extends PropertyEditorBase {\r\n public get reactNode(): React.ReactNode {\r\n return <CustomNumberEditor />;\r\n }\r\n public override get containerHandlesEscape(): boolean {\r\n return false;\r\n }\r\n}\r\nPropertyEditorManager.registerEditor(StandardTypeNames.Number, CustomNumberPropertyEditor, StandardEditorNames.NumberCustom);\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeHooks.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,iCAGlI;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,sCAGzJ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,mBAGhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,SAAS,gBAAgB,EAAE,eAAe,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,sBAAsB,oBAO7I"}
1
+ {"version":3,"file":"TreeHooks.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,iCAGlI;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,sCAGzJ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,mBAGhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,SAAS,gBAAgB,EAAE,eAAe,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,sBAAsB,oBAO7I"}
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.useTreeEventsHandler = exports.useTreeModelSource = exports.usePagedTreeNodeLoader = exports.useTreeNodeLoader = exports.useTreeModel = void 0;
11
11
  const react_1 = require("react");
12
12
  const core_react_1 = require("@itwin/core-react");
13
+ const UseRerender_1 = require("../../common/UseRerender");
13
14
  const TreeEventHandler_1 = require("./TreeEventHandler");
14
15
  const TreeModelSource_1 = require("./TreeModelSource");
15
16
  const TreeNodeLoader_1 = require("./TreeNodeLoader");
@@ -20,15 +21,11 @@ const TreeNodeLoader_1 = require("./TreeNodeLoader");
20
21
  * @public
21
22
  */
22
23
  function useTreeModel(modelSource) {
23
- const [model, setModel] = (0, react_1.useState)(modelSource.getModel());
24
+ const { rerender } = (0, UseRerender_1.useRerender)();
24
25
  (0, react_1.useEffect)(() => {
25
- const onModelChanged = () => {
26
- setModel(modelSource.getModel());
27
- };
28
- onModelChanged();
29
- return modelSource.onModelChanged.addListener(onModelChanged);
30
- }, [modelSource]);
31
- return model;
26
+ return modelSource.onModelChanged.addListener(rerender);
27
+ }, [modelSource, rerender]);
28
+ return modelSource.getModel();
32
29
  }
33
30
  exports.useTreeModel = useTreeModel;
34
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TreeHooks.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,iCAAkE;AAClE,kDAAkD;AAElD,yDAA8E;AAE9E,uDAAoD;AACpD,qDAAuE;AAEvE;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,WAA4B;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE3D,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,cAAc,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC;AACf,CAAC;AAZD,oCAYC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAyC,YAA2B,EAAE,WAA4B;IACjI,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,IAAI,+BAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACnH,OAAO,IAAA,0BAAa,EAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAHD,8CAGC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAyC,YAA2B,EAAE,QAAgB,EAAE,WAA4B;IACxJ,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,IAAI,oCAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5I,OAAO,IAAA,0BAAa,EAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAHD,wDAGC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,YAA8B;IAC/D,0HAA0H;IAC1H,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAI,iCAAe,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kDAAkD;AACjH,CAAC;AAHD,gDAGC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAA0C,eAAgE;IAC5I,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAqB,EAAE;QACjD,IAAI,OAAO,eAAe,KAAK,UAAU;YACvC,OAAO,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,mCAAgB,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACtB,OAAO,IAAA,0BAAa,EAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAPD,oDAOC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useDisposable } from \"@itwin/core-react\";\r\nimport { TreeDataProvider } from \"../TreeDataProvider\";\r\nimport { TreeEventHandler, TreeEventHandlerParams } from \"./TreeEventHandler\";\r\nimport { TreeModel } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\nimport { PagedTreeNodeLoader, TreeNodeLoader } from \"./TreeNodeLoader\";\r\n\r\n/**\r\n * React hook that returns an immutable `TreeModel` whenever it changes in the given\r\n * `TreeModelSource`.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModel(modelSource: TreeModelSource): TreeModel {\r\n const [model, setModel] = useState(modelSource.getModel());\r\n\r\n useEffect(() => {\r\n const onModelChanged = () => {\r\n setModel(modelSource.getModel());\r\n };\r\n onModelChanged();\r\n return modelSource.onModelChanged.addListener(onModelChanged);\r\n }, [modelSource]);\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Custom hook which creates a nodes' loader using the supplied data provider and model source. The\r\n * loader pulls nodes from the data provider and puts them into the model source.\r\n *\r\n * @public\r\n */\r\nexport function useTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new TreeNodeLoader(dataProvider, modelSource), [dataProvider, modelSource]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a paging nodes' loader using the supplied data provider and model source. The loader pulls\r\n * nodes from the data provider and puts them into the model source.\r\n * @public\r\n */\r\nexport function usePagedTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, pageSize: number, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new PagedTreeNodeLoader(dataProvider, modelSource, pageSize), [dataProvider, modelSource, pageSize]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a `TreeModelSource`.\r\n *\r\n * @note The model source has no direct dependency on the data provider, but we want a fresh model\r\n * source whenever the data provider changes - that's the reason the hook takes a data provider.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModelSource(dataProvider: TreeDataProvider) {\r\n // need to create new model source every time data provider changes although it does not need data provider to be created.\r\n return useMemo(() => new TreeModelSource(), [dataProvider]); // eslint-disable-line react-hooks/exhaustive-deps\r\n}\r\n\r\n/**\r\n * Custom hook which creates and takes care of disposing a TreeEventsHandler. The input is either a factory method\r\n * for a custom `TreeEventHandler` implementation or parameters for the default implementation.\r\n *\r\n * @note Caller must ensure `factoryOrParams` changes only when a new handler needs to be created. `useCallback` or `useMemo` can\r\n * be used for that purpose based on whether the input is a factory function or params object.\r\n *\r\n * @public\r\n */\r\nexport function useTreeEventsHandler<TEventsHandler extends TreeEventHandler>(factoryOrParams: (() => TEventsHandler) | TreeEventHandlerParams) {\r\n const factory = useCallback((): TreeEventHandler => {\r\n if (typeof factoryOrParams === \"function\")\r\n return factoryOrParams();\r\n return new TreeEventHandler(factoryOrParams);\r\n }, [factoryOrParams]);\r\n return useDisposable(factory);\r\n}\r\n"]}
1
+ {"version":3,"file":"TreeHooks.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,iCAAwD;AACxD,kDAAkD;AAClD,0DAAuD;AAEvD,yDAA8E;AAE9E,uDAAoD;AACpD,qDAAuE;AAEvE;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,WAA4B;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,yBAAW,GAAE,CAAC;IACnC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,OAAO,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5B,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC;AAND,oCAMC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAyC,YAA2B,EAAE,WAA4B;IACjI,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,IAAI,+BAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACnH,OAAO,IAAA,0BAAa,EAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAHD,8CAGC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAyC,YAA2B,EAAE,QAAgB,EAAE,WAA4B;IACxJ,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,IAAI,oCAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5I,OAAO,IAAA,0BAAa,EAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAHD,wDAGC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,YAA8B;IAC/D,0HAA0H;IAC1H,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAI,iCAAe,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kDAAkD;AACjH,CAAC;AAHD,gDAGC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAA0C,eAAgE;IAC5I,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAqB,EAAE;QACjD,IAAI,OAAO,eAAe,KAAK,UAAU;YACvC,OAAO,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,mCAAgB,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACtB,OAAO,IAAA,0BAAa,EAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAPD,oDAOC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { useDisposable } from \"@itwin/core-react\";\r\nimport { useRerender } from \"../../common/UseRerender\";\r\nimport { TreeDataProvider } from \"../TreeDataProvider\";\r\nimport { TreeEventHandler, TreeEventHandlerParams } from \"./TreeEventHandler\";\r\nimport { TreeModel } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\nimport { PagedTreeNodeLoader, TreeNodeLoader } from \"./TreeNodeLoader\";\r\n\r\n/**\r\n * React hook that returns an immutable `TreeModel` whenever it changes in the given\r\n * `TreeModelSource`.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModel(modelSource: TreeModelSource): TreeModel {\r\n const { rerender } = useRerender();\r\n useEffect(() => {\r\n return modelSource.onModelChanged.addListener(rerender);\r\n }, [modelSource, rerender]);\r\n return modelSource.getModel();\r\n}\r\n\r\n/**\r\n * Custom hook which creates a nodes' loader using the supplied data provider and model source. The\r\n * loader pulls nodes from the data provider and puts them into the model source.\r\n *\r\n * @public\r\n */\r\nexport function useTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new TreeNodeLoader(dataProvider, modelSource), [dataProvider, modelSource]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a paging nodes' loader using the supplied data provider and model source. The loader pulls\r\n * nodes from the data provider and puts them into the model source.\r\n * @public\r\n */\r\nexport function usePagedTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, pageSize: number, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new PagedTreeNodeLoader(dataProvider, modelSource, pageSize), [dataProvider, modelSource, pageSize]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a `TreeModelSource`.\r\n *\r\n * @note The model source has no direct dependency on the data provider, but we want a fresh model\r\n * source whenever the data provider changes - that's the reason the hook takes a data provider.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModelSource(dataProvider: TreeDataProvider) {\r\n // need to create new model source every time data provider changes although it does not need data provider to be created.\r\n return useMemo(() => new TreeModelSource(), [dataProvider]); // eslint-disable-line react-hooks/exhaustive-deps\r\n}\r\n\r\n/**\r\n * Custom hook which creates and takes care of disposing a TreeEventsHandler. The input is either a factory method\r\n * for a custom `TreeEventHandler` implementation or parameters for the default implementation.\r\n *\r\n * @note Caller must ensure `factoryOrParams` changes only when a new handler needs to be created. `useCallback` or `useMemo` can\r\n * be used for that purpose based on whether the input is a factory function or params object.\r\n *\r\n * @public\r\n */\r\nexport function useTreeEventsHandler<TEventsHandler extends TreeEventHandler>(factoryOrParams: (() => TEventsHandler) | TreeEventHandlerParams) {\r\n const factory = useCallback((): TreeEventHandler => {\r\n if (typeof factoryOrParams === \"function\")\r\n return factoryOrParams();\r\n return new TreeEventHandler(factoryOrParams);\r\n }, [factoryOrParams]);\r\n return useDisposable(factory);\r\n}\r\n"]}
@@ -20,15 +20,17 @@ export declare abstract class NumericTypeConverterBase extends TypeConverter imp
20
20
  * @public
21
21
  */
22
22
  export declare class FloatTypeConverter extends NumericTypeConverterBase {
23
+ private static parseString;
23
24
  convertToString(value?: Primitives.Float): string;
24
- convertFromString(value: string): number;
25
+ convertFromString(value: string): number | undefined;
25
26
  }
26
27
  /**
27
28
  * Int Type Converter.
28
29
  * @public
29
30
  */
30
31
  export declare class IntTypeConverter extends NumericTypeConverterBase {
32
+ private static parseString;
31
33
  convertToString(value?: Primitives.Int): string;
32
- convertFromString(value: string): number;
34
+ convertFromString(value: string): number | undefined;
33
35
  }
34
36
  //# sourceMappingURL=NumericTypeConverter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumericTypeConverter.d.ts","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9E;;;GAGG;AACH,8BAAsB,wBAAyB,SAAQ,aAAc,YAAW,4BAA4B;IAC1G,IAAoB,iBAAiB,IAAI,OAAO,CAAiB;IAE1D,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIjE,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI1E,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIpE,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI7E,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;CAGhG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9C,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK;IAwBxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGzD;AAKD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5C,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAkBtC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGzD"}
1
+ {"version":3,"file":"NumericTypeConverter.d.ts","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9E;;;GAGG;AACH,8BAAsB,wBAAyB,SAAQ,aAAc,YAAW,4BAA4B;IAC1G,IAAoB,iBAAiB,IAAI,OAAO,CAAiB;IAE1D,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIjE,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI1E,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAIpE,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO;IAI7E,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;CAGhG;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,OAAO,CAAC,MAAM,CAAC,WAAW;IAKV,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK;IAwBxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGrE;AAKD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5D,OAAO,CAAC,MAAM,CAAC,WAAW;IAKV,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAkBtC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGrE"}
@@ -35,7 +35,12 @@ export class NumericTypeConverterBase extends TypeConverter {
35
35
  * @public
36
36
  */
37
37
  export class FloatTypeConverter extends NumericTypeConverterBase {
38
+ static parseString(value) {
39
+ const parsedValue = parseFloat(value);
40
+ return Number.isNaN(parsedValue) ? undefined : parsedValue;
41
+ }
38
42
  convertToString(value) {
43
+ var _a;
39
44
  if (value === undefined)
40
45
  return "";
41
46
  let numericValue = 0;
@@ -45,7 +50,7 @@ export class FloatTypeConverter extends NumericTypeConverterBase {
45
50
  numericValue = 0;
46
51
  }
47
52
  else {
48
- numericValue = parseFloat(value);
53
+ numericValue = (_a = FloatTypeConverter.parseString(value)) !== null && _a !== void 0 ? _a : 0;
49
54
  }
50
55
  }
51
56
  else {
@@ -60,7 +65,7 @@ export class FloatTypeConverter extends NumericTypeConverterBase {
60
65
  return stringValue;
61
66
  }
62
67
  convertFromString(value) {
63
- return parseFloat(value);
68
+ return FloatTypeConverter.parseString(value);
64
69
  }
65
70
  }
66
71
  TypeConverterManager.registerConverter(StandardTypeNames.Float, FloatTypeConverter);
@@ -71,7 +76,12 @@ TypeConverterManager.registerConverter(StandardTypeNames.Number, FloatTypeConver
71
76
  * @public
72
77
  */
73
78
  export class IntTypeConverter extends NumericTypeConverterBase {
79
+ static parseString(value) {
80
+ const parsedValue = parseInt(value, 10);
81
+ return Number.isNaN(parsedValue) ? undefined : parsedValue;
82
+ }
74
83
  convertToString(value) {
84
+ var _a;
75
85
  if (value === undefined)
76
86
  return "";
77
87
  let numericValue = 0;
@@ -81,7 +91,7 @@ export class IntTypeConverter extends NumericTypeConverterBase {
81
91
  numericValue = 0;
82
92
  }
83
93
  else {
84
- numericValue = parseInt(value, 10);
94
+ numericValue = (_a = IntTypeConverter.parseString(value)) !== null && _a !== void 0 ? _a : 0;
85
95
  }
86
96
  }
87
97
  else {
@@ -90,7 +100,7 @@ export class IntTypeConverter extends NumericTypeConverterBase {
90
100
  return Math.round(numericValue).toString();
91
101
  }
92
102
  convertFromString(value) {
93
- return parseInt(value, 10);
103
+ return IntTypeConverter.parseString(value);
94
104
  }
95
105
  }
96
106
  TypeConverterManager.registerConverter(StandardTypeNames.Int, IntTypeConverter);
@@ -1 +1 @@
1
- {"version":3,"file":"NumericTypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\nimport { Primitives, StandardTypeNames } from \"@itwin/appui-abstract\";\r\nimport { LessGreaterOperatorProcessor, TypeConverter } from \"./TypeConverter\";\r\nimport { TypeConverterManager } from \"./TypeConverterManager\";\r\n\r\n/**\r\n * Base Numeric Type Converter.\r\n * @public\r\n */\r\nexport abstract class NumericTypeConverterBase extends TypeConverter implements LessGreaterOperatorProcessor {\r\n public override get isLessGreaterType(): boolean { return true; }\r\n\r\n public isLessThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a < b;\r\n }\r\n\r\n public isLessThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a <= b;\r\n }\r\n\r\n public isGreaterThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a > b;\r\n }\r\n\r\n public isGreaterThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a >= b;\r\n }\r\n\r\n public sortCompare(a: Primitives.Numeric, b: Primitives.Numeric, _ignoreCase?: boolean): number {\r\n return (+a) - (+b);\r\n }\r\n}\r\n\r\n/**\r\n * Float Type Converter.\r\n * @public\r\n */\r\nexport class FloatTypeConverter extends NumericTypeConverterBase {\r\n public override convertToString(value?: Primitives.Float) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0.0\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = parseFloat(value);\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n // this is close to calling `toFixed(2)`, but cuts of any trailing zeros\r\n let stringValue = (Math.round(100 * numericValue) / 100).toString();\r\n // because this is a _float_ converter, we want to emphasize the number is a float - make\r\n // sure there's a decimal part\r\n if (stringValue.indexOf(\".\") === -1)\r\n stringValue += \".0\";\r\n return stringValue;\r\n }\r\n\r\n public override convertFromString(value: string): number {\r\n return parseFloat(value);\r\n }\r\n}\r\nTypeConverterManager.registerConverter(StandardTypeNames.Float, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Double, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Number, FloatTypeConverter);\r\n\r\n/**\r\n * Int Type Converter.\r\n * @public\r\n */\r\nexport class IntTypeConverter extends NumericTypeConverterBase {\r\n public override convertToString(value?: Primitives.Int) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = parseInt(value, 10);\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n return Math.round(numericValue).toString();\r\n }\r\n\r\n public override convertFromString(value: string): number {\r\n return parseInt(value, 10);\r\n }\r\n}\r\n\r\nTypeConverterManager.registerConverter(StandardTypeNames.Int, IntTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Integer, IntTypeConverter);\r\n"]}
1
+ {"version":3,"file":"NumericTypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/NumericTypeConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\nimport { Primitives, StandardTypeNames } from \"@itwin/appui-abstract\";\r\nimport { LessGreaterOperatorProcessor, TypeConverter } from \"./TypeConverter\";\r\nimport { TypeConverterManager } from \"./TypeConverterManager\";\r\n\r\n/**\r\n * Base Numeric Type Converter.\r\n * @public\r\n */\r\nexport abstract class NumericTypeConverterBase extends TypeConverter implements LessGreaterOperatorProcessor {\r\n public override get isLessGreaterType(): boolean { return true; }\r\n\r\n public isLessThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a < b;\r\n }\r\n\r\n public isLessThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a <= b;\r\n }\r\n\r\n public isGreaterThan(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a > b;\r\n }\r\n\r\n public isGreaterThanOrEqualTo(a: Primitives.Numeric, b: Primitives.Numeric): boolean {\r\n return a >= b;\r\n }\r\n\r\n public sortCompare(a: Primitives.Numeric, b: Primitives.Numeric, _ignoreCase?: boolean): number {\r\n return (+a) - (+b);\r\n }\r\n}\r\n\r\n/**\r\n * Float Type Converter.\r\n * @public\r\n */\r\nexport class FloatTypeConverter extends NumericTypeConverterBase {\r\n private static parseString(value: string): number | undefined {\r\n const parsedValue = parseFloat(value);\r\n return Number.isNaN(parsedValue) ? undefined : parsedValue;\r\n }\r\n\r\n public override convertToString(value?: Primitives.Float) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0.0\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = FloatTypeConverter.parseString(value) ?? 0;\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n // this is close to calling `toFixed(2)`, but cuts of any trailing zeros\r\n let stringValue = (Math.round(100 * numericValue) / 100).toString();\r\n // because this is a _float_ converter, we want to emphasize the number is a float - make\r\n // sure there's a decimal part\r\n if (stringValue.indexOf(\".\") === -1)\r\n stringValue += \".0\";\r\n return stringValue;\r\n }\r\n\r\n public override convertFromString(value: string): number | undefined {\r\n return FloatTypeConverter.parseString(value);\r\n }\r\n}\r\nTypeConverterManager.registerConverter(StandardTypeNames.Float, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Double, FloatTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Number, FloatTypeConverter);\r\n\r\n/**\r\n * Int Type Converter.\r\n * @public\r\n */\r\nexport class IntTypeConverter extends NumericTypeConverterBase {\r\n private static parseString(value: string): number | undefined {\r\n const parsedValue = parseInt(value, 10);\r\n return Number.isNaN(parsedValue) ? undefined : parsedValue;\r\n }\r\n\r\n public override convertToString(value?: Primitives.Int) {\r\n if (value === undefined)\r\n return \"\";\r\n\r\n let numericValue = 0;\r\n if (typeof value === \"string\") {\r\n if (value === \"-\" || value === \"\" || value === \"-0\") {\r\n // handle these semi-valid values as 0\r\n numericValue = 0;\r\n } else {\r\n numericValue = IntTypeConverter.parseString(value) ?? 0;\r\n }\r\n } else {\r\n numericValue = value;\r\n }\r\n return Math.round(numericValue).toString();\r\n }\r\n\r\n public override convertFromString(value: string): number | undefined {\r\n return IntTypeConverter.parseString(value);\r\n }\r\n}\r\n\r\nTypeConverterManager.registerConverter(StandardTypeNames.Int, IntTypeConverter);\r\nTypeConverterManager.registerConverter(StandardTypeNames.Integer, IntTypeConverter);\r\n"]}
@@ -41,7 +41,7 @@ export class TypeConverter {
41
41
  const stringValue = await this.convertFromStringWithOptions(value, converterOptions);
42
42
  const propertyValue = {
43
43
  valueFormat: PropertyValueFormat.Primitive,
44
- value: stringValue ? stringValue : "",
44
+ value: stringValue,
45
45
  displayValue: "",
46
46
  };
47
47
  return propertyValue;
@@ -1 +1 @@
1
- {"version":3,"file":"TypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/TypeConverter.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,qCAAqC;AAErC,OAAO,EAAkF,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA6C5I;;;GAGG;AACH,MAAM,OAAgB,aAAa;IACjC,6CAA6C;IACtC,eAAe,CAAC,KAAwB;QAC7C,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACjE,0BAA0B,CAAC,KAAwB,EAAE,QAAiC;QAC3F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IACtC,iBAAiB,CAAC,MAAc;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IACnE,4BAA4B,CAAC,KAAa,EAAE,QAAiC;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,0EAA0E;IACnE,uBAAuB,CAAC,mBAAwC,EAAE,KAAwB;;QAC/F,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAA,mBAAmB,CAAC,SAAS,0CAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IAED,mEAAmE;IAC5D,KAAK,CAAC,gCAAgC,CAAC,KAAa,EAAE,cAA+B;QAC1F,MAAM,gBAAgB,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACvI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACrF,MAAM,aAAa,GAAmB;YACpC,WAAW,EAAE,mBAAmB,CAAC,SAAS;YAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YACrC,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAKD,mDAAmD;IAC5C,SAAS,CAAC,MAAwB,EAAE,MAAwB;QACjE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,uDAAuD;IAChD,YAAY,CAAC,MAAwB,EAAE,MAAwB;QACpE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,2DAA2D;IACpD,MAAM,CAAC,KAAuB;QACnC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,mEAAmE;IAC5D,SAAS,CAAC,KAAuB;QACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,uDAAuD;IACvD,IAAW,YAAY,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACpD,wDAAwD;IACxD,IAAW,iBAAiB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACzD,wDAAwD;IACxD,IAAW,aAAa,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,IAAW,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;CACtD","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\n// cSpell:ignore valuetypes shortdate\r\n\r\nimport { Primitives, PrimitiveValue, PropertyDescription, PropertyRecord, PropertyValue, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { ConvertedPrimitives } from \"./valuetypes/ConvertedTypes\";\r\n\r\n/** Sort compare method for types that support sorting\r\n * @public\r\n */\r\nexport interface SortComparer {\r\n /** Sort function for two primitive values */\r\n sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, ignoreCase?: boolean): number;\r\n}\r\n\r\n/** Operators for all filterable types\r\n * @public\r\n */\r\nexport interface OperatorProcessor {\r\n /** Determines if two primitive values are equal */\r\n isEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if two primitive values are not equal */\r\n isNotEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for Numeric types, DateTime, TimeSpan, or any type that supports these comparisons\r\n * @public\r\n */\r\nexport interface LessGreaterOperatorProcessor {\r\n /** Determines if a primitive values is less than another primitive value */\r\n isLessThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is less than or equal to another primitive value */\r\n isLessThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than another primitive value */\r\n isGreaterThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than or equal to another primitive value */\r\n isGreaterThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for all filterable null-able types\r\n * @public\r\n */\r\nexport interface NullableOperatorProcessor {\r\n /** Determines if a primitive value is null or undefined */\r\n isNull(value: Primitives.Value): boolean;\r\n /** Determines if a primitive value is not null or not undefined */\r\n isNotNull(value: Primitives.Value): boolean;\r\n}\r\n\r\n/**\r\n * Type Converter base class.\r\n * @public\r\n */\r\nexport abstract class TypeConverter implements SortComparer, OperatorProcessor, NullableOperatorProcessor {\r\n /** Converts a primitive value to a string */\r\n public convertToString(value?: Primitives.Value): string | Promise<string> {\r\n if (value === undefined)\r\n return \"\";\r\n return value.toString();\r\n }\r\n\r\n /** Default implementation just calls convertToString with no options */\r\n public convertToStringWithOptions(value?: Primitives.Value, _options?: { [key: string]: any }): string | Promise<string> {\r\n return this.convertToString(value);\r\n }\r\n\r\n /** Converts a string to a primitive value */\r\n public convertFromString(_value: string): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return undefined;\r\n }\r\n\r\n /** Default implementation just calls convertFromString with no options */\r\n public convertFromStringWithOptions(value: string, _options?: { [key: string]: any }): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return this.convertFromString(value);\r\n }\r\n\r\n /** Converts a value associated with a property description to a string */\r\n public convertPropertyToString(propertyDescription: PropertyDescription, value?: Primitives.Value): string | Promise<string> {\r\n return this.convertToStringWithOptions(value, propertyDescription.converter?.options);\r\n }\r\n\r\n /** Converts a string with a property record to a property value */\r\n public async convertFromStringToPropertyValue(value: string, propertyRecord?: PropertyRecord): Promise<PropertyValue> {\r\n const converterOptions = (propertyRecord && propertyRecord.property.converter) ? propertyRecord.property.converter.options : undefined;\r\n const stringValue = await this.convertFromStringWithOptions(value, converterOptions);\r\n const propertyValue: PrimitiveValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: stringValue ? stringValue : \"\",\r\n displayValue: \"\",\r\n };\r\n return propertyValue;\r\n }\r\n\r\n /** Sort function for two primitive values */\r\n public abstract sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, _ignoreCase?: boolean): number;\r\n\r\n /** Determines if two primitive values are equal */\r\n public isEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA === valueB;\r\n }\r\n\r\n /** Determines if two primitive values are not equal */\r\n public isNotEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA !== valueB;\r\n }\r\n\r\n /** Determines if a primitive value is null or undefined */\r\n public isNull(value: Primitives.Value): boolean {\r\n return value === null || value === undefined;\r\n }\r\n\r\n /** Determines if a primitive value is not null or not undefined */\r\n public isNotNull(value: Primitives.Value): boolean {\r\n return value !== null && value !== undefined;\r\n }\r\n\r\n /** Determines if the converter is for a string type */\r\n public get isStringType(): boolean { return false; }\r\n /** Determines if the converter is for a numeric type */\r\n public get isLessGreaterType(): boolean { return false; }\r\n /** Determines if the converter is for a boolean type */\r\n public get isBooleanType(): boolean { return false; }\r\n /** Determines if the converter is for a nullable type */\r\n public get isNullableType(): boolean { return true; }\r\n}\r\n"]}
1
+ {"version":3,"file":"TypeConverter.js","sourceRoot":"","sources":["../../../../src/components-react/converters/TypeConverter.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,qCAAqC;AAErC,OAAO,EAAkF,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA6C5I;;;GAGG;AACH,MAAM,OAAgB,aAAa;IACjC,6CAA6C;IACtC,eAAe,CAAC,KAAwB;QAC7C,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACjE,0BAA0B,CAAC,KAAwB,EAAE,QAAiC;QAC3F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IACtC,iBAAiB,CAAC,MAAc;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IACnE,4BAA4B,CAAC,KAAa,EAAE,QAAiC;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,0EAA0E;IACnE,uBAAuB,CAAC,mBAAwC,EAAE,KAAwB;;QAC/F,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAA,mBAAmB,CAAC,SAAS,0CAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IAED,mEAAmE;IAC5D,KAAK,CAAC,gCAAgC,CAAC,KAAa,EAAE,cAA+B;QAC1F,MAAM,gBAAgB,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACvI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACrF,MAAM,aAAa,GAAmB;YACpC,WAAW,EAAE,mBAAmB,CAAC,SAAS;YAC1C,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAKD,mDAAmD;IAC5C,SAAS,CAAC,MAAwB,EAAE,MAAwB;QACjE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,uDAAuD;IAChD,YAAY,CAAC,MAAwB,EAAE,MAAwB;QACpE,OAAO,MAAM,KAAK,MAAM,CAAC;IAC3B,CAAC;IAED,2DAA2D;IACpD,MAAM,CAAC,KAAuB;QACnC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,mEAAmE;IAC5D,SAAS,CAAC,KAAuB;QACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,uDAAuD;IACvD,IAAW,YAAY,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACpD,wDAAwD;IACxD,IAAW,iBAAiB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACzD,wDAAwD;IACxD,IAAW,aAAa,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,IAAW,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;CACtD","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module TypeConverters\r\n */\r\n\r\n// cSpell:ignore valuetypes shortdate\r\n\r\nimport { Primitives, PrimitiveValue, PropertyDescription, PropertyRecord, PropertyValue, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { ConvertedPrimitives } from \"./valuetypes/ConvertedTypes\";\r\n\r\n/** Sort compare method for types that support sorting\r\n * @public\r\n */\r\nexport interface SortComparer {\r\n /** Sort function for two primitive values */\r\n sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, ignoreCase?: boolean): number;\r\n}\r\n\r\n/** Operators for all filterable types\r\n * @public\r\n */\r\nexport interface OperatorProcessor {\r\n /** Determines if two primitive values are equal */\r\n isEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if two primitive values are not equal */\r\n isNotEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for Numeric types, DateTime, TimeSpan, or any type that supports these comparisons\r\n * @public\r\n */\r\nexport interface LessGreaterOperatorProcessor {\r\n /** Determines if a primitive values is less than another primitive value */\r\n isLessThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is less than or equal to another primitive value */\r\n isLessThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than another primitive value */\r\n isGreaterThan(a: Primitives.Value, b: Primitives.Value): boolean;\r\n /** Determines if a primitive values is greater than or equal to another primitive value */\r\n isGreaterThanOrEqualTo(a: Primitives.Value, b: Primitives.Value): boolean;\r\n}\r\n\r\n/** Operators for all filterable null-able types\r\n * @public\r\n */\r\nexport interface NullableOperatorProcessor {\r\n /** Determines if a primitive value is null or undefined */\r\n isNull(value: Primitives.Value): boolean;\r\n /** Determines if a primitive value is not null or not undefined */\r\n isNotNull(value: Primitives.Value): boolean;\r\n}\r\n\r\n/**\r\n * Type Converter base class.\r\n * @public\r\n */\r\nexport abstract class TypeConverter implements SortComparer, OperatorProcessor, NullableOperatorProcessor {\r\n /** Converts a primitive value to a string */\r\n public convertToString(value?: Primitives.Value): string | Promise<string> {\r\n if (value === undefined)\r\n return \"\";\r\n return value.toString();\r\n }\r\n\r\n /** Default implementation just calls convertToString with no options */\r\n public convertToStringWithOptions(value?: Primitives.Value, _options?: { [key: string]: any }): string | Promise<string> {\r\n return this.convertToString(value);\r\n }\r\n\r\n /** Converts a string to a primitive value */\r\n public convertFromString(_value: string): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return undefined;\r\n }\r\n\r\n /** Default implementation just calls convertFromString with no options */\r\n public convertFromStringWithOptions(value: string, _options?: { [key: string]: any }): ConvertedPrimitives.Value | undefined | Promise<ConvertedPrimitives.Value | undefined> {\r\n return this.convertFromString(value);\r\n }\r\n\r\n /** Converts a value associated with a property description to a string */\r\n public convertPropertyToString(propertyDescription: PropertyDescription, value?: Primitives.Value): string | Promise<string> {\r\n return this.convertToStringWithOptions(value, propertyDescription.converter?.options);\r\n }\r\n\r\n /** Converts a string with a property record to a property value */\r\n public async convertFromStringToPropertyValue(value: string, propertyRecord?: PropertyRecord): Promise<PropertyValue> {\r\n const converterOptions = (propertyRecord && propertyRecord.property.converter) ? propertyRecord.property.converter.options : undefined;\r\n const stringValue = await this.convertFromStringWithOptions(value, converterOptions);\r\n const propertyValue: PrimitiveValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: stringValue,\r\n displayValue: \"\",\r\n };\r\n return propertyValue;\r\n }\r\n\r\n /** Sort function for two primitive values */\r\n public abstract sortCompare(valueA: Primitives.Value, valueB: Primitives.Value, _ignoreCase?: boolean): number;\r\n\r\n /** Determines if two primitive values are equal */\r\n public isEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA === valueB;\r\n }\r\n\r\n /** Determines if two primitive values are not equal */\r\n public isNotEqualTo(valueA: Primitives.Value, valueB: Primitives.Value): boolean {\r\n return valueA !== valueB;\r\n }\r\n\r\n /** Determines if a primitive value is null or undefined */\r\n public isNull(value: Primitives.Value): boolean {\r\n return value === null || value === undefined;\r\n }\r\n\r\n /** Determines if a primitive value is not null or not undefined */\r\n public isNotNull(value: Primitives.Value): boolean {\r\n return value !== null && value !== undefined;\r\n }\r\n\r\n /** Determines if the converter is for a string type */\r\n public get isStringType(): boolean { return false; }\r\n /** Determines if the converter is for a numeric type */\r\n public get isLessGreaterType(): boolean { return false; }\r\n /** Determines if the converter is for a boolean type */\r\n public get isBooleanType(): boolean { return false; }\r\n /** Determines if the converter is for a nullable type */\r\n public get isNullableType(): boolean { return true; }\r\n}\r\n"]}
@@ -34,7 +34,7 @@ export class CustomNumberEditor extends React.PureComponent {
34
34
  var _a;
35
35
  // istanbul ignore else
36
36
  if (e.key === SpecialKey.Escape) {
37
- const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : this._getInitialDisplayValue();
37
+ const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : ( /* istanbul ignore next */this._getInitialDisplayValue());
38
38
  if (initialDisplayValue !== this.state.inputValue) {
39
39
  e.preventDefault();
40
40
  e.stopPropagation();
@@ -93,7 +93,7 @@ export class CustomNumberEditor extends React.PureComponent {
93
93
  UiAdmin.messagePresenter.displayMessage(MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate("errors.unable-to-parse-quantity"));
94
94
  }
95
95
  const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ this._formatParams.formatFunction(record.value.value);
96
- propertyValue = this._lastValidValue ? { ...this._lastValidValue } : {
96
+ propertyValue = this._lastValidValue ? { ...this._lastValidValue } : /* istanbul ignore next */ {
97
97
  valueFormat: PropertyValueFormat.Primitive,
98
98
  value: record.value.value,
99
99
  displayValue,
@@ -213,7 +213,7 @@ export class CustomNumberEditor extends React.PureComponent {
213
213
  }
214
214
  _resetToLastValidDisplayValue() {
215
215
  var _a;
216
- const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : this._getInitialDisplayValue();
216
+ const initialDisplayValue = (_a = (this._lastValidValue && this._lastValidValue.displayValue)) !== null && _a !== void 0 ? _a : ( /* istanbul ignore next */this._getInitialDisplayValue());
217
217
  this.setState({ inputValue: initialDisplayValue });
218
218
  }
219
219
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"CustomNumberEditor.js","sourceRoot":"","sources":["../../../../src/components-react/editors/CustomNumberEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module PropertyEditors\r\n */\r\n\r\n// cSpell:ignore customnumber testid\r\n\r\nimport \"./CustomNumberEditor.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CustomFormattedNumberParams, IconEditorParams, InputEditorSizeParams, MessageSeverity, PrimitiveValue, PropertyEditorParams, PropertyEditorParamTypes,\r\n PropertyRecord, PropertyValue, PropertyValueFormat, SpecialKey, StandardEditorNames, StandardTypeNames, UiAdmin,\r\n} from \"@itwin/appui-abstract\";\r\nimport { Icon, IconInput } from \"@itwin/core-react\";\r\nimport { Input, InputProps } from \"@itwin/itwinui-react\";\r\n\r\nimport { UiComponents } from \"../UiComponents\";\r\nimport { PropertyEditorProps, TypeEditor } from \"./EditorContainer\";\r\nimport { PropertyEditorBase, PropertyEditorManager } from \"./PropertyEditorManager\";\r\n\r\n/** @internal */\r\ninterface CustomNumberEditorState {\r\n inputValue: string;\r\n size?: number;\r\n maxLength?: number;\r\n iconSpec?: string;\r\n}\r\n\r\n/** CustomNumberEditor is a React component that is a property editor for numbers that specify custom formatting and parsing functions.\r\n * @alpha\r\n */\r\nexport class CustomNumberEditor extends React.PureComponent<PropertyEditorProps, CustomNumberEditorState> implements TypeEditor {\r\n private _isMounted = false;\r\n private _formatParams: CustomFormattedNumberParams | undefined;\r\n private _inputElement = React.createRef<HTMLInputElement>();\r\n private _lastValidValue: PropertyValue | undefined;\r\n\r\n /** @internal */\r\n public override readonly state: Readonly<CustomNumberEditorState> = {\r\n inputValue: \"\",\r\n };\r\n\r\n public async getPropertyValue(): Promise<PropertyValue | undefined> {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n let propertyValue: PropertyValue | undefined;\r\n\r\n if (record.isReadonly) {\r\n return {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: (record.value as PrimitiveValue).displayValue,\r\n };\r\n }\r\n\r\n // istanbul ignore else\r\n if (record && record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const parseResults = (this._formatParams as CustomFormattedNumberParams).parseFunction(this.state.inputValue);\r\n if (!parseResults.parseError && undefined !== parseResults.value) {\r\n const newDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(parseResults.value as number);\r\n propertyValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: parseResults.value,\r\n displayValue: newDisplayValue,\r\n };\r\n this._lastValidValue = { ...propertyValue };\r\n // make sure the text in the input item matches the latest formatted text... this could get out if the input string say 1.5 === the display string of 1'-6\"\r\n // istanbul ignore else\r\n if (newDisplayValue !== this.state.inputValue) {\r\n this.setState({ inputValue: newDisplayValue });\r\n }\r\n } else {\r\n // istanbul ignore else\r\n if (this.htmlElement) {\r\n UiAdmin.messagePresenter.displayInputFieldMessage(this.htmlElement, MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n this.htmlElement.focus();\r\n } else {\r\n UiAdmin.messagePresenter.displayMessage(MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n }\r\n\r\n const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ (this._formatParams as CustomFormattedNumberParams).formatFunction(record.value.value as number);\r\n propertyValue = this._lastValidValue ? { ...this._lastValidValue } : {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: record.value.value,\r\n displayValue,\r\n };\r\n }\r\n }\r\n\r\n return propertyValue;\r\n }\r\n\r\n public get htmlElement(): HTMLElement | null {\r\n return this._inputElement.current;\r\n }\r\n\r\n public get hasFocus(): boolean {\r\n return document.activeElement === this._inputElement.current;\r\n }\r\n\r\n private shouldSetFocus(): boolean {\r\n if (!this.props.setFocus)\r\n return false;\r\n\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n\r\n return (!disabled && !readonly);\r\n }\r\n\r\n private _applyUpdatedValue(userInput: string) {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n\r\n if (readonly || disabled)\r\n return;\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({\r\n inputValue: userInput,\r\n });\r\n }\r\n\r\n private _updateInputValue = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n this._applyUpdatedValue(e.target.value);\r\n };\r\n\r\n /** @internal */\r\n public override componentDidMount() {\r\n this._isMounted = true;\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n /** @internal */\r\n public override componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n /** @internal */\r\n public override componentDidUpdate(prevProps: PropertyEditorProps) {\r\n if (this.props.propertyRecord !== prevProps.propertyRecord) {\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n }\r\n\r\n private _getInitialDisplayValue(): string {\r\n const record = this.props.propertyRecord;\r\n let initialDisplayValue = \"\";\r\n let numberValue = 0;\r\n // istanbul ignore else\r\n if (record) {\r\n // istanbul ignore else\r\n if (record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const primitiveValue = record.value;\r\n numberValue = (undefined !== primitiveValue.value) ? primitiveValue.value as number : /* istanbul ignore next */ 0;\r\n // istanbul ignore else\r\n if (primitiveValue.displayValue)\r\n initialDisplayValue = primitiveValue.displayValue;\r\n else\r\n initialDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(numberValue);\r\n }\r\n }\r\n\r\n return initialDisplayValue;\r\n }\r\n\r\n private async setStateFromProps() {\r\n const record = this.props.propertyRecord;\r\n // istanbul ignore next\r\n if (!record || !record.property) {\r\n Logger.logError(UiComponents.loggerCategory(this), \"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n // eslint-disable-next-line no-console\r\n // console.log(\"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n return;\r\n }\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n this._formatParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.CustomFormattedNumber) as CustomFormattedNumberParams;\r\n }\r\n\r\n if (!this._formatParams) {\r\n Logger.logError(UiComponents.loggerCategory(this), `CustomFormattedNumberParams must be defined for property ${record.property.name}`);\r\n // eslint-disable-next-line no-console\r\n // console.log(`CustomFormattedNumberParams must be defined for property ${record!.property!.name}`);\r\n return;\r\n }\r\n\r\n const initialDisplayValue = this._getInitialDisplayValue();\r\n this._lastValidValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: initialDisplayValue,\r\n };\r\n let size: number | undefined;\r\n let maxLength: number | undefined;\r\n let iconSpec: string | undefined;\r\n\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n const editorSizeParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.InputEditorSize) as InputEditorSizeParams;\r\n // istanbul ignore else\r\n if (editorSizeParams) {\r\n // istanbul ignore else\r\n if (editorSizeParams.size)\r\n size = editorSizeParams.size;\r\n // istanbul ignore else\r\n if (editorSizeParams.maxLength)\r\n maxLength = editorSizeParams.maxLength;\r\n }\r\n\r\n const iconParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.Icon) as IconEditorParams;\r\n if (iconParams) {\r\n iconSpec = iconParams.definition.iconSpec;\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({ inputValue: initialDisplayValue, size, maxLength, iconSpec });\r\n }\r\n\r\n private _resetToLastValidDisplayValue() {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? this._getInitialDisplayValue();\r\n this.setState({ inputValue: initialDisplayValue });\r\n }\r\n\r\n private _onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Escape) {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? this._getInitialDisplayValue();\r\n if (initialDisplayValue !== this.state.inputValue) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this._resetToLastValidDisplayValue();\r\n } else {\r\n // istanbul ignore else\r\n if (this.props.onCancel)\r\n this.props.onCancel();\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (e.key !== SpecialKey.Enter) {\r\n UiAdmin.messagePresenter.closeInputFieldMessage();\r\n }\r\n };\r\n\r\n // istanbul ignore next\r\n private _onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n e.target.select();\r\n };\r\n\r\n /** @internal */\r\n public override render(): React.ReactNode {\r\n const minSize = this.state.size ? this.state.size : 8;\r\n const minWidthStyle: React.CSSProperties = {\r\n minWidth: `${minSize * 0.75}em`,\r\n };\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n if (!record || !this._formatParams)\r\n return null;\r\n\r\n const readOnly = !record.isReadonly ? false : true;\r\n const disabled = !record.isDisabled ? false : true;\r\n\r\n const className = classnames(\"components-cell-editor\", \"components-customnumber-editor\", this.props.className);\r\n\r\n const inputProps: Omit<InputProps, \"size\"> = { // eslint-disable-line deprecation/deprecation\r\n className,\r\n style: this.props.style ? this.props.style : minWidthStyle,\r\n readOnly,\r\n disabled,\r\n maxLength: this.state.maxLength,\r\n value: this.state.inputValue,\r\n onChange: this._updateInputValue,\r\n onBlur: this.props.onBlur,\r\n onFocus: this._onFocus,\r\n setFocus: this.shouldSetFocus(),\r\n onKeyDown: this._onKeyPress,\r\n };\r\n\r\n let reactNode: React.ReactNode;\r\n if (this.state.iconSpec) {\r\n const icon = <Icon iconSpec={this.state.iconSpec} />;\r\n reactNode = (\r\n <IconInput\r\n {...inputProps}\r\n ref={this._inputElement}\r\n icon={icon}\r\n data-testid=\"components-customnumber-editor\"\r\n />\r\n );\r\n } else {\r\n // NEEDSWORK: still using core-react Input component because of `nativeKeyHandler` prop\r\n reactNode = (\r\n <Input\r\n {...inputProps}\r\n ref={this._inputElement}\r\n data-testid=\"components-customnumber-editor\"\r\n size=\"small\"\r\n />\r\n );\r\n }\r\n\r\n return reactNode;\r\n }\r\n}\r\n\r\n/** Custom Property Editor registered for the \"number\" type name and the \"number-custom\" editor name.\r\n * It uses the [[CustomNumberEditor]] React component.\r\n * @alpha\r\n */\r\nexport class CustomNumberPropertyEditor extends PropertyEditorBase {\r\n public get reactNode(): React.ReactNode {\r\n return <CustomNumberEditor />;\r\n }\r\n public override get containerHandlesEscape(): boolean {\r\n return false;\r\n }\r\n}\r\nPropertyEditorManager.registerEditor(StandardTypeNames.Number, CustomNumberPropertyEditor, StandardEditorNames.NumberCustom);\r\n"]}
1
+ {"version":3,"file":"CustomNumberEditor.js","sourceRoot":"","sources":["../../../../src/components-react/editors/CustomNumberEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module PropertyEditors\r\n */\r\n\r\n// cSpell:ignore customnumber testid\r\n\r\nimport \"./CustomNumberEditor.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CustomFormattedNumberParams, IconEditorParams, InputEditorSizeParams, MessageSeverity, PrimitiveValue, PropertyEditorParams, PropertyEditorParamTypes,\r\n PropertyRecord, PropertyValue, PropertyValueFormat, SpecialKey, StandardEditorNames, StandardTypeNames, UiAdmin,\r\n} from \"@itwin/appui-abstract\";\r\nimport { Icon, IconInput } from \"@itwin/core-react\";\r\nimport { Input, InputProps } from \"@itwin/itwinui-react\";\r\n\r\nimport { UiComponents } from \"../UiComponents\";\r\nimport { PropertyEditorProps, TypeEditor } from \"./EditorContainer\";\r\nimport { PropertyEditorBase, PropertyEditorManager } from \"./PropertyEditorManager\";\r\n\r\n/** @internal */\r\ninterface CustomNumberEditorState {\r\n inputValue: string;\r\n size?: number;\r\n maxLength?: number;\r\n iconSpec?: string;\r\n}\r\n\r\n/** CustomNumberEditor is a React component that is a property editor for numbers that specify custom formatting and parsing functions.\r\n * @alpha\r\n */\r\nexport class CustomNumberEditor extends React.PureComponent<PropertyEditorProps, CustomNumberEditorState> implements TypeEditor {\r\n private _isMounted = false;\r\n private _formatParams: CustomFormattedNumberParams | undefined;\r\n private _inputElement = React.createRef<HTMLInputElement>();\r\n private _lastValidValue: PropertyValue | undefined;\r\n\r\n /** @internal */\r\n public override readonly state: Readonly<CustomNumberEditorState> = {\r\n inputValue: \"\",\r\n };\r\n\r\n public async getPropertyValue(): Promise<PropertyValue | undefined> {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n let propertyValue: PropertyValue | undefined;\r\n\r\n if (record.isReadonly) {\r\n return {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: (record.value as PrimitiveValue).displayValue,\r\n };\r\n }\r\n\r\n // istanbul ignore else\r\n if (record && record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const parseResults = (this._formatParams as CustomFormattedNumberParams).parseFunction(this.state.inputValue);\r\n if (!parseResults.parseError && undefined !== parseResults.value) {\r\n const newDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(parseResults.value as number);\r\n propertyValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: parseResults.value,\r\n displayValue: newDisplayValue,\r\n };\r\n this._lastValidValue = { ...propertyValue };\r\n // make sure the text in the input item matches the latest formatted text... this could get out if the input string say 1.5 === the display string of 1'-6\"\r\n // istanbul ignore else\r\n if (newDisplayValue !== this.state.inputValue) {\r\n this.setState({ inputValue: newDisplayValue });\r\n }\r\n } else {\r\n // istanbul ignore else\r\n if (this.htmlElement) {\r\n UiAdmin.messagePresenter.displayInputFieldMessage(this.htmlElement, MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n this.htmlElement.focus();\r\n } else {\r\n UiAdmin.messagePresenter.displayMessage(MessageSeverity.Error, parseResults.parseError ? parseResults.parseError : /* istanbul ignore next */ UiComponents.translate(\"errors.unable-to-parse-quantity\"));\r\n }\r\n\r\n const displayValue = (record.value.displayValue && record.value.displayValue.length > 0) ? record.value.displayValue : /* istanbul ignore next */ (this._formatParams as CustomFormattedNumberParams).formatFunction(record.value.value as number);\r\n propertyValue = this._lastValidValue ? { ...this._lastValidValue } : /* istanbul ignore next */ {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: record.value.value,\r\n displayValue,\r\n };\r\n }\r\n }\r\n\r\n return propertyValue;\r\n }\r\n\r\n public get htmlElement(): HTMLElement | null {\r\n return this._inputElement.current;\r\n }\r\n\r\n public get hasFocus(): boolean {\r\n return document.activeElement === this._inputElement.current;\r\n }\r\n\r\n private shouldSetFocus(): boolean {\r\n if (!this.props.setFocus)\r\n return false;\r\n\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n\r\n return (!disabled && !readonly);\r\n }\r\n\r\n private _applyUpdatedValue(userInput: string) {\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n const readonly = (record && !record.isReadonly) ? false : true;\r\n const disabled = (record && !record.isDisabled) ? false : true;\r\n\r\n if (readonly || disabled)\r\n return;\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({\r\n inputValue: userInput,\r\n });\r\n }\r\n\r\n private _updateInputValue = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n this._applyUpdatedValue(e.target.value);\r\n };\r\n\r\n /** @internal */\r\n public override componentDidMount() {\r\n this._isMounted = true;\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n /** @internal */\r\n public override componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n /** @internal */\r\n public override componentDidUpdate(prevProps: PropertyEditorProps) {\r\n if (this.props.propertyRecord !== prevProps.propertyRecord) {\r\n this.setStateFromProps(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n }\r\n\r\n private _getInitialDisplayValue(): string {\r\n const record = this.props.propertyRecord;\r\n let initialDisplayValue = \"\";\r\n let numberValue = 0;\r\n // istanbul ignore else\r\n if (record) {\r\n // istanbul ignore else\r\n if (record.value.valueFormat === PropertyValueFormat.Primitive) {\r\n const primitiveValue = record.value;\r\n numberValue = (undefined !== primitiveValue.value) ? primitiveValue.value as number : /* istanbul ignore next */ 0;\r\n // istanbul ignore else\r\n if (primitiveValue.displayValue)\r\n initialDisplayValue = primitiveValue.displayValue;\r\n else\r\n initialDisplayValue = (this._formatParams as CustomFormattedNumberParams).formatFunction(numberValue);\r\n }\r\n }\r\n\r\n return initialDisplayValue;\r\n }\r\n\r\n private async setStateFromProps() {\r\n const record = this.props.propertyRecord;\r\n // istanbul ignore next\r\n if (!record || !record.property) {\r\n Logger.logError(UiComponents.loggerCategory(this), \"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n // eslint-disable-next-line no-console\r\n // console.log(\"PropertyRecord must be defined to use CustomNumberPropertyEditor\");\r\n return;\r\n }\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n this._formatParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.CustomFormattedNumber) as CustomFormattedNumberParams;\r\n }\r\n\r\n if (!this._formatParams) {\r\n Logger.logError(UiComponents.loggerCategory(this), `CustomFormattedNumberParams must be defined for property ${record.property.name}`);\r\n // eslint-disable-next-line no-console\r\n // console.log(`CustomFormattedNumberParams must be defined for property ${record!.property!.name}`);\r\n return;\r\n }\r\n\r\n const initialDisplayValue = this._getInitialDisplayValue();\r\n this._lastValidValue = {\r\n valueFormat: PropertyValueFormat.Primitive,\r\n value: (record.value as PrimitiveValue).value,\r\n displayValue: initialDisplayValue,\r\n };\r\n let size: number | undefined;\r\n let maxLength: number | undefined;\r\n let iconSpec: string | undefined;\r\n\r\n // istanbul ignore else\r\n if (record.property && record.property.editor && record.property.editor.params) {\r\n const editorSizeParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.InputEditorSize) as InputEditorSizeParams;\r\n // istanbul ignore else\r\n if (editorSizeParams) {\r\n // istanbul ignore else\r\n if (editorSizeParams.size)\r\n size = editorSizeParams.size;\r\n // istanbul ignore else\r\n if (editorSizeParams.maxLength)\r\n maxLength = editorSizeParams.maxLength;\r\n }\r\n\r\n const iconParams = record.property.editor.params.find((param: PropertyEditorParams) => param.type === PropertyEditorParamTypes.Icon) as IconEditorParams;\r\n if (iconParams) {\r\n iconSpec = iconParams.definition.iconSpec;\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (this._isMounted)\r\n this.setState({ inputValue: initialDisplayValue, size, maxLength, iconSpec });\r\n }\r\n\r\n private _resetToLastValidDisplayValue() {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? (/* istanbul ignore next */ this._getInitialDisplayValue());\r\n this.setState({ inputValue: initialDisplayValue });\r\n }\r\n\r\n private _onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Escape) {\r\n const initialDisplayValue = (this._lastValidValue && (this._lastValidValue as PrimitiveValue).displayValue) ?? (/* istanbul ignore next */ this._getInitialDisplayValue());\r\n if (initialDisplayValue !== this.state.inputValue) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this._resetToLastValidDisplayValue();\r\n } else {\r\n // istanbul ignore else\r\n if (this.props.onCancel)\r\n this.props.onCancel();\r\n }\r\n }\r\n\r\n // istanbul ignore else\r\n if (e.key !== SpecialKey.Enter) {\r\n UiAdmin.messagePresenter.closeInputFieldMessage();\r\n }\r\n };\r\n\r\n // istanbul ignore next\r\n private _onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n e.target.select();\r\n };\r\n\r\n /** @internal */\r\n public override render(): React.ReactNode {\r\n const minSize = this.state.size ? this.state.size : 8;\r\n const minWidthStyle: React.CSSProperties = {\r\n minWidth: `${minSize * 0.75}em`,\r\n };\r\n const record = this.props.propertyRecord as PropertyRecord;\r\n if (!record || !this._formatParams)\r\n return null;\r\n\r\n const readOnly = !record.isReadonly ? false : true;\r\n const disabled = !record.isDisabled ? false : true;\r\n\r\n const className = classnames(\"components-cell-editor\", \"components-customnumber-editor\", this.props.className);\r\n\r\n const inputProps: Omit<InputProps, \"size\"> = { // eslint-disable-line deprecation/deprecation\r\n className,\r\n style: this.props.style ? this.props.style : minWidthStyle,\r\n readOnly,\r\n disabled,\r\n maxLength: this.state.maxLength,\r\n value: this.state.inputValue,\r\n onChange: this._updateInputValue,\r\n onBlur: this.props.onBlur,\r\n onFocus: this._onFocus,\r\n setFocus: this.shouldSetFocus(),\r\n onKeyDown: this._onKeyPress,\r\n };\r\n\r\n let reactNode: React.ReactNode;\r\n if (this.state.iconSpec) {\r\n const icon = <Icon iconSpec={this.state.iconSpec} />;\r\n reactNode = (\r\n <IconInput\r\n {...inputProps}\r\n ref={this._inputElement}\r\n icon={icon}\r\n data-testid=\"components-customnumber-editor\"\r\n />\r\n );\r\n } else {\r\n // NEEDSWORK: still using core-react Input component because of `nativeKeyHandler` prop\r\n reactNode = (\r\n <Input\r\n {...inputProps}\r\n ref={this._inputElement}\r\n data-testid=\"components-customnumber-editor\"\r\n size=\"small\"\r\n />\r\n );\r\n }\r\n\r\n return reactNode;\r\n }\r\n}\r\n\r\n/** Custom Property Editor registered for the \"number\" type name and the \"number-custom\" editor name.\r\n * It uses the [[CustomNumberEditor]] React component.\r\n * @alpha\r\n */\r\nexport class CustomNumberPropertyEditor extends PropertyEditorBase {\r\n public get reactNode(): React.ReactNode {\r\n return <CustomNumberEditor />;\r\n }\r\n public override get containerHandlesEscape(): boolean {\r\n return false;\r\n }\r\n}\r\nPropertyEditorManager.registerEditor(StandardTypeNames.Number, CustomNumberPropertyEditor, StandardEditorNames.NumberCustom);\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeHooks.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,iCAGlI;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,sCAGzJ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,mBAGhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,SAAS,gBAAgB,EAAE,eAAe,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,sBAAsB,oBAO7I"}
1
+ {"version":3,"file":"TreeHooks.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,iCAGlI;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,SAAS,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,sCAGzJ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,mBAGhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,SAAS,gBAAgB,EAAE,eAAe,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,sBAAsB,oBAO7I"}
@@ -5,8 +5,9 @@
5
5
  /** @packageDocumentation
6
6
  * @module Tree
7
7
  */
8
- import { useCallback, useEffect, useMemo, useState } from "react";
8
+ import { useCallback, useEffect, useMemo } from "react";
9
9
  import { useDisposable } from "@itwin/core-react";
10
+ import { useRerender } from "../../common/UseRerender";
10
11
  import { TreeEventHandler } from "./TreeEventHandler";
11
12
  import { TreeModelSource } from "./TreeModelSource";
12
13
  import { PagedTreeNodeLoader, TreeNodeLoader } from "./TreeNodeLoader";
@@ -17,15 +18,11 @@ import { PagedTreeNodeLoader, TreeNodeLoader } from "./TreeNodeLoader";
17
18
  * @public
18
19
  */
19
20
  export function useTreeModel(modelSource) {
20
- const [model, setModel] = useState(modelSource.getModel());
21
+ const { rerender } = useRerender();
21
22
  useEffect(() => {
22
- const onModelChanged = () => {
23
- setModel(modelSource.getModel());
24
- };
25
- onModelChanged();
26
- return modelSource.onModelChanged.addListener(onModelChanged);
27
- }, [modelSource]);
28
- return model;
23
+ return modelSource.onModelChanged.addListener(rerender);
24
+ }, [modelSource, rerender]);
25
+ return modelSource.getModel();
29
26
  }
30
27
  /**
31
28
  * Custom hook which creates a nodes' loader using the supplied data provider and model source. The
@@ -1 +1 @@
1
- {"version":3,"file":"TreeHooks.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,WAA4B;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,cAAc,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAyC,YAA2B,EAAE,WAA4B;IACjI,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACnH,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAyC,YAA2B,EAAE,QAAgB,EAAE,WAA4B;IACxJ,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5I,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAA8B;IAC/D,0HAA0H;IAC1H,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kDAAkD;AACjH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAA0C,eAAgE;IAC5I,MAAM,OAAO,GAAG,WAAW,CAAC,GAAqB,EAAE;QACjD,IAAI,OAAO,eAAe,KAAK,UAAU;YACvC,OAAO,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACtB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useDisposable } from \"@itwin/core-react\";\r\nimport { TreeDataProvider } from \"../TreeDataProvider\";\r\nimport { TreeEventHandler, TreeEventHandlerParams } from \"./TreeEventHandler\";\r\nimport { TreeModel } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\nimport { PagedTreeNodeLoader, TreeNodeLoader } from \"./TreeNodeLoader\";\r\n\r\n/**\r\n * React hook that returns an immutable `TreeModel` whenever it changes in the given\r\n * `TreeModelSource`.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModel(modelSource: TreeModelSource): TreeModel {\r\n const [model, setModel] = useState(modelSource.getModel());\r\n\r\n useEffect(() => {\r\n const onModelChanged = () => {\r\n setModel(modelSource.getModel());\r\n };\r\n onModelChanged();\r\n return modelSource.onModelChanged.addListener(onModelChanged);\r\n }, [modelSource]);\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Custom hook which creates a nodes' loader using the supplied data provider and model source. The\r\n * loader pulls nodes from the data provider and puts them into the model source.\r\n *\r\n * @public\r\n */\r\nexport function useTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new TreeNodeLoader(dataProvider, modelSource), [dataProvider, modelSource]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a paging nodes' loader using the supplied data provider and model source. The loader pulls\r\n * nodes from the data provider and puts them into the model source.\r\n * @public\r\n */\r\nexport function usePagedTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, pageSize: number, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new PagedTreeNodeLoader(dataProvider, modelSource, pageSize), [dataProvider, modelSource, pageSize]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a `TreeModelSource`.\r\n *\r\n * @note The model source has no direct dependency on the data provider, but we want a fresh model\r\n * source whenever the data provider changes - that's the reason the hook takes a data provider.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModelSource(dataProvider: TreeDataProvider) {\r\n // need to create new model source every time data provider changes although it does not need data provider to be created.\r\n return useMemo(() => new TreeModelSource(), [dataProvider]); // eslint-disable-line react-hooks/exhaustive-deps\r\n}\r\n\r\n/**\r\n * Custom hook which creates and takes care of disposing a TreeEventsHandler. The input is either a factory method\r\n * for a custom `TreeEventHandler` implementation or parameters for the default implementation.\r\n *\r\n * @note Caller must ensure `factoryOrParams` changes only when a new handler needs to be created. `useCallback` or `useMemo` can\r\n * be used for that purpose based on whether the input is a factory function or params object.\r\n *\r\n * @public\r\n */\r\nexport function useTreeEventsHandler<TEventsHandler extends TreeEventHandler>(factoryOrParams: (() => TEventsHandler) | TreeEventHandlerParams) {\r\n const factory = useCallback((): TreeEventHandler => {\r\n if (typeof factoryOrParams === \"function\")\r\n return factoryOrParams();\r\n return new TreeEventHandler(factoryOrParams);\r\n }, [factoryOrParams]);\r\n return useDisposable(factory);\r\n}\r\n"]}
1
+ {"version":3,"file":"TreeHooks.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeHooks.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,WAA4B;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5B,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAyC,YAA2B,EAAE,WAA4B;IACjI,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACnH,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAyC,YAA2B,EAAE,QAAgB,EAAE,WAA4B;IACxJ,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5I,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAA8B;IAC/D,0HAA0H;IAC1H,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kDAAkD;AACjH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAA0C,eAAgE;IAC5I,MAAM,OAAO,GAAG,WAAW,CAAC,GAAqB,EAAE;QACjD,IAAI,OAAO,eAAe,KAAK,UAAU;YACvC,OAAO,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACtB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { useDisposable } from \"@itwin/core-react\";\r\nimport { useRerender } from \"../../common/UseRerender\";\r\nimport { TreeDataProvider } from \"../TreeDataProvider\";\r\nimport { TreeEventHandler, TreeEventHandlerParams } from \"./TreeEventHandler\";\r\nimport { TreeModel } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\nimport { PagedTreeNodeLoader, TreeNodeLoader } from \"./TreeNodeLoader\";\r\n\r\n/**\r\n * React hook that returns an immutable `TreeModel` whenever it changes in the given\r\n * `TreeModelSource`.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModel(modelSource: TreeModelSource): TreeModel {\r\n const { rerender } = useRerender();\r\n useEffect(() => {\r\n return modelSource.onModelChanged.addListener(rerender);\r\n }, [modelSource, rerender]);\r\n return modelSource.getModel();\r\n}\r\n\r\n/**\r\n * Custom hook which creates a nodes' loader using the supplied data provider and model source. The\r\n * loader pulls nodes from the data provider and puts them into the model source.\r\n *\r\n * @public\r\n */\r\nexport function useTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new TreeNodeLoader(dataProvider, modelSource), [dataProvider, modelSource]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a paging nodes' loader using the supplied data provider and model source. The loader pulls\r\n * nodes from the data provider and puts them into the model source.\r\n * @public\r\n */\r\nexport function usePagedTreeNodeLoader<TDataProvider extends TreeDataProvider>(dataProvider: TDataProvider, pageSize: number, modelSource: TreeModelSource) {\r\n const createLoader = useCallback(() => new PagedTreeNodeLoader(dataProvider, modelSource, pageSize), [dataProvider, modelSource, pageSize]);\r\n return useDisposable(createLoader);\r\n}\r\n\r\n/**\r\n * Custom hook which creates a `TreeModelSource`.\r\n *\r\n * @note The model source has no direct dependency on the data provider, but we want a fresh model\r\n * source whenever the data provider changes - that's the reason the hook takes a data provider.\r\n *\r\n * @public\r\n */\r\nexport function useTreeModelSource(dataProvider: TreeDataProvider) {\r\n // need to create new model source every time data provider changes although it does not need data provider to be created.\r\n return useMemo(() => new TreeModelSource(), [dataProvider]); // eslint-disable-line react-hooks/exhaustive-deps\r\n}\r\n\r\n/**\r\n * Custom hook which creates and takes care of disposing a TreeEventsHandler. The input is either a factory method\r\n * for a custom `TreeEventHandler` implementation or parameters for the default implementation.\r\n *\r\n * @note Caller must ensure `factoryOrParams` changes only when a new handler needs to be created. `useCallback` or `useMemo` can\r\n * be used for that purpose based on whether the input is a factory function or params object.\r\n *\r\n * @public\r\n */\r\nexport function useTreeEventsHandler<TEventsHandler extends TreeEventHandler>(factoryOrParams: (() => TEventsHandler) | TreeEventHandlerParams) {\r\n const factory = useCallback((): TreeEventHandler => {\r\n if (typeof factoryOrParams === \"function\")\r\n return factoryOrParams();\r\n return new TreeEventHandler(factoryOrParams);\r\n }, [factoryOrParams]);\r\n return useDisposable(factory);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/components-react",
3
- "version": "3.3.0-dev.4",
3
+ "version": "3.3.0-dev.40",
4
4
  "description": "iTwin.js UI complex components",
5
5
  "main": "lib/cjs/components-react.js",
6
6
  "module": "lib/esm/components-react.js",
@@ -20,9 +20,9 @@
20
20
  "url": "http://www.bentley.com"
21
21
  },
22
22
  "peerDependencies": {
23
- "@itwin/appui-abstract": "^3.3.0-dev.4",
24
- "@itwin/core-bentley": "^3.3.0-dev.4",
25
- "@itwin/core-react": "^3.3.0-dev.4",
23
+ "@itwin/appui-abstract": "^3.3.0-dev.40",
24
+ "@itwin/core-bentley": "^3.3.0-dev.40",
25
+ "@itwin/core-react": "^3.3.0-dev.40",
26
26
  "react": "^17.0.0",
27
27
  "react-dom": "^17.0.0"
28
28
  },
@@ -31,13 +31,13 @@
31
31
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
32
32
  ],
33
33
  "devDependencies": {
34
- "@itwin/appui-abstract": "3.3.0-dev.4",
35
- "@itwin/build-tools": "3.3.0-dev.4",
36
- "@itwin/core-bentley": "3.3.0-dev.4",
37
- "@itwin/core-common": "3.3.0-dev.4",
38
- "@itwin/core-i18n": "3.3.0-dev.4",
39
- "@itwin/core-react": "3.3.0-dev.4",
40
- "@itwin/eslint-plugin": "3.3.0-dev.4",
34
+ "@itwin/appui-abstract": "3.3.0-dev.40",
35
+ "@itwin/build-tools": "3.3.0-dev.40",
36
+ "@itwin/core-bentley": "3.3.0-dev.40",
37
+ "@itwin/core-common": "3.3.0-dev.40",
38
+ "@itwin/core-i18n": "3.3.0-dev.40",
39
+ "@itwin/core-react": "3.3.0-dev.40",
40
+ "@itwin/eslint-plugin": "3.3.0-dev.40",
41
41
  "@testing-library/dom": "^8.11.2",
42
42
  "@testing-library/react": "^12.0.0",
43
43
  "@testing-library/react-hooks": "^7.0.2",
@@ -67,7 +67,7 @@
67
67
  "chai-spies": "1.0.0",
68
68
  "chai-string": "^1.5.0",
69
69
  "cpx2": "^3.0.0",
70
- "enzyme": "^3.4.0",
70
+ "enzyme": "3.10.0",
71
71
  "@wojtekmaj/enzyme-adapter-react-17": "^0.6.3",
72
72
  "enzyme-to-json": "^3.3.4",
73
73
  "eslint": "^7.11.0",
@@ -75,7 +75,7 @@
75
75
  "ignore-styles": "^5.0.1",
76
76
  "jsdom": "^19.0.0",
77
77
  "jsdom-global": "3.0.2",
78
- "mocha": "^8.3.2",
78
+ "mocha": "^10.0.0",
79
79
  "nyc": "^15.1.0",
80
80
  "raf": "^3.4.0",
81
81
  "react": "^17.0.0",
@@ -98,7 +98,7 @@
98
98
  "dependencies": {
99
99
  "@bentley/icons-generic-webfont": "^1.0.15",
100
100
  "@itwin/itwinui-css": "0.x",
101
- "@itwin/itwinui-react": "^1.32.0",
101
+ "@itwin/itwinui-react": "^1.38.1",
102
102
  "@types/shortid": "~0.0.29",
103
103
  "callable-instance2": "1.0.0",
104
104
  "classnames": "^2.3.1",