index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. const { h } = require('preact')
  2. const copyToClipboard = require('../../../utils/copyToClipboard')
  3. function EditButton ({
  4. file,
  5. uploadInProgressOrComplete,
  6. metaFields,
  7. canEditFile,
  8. i18n,
  9. onClick,
  10. }) {
  11. if (
  12. (!uploadInProgressOrComplete && metaFields && metaFields.length > 0)
  13. || (!uploadInProgressOrComplete && canEditFile(file))
  14. ) {
  15. return (
  16. <button
  17. className="uppy-u-reset uppy-Dashboard-Item-action uppy-Dashboard-Item-action--edit"
  18. type="button"
  19. aria-label={i18n('editFileWithFilename', { file: file.meta.name })}
  20. title={i18n('editFileWithFilename', { file: file.meta.name })}
  21. onClick={() => onClick()}
  22. >
  23. <svg aria-hidden="true" focusable="false" className="uppy-c-icon" width="14" height="14" viewBox="0 0 14 14">
  24. <g fillRule="evenodd">
  25. <path d="M1.5 10.793h2.793A1 1 0 0 0 5 10.5L11.5 4a1 1 0 0 0 0-1.414L9.707.793a1 1 0 0 0-1.414 0l-6.5 6.5A1 1 0 0 0 1.5 8v2.793zm1-1V8L9 1.5l1.793 1.793-6.5 6.5H2.5z" fillRule="nonzero" />
  26. <rect x="1" y="12.293" width="11" height="1" rx=".5" />
  27. <path fillRule="nonzero" d="M6.793 2.5L9.5 5.207l.707-.707L7.5 1.793z" />
  28. </g>
  29. </svg>
  30. </button>
  31. )
  32. }
  33. return null
  34. }
  35. function RemoveButton ({ i18n, onClick, file }) {
  36. return (
  37. <button
  38. className="uppy-u-reset uppy-Dashboard-Item-action uppy-Dashboard-Item-action--remove"
  39. type="button"
  40. aria-label={i18n('removeFile', { file: file.meta.name })}
  41. title={i18n('removeFile', { file: file.meta.name })}
  42. onClick={() => onClick()}
  43. >
  44. <svg aria-hidden="true" focusable="false" className="uppy-c-icon" width="18" height="18" viewBox="0 0 18 18">
  45. <path d="M9 0C4.034 0 0 4.034 0 9s4.034 9 9 9 9-4.034 9-9-4.034-9-9-9z" />
  46. <path fill="#FFF" d="M13 12.222l-.778.778L9 9.778 5.778 13 5 12.222 8.222 9 5 5.778 5.778 5 9 8.222 12.222 5l.778.778L9.778 9z" />
  47. </svg>
  48. </button>
  49. )
  50. }
  51. const copyLinkToClipboard = (event, props) => {
  52. copyToClipboard(props.file.uploadURL, props.i18n('copyLinkToClipboardFallback'))
  53. .then(() => {
  54. props.uppy.log('Link copied to clipboard.')
  55. props.uppy.info(props.i18n('copyLinkToClipboardSuccess'), 'info', 3000)
  56. })
  57. .catch(props.uppy.log)
  58. // avoid losing focus
  59. .then(() => event.target.focus({ preventScroll: true }))
  60. }
  61. function CopyLinkButton (props) {
  62. return (
  63. <button
  64. className="uppy-u-reset uppy-Dashboard-Item-action uppy-Dashboard-Item-action--copyLink"
  65. type="button"
  66. aria-label={props.i18n('copyLink')}
  67. title={props.i18n('copyLink')}
  68. onClick={(event) => copyLinkToClipboard(event, props)}
  69. >
  70. <svg aria-hidden="true" focusable="false" className="uppy-c-icon" width="14" height="14" viewBox="0 0 14 12">
  71. <path d="M7.94 7.703a2.613 2.613 0 0 1-.626 2.681l-.852.851a2.597 2.597 0 0 1-1.849.766A2.616 2.616 0 0 1 2.764 7.54l.852-.852a2.596 2.596 0 0 1 2.69-.625L5.267 7.099a1.44 1.44 0 0 0-.833.407l-.852.851a1.458 1.458 0 0 0 1.03 2.486c.39 0 .755-.152 1.03-.426l.852-.852c.231-.231.363-.522.406-.824l1.04-1.038zm4.295-5.937A2.596 2.596 0 0 0 10.387 1c-.698 0-1.355.272-1.849.766l-.852.851a2.614 2.614 0 0 0-.624 2.688l1.036-1.036c.041-.304.173-.6.407-.833l.852-.852c.275-.275.64-.426 1.03-.426a1.458 1.458 0 0 1 1.03 2.486l-.852.851a1.442 1.442 0 0 1-.824.406l-1.04 1.04a2.596 2.596 0 0 0 2.683-.628l.851-.85a2.616 2.616 0 0 0 0-3.697zm-6.88 6.883a.577.577 0 0 0 .82 0l3.474-3.474a.579.579 0 1 0-.819-.82L5.355 7.83a.579.579 0 0 0 0 .819z" />
  72. </svg>
  73. </button>
  74. )
  75. }
  76. module.exports = function Buttons (props) {
  77. const {
  78. uppy,
  79. file,
  80. uploadInProgressOrComplete,
  81. canEditFile,
  82. metaFields,
  83. showLinkToFileUploadResult,
  84. showRemoveButton,
  85. i18n,
  86. toggleFileCard,
  87. openFileEditor,
  88. } = props
  89. const editAction = () => {
  90. if (metaFields && metaFields.length > 0) {
  91. toggleFileCard(true, file.id)
  92. } else {
  93. openFileEditor(file)
  94. }
  95. }
  96. return (
  97. <div className="uppy-Dashboard-Item-actionWrapper">
  98. <EditButton
  99. i18n={i18n}
  100. file={file}
  101. uploadInProgressOrComplete={uploadInProgressOrComplete}
  102. canEditFile={canEditFile}
  103. metaFields={metaFields}
  104. onClick={editAction}
  105. />
  106. {showLinkToFileUploadResult && file.uploadURL ? (
  107. <CopyLinkButton
  108. file={file}
  109. uppy={uppy}
  110. />
  111. ) : null}
  112. {showRemoveButton ? (
  113. <RemoveButton
  114. i18n={i18n}
  115. file={file}
  116. uppy={uppy}
  117. onClick={() => props.uppy.removeFile(file.id, 'removed-by-user')}
  118. />
  119. ) : null}
  120. </div>
  121. )
  122. }