toolbar.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import React from "react"
  2. import Button from "misago/components/button"
  3. import escapeHtml from "misago/utils/escape-html"
  4. const DATE_ABBR = '<abbr title="%(absolute)s">%(relative)s</abbr>'
  5. const USER_SPAN = '<span class="item-title">%(user)s</span>'
  6. const USER_URL = '<a href="%(url)s" class="item-title">%(user)s</a>'
  7. export default class extends React.Component {
  8. goLast = () => {
  9. this.props.goToEdit()
  10. }
  11. goForward = () => {
  12. this.props.goToEdit(this.props.edit.next)
  13. }
  14. goBack = () => {
  15. this.props.goToEdit(this.props.edit.previous)
  16. }
  17. revertEdit = () => {
  18. this.props.revertEdit(this.props.edit.id)
  19. }
  20. render() {
  21. return (
  22. <div className="modal-toolbar post-changelog-toolbar">
  23. <div className="row">
  24. <div className="col-xs-12 col-sm-4">
  25. <div className="row">
  26. <div className="col-xs-4">
  27. <GoBackBtn
  28. disabled={this.props.disabled}
  29. edit={this.props.edit}
  30. onClick={this.goBack}
  31. />
  32. </div>
  33. <div className="col-xs-4">
  34. <GoForwardBtn
  35. disabled={this.props.disabled}
  36. edit={this.props.edit}
  37. onClick={this.goForward}
  38. />
  39. </div>
  40. <div className="col-xs-4">
  41. <GoLastBtn
  42. disabled={this.props.disabled}
  43. edit={this.props.edit}
  44. onClick={this.goLast}
  45. />
  46. </div>
  47. </div>
  48. </div>
  49. <div className="col-xs-12 col-sm-5 xs-margin-top-half post-change-label">
  50. <Label edit={this.props.edit} />
  51. </div>
  52. <RevertBtn
  53. canRevert={this.props.canRevert}
  54. disabled={this.props.disabled}
  55. onClick={this.revertEdit}
  56. />
  57. </div>
  58. </div>
  59. )
  60. }
  61. }
  62. export function GoBackBtn(props) {
  63. return (
  64. <Button
  65. className="btn-default btn-block btn-icon btn-sm"
  66. disabled={props.disabled || !props.edit.previous}
  67. onClick={props.onClick}
  68. title={gettext("See previous change")}
  69. >
  70. <span className="material-icon">chevron_left</span>
  71. </Button>
  72. )
  73. }
  74. export function GoForwardBtn(props) {
  75. return (
  76. <Button
  77. className="btn-default btn-block btn-icon btn-sm"
  78. disabled={props.disabled || !props.edit.next}
  79. onClick={props.onClick}
  80. title={gettext("See previous change")}
  81. >
  82. <span className="material-icon">chevron_right</span>
  83. </Button>
  84. )
  85. }
  86. export function GoLastBtn(props) {
  87. return (
  88. <Button
  89. className="btn-default btn-block btn-icon btn-sm"
  90. disabled={props.disabled || !props.edit.next}
  91. onClick={props.onClick}
  92. title={gettext("See previous change")}
  93. >
  94. <span className="material-icon">last_page</span>
  95. </Button>
  96. )
  97. }
  98. export function RevertBtn(props) {
  99. if (!props.canRevert) return null
  100. return (
  101. <div className="col-sm-3 hidden-xs">
  102. <Button
  103. className="btn-default btn-sm btn-block"
  104. disabled={props.disabled}
  105. onClick={props.onClick}
  106. title={gettext("Revert post to state from before this edit.")}
  107. >
  108. {gettext("Revert")}
  109. </Button>
  110. </div>
  111. )
  112. }
  113. export function Label(props) {
  114. let user = null
  115. if (props.edit.url.editor) {
  116. user = interpolate(
  117. USER_URL,
  118. {
  119. url: escapeHtml(props.edit.url.editor),
  120. user: escapeHtml(props.edit.editor_name)
  121. },
  122. true
  123. )
  124. } else {
  125. user = interpolate(
  126. USER_SPAN,
  127. {
  128. user: escapeHtml(props.edit.editor_name)
  129. },
  130. true
  131. )
  132. }
  133. const date = interpolate(
  134. DATE_ABBR,
  135. {
  136. absolute: escapeHtml(props.edit.edited_on.format("LLL")),
  137. relative: escapeHtml(props.edit.edited_on.fromNow())
  138. },
  139. true
  140. )
  141. const message = interpolate(
  142. escapeHtml(gettext("By %(edited_by)s %(edited_on)s.")),
  143. {
  144. edited_by: user,
  145. edited_on: date
  146. },
  147. true
  148. )
  149. return <p dangerouslySetInnerHTML={{ __html: message }} />
  150. }