layout-dropdown-button.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import PropTypes from 'prop-types'
  2. import { Dropdown, MenuItem } from 'react-bootstrap'
  3. import { Trans, useTranslation } from 'react-i18next'
  4. import Icon from '../../../shared/components/icon'
  5. import IconChecked from '../../../shared/components/icon-checked'
  6. import ControlledDropdown from '../../../shared/components/controlled-dropdown'
  7. import IconEditorOnly from './icon-editor-only'
  8. import IconPdfOnly from './icon-pdf-only'
  9. function IconCheckmark({ iconFor, pdfLayout, view }) {
  10. if (iconFor === 'editorOnly' && pdfLayout === 'flat' && view === 'editor') {
  11. return <IconChecked />
  12. } else if (iconFor === 'pdfOnly' && pdfLayout === 'flat' && view === 'pdf') {
  13. return <IconChecked />
  14. } else if (iconFor === 'sideBySide' && pdfLayout === 'sideBySide') {
  15. return <IconChecked />
  16. }
  17. // return empty icon for placeholder
  18. return <Icon type="" modifier="fw" />
  19. }
  20. function LayoutDropdownButton({
  21. reattach,
  22. detach,
  23. handleChangeLayout,
  24. detachMode,
  25. detachRole,
  26. pdfLayout,
  27. view,
  28. }) {
  29. const { t } = useTranslation()
  30. // bsStyle is required for Dropdown.Toggle, but we will override style
  31. return (
  32. <>
  33. {detachMode === 'detaching' && (
  34. <div aria-live="assertive" className="sr-only">
  35. {t('layout_processing')}
  36. </div>
  37. )}
  38. <ControlledDropdown
  39. id="layout-dropdown"
  40. className="toolbar-item"
  41. disabled={detachMode === 'detaching'}
  42. >
  43. <Dropdown.Toggle className="btn-full-height" bsStyle="link">
  44. {detachMode === 'detaching' ? (
  45. <Icon type="refresh" modifier="fw" spin />
  46. ) : (
  47. <Icon type="columns" modifier="fw" />
  48. )}
  49. <span className="toolbar-label">{t('layout')}</span>
  50. </Dropdown.Toggle>
  51. <Dropdown.Menu id="layout-dropdown-list">
  52. <MenuItem header>{t('layout')}</MenuItem>
  53. <MenuItem
  54. disabled={detachRole === 'detacher'}
  55. onSelect={() => handleChangeLayout('sideBySide')}
  56. >
  57. <IconCheckmark
  58. iconFor="sideBySide"
  59. pdfLayout={pdfLayout}
  60. view={view}
  61. />
  62. <Icon type="columns" />
  63. {t('editor_and_pdf')}
  64. </MenuItem>
  65. <MenuItem
  66. onSelect={() => handleChangeLayout('flat', 'editor')}
  67. className="menu-item-with-svg"
  68. >
  69. <IconCheckmark
  70. iconFor="editorOnly"
  71. pdfLayout={pdfLayout}
  72. view={view}
  73. />
  74. <IconEditorOnly />
  75. <Trans
  76. i18nKey="editor_only_hide_pdf"
  77. components={[
  78. <span key="editor_only_hide_pdf" className="subdued" />,
  79. ]}
  80. />
  81. </MenuItem>
  82. <MenuItem
  83. disabled={detachRole === 'detacher'}
  84. onSelect={() => handleChangeLayout('flat', 'pdf')}
  85. className="menu-item-with-svg"
  86. >
  87. <IconCheckmark
  88. iconFor="pdfOnly"
  89. pdfLayout={pdfLayout}
  90. view={view}
  91. />
  92. <IconPdfOnly />
  93. <Trans
  94. i18nKey="pdf_only_hide_editor"
  95. components={[
  96. <span key="pdf_only_hide_editor" className="subdued" />,
  97. ]}
  98. />
  99. </MenuItem>
  100. <MenuItem divider />
  101. {detachRole === 'detacher' ? (
  102. <MenuItem onSelect={() => reattach()}>
  103. <Icon type="window-restore" modifier="fw" />
  104. {t('bring_pdf_back_to_tab')}
  105. </MenuItem>
  106. ) : (
  107. <MenuItem onSelect={() => detach()}>
  108. <Icon type="window-restore" modifier="fw" />
  109. {t('open_pdf_in_new_tab')}
  110. </MenuItem>
  111. )}
  112. </Dropdown.Menu>
  113. </ControlledDropdown>
  114. </>
  115. )
  116. }
  117. export default LayoutDropdownButton
  118. IconCheckmark.propTypes = {
  119. iconFor: PropTypes.string.isRequired,
  120. pdfLayout: PropTypes.string.isRequired,
  121. view: PropTypes.string,
  122. }
  123. LayoutDropdownButton.propTypes = {
  124. reattach: PropTypes.func.isRequired,
  125. detach: PropTypes.func.isRequired,
  126. handleChangeLayout: PropTypes.func.isRequired,
  127. detachMode: PropTypes.string,
  128. detachRole: PropTypes.string,
  129. pdfLayout: PropTypes.string.isRequired,
  130. view: PropTypes.string,
  131. }