@itwin/core-backend 5.2.0-dev.8 → 5.3.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +2 -0
  3. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
  6. package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
  7. package/lib/cjs/BackendLoggerCategory.js +6 -0
  8. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  9. package/lib/cjs/BriefcaseManager.d.ts +57 -3
  10. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  11. package/lib/cjs/BriefcaseManager.js +151 -42
  12. package/lib/cjs/BriefcaseManager.js.map +1 -1
  13. package/lib/cjs/CloudSqlite.d.ts +4 -0
  14. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  15. package/lib/cjs/CloudSqlite.js.map +1 -1
  16. package/lib/cjs/ECDb.d.ts +8 -0
  17. package/lib/cjs/ECDb.d.ts.map +1 -1
  18. package/lib/cjs/ECDb.js +22 -0
  19. package/lib/cjs/ECDb.js.map +1 -1
  20. package/lib/cjs/IModelDb.d.ts +54 -3
  21. package/lib/cjs/IModelDb.d.ts.map +1 -1
  22. package/lib/cjs/IModelDb.js +87 -9
  23. package/lib/cjs/IModelDb.js.map +1 -1
  24. package/lib/cjs/IModelHost.d.ts +11 -1
  25. package/lib/cjs/IModelHost.d.ts.map +1 -1
  26. package/lib/cjs/IModelHost.js +5 -0
  27. package/lib/cjs/IModelHost.js.map +1 -1
  28. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
  29. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  30. package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
  31. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  32. package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
  33. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  34. package/lib/cjs/SqliteChangesetReader.js +11 -0
  35. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  36. package/lib/cjs/StashManager.d.ts +175 -0
  37. package/lib/cjs/StashManager.d.ts.map +1 -0
  38. package/lib/cjs/StashManager.js +306 -0
  39. package/lib/cjs/StashManager.js.map +1 -0
  40. package/lib/cjs/TxnManager.d.ts +226 -15
  41. package/lib/cjs/TxnManager.d.ts.map +1 -1
  42. package/lib/cjs/TxnManager.js +249 -23
  43. package/lib/cjs/TxnManager.js.map +1 -1
  44. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
  45. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  46. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +15 -6
  47. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  48. package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
  49. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  50. package/lib/cjs/annotations/LeaderGeometry.js +5 -4
  51. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  52. package/lib/cjs/annotations/TextAnnotationElement.d.ts +52 -24
  53. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  54. package/lib/cjs/annotations/TextAnnotationElement.js +49 -59
  55. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  56. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
  57. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  58. package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
  59. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  60. package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
  61. package/lib/cjs/annotations/TextBlockGeometry.js +8 -0
  62. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  63. package/lib/cjs/annotations/TextBlockLayout.d.ts +49 -36
  64. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  65. package/lib/cjs/annotations/TextBlockLayout.js +204 -135
  66. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  67. package/lib/cjs/internal/ChannelAdmin.js +1 -1
  68. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  69. package/lib/cjs/internal/Symbols.d.ts +1 -0
  70. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  71. package/lib/cjs/internal/Symbols.js +2 -1
  72. package/lib/cjs/internal/Symbols.js.map +1 -1
  73. package/lib/cjs/internal/annotations/fields.d.ts +2 -12
  74. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  75. package/lib/cjs/internal/annotations/fields.js +49 -45
  76. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  77. package/lib/cjs/workspace/Workspace.d.ts +1 -1
  78. package/lib/cjs/workspace/Workspace.js.map +1 -1
  79. package/lib/esm/BackendHubAccess.d.ts +2 -0
  80. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  81. package/lib/esm/BackendHubAccess.js.map +1 -1
  82. package/lib/esm/BackendLoggerCategory.d.ts +6 -0
  83. package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
  84. package/lib/esm/BackendLoggerCategory.js +6 -0
  85. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  86. package/lib/esm/BriefcaseManager.d.ts +57 -3
  87. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  88. package/lib/esm/BriefcaseManager.js +152 -43
  89. package/lib/esm/BriefcaseManager.js.map +1 -1
  90. package/lib/esm/CloudSqlite.d.ts +4 -0
  91. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  92. package/lib/esm/CloudSqlite.js.map +1 -1
  93. package/lib/esm/ECDb.d.ts +8 -0
  94. package/lib/esm/ECDb.d.ts.map +1 -1
  95. package/lib/esm/ECDb.js +22 -0
  96. package/lib/esm/ECDb.js.map +1 -1
  97. package/lib/esm/IModelDb.d.ts +54 -3
  98. package/lib/esm/IModelDb.d.ts.map +1 -1
  99. package/lib/esm/IModelDb.js +88 -10
  100. package/lib/esm/IModelDb.js.map +1 -1
  101. package/lib/esm/IModelHost.d.ts +11 -1
  102. package/lib/esm/IModelHost.d.ts.map +1 -1
  103. package/lib/esm/IModelHost.js +5 -0
  104. package/lib/esm/IModelHost.js.map +1 -1
  105. package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
  106. package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  107. package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
  108. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  109. package/lib/esm/SqliteChangesetReader.d.ts +8 -0
  110. package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
  111. package/lib/esm/SqliteChangesetReader.js +11 -0
  112. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  113. package/lib/esm/StashManager.d.ts +175 -0
  114. package/lib/esm/StashManager.d.ts.map +1 -0
  115. package/lib/esm/StashManager.js +301 -0
  116. package/lib/esm/StashManager.js.map +1 -0
  117. package/lib/esm/TxnManager.d.ts +226 -15
  118. package/lib/esm/TxnManager.d.ts.map +1 -1
  119. package/lib/esm/TxnManager.js +247 -21
  120. package/lib/esm/TxnManager.js.map +1 -1
  121. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
  122. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  123. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +13 -5
  124. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  125. package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
  126. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  127. package/lib/esm/annotations/LeaderGeometry.js +5 -4
  128. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  129. package/lib/esm/annotations/TextAnnotationElement.d.ts +52 -24
  130. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  131. package/lib/esm/annotations/TextAnnotationElement.js +51 -61
  132. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  133. package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
  134. package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  135. package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
  136. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  137. package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
  138. package/lib/esm/annotations/TextBlockGeometry.js +8 -0
  139. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  140. package/lib/esm/annotations/TextBlockLayout.d.ts +49 -36
  141. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  142. package/lib/esm/annotations/TextBlockLayout.js +205 -136
  143. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  144. package/lib/esm/internal/ChannelAdmin.js +1 -1
  145. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  146. package/lib/esm/internal/Symbols.d.ts +1 -0
  147. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  148. package/lib/esm/internal/Symbols.js +1 -0
  149. package/lib/esm/internal/Symbols.js.map +1 -1
  150. package/lib/esm/internal/annotations/fields.d.ts +2 -12
  151. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  152. package/lib/esm/internal/annotations/fields.js +51 -47
  153. package/lib/esm/internal/annotations/fields.js.map +1 -1
  154. package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
  155. package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
  156. package/lib/esm/test/AnnotationTestUtils.js +6 -1
  157. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  158. package/lib/esm/test/annotations/Fields.test.js +163 -46
  159. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  160. package/lib/esm/test/annotations/LeaderGeometry.test.js +12 -10
  161. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  162. package/lib/esm/test/annotations/TextAnnotation.test.js +299 -43
  163. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  164. package/lib/esm/test/annotations/TextBlock.test.js +453 -86
  165. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  166. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
  167. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
  168. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
  169. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  170. package/lib/esm/test/ecdb/ECDb.test.js +71 -1
  171. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  172. package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
  173. package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
  174. package/lib/esm/test/hubaccess/Rebase.test.js +640 -0
  175. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
  176. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
  177. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  178. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
  179. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  180. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
  181. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
  182. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
  183. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  184. package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
  185. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  186. package/lib/esm/test/standalone/ChangesetReader.test.js +131 -1
  187. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  188. package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
  189. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  190. package/lib/esm/workspace/Workspace.d.ts +1 -1
  191. package/lib/esm/workspace/Workspace.js.map +1 -1
  192. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../../src/internal/annotations/fields.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { ECSqlValueType, FieldRun, RelationshipProps, TextBlock } from \"@itwin/core-common\";\nimport { IModelDb } from \"../../IModelDb\";\nimport { assert, DbResult, expectDefined, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { BackendLoggerCategory } from \"../../BackendLoggerCategory\";\nimport { XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { isITextAnnotation } from \"../../annotations/ElementDrivesTextAnnotation\";\nimport { AnyClass, EntityClass, Property, StructArrayProperty } from \"@itwin/ecschema-metadata\";\n\n// A FieldPropertyPath must ultimately resolve to one of these primitive types.\nexport type FieldPrimitiveValue = boolean | number | string | Date | XAndY | XYAndZ | Uint8Array;\n\ninterface FieldStructValue { [key: string]: any }\n\n// An intermediate value obtained while evaluating a FieldPropertyPath.\ntype FieldValue = {\n primitive: FieldPrimitiveValue;\n struct?: never;\n primitiveArray?: never;\n structArray?: never;\n} | {\n primitive?: never;\n struct: FieldStructValue;\n primitiveArray?: never;\n structArray?: never;\n} | {\n primitive?: never;\n struct?: never;\n primitiveArray: FieldPrimitiveValue[];\n structArray?: never;\n} | {\n primitive?: never;\n struct?: never;\n primitiveArray?: never;\n structArray: FieldStructValue[];\n}\n\n// Metadata associated with a FieldProperty, providing info needed for formatting like kind-of-quantity, extended type, etc.\n// That information can be obtained from the EC Property. For JSON fields, we will need to allow the user to specify it explicitly\n// (TBD because formatting is not yet implemented).\nexport interface FieldPropertyMetadata {\n readonly property: Property;\n // ###TODO probably want to know if it's a JSON property.\n}\n\n// The resolved primitive value of a field with metadata.\nexport interface FieldProperty {\n value: FieldPrimitiveValue;\n metadata: FieldPropertyMetadata;\n}\n\nexport interface UpdateFieldsContext {\n readonly hostElementId: Id64String;\n\n getProperty(field: FieldRun): FieldProperty | undefined\n}\n\n// Resolve the raw primitive value of the property that a field points to.\nfunction getFieldProperty(field: FieldRun, iModel: IModelDb): FieldProperty | undefined {\n const host = field.propertyHost;\n const schemaItem = iModel.schemaContext.getSchemaItemSync(host.schemaName, host.className);\n if (!EntityClass.isEntityClass(schemaItem)) {\n return undefined;\n }\n\n let ecClass: AnyClass = schemaItem;\n const { propertyName, accessors } = field.propertyPath;\n let ecProp = ecClass.getPropertySync(propertyName);\n if (!ecProp) {\n return undefined;\n }\n\n const isAspect = ecClass.isSync(\"ElementAspect\", \"BisCore\");\n const where = ` WHERE ${isAspect ? \"Element.Id\" : \"ECInstanceId\"}=${host.elementId}`;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n let curValue: FieldValue | undefined = iModel.withPreparedStatement(`SELECT ${propertyName} FROM ${host.schemaName}.${host.className} ${where}`, (stmt) => {\n if (stmt.step() !== DbResult.BE_SQLITE_ROW) {\n return undefined;\n }\n\n const rootValue = stmt.getValue(0);\n if (undefined === rootValue || rootValue.isNull) {\n return undefined;\n }\n\n switch (rootValue.columnInfo.getType()) {\n case ECSqlValueType.Blob:\n return { primitive: rootValue.getBlob() };\n case ECSqlValueType.Boolean:\n return { primitive: rootValue.getBoolean() };\n case ECSqlValueType.DateTime:\n return { primitive: rootValue.getDateTime() };\n case ECSqlValueType.Double:\n return { primitive: rootValue.getDouble() };\n case ECSqlValueType.Guid:\n return { primitive: rootValue.getGuid() };\n case ECSqlValueType.Int:\n case ECSqlValueType.Int64:\n return { primitive: rootValue.getInteger() };\n case ECSqlValueType.Point2d:\n return { primitive: rootValue.getXAndY() };\n case ECSqlValueType.Point3d:\n return { primitive: rootValue.getXYAndZ() };\n case ECSqlValueType.String:\n return { primitive: rootValue.getString() };\n case ECSqlValueType.Struct: {\n ecProp = expectDefined(ecProp);\n assert(ecProp.isStruct());\n ecClass = ecProp.structClass;\n return { struct: rootValue.getStruct() };\n }\n case ECSqlValueType.PrimitiveArray: {\n return { primitiveArray: rootValue.getArray() };\n }\n case ECSqlValueType.StructArray: {\n return { structArray: rootValue.getArray() };\n }\n // Unsupported:\n // case ECSqlValueType.Geometry:\n // case ECSqlValueType.Navigation:\n // case ECSqlValueType.Id:\n }\n\n return undefined;\n });\n\n if (undefined === curValue) {\n return undefined;\n }\n\n if (accessors) {\n for (const accessor of accessors) {\n if (undefined !== curValue.primitive) {\n // Can't index into a primitive.\n return undefined;\n }\n\n if (typeof accessor === \"number\") {\n const array: FieldPrimitiveValue[] | FieldStructValue[] | undefined = curValue.primitiveArray ?? curValue.structArray;\n if (!array) {\n return undefined;\n }\n\n const index: number = accessor < 0 ? (array.length + accessor) : accessor;\n const item: FieldPrimitiveValue | FieldStructValue = array[index];\n if (undefined === item) {\n return undefined;\n } else if (curValue.primitiveArray) {\n curValue = { primitive: curValue.primitiveArray[index] };\n } else {\n assert(undefined !== curValue.structArray);\n assert(ecProp instanceof StructArrayProperty);\n\n ecClass = ecProp.structClass;\n curValue = { struct: curValue.structArray[index] };\n }\n } else {\n if (undefined === curValue.struct) {\n return undefined;\n }\n\n const item: any = curValue.struct[accessor];\n if (undefined === item) {\n return undefined;\n }\n\n ecProp = ecClass.getPropertySync(accessor);\n if (!ecProp) {\n return undefined;\n }\n\n if (ecProp.isArray()) {\n curValue = ecProp.isStruct() ? { structArray: item } : { primitiveArray: item };\n } else if (ecProp.isStruct()) {\n ecClass = ecProp.structClass;\n curValue = { struct: item };\n } else if (ecProp.isPrimitive()) {\n curValue = { primitive: item };\n } else {\n return undefined;\n }\n }\n }\n }\n\n if (field.propertyPath.jsonAccessors) {\n if (!ecProp.isPrimitive() || ecProp.isArray() || ecProp.extendedTypeName !== \"Json\" || typeof curValue.primitive !== \"string\") {\n return undefined;\n }\n\n let json = JSON.parse(curValue.primitive);\n for (const accessor of field.propertyPath.jsonAccessors) {\n if (typeof accessor === \"number\") {\n if (!Array.isArray(json)) {\n return undefined;\n }\n\n json = json[accessor < 0 ? json.length + accessor : accessor];\n } else {\n if (typeof json !== \"object\" || json === null) {\n return undefined;\n }\n\n json = json[accessor];\n }\n }\n\n switch (typeof json) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n curValue = { primitive: json };\n break;\n default:\n return undefined;\n }\n }\n\n // The ultimate result must be a primitive value.\n if (undefined === curValue.primitive) {\n return undefined;\n }\n\n return {\n value: curValue.primitive,\n metadata: { property: ecProp },\n };\n}\n\nexport function createUpdateContext(hostElementId: string, iModel: IModelDb, deleted: boolean): UpdateFieldsContext {\n return {\n hostElementId,\n getProperty: deleted ? () => undefined : (field) => getFieldProperty(field, iModel),\n };\n}\n\n// Recompute the display value of a single field, return false if it couldn't be evaluated.\nexport function updateField(field: FieldRun, context: UpdateFieldsContext): boolean {\n if (context.hostElementId !== field.propertyHost.elementId) {\n return false;\n }\n\n let newContent: string | undefined;\n try {\n const prop = context.getProperty(field);\n if (undefined !== prop) {\n // ###TODO formatting etc.\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n newContent = prop.value.toString();\n }\n } catch (err) {\n Logger.logException(BackendLoggerCategory.IModelDb, err);\n }\n\n newContent = newContent ?? FieldRun.invalidContentIndicator;\n if (newContent === field.cachedContent) {\n return false;\n }\n\n field.setCachedContent(newContent);\n return true;\n}\n\n// Re-evaluates the display strings for all fields that target the element specified by `context` and returns the number\n// of fields whose display strings changed as a result.\nexport function updateFields(textBlock: TextBlock, context: UpdateFieldsContext): number {\n let numUpdated = 0;\n for (const paragraph of textBlock.paragraphs) {\n for (const run of paragraph.runs) {\n if (run.type === \"field\" && updateField(run, context)) {\n ++numUpdated;\n }\n }\n }\n\n return numUpdated;\n}\n\n// Invoked by ElementDrivesTextAnnotation to update fields in target element when source element changes or is deleted.\nexport function updateElementFields(props: RelationshipProps, iModel: IModelDb, deleted: boolean): void {\n try {\n const target = iModel.elements.getElement(props.targetId);\n if (isITextAnnotation(target)) {\n const context = createUpdateContext(props.sourceId, iModel, deleted);\n const updatedBlocks = [];\n for (const block of target.getTextBlocks()) {\n if (updateFields(block.textBlock, context)) {\n updatedBlocks.push(block);\n }\n }\n\n if (updatedBlocks.length > 0) {\n target.updateTextBlocks(updatedBlocks);\n }\n }\n } catch (err) {\n Logger.logException(BackendLoggerCategory.IModelDb, err);\n }\n}\n\n"]}
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../../src/internal/annotations/fields.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { ECSqlValueType, FieldPrimitiveValue, FieldPropertyType, FieldRun, FieldValue, formatFieldValue, RelationshipProps, TextBlock, traverseTextBlockComponent } from \"@itwin/core-common\";\nimport { IModelDb } from \"../../IModelDb\";\nimport { assert, DbResult, expectDefined, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { BackendLoggerCategory } from \"../../BackendLoggerCategory\";\nimport { isITextAnnotation } from \"../../annotations/ElementDrivesTextAnnotation\";\nimport { AnyClass, EntityClass, PrimitiveType, Property, PropertyType, StructArrayProperty } from \"@itwin/ecschema-metadata\";\n\ninterface FieldStructValue { [key: string]: any }\n\n// An intermediate value obtained while evaluating a FieldPropertyPath.\ntype FieldValueType = {\n primitive: FieldPrimitiveValue;\n struct?: never;\n primitiveArray?: never;\n structArray?: never;\n} | {\n primitive?: never;\n struct: FieldStructValue;\n primitiveArray?: never;\n structArray?: never;\n} | {\n primitive?: never;\n struct?: never;\n primitiveArray: FieldPrimitiveValue[];\n structArray?: never;\n} | {\n primitive?: never;\n struct?: never;\n primitiveArray?: never;\n structArray: FieldStructValue[];\n}\n\nexport interface UpdateFieldsContext {\n readonly hostElementId: Id64String;\n\n getProperty(field: FieldRun): FieldValue | undefined\n}\n\n// Resolve the raw primitive value of the property that a field points to.\nfunction getFieldPropertyValue(field: FieldRun, iModel: IModelDb): FieldValue | undefined {\n const host = field.propertyHost;\n const schemaItem = iModel.schemaContext.getSchemaItemSync(host.schemaName, host.className);\n if (!EntityClass.isEntityClass(schemaItem)) {\n return undefined;\n }\n\n let ecClass: AnyClass = schemaItem;\n const { propertyName, accessors } = field.propertyPath;\n let ecProp = ecClass.getPropertySync(propertyName);\n if (!ecProp) {\n return undefined;\n }\n\n const isAspect = ecClass.isSync(\"ElementAspect\", \"BisCore\");\n const where = ` WHERE ${isAspect ? \"Element.Id\" : \"ECInstanceId\"}=${host.elementId}`;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n let curValue: FieldValueType | undefined = iModel.withPreparedStatement(`SELECT ${propertyName} FROM ${host.schemaName}.${host.className} ${where}`, (stmt) => {\n if (stmt.step() !== DbResult.BE_SQLITE_ROW) {\n return undefined;\n }\n\n const rootValue = stmt.getValue(0);\n if (undefined === rootValue || rootValue.isNull) {\n return undefined;\n }\n\n switch (rootValue.columnInfo.getType()) {\n case ECSqlValueType.Blob:\n return { primitive: rootValue.getBlob() };\n case ECSqlValueType.Boolean:\n return { primitive: rootValue.getBoolean() };\n case ECSqlValueType.DateTime:\n return { primitive: new Date(rootValue.getDateTime()) };\n case ECSqlValueType.Double:\n return { primitive: rootValue.getDouble() };\n case ECSqlValueType.Guid:\n return { primitive: rootValue.getGuid() };\n case ECSqlValueType.Int:\n case ECSqlValueType.Int64:\n return { primitive: rootValue.getInteger() };\n case ECSqlValueType.Point2d:\n return { primitive: rootValue.getXAndY() };\n case ECSqlValueType.Point3d:\n return { primitive: rootValue.getXYAndZ() };\n case ECSqlValueType.String:\n return { primitive: rootValue.getString() };\n case ECSqlValueType.Struct: {\n ecProp = expectDefined(ecProp);\n assert(ecProp.isStruct());\n ecClass = ecProp.structClass;\n return { struct: rootValue.getStruct() };\n }\n case ECSqlValueType.PrimitiveArray: {\n return { primitiveArray: rootValue.getArray() };\n }\n case ECSqlValueType.StructArray: {\n return { structArray: rootValue.getArray() };\n }\n // Unsupported:\n // case ECSqlValueType.Geometry:\n // case ECSqlValueType.Navigation:\n // case ECSqlValueType.Id:\n }\n\n return undefined;\n });\n\n if (undefined === curValue) {\n return undefined;\n }\n\n if (accessors) {\n for (const accessor of accessors) {\n if (undefined !== curValue.primitive) {\n // Can't index into a primitive.\n return undefined;\n }\n\n if (typeof accessor === \"number\") {\n const array: FieldPrimitiveValue[] | FieldStructValue[] | undefined = curValue.primitiveArray ?? curValue.structArray;\n if (!array) {\n return undefined;\n }\n\n const index: number = accessor < 0 ? (array.length + accessor) : accessor;\n const item: FieldPrimitiveValue | FieldStructValue = array[index];\n if (undefined === item) {\n return undefined;\n } else if (curValue.primitiveArray) {\n curValue = { primitive: curValue.primitiveArray[index] };\n } else {\n assert(undefined !== curValue.structArray);\n assert(ecProp instanceof StructArrayProperty);\n\n ecClass = ecProp.structClass;\n curValue = { struct: curValue.structArray[index] };\n }\n } else {\n if (undefined === curValue.struct) {\n return undefined;\n }\n\n const item: any = curValue.struct[accessor];\n if (undefined === item) {\n return undefined;\n }\n\n ecProp = ecClass.getPropertySync(accessor);\n if (!ecProp) {\n return undefined;\n }\n\n if (ecProp.isArray()) {\n curValue = ecProp.isStruct() ? { structArray: item } : { primitiveArray: item };\n } else if (ecProp.isStruct()) {\n ecClass = ecProp.structClass;\n curValue = { struct: item };\n } else if (ecProp.isPrimitive()) {\n curValue = { primitive: item };\n } else {\n return undefined;\n }\n }\n }\n }\n\n const propertyType = determineFieldPropertyType(ecProp);\n if(!propertyType) {\n return undefined;\n }\n\n // The ultimate result must be a primitive value.\n if (undefined === curValue.primitive) {\n return undefined;\n }\n\n return { value: curValue.primitive, type: propertyType };\n}\n\nfunction determineFieldPropertyType(prop: Property): FieldPropertyType | undefined {\n if (prop.isEnumeration()) {\n switch (prop.propertyType) {\n case PropertyType.Integer_Enumeration:\n return \"int-enum\";\n case PropertyType.String_Enumeration:\n return \"string-enum\";\n default:\n return undefined;\n }\n }\n\n if (prop.isPrimitive()) {\n switch (prop.primitiveType) {\n case PrimitiveType.Boolean:\n return \"boolean\";\n case PrimitiveType.String:\n return prop.extendedTypeName === \"DateTime\" ? \"datetime\" : \"string\";\n case PrimitiveType.DateTime:\n return \"datetime\";\n case PrimitiveType.Double:\n case PrimitiveType.Long:\n return \"quantity\";\n case PrimitiveType.Point2d:\n case PrimitiveType.Point3d:\n return \"coordinate\";\n case PrimitiveType.Binary:\n return prop.extendedTypeName === \"BeGuid\" ? \"string\" : undefined;\n case PrimitiveType.Integer:\n case PrimitiveType.Long:\n return \"string\";\n default:\n return undefined;\n }\n }\n\n return undefined;\n}\n\nexport function createUpdateContext(hostElementId: string, iModel: IModelDb, deleted: boolean): UpdateFieldsContext {\n return {\n hostElementId,\n getProperty: deleted ? () => undefined : (field) => getFieldPropertyValue(field, iModel),\n };\n}\n\n// Recompute the display value of a single field, return false if it couldn't be evaluated.\nexport function updateField(field: FieldRun, context: UpdateFieldsContext): boolean {\n if (context.hostElementId !== field.propertyHost.elementId) {\n return false;\n }\n\n let newContent: string | undefined;\n try {\n const propValue = context.getProperty(field);\n if (undefined !== propValue) {\n newContent = formatFieldValue(propValue, field.formatOptions);\n }\n } catch (err) {\n Logger.logException(BackendLoggerCategory.IModelDb, err);\n }\n\n newContent = newContent ?? FieldRun.invalidContentIndicator;\n if (newContent === field.cachedContent) {\n return false;\n }\n\n field.setCachedContent(newContent);\n return true;\n}\n\n// Re-evaluates the display strings for all fields that target the element specified by `context` and returns the number\n// of fields whose display strings changed as a result.\nexport function updateFields(textBlock: TextBlock, context: UpdateFieldsContext): number {\n let numUpdated = 0;\n for (const { child } of traverseTextBlockComponent(textBlock)) {\n if (child.type === \"field\" && updateField(child, context)) {\n ++numUpdated;\n }\n }\n\n return numUpdated;\n}\n\n// Invoked by ElementDrivesTextAnnotation to update fields in target element when source element changes or is deleted.\nexport function updateElementFields(props: RelationshipProps, iModel: IModelDb, deleted: boolean): void {\n try {\n const target = iModel.elements.getElement(props.targetId);\n if (isITextAnnotation(target)) {\n const context = createUpdateContext(props.sourceId, iModel, deleted);\n const updatedBlocks = [];\n for (const block of target.getTextBlocks()) {\n if (updateFields(block.textBlock, context)) {\n updatedBlocks.push(block);\n }\n }\n\n if (updatedBlocks.length > 0) {\n target.updateTextBlocks(updatedBlocks);\n }\n }\n } catch (err) {\n Logger.logException(BackendLoggerCategory.IModelDb, err);\n }\n}\n\n"]}
@@ -1,15 +1,19 @@
1
- import { ElementGeometry, GeometryParams, TextBlock } from "@itwin/core-common";
1
+ import { ElementGeometry, GeometryParams, TextBlock, TextString } from "@itwin/core-common";
2
2
  import { AnyCurvePrimitive } from "@itwin/core-geometry";
3
3
  import { ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, TextBlockLayout, TextLayoutRanges } from "../core-backend";
4
+ import { Id64String } from "@itwin/core-bentley";
4
5
  export declare function computeTextRangeAsStringLength(args: ComputeRangesForTextLayoutArgs): TextLayoutRanges;
5
6
  export declare function doLayout(textBlock: TextBlock, args?: {
7
+ textStyleId?: Id64String;
6
8
  findTextStyle?: FindTextStyle;
7
9
  findFontId?: FindFontId;
8
10
  }): TextBlockLayout;
9
11
  export declare class MockBuilder extends ElementGeometry.Builder {
10
12
  params: GeometryParams[];
11
13
  geometries: AnyCurvePrimitive[];
14
+ textStrings: TextString[];
12
15
  appendGeometryParamsChange(params: GeometryParams): boolean;
13
16
  appendGeometryQuery(geometry: AnyCurvePrimitive): boolean;
17
+ appendTextString(text: TextString): boolean;
14
18
  }
15
19
  //# sourceMappingURL=AnnotationTestUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationTestUtils.d.ts","sourceRoot":"","sources":["../../../src/test/AnnotationTestUtils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAW,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,UAAU,EAAE,aAAa,EAAmB,eAAe,EAAE,gBAAgB,EAAqB,MAAM,iBAAiB,CAAC;AAGnK,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,8BAA8B,GAAG,gBAAgB,CAGrG;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE;IACpD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,GAAG,eAAe,CAgBlB;AAGD,qBAAa,WAAY,SAAQ,eAAe,CAAC,OAAO;IAC/C,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAM;IAC5B,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI3D,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO;CAI1E"}
1
+ {"version":3,"file":"AnnotationTestUtils.d.ts","sourceRoot":"","sources":["../../../src/test/AnnotationTestUtils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAqB,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,iBAAiB,EAAW,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,UAAU,EAAE,aAAa,EAAmB,eAAe,EAAE,gBAAgB,EAAqB,MAAM,iBAAiB,CAAC;AACnK,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,8BAA8B,GAAG,gBAAgB,CAGrG;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE;IACpD,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,GAAG,eAAe,CAgBlB;AAGD,qBAAa,WAAY,SAAQ,eAAe,CAAC,OAAO;IAC/C,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAM;IACrC,WAAW,EAAE,UAAU,EAAE,CAAK;IAErB,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI3D,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO;IAKzD,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;CAK5D"}
@@ -12,8 +12,8 @@ export function computeTextRangeAsStringLength(args) {
12
12
  export function doLayout(textBlock, args) {
13
13
  const textStyleResolver = new TextStyleResolver({
14
14
  textBlock,
15
+ textStyleId: args?.textStyleId ?? "",
15
16
  iModel: {},
16
- modelId: undefined,
17
17
  findTextStyle: args?.findTextStyle ?? (() => TextStyleSettings.defaults)
18
18
  });
19
19
  const layout = layoutTextBlock({
@@ -29,6 +29,7 @@ export function doLayout(textBlock, args) {
29
29
  export class MockBuilder extends ElementGeometry.Builder {
30
30
  params = [];
31
31
  geometries = [];
32
+ textStrings = [];
32
33
  appendGeometryParamsChange(params) {
33
34
  this.params.push(params.clone());
34
35
  return super.appendGeometryParamsChange(params);
@@ -37,5 +38,9 @@ export class MockBuilder extends ElementGeometry.Builder {
37
38
  this.geometries.push(geometry);
38
39
  return super.appendGeometryQuery(geometry);
39
40
  }
41
+ appendTextString(text) {
42
+ this.textStrings.push(text);
43
+ return super.appendTextString(text);
44
+ }
40
45
  }
41
46
  //# sourceMappingURL=AnnotationTestUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationTestUtils.js","sourceRoot":"","sources":["../../../src/test/AnnotationTestUtils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,eAAe,EAA6B,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAqB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAA6D,eAAe,EAAqC,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGnK,MAAM,UAAU,8BAA8B,CAAC,IAAoC;IACjF,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAoB,EAAE,IAG9C;IACC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;QAC9C,SAAS;QACT,MAAM,EAAE,EAAS;QACjB,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;KACzE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,SAAS;QACT,MAAM,EAAE,EAAS;QACjB,iBAAiB;QACjB,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzC,gBAAgB,EAAE,8BAA8B;KACjD,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,OAAO,WAAY,SAAQ,eAAe,CAAC,OAAO;IAC/C,MAAM,GAAqB,EAAE,CAAC;IAC9B,UAAU,GAAwB,EAAE,CAAC;IAC5B,0BAA0B,CAAC,MAAsB;QAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IACe,mBAAmB,CAAC,QAA2B;QAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { ElementGeometry, GeometryParams, TextBlock, TextStyleSettings } from \"@itwin/core-common\";\nimport { AnyCurvePrimitive, Range2d } from \"@itwin/core-geometry\";\nimport { ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, layoutTextBlock, TextBlockLayout, TextLayoutRanges, TextStyleResolver } from \"../core-backend\";\n\n\nexport function computeTextRangeAsStringLength(args: ComputeRangesForTextLayoutArgs): TextLayoutRanges {\n const range = new Range2d(0, 0, args.chars.length, args.lineHeight);\n return { layout: range, justification: range };\n}\n\nexport function doLayout(textBlock: TextBlock, args?: {\n findTextStyle?: FindTextStyle;\n findFontId?: FindFontId;\n}): TextBlockLayout {\n const textStyleResolver = new TextStyleResolver({\n textBlock,\n iModel: {} as any,\n modelId: undefined,\n findTextStyle: args?.findTextStyle ?? (() => TextStyleSettings.defaults)\n });\n const layout = layoutTextBlock({\n textBlock,\n iModel: {} as any,\n textStyleResolver,\n findFontId: args?.findFontId ?? (() => 0),\n computeTextRange: computeTextRangeAsStringLength,\n });\n\n return layout;\n}\n\n// Extending this because the ElementGeometry.Builder.entries attribute is hard to parse\nexport class MockBuilder extends ElementGeometry.Builder {\n public params: GeometryParams[] = [];\n public geometries: AnyCurvePrimitive[] = [];\n public override appendGeometryParamsChange(params: GeometryParams): boolean {\n this.params.push(params.clone());\n return super.appendGeometryParamsChange(params);\n }\n public override appendGeometryQuery(geometry: AnyCurvePrimitive): boolean {\n this.geometries.push(geometry);\n return super.appendGeometryQuery(geometry);\n }\n}"]}
1
+ {"version":3,"file":"AnnotationTestUtils.js","sourceRoot":"","sources":["../../../src/test/AnnotationTestUtils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,eAAe,EAAyC,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAqB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAA6D,eAAe,EAAqC,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAInK,MAAM,UAAU,8BAA8B,CAAC,IAAoC;IACjF,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAoB,EAAE,IAI9C;IACC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;QAC9C,SAAS;QACT,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,EAAE;QACpC,MAAM,EAAE,EAAS;QACjB,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;KACzE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,SAAS;QACT,MAAM,EAAE,EAAS;QACjB,iBAAiB;QACjB,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzC,gBAAgB,EAAE,8BAA8B;KACjD,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,OAAO,WAAY,SAAQ,eAAe,CAAC,OAAO;IAC/C,MAAM,GAAqB,EAAE,CAAC;IAC9B,UAAU,GAAwB,EAAE,CAAC;IACrC,WAAW,GAAiB,EAAE,CAAA;IAErB,0BAA0B,CAAC,MAAsB;QAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IACe,mBAAmB,CAAC,QAA2B;QAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEe,gBAAgB,CAAC,IAAgB;QAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CAEF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { ElementGeometry, GeometryParams, TextBlock, TextString, TextStyleSettings } from \"@itwin/core-common\";\nimport { AnyCurvePrimitive, Range2d } from \"@itwin/core-geometry\";\nimport { ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, layoutTextBlock, TextBlockLayout, TextLayoutRanges, TextStyleResolver } from \"../core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\n\n\nexport function computeTextRangeAsStringLength(args: ComputeRangesForTextLayoutArgs): TextLayoutRanges {\n const range = new Range2d(0, 0, args.chars.length, args.lineHeight);\n return { layout: range, justification: range };\n}\n\nexport function doLayout(textBlock: TextBlock, args?: {\n textStyleId?: Id64String,\n findTextStyle?: FindTextStyle;\n findFontId?: FindFontId;\n}): TextBlockLayout {\n const textStyleResolver = new TextStyleResolver({\n textBlock,\n textStyleId: args?.textStyleId ?? \"\",\n iModel: {} as any,\n findTextStyle: args?.findTextStyle ?? (() => TextStyleSettings.defaults)\n });\n const layout = layoutTextBlock({\n textBlock,\n iModel: {} as any,\n textStyleResolver,\n findFontId: args?.findFontId ?? (() => 0),\n computeTextRange: computeTextRangeAsStringLength,\n });\n\n return layout;\n}\n\n// Extending this because the ElementGeometry.Builder.entries attribute is hard to parse\nexport class MockBuilder extends ElementGeometry.Builder {\n public params: GeometryParams[] = [];\n public geometries: AnyCurvePrimitive[] = [];\n public textStrings: TextString[] = []\n\n public override appendGeometryParamsChange(params: GeometryParams): boolean {\n this.params.push(params.clone());\n return super.appendGeometryParamsChange(params);\n }\n public override appendGeometryQuery(geometry: AnyCurvePrimitive): boolean {\n this.geometries.push(geometry);\n return super.appendGeometryQuery(geometry);\n }\n\n public override appendTextString(text: TextString): boolean {\n this.textStrings.push(text);\n return super.appendTextString(text);\n }\n\n}"]}
@@ -7,14 +7,20 @@ import { Code, FieldRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextR
7
7
  import { StandaloneDb } from "../../IModelDb";
8
8
  import { IModelTestUtils } from "../IModelTestUtils";
9
9
  import { createUpdateContext, updateField, updateFields } from "../../internal/annotations/fields";
10
- import { DbResult, Id64 } from "@itwin/core-bentley";
10
+ import { DbResult, Id64, ProcessDetector } from "@itwin/core-bentley";
11
11
  import { SpatialCategory } from "../../Category";
12
12
  import { Point3d, YawPitchRollAngles } from "@itwin/core-geometry";
13
13
  import { Schema, Schemas } from "../../Schema";
14
14
  import { ClassRegistry } from "../../ClassRegistry";
15
15
  import { PhysicalElement } from "../../Element";
16
16
  import { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, TextAnnotation3d } from "../../core-backend";
17
- import { ElementDrivesTextAnnotation } from "../../annotations/ElementDrivesTextAnnotation";
17
+ import { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
18
+ function isIntlSupported() {
19
+ // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile
20
+ // users are not expected to do any editing, but long term we will attempt to find a better
21
+ // solution.
22
+ return !ProcessDetector.isMobileAppBackend;
23
+ }
18
24
  describe("updateField", () => {
19
25
  const mockElementId = "0x1";
20
26
  const mockPath = {
@@ -31,7 +37,7 @@ describe("updateField", () => {
31
37
  propertyPath.accessors?.[0] === 0 &&
32
38
  propertyPath.accessors?.[1] === "nestedProperty" &&
33
39
  propertyValue !== undefined) {
34
- return { value: propertyValue, metadata: {} };
40
+ return { value: propertyValue, type: "string" };
35
41
  }
36
42
  return undefined;
37
43
  },
@@ -102,6 +108,11 @@ const fieldsSchemaXml = `
102
108
  <ECSchema schemaName="Fields" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
103
109
  <ECSchemaReference name="BisCore" version="01.00.04" alias="bis"/>
104
110
 
111
+ <ECEnumeration typeName="IntEnum" backingTypeName="int">
112
+ <ECEnumerator name="one" displayLabel="One" value="1" />
113
+ <ECEnumerator name="two" displayLabel="Two" value="2"/>
114
+ </ECEnumeration>
115
+
105
116
  <ECStructClass typeName="InnerStruct" modifier="None">
106
117
  <ECProperty propertyName="bool" typeName="boolean"/>
107
118
  <ECArrayProperty propertyName="doubles" typeName="double" minOccurs="0" maxOccurs="unbounded"/>
@@ -117,9 +128,11 @@ const fieldsSchemaXml = `
117
128
  <ECProperty propertyName="intProp" typeName="int"/>
118
129
  <ECProperty propertyName="point" typeName="point3d"/>
119
130
  <ECProperty propertyName="maybeNull" typeName="int"/>
131
+ <ECProperty propertyName="datetime" typeName="dateTime"/>
120
132
  <ECArrayProperty propertyName="strings" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
121
133
  <ECStructProperty propertyName="outerStruct" typeName="OuterStruct"/>
122
134
  <ECStructArrayProperty propertyName="outerStructs" typeName="OuterStruct" minOccurs="0" maxOccurs="unbounded"/>
135
+ <ECProperty propertyName="intEnum" typeName="IntEnum"/>
123
136
  </ECEntityClass>
124
137
 
125
138
  <ECEntityClass typeName="TestAspect" modifier="None">
@@ -174,6 +187,8 @@ describe("Field evaluation", () => {
174
187
  intProp: 100,
175
188
  point: { x: 1, y: 2, z: 3 },
176
189
  strings: ["a", "b", `"name": "c"`],
190
+ datetime: new Date("2025-08-28T13:45:30.123Z"),
191
+ intEnum: 1,
177
192
  outerStruct: {
178
193
  innerStruct: { bool: false, doubles: [1, 2, 3] },
179
194
  innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],
@@ -189,6 +204,7 @@ describe("Field evaluation", () => {
189
204
  jsonProperties: {
190
205
  stringProp: "abc",
191
206
  ints: [10, 11, 12, 13],
207
+ bool: true,
192
208
  zoo: {
193
209
  address: {
194
210
  zipcode: 12345,
@@ -210,22 +226,27 @@ describe("Field evaluation", () => {
210
226
  imodel.saveChanges();
211
227
  return id;
212
228
  }
229
+ function evaluateField(propertyPath, propertyHost, deletedDependency = false) {
230
+ if (typeof propertyHost === "string") {
231
+ propertyHost = { schemaName: "Fields", className: "TestElement", elementId: propertyHost };
232
+ }
233
+ const field = FieldRun.create({
234
+ propertyPath,
235
+ propertyHost,
236
+ });
237
+ const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);
238
+ return context.getProperty(field);
239
+ }
213
240
  describe("getProperty", () => {
214
241
  function expectValue(expected, propertyPath, propertyHost, deletedDependency = false) {
215
- if (typeof propertyHost === "string") {
216
- propertyHost = { schemaName: "Fields", className: "TestElement", elementId: propertyHost };
217
- }
218
- const field = FieldRun.create({
219
- propertyPath,
220
- propertyHost,
221
- });
222
- const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);
223
- const actual = context.getProperty(field);
224
- expect(actual?.value).to.deep.equal(expected);
242
+ expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);
225
243
  }
226
244
  it("returns a primitive property value", () => {
227
245
  expectValue(100, { propertyName: "intProp" }, sourceElementId);
228
246
  });
247
+ it("returns an integer enum property value", () => {
248
+ expectValue(1, { propertyName: "intEnum" }, sourceElementId);
249
+ });
229
250
  it("treats points as primitive values", () => {
230
251
  expectValue({ x: 1, y: 2, z: 3 }, { propertyName: "point" }, sourceElementId);
231
252
  expectValue(undefined, { propertyName: "point", accessors: ["x"] }, sourceElementId);
@@ -284,28 +305,62 @@ describe("Field evaluation", () => {
284
305
  expectValue(false, { propertyName: "outerStructs", accessors: [0, "innerStructs", -1, "bool"] }, sourceElementId);
285
306
  expectValue(5, { propertyName: "outerStructs", accessors: [0, "innerStructs", 0, "doubles", 0] }, sourceElementId);
286
307
  });
287
- it("returns arbitrarily-nested JSON properties", () => {
288
- expectValue("abc", { propertyName: "jsonProperties", jsonAccessors: ["stringProp"] }, sourceElementId);
289
- expectValue(10, { propertyName: "jsonProperties", jsonAccessors: ["ints", 0] }, sourceElementId);
290
- expectValue(13, { propertyName: "jsonProperties", jsonAccessors: ["ints", 3] }, sourceElementId);
291
- expectValue(13, { propertyName: "jsonProperties", jsonAccessors: ["ints", -1] }, sourceElementId);
292
- expectValue(11, { propertyName: "jsonProperties", jsonAccessors: ["ints", -3] }, sourceElementId);
293
- expectValue(12345, { propertyName: "jsonProperties", jsonAccessors: ["zoo", "address", "zipcode"] }, sourceElementId);
294
- expectValue("scree!", { propertyName: "jsonProperties", jsonAccessors: ["zoo", "birds", 1, "sound"] }, sourceElementId);
295
- });
296
- it("returns undefined if JSON accessors applied to non-JSON property", () => {
297
- expectValue(undefined, { propertyName: "int", jsonAccessors: ["whatever"] }, sourceElementId);
298
- expectValue(undefined, { propertyName: "strings", accessors: [2, "name"] }, sourceElementId);
299
- expectValue(undefined, { propertyName: "outerStruct", accessors: ["innerStruct"], jsonAccessors: ["bool"] }, sourceElementId);
300
- });
301
308
  it("returns the value of a property of an aspect", () => {
302
309
  expect(imodel.elements.getAspects(sourceElementId, "Fields:TestAspect").length).to.equal(1);
303
310
  expectValue(999, { propertyName: "aspectProp" }, { elementId: sourceElementId, schemaName: "Fields", className: "TestAspect" });
304
311
  });
312
+ it("should fail to evaluate if prop type does not match", () => {
313
+ const fieldRun = FieldRun.create({
314
+ propertyHost: { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" },
315
+ propertyPath: { propertyName: "string", accessors: [0] },
316
+ cachedContent: "oldValue",
317
+ formatOptions: {
318
+ case: "upper",
319
+ prefix: "Value: ",
320
+ suffix: "!"
321
+ }
322
+ });
323
+ const context = createUpdateContext(sourceElementId, imodel, false);
324
+ const updated = updateField(fieldRun, context);
325
+ expect(updated).to.be.true;
326
+ expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);
327
+ });
328
+ function getPropertyType(propertyHost, propertyPath) {
329
+ if (typeof propertyPath === "string") {
330
+ propertyPath = { propertyName: propertyPath };
331
+ }
332
+ return evaluateField(propertyPath, propertyHost)?.type;
333
+ }
334
+ it("deduces type for primitive properties", () => {
335
+ const propertyHost = { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" };
336
+ expect(getPropertyType(propertyHost, "intProp")).to.equal("string");
337
+ expect(getPropertyType(propertyHost, "point")).to.equal("coordinate");
338
+ expect(getPropertyType(propertyHost, { propertyName: "strings", accessors: [0] })).to.equal("string");
339
+ expect(getPropertyType(propertyHost, "intEnum")).to.equal("int-enum");
340
+ expect(getPropertyType(propertyHost, { propertyName: "outerStruct", accessors: ["innerStruct", "doubles", 0] })).to.equal("quantity");
341
+ expect(getPropertyType(propertyHost, { propertyName: "outerStruct", accessors: ["innerStruct", "bool"] })).to.equal("boolean");
342
+ propertyHost.schemaName = "BisCore";
343
+ propertyHost.className = "GeometricElement3d";
344
+ expect(getPropertyType(propertyHost, "LastMod")).to.equal("datetime");
345
+ expect(getPropertyType(propertyHost, "FederationGuid")).to.equal("string");
346
+ });
347
+ it("returns undefined for non-primitive properties", () => {
348
+ const propertyHost = { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" };
349
+ expect(getPropertyType(propertyHost, "outerStruct")).to.equal(undefined);
350
+ expect(getPropertyType(propertyHost, "outerStructs")).to.equal(undefined);
351
+ });
352
+ it("returns undefined for invalid property paths", () => {
353
+ const propertyHost = { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" };
354
+ expect(getPropertyType(propertyHost, "unknownPropertyName")).to.be.undefined;
355
+ });
356
+ it("should return undefined for unsupported primitive types", () => {
357
+ const host = { elementId: sourceElementId, schemaName: "BisCore", className: "GeometricElement3d" };
358
+ expect(getPropertyType(host, "GeometryStream")).to.be.undefined;
359
+ });
305
360
  });
306
361
  describe("updateFields", () => {
307
362
  it("recomputes cached content", () => {
308
- const textBlock = TextBlock.create({ styleId: "0x123" });
363
+ const textBlock = TextBlock.create();
309
364
  const fieldRun = FieldRun.create({
310
365
  propertyHost: { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" },
311
366
  propertyPath: { propertyName: "intProp" },
@@ -318,7 +373,7 @@ describe("Field evaluation", () => {
318
373
  expect(fieldRun.cachedContent).to.equal("100"); // `intProp` value from the test element
319
374
  });
320
375
  it("does not update a field if recomputed content matches cached content", () => {
321
- const textBlock = TextBlock.create({ styleId: "0x123" });
376
+ const textBlock = TextBlock.create();
322
377
  const fieldRun = FieldRun.create({
323
378
  propertyHost: { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" },
324
379
  propertyPath: { propertyName: "intProp" },
@@ -331,7 +386,7 @@ describe("Field evaluation", () => {
331
386
  expect(fieldRun.cachedContent).to.equal("100");
332
387
  });
333
388
  it("returns the number of fields updated", () => {
334
- const textBlock = TextBlock.create({ styleId: "0x123" });
389
+ const textBlock = TextBlock.create();
335
390
  const fieldRun1 = FieldRun.create({
336
391
  propertyHost: { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" },
337
392
  propertyPath: { propertyName: "intProp" },
@@ -361,6 +416,7 @@ describe("Field evaluation", () => {
361
416
  angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
362
417
  },
363
418
  classFullName: TextAnnotation3d.classFullName,
419
+ defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x123").toJSON(),
364
420
  }, imodel);
365
421
  if (textBlock) {
366
422
  const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });
@@ -395,7 +451,7 @@ describe("Field evaluation", () => {
395
451
  expect(relationship.sourceId).to.equal(sourceElementId);
396
452
  expect(relationship.targetId).to.equal(targetId);
397
453
  });
398
- function createField(propertyHost, cachedContent, propertyName = "intProp", accessors, jsonAccessors) {
454
+ function createField(propertyHost, cachedContent, propertyName = "intProp", accessors) {
399
455
  if (typeof propertyHost === "string") {
400
456
  propertyHost = { schemaName: "Fields", className: "TestElement", elementId: propertyHost };
401
457
  }
@@ -403,13 +459,13 @@ describe("Field evaluation", () => {
403
459
  styleOverrides: { fontName: "Karla" },
404
460
  propertyHost,
405
461
  cachedContent,
406
- propertyPath: { propertyName, accessors, jsonAccessors },
462
+ propertyPath: { propertyName, accessors },
407
463
  });
408
464
  }
409
465
  describe("updateFieldDependencies", () => {
410
466
  it("creates exactly one relationship for each unique source element on insert and update", () => {
411
467
  const source1 = insertTestElement();
412
- const block = TextBlock.create({ styleId: "0x123" });
468
+ const block = TextBlock.create();
413
469
  block.appendRun(createField(source1, "1"));
414
470
  const targetId = insertAnnotationElement(block);
415
471
  imodel.saveChanges();
@@ -437,7 +493,7 @@ describe("Field evaluation", () => {
437
493
  it("deletes stale relationships", () => {
438
494
  const sourceA = insertTestElement();
439
495
  const sourceB = insertTestElement();
440
- const block = TextBlock.create({ styleId: "0x123" });
496
+ const block = TextBlock.create();
441
497
  block.appendRun(createField(sourceA, "A"));
442
498
  block.appendRun(createField(sourceB, "B"));
443
499
  const targetId = insertAnnotationElement(block);
@@ -447,14 +503,16 @@ describe("Field evaluation", () => {
447
503
  expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;
448
504
  const target = imodel.elements.getElement(targetId);
449
505
  const anno = target.getAnnotation();
450
- anno.textBlock.paragraphs[0].runs.shift();
506
+ // Remove the sourceA FieldRun from the first paragraph.
507
+ const p1 = anno.textBlock.children[0];
508
+ p1.children.shift();
451
509
  target.setAnnotation(anno);
452
510
  target.update();
453
511
  imodel.saveChanges();
454
512
  expectNumRelationships(1, targetId);
455
513
  expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;
456
514
  expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;
457
- anno.textBlock.paragraphs.length = 0;
515
+ anno.textBlock.children.length = 0;
458
516
  anno.textBlock.appendRun(createField(sourceA, "A2"));
459
517
  target.setAnnotation(anno);
460
518
  target.update();
@@ -462,7 +520,7 @@ describe("Field evaluation", () => {
462
520
  expectNumRelationships(1, targetId);
463
521
  expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;
464
522
  expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;
465
- anno.textBlock.paragraphs.length = 0;
523
+ anno.textBlock.children.length = 0;
466
524
  anno.textBlock.appendRun(TextRun.create({
467
525
  styleOverrides: { fontName: "Karla" },
468
526
  content: "not a field",
@@ -476,7 +534,7 @@ describe("Field evaluation", () => {
476
534
  });
477
535
  it("ignores invalid source element Ids", () => {
478
536
  const source = insertTestElement();
479
- const block = TextBlock.create({ styleId: "0x123" });
537
+ const block = TextBlock.create();
480
538
  block.appendRun(createField(Id64.invalid, "invalid"));
481
539
  block.appendRun(createField("0xbaadf00d", "non-existent"));
482
540
  block.appendRun(createField(source, "valid"));
@@ -491,9 +549,19 @@ describe("Field evaluation", () => {
491
549
  const actual = anno.textBlock.stringify();
492
550
  expect(actual).to.equal(expected);
493
551
  }
552
+ it("evaluates cachedContent when annotation element is inserted", () => {
553
+ const sourceId = insertTestElement();
554
+ const block = TextBlock.create();
555
+ block.appendRun(createField(sourceId, "initial cached content"));
556
+ expect(block.stringify()).to.equal("initial cached content");
557
+ const targetId = insertAnnotationElement(block);
558
+ imodel.saveChanges();
559
+ const target = imodel.elements.getElement(targetId);
560
+ expect(target.getAnnotation().textBlock.stringify()).to.equal("100");
561
+ });
494
562
  it("updates fields when source element is modified or deleted", () => {
495
563
  const sourceId = insertTestElement();
496
- const block = TextBlock.create({ styleId: "0x123" });
564
+ const block = TextBlock.create();
497
565
  block.appendRun(createField(sourceId, "old value"));
498
566
  ;
499
567
  const targetId = insertAnnotationElement(block);
@@ -516,7 +584,7 @@ describe("Field evaluation", () => {
516
584
  });
517
585
  it("updates fields when source element aspect is modified, deleted, or recreated", () => {
518
586
  const sourceId = insertTestElement();
519
- const block = TextBlock.create({ styleId: "0x123" });
587
+ const block = TextBlock.create();
520
588
  block.appendRun(createField({ elementId: sourceId, schemaName: "Fields", className: "TestAspect" }, "", "aspectProp"));
521
589
  const targetId = insertAnnotationElement(block);
522
590
  imodel.saveChanges();
@@ -544,7 +612,7 @@ describe("Field evaluation", () => {
544
612
  it("updates only fields for specific modified element", () => {
545
613
  const sourceA = insertTestElement();
546
614
  const sourceB = insertTestElement();
547
- const block = TextBlock.create({ styleId: "0x123" });
615
+ const block = TextBlock.create();
548
616
  block.appendRun(createField(sourceA, "A"));
549
617
  block.appendRun(createField(sourceB, "B"));
550
618
  const targetId = insertAnnotationElement(block);
@@ -558,18 +626,67 @@ describe("Field evaluation", () => {
558
626
  });
559
627
  it("supports complex property paths", () => {
560
628
  const sourceId = insertTestElement();
561
- const block = TextBlock.create({ styleId: "0x123" });
629
+ const block = TextBlock.create();
562
630
  block.appendRun(createField(sourceId, "", "outerStruct", ["innerStructs", 1, "doubles", -2]));
563
- block.appendRun(createField(sourceId, "", "jsonProperties", undefined, ["zoo", "birds", 0, "name"]));
564
631
  const targetId = insertAnnotationElement(block);
565
632
  imodel.saveChanges();
566
- expectText("2duck", targetId);
633
+ expectText("2", targetId);
567
634
  const source = imodel.elements.getElement(sourceId);
568
635
  source.outerStruct.innerStructs[1].doubles[3] = 12.5;
569
- source.jsonProperties.zoo.birds[0].name = "parrot";
570
636
  source.update();
571
637
  imodel.saveChanges();
572
- expectText("12.5parrot", targetId);
638
+ expectText("12.5", targetId);
639
+ });
640
+ });
641
+ describe("Format Validation", () => {
642
+ it("validates formatting options for string property type", () => {
643
+ // Create a FieldRun with string property type and some format options
644
+ const fieldRun = FieldRun.create({
645
+ propertyHost: { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" },
646
+ propertyPath: { propertyName: "strings", accessors: [0] },
647
+ cachedContent: "oldValue",
648
+ formatOptions: {
649
+ case: "upper",
650
+ prefix: "Value: ",
651
+ suffix: "!"
652
+ }
653
+ });
654
+ // Context returns a string value for the property
655
+ const context = {
656
+ hostElementId: sourceElementId,
657
+ getProperty: () => { return { value: "abc", type: "string" }; },
658
+ };
659
+ // Update the field and check the result
660
+ const updated = updateField(fieldRun, context);
661
+ // The formatted value should be uppercased and have prefix/suffix applied
662
+ expect(updated).to.be.true;
663
+ expect(fieldRun.cachedContent).to.equal("Value: ABC!");
664
+ });
665
+ it("validates formatting options for datetime objects", function () {
666
+ if (!isIntlSupported()) {
667
+ this.skip();
668
+ }
669
+ const propertyHost = { elementId: sourceElementId, schemaName: "Fields", className: "TestElement" };
670
+ const fieldRun = FieldRun.create({
671
+ propertyHost,
672
+ propertyPath: { propertyName: "datetime" },
673
+ cachedContent: "oldval",
674
+ formatOptions: {
675
+ dateTime: {
676
+ formatOptions: {
677
+ month: "short",
678
+ day: "2-digit",
679
+ year: "numeric",
680
+ timeZone: "UTC"
681
+ },
682
+ locale: "en-US",
683
+ },
684
+ },
685
+ });
686
+ const context = createUpdateContext(sourceElementId, imodel, false);
687
+ const updated = updateField(fieldRun, context);
688
+ expect(updated).to.be.true;
689
+ expect(fieldRun.cachedContent).to.equal("Aug 28, 2025");
573
690
  });
574
691
  });
575
692
  });