@itwin/core-backend 5.2.0-dev.8 → 5.3.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/BackendHubAccess.d.ts +2 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
- package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js +6 -0
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +57 -3
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +151 -42
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +4 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +8 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +22 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
- package/lib/cjs/GeographicCRSServices.js +2 -0
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +54 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +87 -9
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +11 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +5 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +11 -0
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +175 -0
- package/lib/cjs/StashManager.d.ts.map +1 -0
- package/lib/cjs/StashManager.js +306 -0
- package/lib/cjs/StashManager.js.map +1 -0
- package/lib/cjs/TxnManager.d.ts +226 -15
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +249 -23
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +15 -6
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +5 -4
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +52 -24
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +49 -59
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js +8 -0
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.d.ts +49 -36
- package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js +204 -135
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.d.ts +2 -12
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +49 -45
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +2 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.d.ts +6 -0
- package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/esm/BackendLoggerCategory.js +6 -0
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +57 -3
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +152 -43
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +4 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts +8 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +22 -0
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
- package/lib/esm/GeographicCRSServices.js +2 -0
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +54 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +88 -10
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +11 -1
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +5 -0
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.d.ts +8 -0
- package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/esm/SqliteChangesetReader.js +11 -0
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/StashManager.d.ts +175 -0
- package/lib/esm/StashManager.d.ts.map +1 -0
- package/lib/esm/StashManager.js +301 -0
- package/lib/esm/StashManager.js.map +1 -0
- package/lib/esm/TxnManager.d.ts +226 -15
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +247 -21
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +13 -5
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +5 -4
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +52 -24
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +51 -61
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js +8 -0
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.d.ts +49 -36
- package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js +205 -136
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.d.ts +2 -12
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +51 -47
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js +6 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +163 -46
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +12 -10
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +299 -43
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js +453 -86
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +71 -1
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +640 -0
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +131 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- 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;
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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("
|
|
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.
|
|
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
|
});
|