diff --git a/packages/frontend/editor-ui/src/components/RunData.test.ts b/packages/frontend/editor-ui/src/components/RunData.test.ts index b47f1eede9..dc10f24566 100644 --- a/packages/frontend/editor-ui/src/components/RunData.test.ts +++ b/packages/frontend/editor-ui/src/components/RunData.test.ts @@ -166,14 +166,14 @@ describe('RunData', () => { expect(queryByTestId('ndv-pin-data')).not.toBeInTheDocument(); }); - it('should disable pin data button when data is pinned', async () => { + it('should not disable pin data button when data is pinned [ADO-3143]', async () => { const { getByTestId } = render({ defaultRunItems: [], displayMode: 'table', pinnedData: [{ json: { name: 'Test' } }], }); const pinDataButton = getByTestId('ndv-pin-data'); - expect(pinDataButton).toBeDisabled(); + expect(pinDataButton).not.toBeDisabled(); }); it('should render callout when data is pinned in output panel', async () => { diff --git a/packages/frontend/editor-ui/src/components/RunData.vue b/packages/frontend/editor-ui/src/components/RunData.vue index 75ea77f386..c0e77ea259 100644 --- a/packages/frontend/editor-ui/src/components/RunData.vue +++ b/packages/frontend/editor-ui/src/components/RunData.vue @@ -528,8 +528,7 @@ const showPinButton = computed(() => { const pinButtonDisabled = computed( () => - pinnedData.hasData.value || - !rawInputData.value.length || + (!rawInputData.value.length && !pinnedData.hasData.value) || !!binaryData.value?.length || isReadOnlyRoute.value || readOnlyEnv.value, diff --git a/packages/frontend/editor-ui/src/components/RunDataPinButton.test.ts b/packages/frontend/editor-ui/src/components/RunDataPinButton.test.ts index 1e6b7958c8..56d25bc547 100644 --- a/packages/frontend/editor-ui/src/components/RunDataPinButton.test.ts +++ b/packages/frontend/editor-ui/src/components/RunDataPinButton.test.ts @@ -30,7 +30,7 @@ const renderComponent = createComponentRenderer(RunDataPinButton, { }, dataPinningDocsUrl: '', pinnedData: { - hasData: false, + hasData: { value: false }, }, disabled: false, }, @@ -121,4 +121,30 @@ describe('RunDataPinButton.vue', () => { expect(getByRole('tooltip')).toBeVisible(); expect(getByRole('tooltip')).toHaveTextContent('disabled'); }); + + it('pins data on button click', async () => { + const { getByTestId, getByRole, emitted } = renderComponent({}); + // Should show 'Pin data' tooltip and emit togglePinData event + await userEvent.hover(getByTestId('ndv-pin-data')); + expect(getByRole('tooltip')).toBeVisible(); + expect(getByRole('tooltip').textContent).toContain('Pin data'); + await userEvent.click(getByTestId('ndv-pin-data')); + expect(emitted().togglePinData).toBeDefined(); + }); + + it('should show correct tooltip and unpin data on button click', async () => { + const { getByTestId, getByRole, emitted } = renderComponent({ + props: { + pinnedData: { + hasData: { value: true }, + }, + }, + }); + // Should show 'Unpin data' tooltip and emit togglePinData event + await userEvent.hover(getByTestId('ndv-pin-data')); + expect(getByRole('tooltip')).toBeVisible(); + expect(getByRole('tooltip').textContent).toContain('Unpin data'); + await userEvent.click(getByTestId('ndv-pin-data')); + expect(emitted().togglePinData).toBeDefined(); + }); }); diff --git a/packages/frontend/editor-ui/src/components/RunDataPinButton.vue b/packages/frontend/editor-ui/src/components/RunDataPinButton.vue index 4b79abb6fa..d8a46a475e 100644 --- a/packages/frontend/editor-ui/src/components/RunDataPinButton.vue +++ b/packages/frontend/editor-ui/src/components/RunDataPinButton.vue @@ -37,14 +37,19 @@ const visible = computed(() => {{ locale.baseText('node.discovery.pinData.ndv') }}
- {{ locale.baseText('ndv.pinData.pin.title') }} - - {{ locale.baseText('ndv.pinData.pin.description') }} +
+ {{ locale.baseText('ndv.pinData.unpin.title') }} +
+
+ {{ locale.baseText('ndv.pinData.pin.title') }} + + {{ locale.baseText('ndv.pinData.pin.description') }} - - {{ locale.baseText('ndv.pinData.pin.link') }} - - + + {{ locale.baseText('ndv.pinData.pin.link') }} + + +