project-name-editable-label.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React, { useEffect, useState, useRef } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { OverlayTrigger, Tooltip } from 'react-bootstrap'
  4. import { useTranslation } from 'react-i18next'
  5. import classNames from 'classnames'
  6. import Icon from '../../../shared/components/icon'
  7. function ProjectNameEditableLabel({
  8. projectName,
  9. userIsAdmin,
  10. onChange,
  11. className,
  12. }) {
  13. const { t } = useTranslation()
  14. const [isRenaming, setIsRenaming] = useState(false)
  15. const canRename = userIsAdmin && !isRenaming
  16. const [inputContent, setInputContent] = useState(projectName)
  17. const inputRef = useRef(null)
  18. useEffect(() => {
  19. if (isRenaming) {
  20. inputRef.current.select()
  21. }
  22. }, [isRenaming])
  23. function startRenaming() {
  24. setInputContent(projectName)
  25. setIsRenaming(true)
  26. }
  27. function handleKeyDown(event) {
  28. if (event.key === 'Enter') {
  29. event.preventDefault()
  30. setIsRenaming(false)
  31. onChange(event.target.value)
  32. }
  33. }
  34. function handleOnChange(event) {
  35. setInputContent(event.target.value)
  36. }
  37. function handleBlur() {
  38. setIsRenaming(false)
  39. }
  40. return (
  41. <div className={classNames('project-name', className)}>
  42. {!isRenaming && (
  43. <span className="name" onDoubleClick={startRenaming}>
  44. {projectName}
  45. </span>
  46. )}
  47. {isRenaming && (
  48. <input
  49. ref={inputRef}
  50. type="text"
  51. className="form-control"
  52. onKeyDown={handleKeyDown}
  53. onChange={handleOnChange}
  54. onBlur={handleBlur}
  55. value={inputContent}
  56. />
  57. )}
  58. {canRename && (
  59. <OverlayTrigger
  60. placement="bottom"
  61. trigger={['hover', 'focus']}
  62. overlay={<Tooltip id="tooltip-online-user">{t('rename')}</Tooltip>}
  63. >
  64. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid, jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus */}
  65. <a className="rename" role="button" onClick={startRenaming}>
  66. <Icon type="pencil" modifier="fw" />
  67. </a>
  68. </OverlayTrigger>
  69. )}
  70. </div>
  71. )
  72. }
  73. ProjectNameEditableLabel.propTypes = {
  74. projectName: PropTypes.string.isRequired,
  75. userIsAdmin: PropTypes.bool,
  76. onChange: PropTypes.func.isRequired,
  77. className: PropTypes.string,
  78. }
  79. export default ProjectNameEditableLabel