pdf-compile-button.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { Dropdown, MenuItem } from 'react-bootstrap'
  2. import Icon from '../../../shared/components/icon'
  3. import ControlledDropdown from '../../../shared/components/controlled-dropdown'
  4. import { useTranslation } from 'react-i18next'
  5. import { memo } from 'react'
  6. import classnames from 'classnames'
  7. import { useDetachCompileContext as useCompileContext } from '../../../shared/context/detach-compile-context'
  8. import { useStopOnFirstError } from '../../../shared/hooks/use-stop-on-first-error'
  9. import PdfCompileButtonInner from './pdf-compile-button-inner'
  10. import getMeta from '../../../utils/meta'
  11. function PdfCompileButton() {
  12. const {
  13. animateCompileDropdownArrow,
  14. autoCompile,
  15. compiling,
  16. draft,
  17. hasChanges,
  18. setAnimateCompileDropdownArrow,
  19. setAutoCompile,
  20. setDraft,
  21. setStopOnValidationError,
  22. stopOnFirstError,
  23. stopOnValidationError,
  24. startCompile,
  25. stopCompile,
  26. recompileFromScratch,
  27. } = useCompileContext()
  28. const { enableStopOnFirstError, disableStopOnFirstError } =
  29. useStopOnFirstError({ eventSource: 'dropdown' })
  30. const { t } = useTranslation()
  31. const showStopOnFirstError = getMeta('ol-showStopOnFirstError')
  32. return (
  33. <ControlledDropdown
  34. className={classnames({
  35. 'toolbar-item': true,
  36. 'btn-recompile-group': true,
  37. 'btn-recompile-group-has-changes': hasChanges,
  38. })}
  39. id="pdf-recompile-dropdown"
  40. >
  41. <PdfCompileButtonInner
  42. startCompile={startCompile}
  43. compiling={compiling}
  44. />
  45. <Dropdown.Toggle
  46. aria-label={t('toggle_compile_options_menu')}
  47. className={classnames({
  48. 'btn-recompile': true,
  49. 'btn-recompile-animate': animateCompileDropdownArrow,
  50. })}
  51. bsStyle="success"
  52. onAnimationEnd={() => {
  53. setAnimateCompileDropdownArrow(false)
  54. }}
  55. />
  56. <Dropdown.Menu>
  57. <MenuItem header>{t('auto_compile')}</MenuItem>
  58. <MenuItem onSelect={() => setAutoCompile(true)}>
  59. <Icon type={autoCompile ? 'check' : ''} fw />
  60. {t('on')}
  61. </MenuItem>
  62. <MenuItem onSelect={() => setAutoCompile(false)}>
  63. <Icon type={!autoCompile ? 'check' : ''} fw />
  64. {t('off')}
  65. </MenuItem>
  66. <MenuItem header>{t('compile_mode')}</MenuItem>
  67. <MenuItem onSelect={() => setDraft(false)}>
  68. <Icon type={!draft ? 'check' : ''} fw />
  69. {t('normal')}
  70. </MenuItem>
  71. <MenuItem onSelect={() => setDraft(true)}>
  72. <Icon type={draft ? 'check' : ''} fw />
  73. {t('fast')} <span className="subdued">[draft]</span>
  74. </MenuItem>
  75. <MenuItem header>Syntax Checks</MenuItem>
  76. <MenuItem onSelect={() => setStopOnValidationError(true)}>
  77. <Icon type={stopOnValidationError ? 'check' : ''} fw />
  78. {t('stop_on_validation_error')}
  79. </MenuItem>
  80. <MenuItem onSelect={() => setStopOnValidationError(false)}>
  81. <Icon type={!stopOnValidationError ? 'check' : ''} fw />
  82. {t('ignore_validation_errors')}
  83. </MenuItem>
  84. {showStopOnFirstError && (
  85. <MenuItem header>{t('compile_error_handling')}</MenuItem>
  86. )}
  87. {showStopOnFirstError && (
  88. <MenuItem onSelect={enableStopOnFirstError}>
  89. <Icon type={stopOnFirstError ? 'check' : ''} fw />
  90. {t('stop_on_first_error')}
  91. </MenuItem>
  92. )}
  93. {showStopOnFirstError && (
  94. <MenuItem onSelect={disableStopOnFirstError}>
  95. <Icon type={!stopOnFirstError ? 'check' : ''} fw />
  96. {t('try_to_compile_despite_errors')}
  97. </MenuItem>
  98. )}
  99. <MenuItem divider />
  100. <MenuItem
  101. onSelect={() => stopCompile()}
  102. disabled={!compiling}
  103. aria-disabled={!compiling}
  104. >
  105. {t('stop_compile')}
  106. </MenuItem>
  107. <MenuItem
  108. onSelect={() => recompileFromScratch()}
  109. disabled={compiling}
  110. aria-disabled={compiling}
  111. >
  112. {t('recompile_from_scratch')}
  113. </MenuItem>
  114. </Dropdown.Menu>
  115. </ControlledDropdown>
  116. )
  117. }
  118. export default memo(PdfCompileButton)