preview-recompile-button.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. import { Dropdown, MenuItem, OverlayTrigger, Tooltip } from 'react-bootstrap'
  4. import { useTranslation } from 'react-i18next'
  5. import classNames from 'classnames'
  6. import Icon from '../../../shared/components/icon'
  7. import ControlledDropdown from '../../../shared/components/controlled-dropdown'
  8. function PreviewRecompileButton({
  9. compilerState: {
  10. autoCompileHasChanges,
  11. autoCompileHasLintingError,
  12. isAutoCompileOn,
  13. isCompiling,
  14. isDraftModeOn,
  15. isSyntaxCheckOn,
  16. },
  17. onRecompile,
  18. onRecompileFromScratch,
  19. onRunSyntaxCheckNow,
  20. onStopCompilation,
  21. onSetAutoCompile,
  22. onSetDraftMode,
  23. onSetSyntaxCheck,
  24. showText,
  25. }) {
  26. const { t } = useTranslation()
  27. function handleSelectAutoCompileOn() {
  28. onSetAutoCompile(true)
  29. }
  30. function handleSelectAutoCompileOff() {
  31. onSetAutoCompile(false)
  32. }
  33. function handleSelectDraftModeOn() {
  34. onSetDraftMode(true)
  35. }
  36. function handleSelectDraftModeOff() {
  37. onSetDraftMode(false)
  38. }
  39. function handleSelectSyntaxCheckOn() {
  40. onSetSyntaxCheck(true)
  41. }
  42. function handleSelectSyntaxCheckOff() {
  43. onSetSyntaxCheck(false)
  44. }
  45. let compilingProps = {}
  46. let recompileProps = {}
  47. function _hideText(keepAria) {
  48. return {
  49. 'aria-hidden': !keepAria,
  50. style: {
  51. position: 'absolute',
  52. right: '-100vw',
  53. },
  54. }
  55. }
  56. if (!showText) {
  57. compilingProps = _hideText(isCompiling)
  58. recompileProps = _hideText(!isCompiling)
  59. } else if (isCompiling) {
  60. recompileProps = _hideText()
  61. } else {
  62. compilingProps = _hideText()
  63. }
  64. const recompileButtonGroupClasses = classNames(
  65. 'btn-recompile-group',
  66. 'toolbar-item',
  67. {
  68. 'btn-recompile-group-has-changes':
  69. autoCompileHasChanges && !autoCompileHasLintingError,
  70. }
  71. )
  72. const buttonElement = (
  73. <ControlledDropdown
  74. id="pdf-recompile-dropdown"
  75. className={recompileButtonGroupClasses}
  76. >
  77. <button className="btn btn-recompile" onClick={() => onRecompile()}>
  78. <Icon type="refresh" spin={isCompiling} />
  79. <span id="text-compiling" className="toolbar-text" {...compilingProps}>
  80. {t('compiling')}
  81. &hellip;
  82. </span>
  83. <span id="text-recompile" className="toolbar-text" {...recompileProps}>
  84. {t('recompile')}
  85. </span>
  86. </button>
  87. <Dropdown.Toggle
  88. aria-label={t('toggle_compile_options_menu')}
  89. className="btn btn-recompile"
  90. bsStyle="success"
  91. />
  92. <Dropdown.Menu>
  93. <MenuItem header>{t('auto_compile')}</MenuItem>
  94. <MenuItem onSelect={handleSelectAutoCompileOn}>
  95. <Icon type={isAutoCompileOn ? 'check' : ''} modifier="fw" />
  96. {t('on')}
  97. </MenuItem>
  98. <MenuItem onSelect={handleSelectAutoCompileOff}>
  99. <Icon type={!isAutoCompileOn ? 'check' : ''} modifier="fw" />
  100. {t('off')}
  101. </MenuItem>
  102. <MenuItem header>{t('compile_mode')}</MenuItem>
  103. <MenuItem onSelect={handleSelectDraftModeOff}>
  104. <Icon type={!isDraftModeOn ? 'check' : ''} modifier="fw" />
  105. {t('normal')}
  106. </MenuItem>
  107. <MenuItem onSelect={handleSelectDraftModeOn}>
  108. <Icon type={isDraftModeOn ? 'check' : ''} modifier="fw" />
  109. {t('fast')} <span className="subdued">[draft]</span>
  110. </MenuItem>
  111. <MenuItem header>Syntax Checks</MenuItem>
  112. <MenuItem onSelect={handleSelectSyntaxCheckOn}>
  113. <Icon type={isSyntaxCheckOn ? 'check' : ''} modifier="fw" />
  114. {t('stop_on_validation_error')}
  115. </MenuItem>
  116. <MenuItem onSelect={handleSelectSyntaxCheckOff}>
  117. <Icon type={!isSyntaxCheckOn ? 'check' : ''} modifier="fw" />
  118. {t('ignore_validation_errors')}
  119. </MenuItem>
  120. <MenuItem onSelect={onRunSyntaxCheckNow}>
  121. <Icon type="" modifier="fw" />
  122. {t('run_syntax_check_now')}
  123. </MenuItem>
  124. <MenuItem className={!isCompiling ? 'hidden' : ''} divider />
  125. <MenuItem
  126. onSelect={onStopCompilation}
  127. className={!isCompiling ? 'hidden' : ''}
  128. disabled={!isCompiling}
  129. aria-disabled={!isCompiling}
  130. >
  131. {t('stop_compile')}
  132. </MenuItem>
  133. <MenuItem divider />
  134. <MenuItem
  135. onSelect={onRecompileFromScratch}
  136. disabled={isCompiling}
  137. aria-disabled={!!isCompiling}
  138. >
  139. {t('recompile_from_scratch')}
  140. </MenuItem>
  141. </Dropdown.Menu>
  142. </ControlledDropdown>
  143. )
  144. return showText ? (
  145. buttonElement
  146. ) : (
  147. <OverlayTrigger
  148. placement="bottom"
  149. overlay={
  150. <Tooltip id="tooltip-download-pdf">
  151. {isCompiling ? t('compiling') : t('recompile')}
  152. </Tooltip>
  153. }
  154. >
  155. {buttonElement}
  156. </OverlayTrigger>
  157. )
  158. }
  159. PreviewRecompileButton.propTypes = {
  160. compilerState: PropTypes.shape({
  161. autoCompileHasChanges: PropTypes.bool.isRequired,
  162. autoCompileHasLintingError: PropTypes.bool,
  163. isAutoCompileOn: PropTypes.bool.isRequired,
  164. isCompiling: PropTypes.bool.isRequired,
  165. isDraftModeOn: PropTypes.bool.isRequired,
  166. isSyntaxCheckOn: PropTypes.bool.isRequired,
  167. logEntries: PropTypes.object.isRequired,
  168. }),
  169. onRecompile: PropTypes.func.isRequired,
  170. onRecompileFromScratch: PropTypes.func.isRequired,
  171. onRunSyntaxCheckNow: PropTypes.func.isRequired,
  172. onSetAutoCompile: PropTypes.func.isRequired,
  173. onSetDraftMode: PropTypes.func.isRequired,
  174. onSetSyntaxCheck: PropTypes.func.isRequired,
  175. onStopCompilation: PropTypes.func.isRequired,
  176. showText: PropTypes.bool.isRequired,
  177. }
  178. export default PreviewRecompileButton