From b6eefe4e6ecb8fde91deca9a3518c391b3f117ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Alby?= Date: Tue, 9 Feb 2021 10:50:16 +0100 Subject: [PATCH] Merge pull request #3640 from overleaf/ta-file-tree-input-draggable [ReactFileTree] Disable Draggable when Renaming Entity GitOrigin-RevId: 7241815d43791685453431aa95b8258ec17d3f81 --- .../file-tree-item/file-tree-item-inner.js | 9 +++- .../file-tree-item/file-tree-item-name.js | 11 ++-- .../file-tree/contexts/file-tree-draggable.js | 8 ++- .../file-tree-item-name.test.js | 50 ++++++++++++++++--- 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-inner.js b/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-inner.js index 646da8dff6..c75d383d90 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-inner.js +++ b/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-inner.js @@ -16,7 +16,7 @@ function FileTreeItemInner({ id, name, isSelected, icons }) { const hasMenu = hasWritePermissions && isSelected - const { isDragging, dragRef } = useDraggable(id) + const { isDragging, dragRef, isDraggable, setIsDraggable } = useDraggable(id) const itemRef = createRef() @@ -54,6 +54,7 @@ function FileTreeItemInner({ id, name, isSelected, icons }) { role="presentation" ref={dragRef} onContextMenu={handleContextMenu} + draggable={isDraggable} >
{icons} - + {hasMenu ? : null}
diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-name.js b/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-name.js index be4c994ced..1fbfa511a1 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-name.js +++ b/services/web/frontend/js/features/file-tree/components/file-tree-item/file-tree-item-name.js @@ -1,11 +1,11 @@ -import React, { useState } from 'react' +import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' import { useRefWithAutoFocus } from '../../../../infrastructure/auto-focus' import { useFileTreeActionable } from '../../contexts/file-tree-actionable' -function FileTreeItemName({ name, isSelected }) { +function FileTreeItemName({ name, isSelected, setIsDraggable }) { const { isRenaming, startRenaming, @@ -16,6 +16,10 @@ function FileTreeItemName({ name, isSelected }) { const isRenamingEntity = isRenaming && isSelected && !error + useEffect(() => { + setIsDraggable(!isRenamingEntity) + }, [setIsDraggable, isRenamingEntity]) + if (isRenamingEntity) { return ( ', function() { + const setIsDraggable = sinon.stub() + beforeEach(function() { global.requestAnimationFrame = sinon.stub() }) afterEach(function() { delete global.requestAnimationFrame + setIsDraggable.reset() }) it('renders name as button', function() { - renderWithContext() + renderWithContext( + + ) screen.getByRole('button', { name: 'foo.tex' }) expect(screen.queryByRole('textbox')).to.not.exist }) it("doesn't start renaming on unselected component", function() { - renderWithContext() + renderWithContext( + + ) const button = screen.queryByRole('button') fireEvent.click(button) @@ -33,7 +48,13 @@ describe('', function() { }) it('start renaming on double-click', function() { - renderWithContext() + renderWithContext( + + ) const button = screen.queryByRole('button') fireEvent.click(button) @@ -42,12 +63,20 @@ describe('', function() { screen.getByRole('textbox') expect(screen.queryByRole('button')).to.not.exist expect(global.requestAnimationFrame).to.be.calledOnce + expect(setIsDraggable).to.be.calledWith(false) }) it('cannot start renaming in read-only', function() { - renderWithContext(, { - contextProps: { hasWritePermissions: false } - }) + renderWithContext( + , + { + contextProps: { hasWritePermissions: false } + } + ) const button = screen.queryByRole('button') fireEvent.click(button) @@ -59,7 +88,13 @@ describe('', function() { describe('stop renaming', function() { beforeEach(function() { - renderWithContext() + renderWithContext( + + ) const button = screen.getByRole('button') fireEvent.click(button) @@ -75,6 +110,7 @@ describe('', function() { fireEvent.keyDown(input, { key: 'Escape' }) screen.getByRole('button', { name: 'foo.tex' }) + expect(setIsDraggable).to.be.calledWith(true) }) }) })