From 68f0c28496c5036ec792cfbf2f95caee78494aab Mon Sep 17 00:00:00 2001 From: Grace Nakiyemba Date: Tue, 27 Oct 2026 13:59:17 +0300 Subject: [PATCH 1/2] fix(formplayer): prevent signature gestures from triggering swipes --- .../renderers/SignatureQuestionRenderer.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/formulus-formplayer/src/renderers/SignatureQuestionRenderer.tsx b/formulus-formplayer/src/renderers/SignatureQuestionRenderer.tsx index 96070dd15..742eb5ea9 100644 --- a/formulus-formplayer/src/renderers/SignatureQuestionRenderer.tsx +++ b/formulus-formplayer/src/renderers/SignatureQuestionRenderer.tsx @@ -126,6 +126,7 @@ const SignatureQuestionRenderer: React.FC = ({ | React.TouchEvent, ) => { e.preventDefault(); + e.stopPropagation(); const point = getCanvasPoint(e); if (!point) return; @@ -142,6 +143,7 @@ const SignatureQuestionRenderer: React.FC = ({ | React.TouchEvent, ) => { e.preventDefault(); + e.stopPropagation(); if (!isDrawingRef.current || !canvasRef.current) return; const point = getCanvasPoint(e); @@ -164,10 +166,19 @@ const SignatureQuestionRenderer: React.FC = ({ [getCanvasPoint], ); - const stopDrawing = useCallback(() => { - isDrawingRef.current = false; - lastPointRef.current = null; - }, []); + const stopDrawing = useCallback( + ( + e: + | React.MouseEvent + | React.TouchEvent, + ) => { + e.preventDefault(); + e.stopPropagation(); + isDrawingRef.current = false; + lastPointRef.current = null; + }, + [], + ); // Clear canvas const clearCanvas = useCallback(() => { From c5d4daf78776a1f6e66f8af5b312da225c30b970 Mon Sep 17 00:00:00 2001 From: Grace Nakiyemba Date: Tue, 27 Oct 2026 13:59:17 +0300 Subject: [PATCH 2/2] test(formplayer): cover signature gesture propagation --- .../SignatureQuestionRenderer.test.tsx | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/formulus-formplayer/src/renderers/SignatureQuestionRenderer.test.tsx b/formulus-formplayer/src/renderers/SignatureQuestionRenderer.test.tsx index 554cd6d8a..efb7e7726 100644 --- a/formulus-formplayer/src/renderers/SignatureQuestionRenderer.test.tsx +++ b/formulus-formplayer/src/renderers/SignatureQuestionRenderer.test.tsx @@ -1,7 +1,14 @@ // @vitest-environment jsdom import React from 'react'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { act, cleanup, render, screen, waitFor } from '@testing-library/react'; +import { + act, + cleanup, + fireEvent, + render, + screen, + waitFor, +} from '@testing-library/react'; import { JsonForms } from '@jsonforms/react'; import Ajv from 'ajv'; import SignatureQuestionRenderer, { @@ -38,6 +45,30 @@ afterEach(() => { vi.restoreAllMocks(); }); +describe('signature drawing gestures', () => { + it('does not bubble touch gestures from the signature canvas', () => { + const onTouchStart = vi.fn(); + const onTouchEnd = vi.fn(); + + const { container } = render( +
+
+
, + ); + + const canvas = container.querySelector('canvas'); + expect(canvas).not.toBeNull(); + + fireEvent.touchStart(canvas!, { + touches: [{ clientX: 20, clientY: 20 }], + }); + fireEvent.touchEnd(canvas!); + + expect(onTouchStart).not.toHaveBeenCalled(); + expect(onTouchEnd).not.toHaveBeenCalled(); + }); +}); + describe('signature profile-safe preview', () => { it('resolves a migrated legacy basename through the bridge without changing stored data', async () => { const value = {