@itwin/ecschema-rpcinterface-tests 5.13.0-dev.1 → 5.13.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.
@@ -85326,7 +85326,7 @@ class BriefcaseConnection extends _IModelConnection__WEBPACK_IMPORTED_MODULE_5__
85326
85326
  */
85327
85327
  async pushChanges(description) {
85328
85328
  this.requireTimeline();
85329
- return _IpcApp__WEBPACK_IMPORTED_MODULE_6__.IpcApp.appFunctionIpc.pushChanges(this.key, description);
85329
+ return this.changeset = await _IpcApp__WEBPACK_IMPORTED_MODULE_6__.IpcApp.appFunctionIpc.pushChanges(this.key, description);
85330
85330
  }
85331
85331
  /** The current graphical editing scope, if one is in progress.
85332
85332
  * @see [[enterEditingScope]] to begin graphical editing.
@@ -187447,8 +187447,17 @@ class ToolAdmin {
187447
187447
  }
187448
187448
  /** Handler for keyboard events. */
187449
187449
  static _keyEventHandler = (ev) => {
187450
- if (!ev.repeat) // we don't want repeated keyboard events. If we keep them they interfere with replacing mouse motion events, since they come as a stream.
187450
+ // we don't want repeated keyboard events. If we keep them they interfere with replacing mouse motion events, since they come as a stream.
187451
+ if (!ev.repeat) {
187452
+ // Suppress default browser behavior for iTwin.js Ctrl shortcuts (Z, Y, C, X, V, F2) on keydown when focus allows.
187453
+ if (ev.type === "keydown" && !ev.isComposing && !ev.defaultPrevented) {
187454
+ if (_IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.toolAdmin.isCtrlKeyShortcut(ev) && _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.toolAdmin.isFocusValidForShortcuts()) {
187455
+ if (_IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.toolAdmin.shouldPreventCtrlDefault(ev))
187456
+ ev.preventDefault();
187457
+ }
187458
+ }
187451
187459
  ToolAdmin.addEvent(ev);
187460
+ }
187452
187461
  };
187453
187462
  /** Handler for modifier key transitions captured before focused UI elements can stop propagation. */
187454
187463
  static _keyEventCaptureHandler = async (event) => {
@@ -188245,9 +188254,6 @@ class ToolAdmin {
188245
188254
  static isContextMenuOpen() {
188246
188255
  return document.querySelector(".core-context-menu-opened") !== null;
188247
188256
  }
188248
- static isElement(target) {
188249
- return target instanceof Element;
188250
- }
188251
188257
  static isEditable(element) {
188252
188258
  const tagName = element.tagName.toLowerCase();
188253
188259
  const editableTags = ["input", "textarea", "select"];
@@ -188257,6 +188263,11 @@ class ToolAdmin {
188257
188263
  return true;
188258
188264
  return false;
188259
188265
  }
188266
+ /** Check if there is currently an active text selection on the page. */
188267
+ static hasActiveTextSelection() {
188268
+ const selection = window.getSelection();
188269
+ return selection !== null && selection.toString().length > 0;
188270
+ }
188260
188271
  static getModifierKey(event) {
188261
188272
  switch (event.key) {
188262
188273
  case "Alt": return _Tool__WEBPACK_IMPORTED_MODULE_13__.BeModifierKeys.Alt;
@@ -188265,22 +188276,75 @@ class ToolAdmin {
188265
188276
  }
188266
188277
  return _Tool__WEBPACK_IMPORTED_MODULE_13__.BeModifierKeys.None;
188267
188278
  }
188279
+ /** Check if focus allows shortcuts to run — i.e., focus is Home or AccuDraw, or focus is not on an editable element and context menu is not open.
188280
+ * Called synchronously in _keyEventHandler to decide whether to call preventDefault(), and in onKeyTransition to gate shortcut processing.
188281
+ * @return true to allow shortcuts
188282
+ */
188283
+ isFocusValidForShortcuts() {
188284
+ // Always allow shortcuts when focus is Home (document.body) or AccuDraw has focus
188285
+ if (ToolAdmin.isFocusHome() || undefined !== _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.accuDraw.getFocusItem())
188286
+ return true;
188287
+ // Block shortcuts when context menu is open or focus is on an editable element
188288
+ if (ToolAdmin.isContextMenuOpen())
188289
+ return false;
188290
+ const active = document.activeElement;
188291
+ if (active !== null && ToolAdmin.isEditable(active))
188292
+ return false;
188293
+ return true;
188294
+ }
188295
+ /** Check if a key is part of a Ctrl key shortcut handled by iTwin.js (Ctrl+Z, Ctrl+Y, Ctrl+C, Ctrl+X, Ctrl+V, Ctrl+F2).
188296
+ * @note Subclasses can override to add custom Ctrl shortcuts and handle them with onCtrlKeyPressed.
188297
+ * @return true if key is a Ctrl key shortcut
188298
+ */
188299
+ isCtrlKeyShortcut(keyEvent) {
188300
+ if (!keyEvent.ctrlKey || keyEvent.altKey || keyEvent.metaKey)
188301
+ return false;
188302
+ const lower = keyEvent.key.toLowerCase();
188303
+ return (lower === "z" || lower === "y" || lower === "c" || lower === "x" || lower === "v" || lower === "f2");
188304
+ }
188305
+ /** Determine if the default browser action should be prevented for a Ctrl key shortcut.
188306
+ * By default, allows browser copy/cut of selected text to work naturally, and prevents paste.
188307
+ * Only called when focus is valid for shortcuts (Home, AccuDraw, not on an editable element, context menu not open).
188308
+ * @note This is called from _keyEventHandler to decide whether to call preventDefault().
188309
+ * @note Subclasses can override to customize preventDefault behavior for Ctrl shortcuts.
188310
+ * @return true if preventDefault() should be called; false to allow browser default
188311
+ */
188312
+ shouldPreventCtrlDefault(keyEvent) {
188313
+ const lower = keyEvent.key.toLowerCase();
188314
+ // For copy/cut, only prevent if no active text selection (allow browser to handle text operations)
188315
+ if (lower === "c" || lower === "x") {
188316
+ return !ToolAdmin.hasActiveTextSelection();
188317
+ }
188318
+ // Prevent default for all other iTwin.js shortcuts (z, y, v, F2, custom)
188319
+ // Caller already checked that focus is valid for shortcuts, so v (paste) should be prevented
188320
+ return true;
188321
+ }
188268
188322
  /** Process key down events while the Ctrl key is pressed */
188269
188323
  async onCtrlKeyPressed(keyEvent) {
188270
188324
  let handled = false;
188271
188325
  let result = false;
188272
- switch (keyEvent.key) {
188326
+ switch (keyEvent.key.toLowerCase()) {
188273
188327
  case "z":
188274
- case "Z":
188275
188328
  result = await this.doUndoOperation();
188276
188329
  handled = true;
188277
188330
  break;
188278
188331
  case "y":
188279
- case "Y":
188280
188332
  result = await this.doRedoOperation();
188281
188333
  handled = true;
188282
188334
  break;
188283
- case "F2":
188335
+ case "c":
188336
+ case "x":
188337
+ // If browser already handled copy/cut (text was selected, so default was not prevented),
188338
+ // mark as handled to skip processShortcutKey.
188339
+ if (!keyEvent.defaultPrevented) {
188340
+ handled = true;
188341
+ }
188342
+ break;
188343
+ case "v":
188344
+ // Paste is prevented when focus is valid for shortcuts; processShortcutKey can handle Ctrl+V.
188345
+ // When not prevented (e.g., in editable element), browser handles naturally.
188346
+ break;
188347
+ case "f2":
188284
188348
  result = _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.uiAdmin.showKeyinPalette();
188285
188349
  handled = true;
188286
188350
  break;
@@ -188294,27 +188358,22 @@ class ToolAdmin {
188294
188358
  return false;
188295
188359
  }
188296
188360
  /** Event for every key down and up transition.
188297
- * @note Called before processShortcutKey.
188361
+ * @note Called before Ctrl shortcut and focus checks in onKeyTransition.
188362
+ * For custom Ctrl shortcuts, override isCtrlKeyShortcut and onCtrlKeyPressed.
188363
+ * For other shortcuts, override processShortcutKey.
188298
188364
  * @return true if handled and no further processing of event should occur.
188299
188365
  */
188300
188366
  processKeyboardEvent(keyEvent, _wentDown) {
188301
- if (ToolAdmin.isFocusHome() || undefined !== _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.accuDraw.getFocusItem())
188302
- return false; // Focus is Home or AccuDraw, allow shortcuts...
188303
- if (keyEvent.defaultPrevented || keyEvent.isComposing)
188304
- return true; // Respect UI handling / IME composition; don't process shortcuts
188305
188367
  // NOTE: Provide a convenient way for the user to move focus to Home to use shortcuts.
188306
188368
  // Escape is the only practical choice with its default behavior that can cancel/close/blur.
188307
188369
  // Intentionally not checking wentDown as some ui elements stop propagation of down but not up (moving to capture is not a good option).
188308
188370
  // Apps that want to use Escape to start the default tool still can with Home focus in processShortcutKey.
188309
- if (keyEvent.key === "Escape" && _ToolSettings__WEBPACK_IMPORTED_MODULE_14__.ToolSettings.escapeMovesFocusToHome) {
188371
+ // Let AccuDraw handle Escape when it has focus—AccuDrawViewportUI.onKeyboardEvent manages this directly.
188372
+ if (keyEvent.key === "Escape" && _ToolSettings__WEBPACK_IMPORTED_MODULE_14__.ToolSettings.escapeMovesFocusToHome && !ToolAdmin.isFocusHome() && undefined === _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.accuDraw.getFocusItem()) {
188310
188373
  ToolAdmin.setFocusHome();
188311
188374
  return true;
188312
188375
  }
188313
- if (ToolAdmin.isContextMenuOpen())
188314
- return true; // Don't allow shortcuts if context menu is open...
188315
- if (ToolAdmin.isElement(keyEvent.target) && ToolAdmin.isEditable(keyEvent.target))
188316
- return true; // Don't allow shortcuts when event target is editable...
188317
- return false;
188376
+ return false; // Not handled; continue processing
188318
188377
  }
188319
188378
  /** Need to check for modifier changes on capture phase as a ui element that calls stopPropagation
188320
188379
  * prevents onKeyTransition from being called when bubbling.
@@ -188328,9 +188387,24 @@ class ToolAdmin {
188328
188387
  /** Event for every key down and up transition. */
188329
188388
  async onKeyTransition(event, wentDown) {
188330
188389
  const keyEvent = event.ev;
188390
+ // Respect IME composition; don't process shortcuts
188391
+ if (keyEvent.isComposing)
188392
+ return _Tool__WEBPACK_IMPORTED_MODULE_13__.EventHandled.Yes;
188331
188393
  if (this.processKeyboardEvent(keyEvent, wentDown))
188332
188394
  return _Tool__WEBPACK_IMPORTED_MODULE_13__.EventHandled.Yes;
188333
- if (wentDown && keyEvent.ctrlKey) {
188395
+ // Respect if any other handler has handled this event, except for Ctrl shortcuts we manage ourselves.
188396
+ // _keyEventHandler calls preventDefault() for our Ctrl shortcuts, but defaultPrevented should not block them.
188397
+ // For all other keys, defaultPrevented signals that another UI handler has claimed the event.
188398
+ // Exception: AccuDraw's input fields call preventDefault() but still want shortcuts to flow through.
188399
+ const isCtrlShortcut = wentDown && this.isCtrlKeyShortcut(keyEvent);
188400
+ const hasAccuDrawFocus = undefined !== _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.accuDraw.getFocusItem();
188401
+ if (keyEvent.defaultPrevented && !isCtrlShortcut && !hasAccuDrawFocus)
188402
+ return _Tool__WEBPACK_IMPORTED_MODULE_13__.EventHandled.Yes; // Respect other UI handling
188403
+ // Check if focus is valid for shortcuts (Home, AccuDraw, not editable, no context menu)
188404
+ if (!this.isFocusValidForShortcuts())
188405
+ return _Tool__WEBPACK_IMPORTED_MODULE_13__.EventHandled.No; // Focus is on an editable element or context menu is open; don't allow shortcuts
188406
+ // Process Ctrl shortcuts if focus is valid
188407
+ if (isCtrlShortcut) {
188334
188408
  const { handled, result } = await this.onCtrlKeyPressed(keyEvent);
188335
188409
  if (handled)
188336
188410
  return result;
@@ -333829,7 +333903,7 @@ var loadLanguages = instance.loadLanguages;
333829
333903
  (module) {
333830
333904
 
333831
333905
  "use strict";
333832
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@itwin/core-frontend","version":"5.13.0-dev.1","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm && npm run -s webpackWorkers && npm run -s copy:workers && npm run -s copy:draco","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2022 --outDir lib/esm","clean":"rimraf -g lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","copy:workers":"cpx \\"./lib/workers/webpack/parse-imdl-worker.js\\" ./lib/public/scripts","copy:draco":"cpx \\"./node_modules/@loaders.gl/draco/dist/libs/*\\" ./lib/public/scripts","docs":"betools docs --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts && npm run -s extract","extract":"betools extract --fileExt=ts --extractFrom=./src/test/example-code --recursive --out=../../generated-docs/extract","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-inline-config -c extraction.eslint.config.js \\"./src/**/*.ts\\" 1>&2","lint":"eslint \\"./src/**/*.ts\\" 1>&2","lint-fix":"eslint --fix -f visualstudio \\"./src/**/*.ts\\" 1>&2","lint-deprecation":"eslint --fix -f visualstudio --no-inline-config -c ../../common/config/eslint/eslint.config.deprecation-policy.js \\"./src/**/*.ts\\"","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run webpackTestWorker && vitest --run","cover":"npm run webpackTestWorker && vitest --run","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2 && npm run -s webpackTestWorker","webpackTestWorker":"webpack --config ./src/test/worker/webpack.config.js 1>&2 && cpx \\"./lib/test/test-worker.js\\" ./lib/test","webpackWorkers":"webpack --config ./src/workers/ImdlParser/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core.git","directory":"core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@bentley/aec-units-schema":"^1.0.3","@bentley/formats-schema":"^1.0.0","@bentley/units-schema":"^1.0.10","@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*","@itwin/object-storage-core":"^3.0.4","@itwin/eslint-plugin":"^6.0.0","@types/chai-as-promised":"^7","@types/draco3d":"^1.4.10","@types/node":"~20.17.0","@types/sinon":"^17.0.2","@vitest/browser-playwright":"^4.1.10","@vitest/coverage-v8":"^4.1.10","cpx2":"^8.0.0","eslint":"^9.31.0","glob":"^10.5.0","playwright":"~1.56.1","rimraf":"^6.0.1","sinon":"^17.0.2","source-map-loader":"^5.0.0","typescript":"~5.6.2","vitest":"^4.1.10","vite-multiple-assets":"^1.3.1","vite-plugin-static-copy":"2.2.0","webpack":"^5.97.1"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/core-i18n":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@loaders.gl/core":"~4.3.4","@loaders.gl/draco":"~4.3.4","fuse.js":"^3.3.0","wms-capabilities":"0.4.0"}}');
333906
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@itwin/core-frontend","version":"5.13.0-dev.2","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm && npm run -s webpackWorkers && npm run -s copy:workers && npm run -s copy:draco","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2022 --outDir lib/esm","clean":"rimraf -g lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","copy:workers":"cpx \\"./lib/workers/webpack/parse-imdl-worker.js\\" ./lib/public/scripts","copy:draco":"cpx \\"./node_modules/@loaders.gl/draco/dist/libs/*\\" ./lib/public/scripts","docs":"betools docs --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts && npm run -s extract","extract":"betools extract --fileExt=ts --extractFrom=./src/test/example-code --recursive --out=../../generated-docs/extract","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-inline-config -c extraction.eslint.config.js \\"./src/**/*.ts\\" 1>&2","lint":"eslint \\"./src/**/*.ts\\" 1>&2","lint-fix":"eslint --fix -f visualstudio \\"./src/**/*.ts\\" 1>&2","lint-deprecation":"eslint --fix -f visualstudio --no-inline-config -c ../../common/config/eslint/eslint.config.deprecation-policy.js \\"./src/**/*.ts\\"","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run webpackTestWorker && vitest --run","cover":"npm run webpackTestWorker && vitest --run","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2 && npm run -s webpackTestWorker","webpackTestWorker":"webpack --config ./src/test/worker/webpack.config.js 1>&2 && cpx \\"./lib/test/test-worker.js\\" ./lib/test","webpackWorkers":"webpack --config ./src/workers/ImdlParser/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core.git","directory":"core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@bentley/aec-units-schema":"^1.0.3","@bentley/formats-schema":"^1.0.0","@bentley/units-schema":"^1.0.10","@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*","@itwin/object-storage-core":"^3.0.4","@itwin/eslint-plugin":"^6.0.0","@types/chai-as-promised":"^7","@types/draco3d":"^1.4.10","@types/node":"~20.17.0","@types/sinon":"^17.0.2","@vitest/browser-playwright":"^4.1.10","@vitest/coverage-v8":"^4.1.10","cpx2":"^8.0.0","eslint":"^9.31.0","glob":"^13.0.6","playwright":"~1.56.1","rimraf":"^6.0.1","sinon":"^17.0.2","source-map-loader":"^5.0.0","typescript":"~5.6.2","vitest":"^4.1.10","vite-multiple-assets":"^1.3.1","vite-plugin-static-copy":"2.2.0","webpack":"^5.97.1"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/core-i18n":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@loaders.gl/core":"~4.3.4","@loaders.gl/draco":"~4.3.4","fuse.js":"^3.3.0","wms-capabilities":"0.4.0"}}');
333833
333907
 
333834
333908
  /***/ }
333835
333909