diff --git a/.changeset/smart-trees-jam.md b/.changeset/smart-trees-jam.md new file mode 100644 index 0000000..a03d807 --- /dev/null +++ b/.changeset/smart-trees-jam.md @@ -0,0 +1,5 @@ +--- +'@viamrobotics/test-widgets': minor +--- + +feat: allow pasting for moveToPositions and moveToPose widgets" diff --git a/package.json b/package.json index 1a736b5..20aefc2 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@types/node": "^25.6.0", "@types/three": "^0.183.1", "@viamrobotics/motion-tools": "^1.19.1", - "@viamrobotics/prime-core": "^0.1.21", + "@viamrobotics/prime-core": "^0.1.22", "@viamrobotics/sdk": "^0.69.0", "@viamrobotics/svelte-sdk": "^1.2.1", "@viamrobotics/tailwind-config": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4541a2..4b98d04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,10 +91,10 @@ importers: version: 0.183.1 '@viamrobotics/motion-tools': specifier: ^1.19.1 - version: 1.19.1(227c8cb51869e1778568ba51e8c8cd26) + version: 1.19.1(3de9b43f3c997d767960211059488fa9) '@viamrobotics/prime-core': - specifier: ^0.1.21 - version: 0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) + specifier: ^0.1.22 + version: 0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@viamrobotics/sdk': specifier: ^0.69.0 version: 0.69.0 @@ -1308,8 +1308,8 @@ packages: svelte: '>=5' svelte-virtuallists: '>=1' - '@viamrobotics/prime-core@0.1.21': - resolution: {integrity: sha512-y/EG0eIqi7yfpUK86Lyha6h9ZFfl9YLr3/6B8nzpnua6dGuzAt22Rvgi3ekmJP4M6G5BczazjqYbd36ijO00lA==} + '@viamrobotics/prime-core@0.1.22': + resolution: {integrity: sha512-h5ukdMQqHSLIBCWyheliW7cJfCeMC2bIifa9hzHnWBUpuYPwoujG/4/4wWRhohG9XBN1bCZQs/txttUdXpxqBA==} peerDependencies: svelte: '>=5 <6' @@ -4183,7 +4183,7 @@ snapshots: '@typescript-eslint/types': 8.59.1 eslint-visitor-keys: 5.0.1 - '@viamrobotics/motion-tools@1.19.1(227c8cb51869e1778568ba51e8c8cd26)': + '@viamrobotics/motion-tools@1.19.1(3de9b43f3c997d767960211059488fa9)': dependencies: '@ag-grid-community/client-side-row-model': 32.3.9 '@ag-grid-community/core': 32.3.9 @@ -4198,7 +4198,7 @@ snapshots: '@threlte/extras': 9.15.0(@types/three@0.183.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) '@threlte/rapier': 3.4.0(@dimforge/rapier3d-compat@0.12.0)(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) '@threlte/xr': 1.4.0(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) - '@viamrobotics/prime-core': 0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) + '@viamrobotics/prime-core': 0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@viamrobotics/sdk': 0.69.0 '@viamrobotics/svelte-sdk': 1.2.1(@viamrobotics/sdk@0.69.0)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@zag-js/collapsible': 1.40.0 @@ -4227,7 +4227,7 @@ snapshots: - react - three - '@viamrobotics/prime-core@0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))': + '@viamrobotics/prime-core@0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))': dependencies: '@codemirror/commands': 6.3.0 '@codemirror/lang-go': 6.0.1 diff --git a/src/lib/components/copy-button.svelte b/src/lib/components/copy-button.svelte index f805f61..2b99a08 100644 --- a/src/lib/components/copy-button.svelte +++ b/src/lib/components/copy-button.svelte @@ -1,5 +1,5 @@ - + {ariaLabel} + diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte new file mode 100644 index 0000000..a6bf5d6 --- /dev/null +++ b/src/lib/components/paste-button.svelte @@ -0,0 +1,38 @@ + + + + + {ariaLabel} + diff --git a/src/lib/components/widgets/arm/move-to-joint-positions.svelte b/src/lib/components/widgets/arm/move-to-joint-positions.svelte index 384ca01..4241d24 100644 --- a/src/lib/components/widgets/arm/move-to-joint-positions.svelte +++ b/src/lib/components/widgets/arm/move-to-joint-positions.svelte @@ -4,6 +4,7 @@ import AngleUnitToggle from '$lib/components/angle-unit-toggle.svelte' import CopyButton from '$lib/components/copy-button.svelte' import ErrorDisplay from '$lib/components/error.svelte' + import PasteButton from '$lib/components/paste-button.svelte' import Table from '$lib/components/table.svelte' import { numberValueFromEvent } from '$lib/event-handlers' import { degreesToRadians, formatNumeric, radiansToDegrees } from '$lib/format' @@ -37,6 +38,14 @@ desiredPositions[index] = useRadians ? radiansToDegrees(inputValue) : inputValue } + const handlePaste = (data: string): boolean => { + try { + desiredPositions = JSON.parse(data) as number[] + } catch { + return false + } + return true + } const degreesToDisplayAngle = (degrees: number) => { return useRadians ? degreesToRadians(degrees) : degrees } @@ -89,6 +98,7 @@ }} /> + diff --git a/src/lib/components/widgets/arm/move-to-position.svelte b/src/lib/components/widgets/arm/move-to-position.svelte index 9447723..175d721 100644 --- a/src/lib/components/widgets/arm/move-to-position.svelte +++ b/src/lib/components/widgets/arm/move-to-position.svelte @@ -6,6 +6,7 @@ import AngleUnitToggle from '$lib/components/angle-unit-toggle.svelte' import CopyButton from '$lib/components/copy-button.svelte' import ErrorDisplay from '$lib/components/error.svelte' + import PasteButton from '$lib/components/paste-button.svelte' import Table from '$lib/components/table.svelte' import { numberValueFromEvent } from '$lib/event-handlers' import { degreesToRadians, formatNumeric, radiansToDegrees } from '$lib/format' @@ -48,9 +49,15 @@ theta: useRadians ? degreesToRadians(desiredPosition.theta) : desiredPosition.theta, }) - const copyData = $derived( - `{x: ${displayPosition.x}, y: ${displayPosition.y}, z: ${displayPosition.z}, o_x: ${displayPosition.oX}, o_y: ${displayPosition.oY}, o_z: ${displayPosition.oZ}, theta: ${displayPosition.theta}}` - ) + const copyData = $derived(JSON.stringify(displayPosition)) + const handlePaste = (data: string): boolean => { + try { + desiredPosition = JSON.parse(data) as Pose + } catch { + return false + } + return true + } const handleAngleInputChange = (key: keyof Pose, inputValue: number) => { if (key === 'theta') { @@ -84,6 +91,7 @@ }} /> +