From f4b45b5a7f9b4cb851b56ef641ec38700c2d2df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20P=C3=B6mp?= Date: Wed, 25 Oct 2023 17:51:29 +0200 Subject: [PATCH] refactor(octra): show changes on audio viewer while dragging --- .../annotation/annotation.reducer.ts | 3 - .../2D-editor/2D-editor.component.html | 1 - .../editors/2D-editor/2D-editor.component.ts | 4 - libs/annotation/src/lib/annotation.ts | 18 + libs/annotation/src/lib/annotjson.ts | 10 + .../audio-viewer/audio-viewer.component.ts | 22 +- .../audio-viewer/audio-viewer.service.ts | 416 +++++++++--------- libs/web-media/src/lib/audio/audio-manager.ts | 22 +- package-lock.json | 22 +- package.json | 2 +- 10 files changed, 267 insertions(+), 253 deletions(-) diff --git a/apps/octra/src/app/core/store/login-mode/annotation/annotation.reducer.ts b/apps/octra/src/app/core/store/login-mode/annotation/annotation.reducer.ts index 31a89b43a..a885b44b7 100644 --- a/apps/octra/src/app/core/store/login-mode/annotation/annotation.reducer.ts +++ b/apps/octra/src/app/core/store/login-mode/annotation/annotation.reducer.ts @@ -286,9 +286,6 @@ export class AnnotationStateReducers { if (currentLevel) { for (const item of items) { - console.log( - `change ${item.id} to ${(item as any).time.seconds}` - ); state.transcript = state.transcript .clone() .changeCurrentItemById(item.id, item); diff --git a/apps/octra/src/app/editors/2D-editor/2D-editor.component.html b/apps/octra/src/app/editors/2D-editor/2D-editor.component.html index 461749fa8..2a5f6cf8e 100644 --- a/apps/octra/src/app/editors/2D-editor/2D-editor.component.html +++ b/apps/octra/src/app/editors/2D-editor/2D-editor.component.html @@ -55,7 +55,6 @@ [refreshOnInternChanges]="false" [annotation]="annotationStoreService.transcript!" (currentLevelChange)="onCurrentLevelChange($event)" - (boundaryDragging)="onBoundaryDragged($event)" id="special" style="height: 400px; display: flex; flex: auto; flex-direction: column" > diff --git a/apps/octra/src/app/editors/2D-editor/2D-editor.component.ts b/apps/octra/src/app/editors/2D-editor/2D-editor.component.ts index 9b149fd84..ffbd1d70c 100644 --- a/apps/octra/src/app/editors/2D-editor/2D-editor.component.ts +++ b/apps/octra/src/app/editors/2D-editor/2D-editor.component.ts @@ -1092,8 +1092,4 @@ export class TwoDEditorComponent ); } } - - onBoundaryDragged($event: any) { - console.log($event); - } } diff --git a/libs/annotation/src/lib/annotation.ts b/libs/annotation/src/lib/annotation.ts index 0a258c8e1..589c01468 100644 --- a/libs/annotation/src/lib/annotation.ts +++ b/libs/annotation/src/lib/annotation.ts @@ -716,6 +716,14 @@ export class OctraAnnotationLevel, S extends OItem> { return this; } + + getLeftSibling(item: S) { + return this.level.getLeftSibling(item); + } + + getRightSibling(item: S) { + return this.level.getRightSibling(item); + } } export class OctraAnnotationSegmentLevel< @@ -864,6 +872,16 @@ export class OctraAnnotationEventLevel { return this; } + + getLeftSibling(item: OctraAnnotationEvent) { + const index = this.items.findIndex((a) => a.id === item.id); + return index > 0 ? this.items[index - 1] : undefined; + } + + getRightSibling(item: OctraAnnotationEvent) { + const index = this.items.findIndex((a) => a.id === item.id); + return index > -1 && index < this.items.length - 1 ? this.items[index + 1] : undefined; + } } export type OctraAnnotationAnyLevel< diff --git a/libs/annotation/src/lib/annotjson.ts b/libs/annotation/src/lib/annotjson.ts index d91126d66..944a87b30 100644 --- a/libs/annotation/src/lib/annotjson.ts +++ b/libs/annotation/src/lib/annotjson.ts @@ -161,6 +161,16 @@ export class OLevel implements ILevel { this.items.map((a) => a.clone()) ); } + + getLeftSibling(item: OItem): T | undefined { + const index = this.items.findIndex((a) => a.id === item.id); + return index > 0 ? this.items[index - 1] : undefined; + } + + getRightSibling(item: OItem): T | undefined { + const index = this.items.findIndex((a) => a.id === item.id); + return index > -1 && index < this.items.length - 1 ? this.items[index + 1] : undefined; + } } export class OSegmentLevel diff --git a/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.component.ts b/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.component.ts index 3e59b5bd7..4df9c3f18 100644 --- a/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.component.ts +++ b/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.component.ts @@ -118,6 +118,19 @@ export class AudioViewerComponent implements OnInit, OnChanges, OnDestroy { 'cursor', 'auto' ); + } + + if (event.status === 'dragging') { + this.subscrManager.add( + timer(0).subscribe({ + next: () => { + this.refresh(); + }, + }) + ); + } + + if (['stopped', 'started'].includes(event.status)) { if (this.refreshOnInternChanges) { this.refresh(); } @@ -1741,7 +1754,7 @@ export class AudioViewerComponent implements OnInit, OnChanges, OnDestroy { boundaryObj.on('mousedown', () => { if (!this.settings.boundaries.readonly) { - this.av.dragableBoundaryNumber = boundary.num; + this.av.dragableBoundaryID = boundary.id; } }); boundaryObj.on('mouseenter', () => { @@ -1914,6 +1927,7 @@ export class AudioViewerComponent implements OnInit, OnChanges, OnDestroy { context.fillStrokeShape(shape); } }; + private overlaySceneFunction = ( lineInterval: { from: number; @@ -2495,7 +2509,7 @@ export class AudioViewerComponent implements OnInit, OnChanges, OnDestroy { } this.av.setMouseMovePosition(absXPos); - if (this.av.dragableBoundaryNumber < 0) { + if (this.av.dragableBoundaryID < 0) { this.drawWholeSelection(); } @@ -2512,7 +2526,9 @@ export class AudioViewerComponent implements OnInit, OnChanges, OnDestroy { const shortcutInfo = this.shortcutsManager.checkKeyEvent(event, Date.now()); this.av.shiftPressed = - event.keyCode === 16 || event.code?.includes('Shift') || event.key?.includes('Shift'); + event.keyCode === 16 || + event.code?.includes('Shift') || + event.key?.includes('Shift'); if (shortcutInfo !== undefined) { const comboKey = shortcutInfo.shortcut; diff --git a/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.service.ts b/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.service.ts index 50a148a5c..816084ead 100644 --- a/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.service.ts +++ b/libs/ngx-components/src/lib/components/audio/audio-viewer/audio-viewer.service.ts @@ -71,6 +71,7 @@ export class AudioViewerService { currentLevelID?: number; annotation?: OctraAnnotation; + tempAnnotation?: OctraAnnotation; // AUDIO protected audioPxW = 0; @@ -132,21 +133,23 @@ export class AudioViewerService { this.playcursor = playcursor; } - private _dragableBoundaryNumber = -1; + private _dragableBoundaryID = -1; - get dragableBoundaryNumber(): number { - return this._dragableBoundaryNumber; + get dragableBoundaryID(): number { + return this._dragableBoundaryID; } - set dragableBoundaryNumber(value: number) { - if (value > -1 && this._dragableBoundaryNumber === -1) { + set dragableBoundaryID(value: number) { + if (value > -1 && this._dragableBoundaryID === -1) { // started + this.tempAnnotation = this.annotation; + console.log(`boundary ${value} started dragging`); this._boundaryDragging.next({ shiftPressed: this.shiftPressed, status: 'started', }); } - this._dragableBoundaryNumber = value; + this._dragableBoundaryID = value; } private _zoomY = 1; @@ -239,7 +242,7 @@ export class AudioViewerService { if (!this.audioManager.isPlaying) { // same line // fix margin settings - if ($event.type === 'mousedown' && !this.shiftPressed) { + if ($event.type === 'mousedown') { // no line defined or same line this.mouseClickPos = absXInTime.clone(); @@ -250,29 +253,19 @@ export class AudioViewerService { this._drawnSelection = this.audioChunk.selection.clone(); } - if (this._dragableBoundaryNumber > -1) { - const segmentBefore = ( - this._dragableBoundaryNumber > 0 - ? this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - 1 - ] - : this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - ] - ) as OctraAnnotationSegment; + if (this._dragableBoundaryID > -1) { + const currentLevel = this + .currentLevel as OctraAnnotationSegmentLevel; + const segmentBefore = currentLevel!.getLeftSibling( + currentLevel.items[this._dragableBoundaryID] + ); const segment = this.annotation.currentLevel.items[ - this._dragableBoundaryNumber + this._dragableBoundaryID ] as OctraAnnotationSegment; - const segmentAfter = ( - this._dragableBoundaryNumber < - this.annotation.currentLevel.items.length - 1 - ? this.annotation.currentLevel.items[ - this._dragableBoundaryNumber + 1 - ] - : this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - ] - ) as OctraAnnotationSegment; + const segmentAfter = currentLevel!.getRightSibling( + currentLevel.items[this._dragableBoundaryID] + ); + if ( segment?.context?.asr?.isBlockedBy === ASRQueueItemType.ASR || segmentBefore?.context?.asr?.isBlockedBy === @@ -281,144 +274,21 @@ export class AudioViewerService { ASRQueueItemType.ASR ) { // prevent dragging boundary of blocked segment - this._dragableBoundaryNumber = -1; + this._dragableBoundaryID = -1; } } this._mouseDown = true; } else if ($event.type === 'mouseup') { - if ( - this.settings.boundaries.enabled && - !this.settings.boundaries.readonly && - this._dragableBoundaryNumber > -1 && - this._dragableBoundaryNumber < - this.annotation.currentLevel.items.length - ) { - // some boundary dragged - const segment: OctraAnnotationSegment | undefined = ( - this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - ] as OctraAnnotationSegment - )?.clone(); - - if (segment) { - if (!this.shiftPressed) { - // move only this boundary - segment.time = this.audioTCalculator.absXChunktoSampleUnit( - absX, - this.audioChunk - )!; - - this.currentLevelChange.emit({ - type: 'change', - items: [ - { - instance: segment, - }, - ], - }); - this.annotationChange.emit(this.annotation); - } else if (this.drawnSelection?.duration?.samples) { - // move all segments with difference to left or right - const oldSamplePosition = segment.time.samples; - const newSamplePosition = - this.audioTCalculator.absXChunktoSampleUnit( - absX, - this.audioChunk - )?.samples; - const diff = newSamplePosition! - oldSamplePosition; - let changedItems: OctraAnnotationSegment[] = []; - - if (diff > 0) { - // shift to right - for (const currentLevelElement of (this.annotation - .currentLevel as OctraAnnotationSegmentLevel)! - .items) { - if ( - currentLevelElement.time.samples >= - segment.time.samples && - currentLevelElement.time.samples + diff < - this.drawnSelection.end!.samples - ) { - const newItem = currentLevelElement.clone( - currentLevelElement.id - ); - newItem.time = currentLevelElement.time.add( - this.audioManager.createSampleUnit(diff) - ); - this.annotation = - this.annotation.changeCurrentItemById( - currentLevelElement.id, - newItem - ); - changedItems.push(newItem); - } - } - } else { - // shift to left - for (const currentLevelElement of (this.annotation - .currentLevel as OctraAnnotationSegmentLevel)! - .items) { - console.log( - `move to ${currentLevelElement.time.samples + diff}` - ); - if ( - currentLevelElement.time.samples <= - segment.time.samples && - currentLevelElement.time.samples + diff > - this.drawnSelection.start!.samples - ) { - const newItem = currentLevelElement.clone( - currentLevelElement.id - ); - newItem.time = currentLevelElement.time.add( - this.audioManager.createSampleUnit(diff) - ); - this.annotation = - this.annotation.changeCurrentItemById( - currentLevelElement.id, - newItem - ); - changedItems.push(newItem); - } else if ( - currentLevelElement.time.samples - diff < - 0 - ) { - changedItems = []; - break; - } - } - } - - if (changedItems.length > 0) { - this.currentLevelChange.emit({ - type: 'change', - items: changedItems.map((a) => ({ instance: a })), - }); - this.annotationChange.emit(this.annotation); - } - } - } - - this._boundaryDragging.next({ - shiftPressed: this.shiftPressed, - status: 'stopped', - }); - } else { - // set selection - this.audioChunk.selection.end = absXInTime.clone(); - this.audioChunk.selection.checkSelection(); - this._drawnSelection = this.audioChunk.selection.clone(); + this.handleBoundaryDragging(absX, absXInTime, true); - this.PlayCursor.changeSamples( - this.audioChunk.absolutePlayposition.clone(), - this.audioTCalculator, - this.audioChunk - ); - } - - this._dragableBoundaryNumber = -1; + this._dragableBoundaryID = -1; this.overboundary = false; this._mouseDown = false; + + this._boundaryDragging.next({ + shiftPressed: this.shiftPressed, + status: 'stopped', + }); } resolve(lineNum); @@ -443,7 +313,7 @@ export class AudioViewerService { ); this._mouseDown = false; - this._dragableBoundaryNumber = -1; + this._dragableBoundaryID = -1; } resolve(lineNum); @@ -457,6 +327,164 @@ export class AudioViewerService { }); } + handleBoundaryDragging(absX: number, absXInTime: SampleUnit, emit = false) { + let annotation = this.tempAnnotation?.clone(); + const currentLevel = + annotation?.currentLevel as OctraAnnotationSegmentLevel; + const limitPadding = 500; + + const draggedItem = currentLevel?.items?.find( + (a) => a.id === this._dragableBoundaryID + ); + if ( + annotation && + currentLevel && + draggedItem && + this.audioTCalculator && + this.audioChunk && + this.audioManager && + this.PlayCursor + ) { + if ( + this.settings.boundaries.enabled && + !this.settings.boundaries.readonly && + this._dragableBoundaryID > -1 + ) { + // some boundary dragged + const segment: OctraAnnotationSegment | undefined = + draggedItem?.clone(); + + if (segment) { + if (!this.shiftPressed) { + // move only this boundary + const previousSegment: OctraAnnotationSegment | undefined = + currentLevel.getLeftSibling(draggedItem)!; + const nextSegment: OctraAnnotationSegment | undefined = + currentLevel.getRightSibling(draggedItem)!; + + let newTime = this.audioTCalculator.absXChunktoSampleUnit( + absX, + this.audioChunk + )!; + + if ( + previousSegment && + newTime.samples < previousSegment.time.samples + limitPadding + ) { + newTime = previousSegment.time.add( + this.audioManager.createSampleUnit(limitPadding) + ); + } else if ( + nextSegment && + newTime.samples > nextSegment.time.samples - limitPadding + ) { + newTime = nextSegment.time.sub( + this.audioManager.createSampleUnit(limitPadding) + ); + } + + segment.time = newTime; + annotation.changeCurrentSegmentBySamplePosition( + segment.time, + segment + ); + + if (emit) { + this.currentLevelChange.emit({ + type: 'change', + items: [ + { + instance: segment, + }, + ], + }); + this.annotationChange.emit(annotation); + } + } else if (this.drawnSelection?.duration?.samples) { + // move all segments with difference to left or right + const oldSamplePosition = segment.time.samples; + const newSamplePosition = + this.audioTCalculator.absXChunktoSampleUnit( + absX, + this.audioChunk + )?.samples; + const diff = newSamplePosition! - oldSamplePosition; + let changedItems: OctraAnnotationSegment[] = []; + + if (diff > 0) { + // shift to right + for (const currentLevelElement of (annotation.currentLevel as OctraAnnotationSegmentLevel)! + .items) { + if ( + currentLevelElement.time.samples >= segment.time.samples && + currentLevelElement.time.samples + diff < + this.drawnSelection.end!.samples + ) { + const newItem = currentLevelElement.clone( + currentLevelElement.id + ); + newItem.time = currentLevelElement.time.add( + this.audioManager.createSampleUnit(diff) + ); + annotation = annotation.changeCurrentItemById( + currentLevelElement.id, + newItem + ); + changedItems.push(newItem); + } + } + } else { + // shift to left + for (const currentLevelElement of (annotation.currentLevel as OctraAnnotationSegmentLevel)! + .items) { + if ( + currentLevelElement.time.samples <= segment.time.samples && + currentLevelElement.time.samples + diff > + this.drawnSelection.start!.samples + ) { + const newItem = currentLevelElement.clone( + currentLevelElement.id + ); + newItem.time = currentLevelElement.time.add( + this.audioManager.createSampleUnit(diff) + ); + annotation = annotation.changeCurrentItemById( + currentLevelElement.id, + newItem + ); + changedItems.push(newItem); + } else if (currentLevelElement.time.samples - diff < 0) { + changedItems = []; + break; + } + } + } + + if (changedItems.length > 0 && emit) { + this.currentLevelChange.emit({ + type: 'change', + items: changedItems.map((a) => ({ instance: a })), + }); + this.annotationChange.emit(annotation); + } + } + } + this.annotation = annotation; + } else { + // set selection + this.audioChunk.selection.end = absXInTime.clone(); + this.audioChunk.selection.checkSelection(); + this._drawnSelection = this.audioChunk.selection.clone(); + + this.PlayCursor.changeSamples( + this.audioChunk.absolutePlayposition.clone(), + this.audioTCalculator, + this.audioChunk + ); + } + } + } + onKeyUp = () => { this.shiftPressed = false; }; @@ -702,7 +730,7 @@ export class AudioViewerService { this.annotation?.currentLevel?.items && this.annotation.currentLevel.items.length > 0 ) { - let absXTime = this.audioTCalculator.absXChunktoSampleUnit( + const absXTime = this.audioTCalculator.absXChunktoSampleUnit( absX, this.audioChunk ); @@ -710,77 +738,25 @@ export class AudioViewerService { if (absXTime !== undefined) { this._mouseCursor = absXTime.clone(); - if (this.mouseDown && this._dragableBoundaryNumber < 0) { + if (this.mouseDown && this._dragableBoundaryID < 0) { // mouse down, nothing dragged if (!this.shiftPressed) { - console.log('reset selection'); this.audioChunk.selection.end = absXTime.clone(); this._drawnSelection = this.audioChunk.selection.clone(); } } else if ( this.settings.boundaries.enabled && this.mouseDown && - this._dragableBoundaryNumber > -1 + this._dragableBoundaryID > -1 ) { - // mouse down something dragged - const segment = ( - this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - ] as any - ).clone(); - const absXSeconds = absXTime.seconds; - - // prevent overwriting another boundary - const segmentBefore = ( - this._dragableBoundaryNumber > 0 - ? this.annotation.currentLevel.items[ - this._dragableBoundaryNumber - 1 - ] - : undefined - ) as OctraAnnotationSegment; - const segmentAfter = ( - this._dragableBoundaryNumber < - this.annotation.currentLevel.items.length - 1 - ? this.annotation.currentLevel.items[ - this._dragableBoundaryNumber + 1 - ] - : undefined - ) as OctraAnnotationSegment; - if ( - segmentBefore?.time !== undefined && - this.audioManager !== undefined - ) { - // check segment boundary before this segment - if (absXSeconds < segmentBefore.time.seconds + 0.02) { - absXTime = this.audioManager.createSampleUnit( - segmentBefore.time.samples + - Math.round(0.02 * this.audioManager.resource.info.sampleRate) - ); - } - } - if (segmentAfter !== undefined && this.audioManager !== undefined) { - // check segment boundary after this segment - if ( - segmentAfter?.time !== undefined && - absXSeconds > segmentAfter.time.seconds - 0.02 - ) { - absXTime = this.audioManager.createSampleUnit( - segmentAfter.time.samples - - Math.round(0.02 * this.audioManager.resource.info.sampleRate) - ); - } - } + this.handleBoundaryDragging(absX, absXTime, false); - segment.time = absXTime.clone(); - this.annotation.currentLevel.items[this._dragableBoundaryNumber] = - segment; - } else { - this._mouseDown = false; + this._boundaryDragging.next({ + shiftPressed: this.shiftPressed, + status: 'dragging', + }); } } - - // set if boundary was dragged - // this.overboundary = (dragableBoundaryTemp > -1); } } diff --git a/libs/web-media/src/lib/audio/audio-manager.ts b/libs/web-media/src/lib/audio/audio-manager.ts index bc62bba96..170368709 100644 --- a/libs/web-media/src/lib/audio/audio-manager.ts +++ b/libs/web-media/src/lib/audio/audio-manager.ts @@ -381,22 +381,24 @@ export class AudioManager { this._audio.addEventListener('ended', this.onPlayBackChanged); this._audio.addEventListener('error', this.onPlaybackFailed); + + this._playbackEndChecker = timer( + Math.round(audioSelection.duration.unix / playbackRate) + ).subscribe(() => { + this.endPlayBack(); + this.subscrManager.add( + timer(100).subscribe(() => { + resolve(); + }) + ); + }); + this._audio .play() .then(() => { const time = Math.round( audioSelection.duration.unix / playbackRate ); - this._playbackEndChecker = timer( - Math.round(audioSelection.duration.unix / playbackRate) - ).subscribe(() => { - this.endPlayBack(); - this.subscrManager.add( - timer(100).subscribe(() => { - resolve(); - }) - ); - }); }) .catch((error) => { this._playbackEndChecker?.unsubscribe(); diff --git a/package-lock.json b/package-lock.json index 1c0e54025..7a25762c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "hotkeys-js": "^3.12.0", "immer": "^9.0.21", "jodit": "^3.24.9", - "konva": "^9.0.0", + "konva": "^9.2.2", "luxon": "^3.0.4", "modernizr": "^3.12.0", "ngrx-wieder": "^11.0.0", @@ -111,14 +111,14 @@ }, "../octra-backend/extern/libs/api-types": { "name": "@octra/api-types", - "version": "0.8.7", + "version": "0.9.0", "peerDependencies": { - "tslib": "2.0.3" + "tslib": "2.6.1" } }, "../octra-backend/extern/libs/ngx-octra-api": { "name": "@octra/ngx-octra-api", - "version": "0.8.7", + "version": "0.9.0", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -126,7 +126,7 @@ "peerDependencies": { "@angular/common": "^16.2.0", "@angular/core": "^16.2.0", - "@octra/api-types": "0.8.7", + "@octra/api-types": "0.9.0", "rxjs": "7.8.1" } }, @@ -15075,9 +15075,9 @@ } }, "node_modules/konva": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.2.1.tgz", - "integrity": "sha512-/D9mZttzjqrkjVPlWyJirdBjFJ/uafrFFR5BD41PsFUX+ctqmoFZjcnjs/ag6YnZNEVsU4/E9dRaH5FH9Y4cLw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/konva/-/konva-9.2.2.tgz", + "integrity": "sha512-Gyn5hQa/5+8pJvTn/IVyZWgum2otWXszuVCG/cevkAyKUFcmFv4tGbQhHFGtJPLQkGO+W6xfgRzyYIkNgKnPxA==", "funding": [ { "type": "patreon", @@ -34184,9 +34184,9 @@ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" }, "konva": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.2.1.tgz", - "integrity": "sha512-/D9mZttzjqrkjVPlWyJirdBjFJ/uafrFFR5BD41PsFUX+ctqmoFZjcnjs/ag6YnZNEVsU4/E9dRaH5FH9Y4cLw==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/konva/-/konva-9.2.2.tgz", + "integrity": "sha512-Gyn5hQa/5+8pJvTn/IVyZWgum2otWXszuVCG/cevkAyKUFcmFv4tGbQhHFGtJPLQkGO+W6xfgRzyYIkNgKnPxA==" }, "launch-editor": { "version": "2.6.0", diff --git a/package.json b/package.json index fe7d37423..1e2b2251e 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "hotkeys-js": "^3.12.0", "immer": "^9.0.21", "jodit": "^3.24.9", - "konva": "^9.0.0", + "konva": "^9.2.2", "luxon": "^3.0.4", "modernizr": "^3.12.0", "ngrx-wieder": "^11.0.0",