history.pug 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. div#history(ng-show="ui.view == 'history'")
  2. span(ng-controller="HistoryPremiumPopup")
  3. .upgrade-prompt(ng-if="project.features.versioning === false && ui.view === 'history'")
  4. div(ng-if="project.owner._id == user.id")
  5. div(sixpack-switch="teaser-history")
  6. .message(sixpack-default)
  7. p.text-center: strong #{translate("upgrade_to_get_feature", {feature:"full Project History"})}
  8. p.text-center.small(ng-show="startedFreeTrial") #{translate("refresh_page_after_starting_free_trial")}
  9. ul.list-unstyled
  10. li
  11. i.fa.fa-check  
  12. | #{translate("unlimited_projects")}
  13. li
  14. i.fa.fa-check  
  15. | #{translate("collabs_per_proj", {collabcount:'Multiple'})}
  16. li
  17. i.fa.fa-check  
  18. | #{translate("full_doc_history")}
  19. li
  20. i.fa.fa-check  
  21. | #{translate("sync_to_dropbox")}
  22. li
  23. i.fa.fa-check  
  24. | #{translate("sync_to_github")}
  25. li
  26. i.fa.fa-check  
  27. |#{translate("compile_larger_projects")}
  28. p.text-center(ng-controller="FreeTrialModalController")
  29. a.btn.btn-success(
  30. href
  31. ng-class="buttonClass"
  32. ng-click="startFreeTrial('history')"
  33. sixpack-convert="teaser-history"
  34. ) #{translate("start_free_trial")}
  35. .message.message-wider(sixpack-when="focused")
  36. header.message-header
  37. h3 History
  38. .message-body
  39. h4.teaser-title See who changed what. Go back to previous versions.
  40. img.teaser-img(
  41. src="/img/teasers/history/teaser-history.png"
  42. alt="History"
  43. )
  44. p.text-center.small(ng-show="startedFreeTrial") #{translate("refresh_page_after_starting_free_trial")}
  45. .row
  46. .col-md-8.col-md-offset-2
  47. ul.list-unstyled
  48. li
  49. i.fa.fa-check  
  50. | Catch up with your collaborators changes
  51. li
  52. i.fa.fa-check  
  53. | See changes over any time period
  54. li
  55. i.fa.fa-check  
  56. | Revert your documents to previous versions
  57. li
  58. i.fa.fa-check  
  59. | Restore deleted files
  60. p.text-center(ng-controller="FreeTrialModalController")
  61. a.btn.btn-success(
  62. href
  63. ng-class="buttonClass"
  64. ng-click="startFreeTrial('history')"
  65. sixpack-convert="teaser-history"
  66. ) Try it for free
  67. .message(ng-show="project.owner._id != user.id")
  68. p #{translate("ask_proj_owner_to_upgrade_for_history")}
  69. p
  70. a.small(href, ng-click="toggleHistory()") #{translate("cancel")}
  71. aside.change-list(
  72. ng-controller="HistoryListController"
  73. infinite-scroll="loadMore()"
  74. infinite-scroll-disabled="history.loading || history.atEnd"
  75. infinite-scroll-initialize="ui.view == 'history'"
  76. )
  77. .infinite-scroll-inner
  78. ul.list-unstyled(
  79. ng-class="{\
  80. 'hover-state': history.hoveringOverListSelectors\
  81. }"
  82. )
  83. li.change(
  84. ng-repeat="update in history.updates"
  85. ng-class="{\
  86. 'first-in-day': update.meta.first_in_day,\
  87. 'selected': update.inSelection,\
  88. 'selected-to': update.selectedTo,\
  89. 'selected-from': update.selectedFrom,\
  90. 'hover-selected': update.inHoverSelection,\
  91. 'hover-selected-to': update.hoverSelectedTo,\
  92. 'hover-selected-from': update.hoverSelectedFrom,\
  93. }"
  94. ng-controller="HistoryListItemController"
  95. )
  96. div.day(ng-show="update.meta.first_in_day") {{ update.meta.end_ts | relativeDate }}
  97. div.selectors
  98. div.range
  99. form
  100. input.selector-from(
  101. type="radio"
  102. name="fromVersion"
  103. ng-model="update.selectedFrom"
  104. ng-value="true"
  105. ng-mouseover="mouseOverSelectedFrom()"
  106. ng-mouseout="mouseOutSelectedFrom()"
  107. ng-show="update.afterSelection || update.inSelection"
  108. )
  109. form
  110. input.selector-to(
  111. type="radio"
  112. name="toVersion"
  113. ng-model="update.selectedTo"
  114. ng-value="true"
  115. ng-mouseover="mouseOverSelectedTo()"
  116. ng-mouseout="mouseOutSelectedTo()"
  117. ng-show="update.beforeSelection || update.inSelection"
  118. )
  119. div.description(ng-click="select()")
  120. div.time {{ update.meta.end_ts | formatDate:'h:mm a' }}
  121. div.docs(ng-repeat="(doc_id, doc) in update.docs")
  122. span.doc {{ doc.entity.name }}
  123. div.users
  124. div.user(ng-repeat="update_user in update.meta.users")
  125. .color-square(ng-if="update_user != null", ng-style="{'background-color': 'hsl({{ update_user.hue }}, 70%, 50%)'}")
  126. .color-square(ng-if="update_user == null", ng-style="{'background-color': 'hsl(100, 70%, 50%)'}")
  127. .name(ng-if="update_user && update_user.id != user.id" ng-bind="displayName(update_user)")
  128. .name(ng-if="update_user && update_user.id == user.id") You
  129. .name(ng-if="update_user == null") #{translate("anonymous")}
  130. div.user(ng-if="update.meta.users.length == 0")
  131. .color-square(style="background-color: hsl(100, 100%, 50%)")
  132. span #{translate("anonymous")}
  133. .loading(ng-show="history.loading")
  134. i.fa.fa-spin.fa-refresh
  135. |    #{translate("loading")}...
  136. .diff-panel.full-size(ng-controller="HistoryDiffController")
  137. .diff(
  138. ng-show="!!history.diff && !history.diff.loading && !history.diff.deleted && !history.diff.error"
  139. )
  140. .toolbar.toolbar-alt
  141. span.name
  142. | <strong>{{history.diff.highlights.length}} </strong>
  143. ng-pluralize(
  144. count="history.diff.highlights.length",
  145. when="{\
  146. 'one': 'change',\
  147. 'other': 'changes'\
  148. }"
  149. )
  150. | in <strong>{{history.diff.doc.name}}</strong>
  151. .toolbar-right
  152. a.btn.btn-danger.btn-sm(
  153. href,
  154. ng-click="openRestoreDiffModal()"
  155. ) #{translate("restore_to_before_these_changes")}
  156. .diff-editor.hide-ace-cursor(
  157. ace-editor="history",
  158. theme="settings.theme",
  159. font-size="settings.fontSize",
  160. text="history.diff.text",
  161. highlights="history.diff.highlights",
  162. read-only="true",
  163. resize-on="layout:main:resize",
  164. navigate-highlights="true"
  165. )
  166. .diff-deleted.text-centered(
  167. ng-show="history.diff.deleted && !history.diff.restoreDeletedSuccess"
  168. )
  169. p.text-serif #{translate("file_has_been_deleted", {filename:"{{ history.diff.doc.name }} "})}
  170. p
  171. a.btn.btn-primary.btn-lg(
  172. href,
  173. ng-click="restoreDeletedDoc()",
  174. ng-disabled="history.diff.restoreInProgress"
  175. ) #{translate("restore")}
  176. .diff-deleted.text-centered(
  177. ng-show="history.diff.deleted && history.diff.restoreDeletedSuccess"
  178. )
  179. p.text-serif #{translate("file_restored", {filename:"{{ history.diff.doc.name }} "})}
  180. p.text-serif #{translate("file_restored_back_to_editor")}
  181. p
  182. a.btn.btn-default(
  183. href,
  184. ng-click="backToEditorAfterRestore()",
  185. ) #{translate("file_restored_back_to_editor_btn")}
  186. .loading-panel(ng-show="history.diff.loading")
  187. i.fa.fa-spin.fa-refresh
  188. | &nbsp;&nbsp;#{translate("loading")}...
  189. .error-panel(ng-show="history.diff.error")
  190. .alert.alert-danger #{translate("generic_something_went_wrong")}
  191. script(type="text/ng-template", id="historyRestoreDiffModalTemplate")
  192. .modal-header
  193. button.close(
  194. type="button"
  195. data-dismiss="modal"
  196. ng-click="cancel()"
  197. ) &times;
  198. h3 #{translate("restore")} {{diff.doc.name}}
  199. .modal-body.modal-body-share
  200. p !{translate("sure_you_want_to_restore_before", {filename:"<strong>{{diff.doc.name}}</strong>", date:"{{diff.start_ts | formatDate}}"})}
  201. .modal-footer
  202. button.btn.btn-default(
  203. ng-click="cancel()",
  204. ng-disabled="state.inflight"
  205. ) #{translate("cancel")}
  206. button.btn.btn-danger(
  207. ng-click="restore()",
  208. ng-disabled="state.inflight"
  209. )
  210. span(ng-show="!state.inflight") #{translate("restore")}
  211. span(ng-show="state.inflight") #{translate("restoring")} ...