track-changes.jade 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. div#trackChanges(ng-show="ui.view == 'track-changes'")
  2. span(ng-controller="TrackChangesPremiumPopup")
  3. .upgrade-prompt(ng-show="!project.features.versioning")
  4. .message(ng-show="project.owner._id == user.id")
  5. p.text-center: strong #{translate("upgrade_to_get_feature", {feature:"full Project History"})}
  6. p.text-center.small(ng-show="startedFreeTrial") #{translate("refresh_page_after_starting_free_trial")}
  7. ul.list-unstyled
  8. li
  9. i.fa.fa-check  
  10. | #{translate("unlimited_projects")}
  11. li
  12. i.fa.fa-check  
  13. | #{translate("collabs_per_proj", {collabcount:'Multiple'})}
  14. li
  15. i.fa.fa-check  
  16. | #{translate("full_doc_history")}
  17. li
  18. i.fa.fa-check  
  19. | #{translate("sync_to_dropbox")}
  20. li
  21. i.fa.fa-check  
  22. | #{translate("sync_to_github")}
  23. li
  24. i.fa.fa-check  
  25. |#{translate("compile_larger_projects")}
  26. p.text-center(ng-controller="FreeTrialModalController")
  27. a.btn.btn-success(
  28. href
  29. ng-class="buttonClass"
  30. ng-click="startFreeTrial('track-changes')"
  31. ) #{translate("start_free_trial")}
  32. .message(ng-show="project.owner._id != user.id")
  33. p #{translate("ask_proj_owner_to_upgrade_for_history")}
  34. p
  35. a.small(href, ng-click="toggleTrackChanges()") #{translate("cancel")}
  36. aside.change-list(
  37. ng-controller="TrackChangesListController"
  38. infinite-scroll="loadMore()"
  39. infinite-scroll-disabled="trackChanges.loading || trackChanges.atEnd"
  40. infinite-scroll-initialize="ui.view == 'track-changes'"
  41. )
  42. .infinite-scroll-inner
  43. ul.list-unstyled(
  44. ng-class="{\
  45. 'hover-state': trackChanges.hoveringOverListSelectors\
  46. }"
  47. )
  48. li.change(
  49. ng-repeat="update in trackChanges.updates"
  50. ng-class="{\
  51. 'first-in-day': update.meta.first_in_day,\
  52. 'selected': update.inSelection,\
  53. 'selected-to': update.selectedTo,\
  54. 'selected-from': update.selectedFrom,\
  55. 'hover-selected': update.inHoverSelection,\
  56. 'hover-selected-to': update.hoverSelectedTo,\
  57. 'hover-selected-from': update.hoverSelectedFrom,\
  58. }"
  59. ng-controller="TrackChangesListItemController"
  60. )
  61. div.day(ng-show="update.meta.first_in_day") {{ update.meta.end_ts | relativeDate }}
  62. div.selectors
  63. div.range
  64. form
  65. input.selector-from(
  66. type="radio"
  67. name="fromVersion"
  68. ng-model="update.selectedFrom"
  69. ng-value="true"
  70. ng-mouseover="mouseOverSelectedFrom()"
  71. ng-mouseout="mouseOutSelectedFrom()"
  72. ng-show="update.afterSelection || update.inSelection"
  73. )
  74. form
  75. input.selector-to(
  76. type="radio"
  77. name="toVersion"
  78. ng-model="update.selectedTo"
  79. ng-value="true"
  80. ng-mouseover="mouseOverSelectedTo()"
  81. ng-mouseout="mouseOutSelectedTo()"
  82. ng-show="update.beforeSelection || update.inSelection"
  83. )
  84. div.description(ng-click="select()")
  85. div.time {{ update.meta.end_ts | formatDate:'h:mm a' }}
  86. div.docs(ng-repeat="(doc_id, doc) in update.docs")
  87. span.doc {{ doc.entity.name }}
  88. div.users
  89. div.user(ng-repeat="update_user in update.meta.users")
  90. .color-square(ng-if="update_user != null", ng-style="{'background-color': 'hsl({{ update_user.hue }}, 70%, 50%)'}")
  91. .color-square(ng-if="update_user == null", ng-style="{'background-color': 'hsl(100, 70%, 50%)'}")
  92. .name(ng-if="update_user && update_user.id != user.id" ng-bind="displayName(update_user)")
  93. .name(ng-if="update_user && update_user.id == user.id") You
  94. .name(ng-if="update_user == null") #{translate("anonymous")}
  95. div.user(ng-if="update.meta.users.length == 0")
  96. .color-square(style="background-color: hsl(100, 100%, 50%)")
  97. span #{translate("anonymous")}
  98. .loading(ng-show="trackChanges.loading")
  99. i.fa.fa-spin.fa-refresh
  100. |    #{translate("loading")}...
  101. .diff-panel.full-size(ng-controller="TrackChangesDiffController")
  102. .diff(
  103. ng-show="!!trackChanges.diff && !trackChanges.diff.loading && !trackChanges.diff.deleted && !trackChanges.diff.error"
  104. )
  105. .toolbar.toolbar-alt
  106. span.name
  107. | <strong>{{trackChanges.diff.highlights.length}} </strong>
  108. ng-pluralize(
  109. count="trackChanges.diff.highlights.length",
  110. when="{\
  111. 'one': 'change',\
  112. 'other': 'changes'\
  113. }"
  114. )
  115. | in <strong>{{trackChanges.diff.doc.name}}</strong>
  116. .toolbar-right
  117. a.btn.btn-danger.btn-sm(
  118. href,
  119. ng-click="openRestoreDiffModal()"
  120. ) #{translate("restore_to_before_these_changes")}
  121. .diff-editor.hide-ace-cursor(
  122. ace-editor="track-changes",
  123. theme="settings.theme",
  124. font-size="settings.fontSize",
  125. text="trackChanges.diff.text",
  126. highlights="trackChanges.diff.highlights",
  127. read-only="true",
  128. resize-on="layout:main:resize",
  129. navigate-highlights="true"
  130. )
  131. .diff-deleted.text-centered(
  132. ng-show="trackChanges.diff.deleted"
  133. )
  134. p.text-serif #{translate("file_has_been_deleted", {filename:"{{ trackChanges.diff.doc.name }} "})}
  135. p
  136. a.btn.btn-primary.btn-lg(
  137. href,
  138. ng-click="restoreDeletedDoc()"
  139. ) #{translate("restore")}
  140. .loading-panel(ng-show="trackChanges.diff.loading")
  141. i.fa.fa-spin.fa-refresh
  142. | &nbsp;&nbsp;#{translate("loading")}...
  143. .error-panel(ng-show="trackChanges.diff.error")
  144. .alert.alert-danger #{translate("generic_something_went_wrong")}
  145. script(type="text/ng-template", id="trackChangesRestoreDiffModalTemplate")
  146. .modal-header
  147. button.close(
  148. type="button"
  149. data-dismiss="modal"
  150. ng-click="cancel()"
  151. ) &times;
  152. h3 #{translate("restore")} {{diff.doc.name}}
  153. .modal-body.modal-body-share
  154. p !{translate("sure_you_want_to_restore_before", {filename:"<strong>{{diff.doc.name}}</strong>", date:"{{diff.start_ts | formatDate}}"})}
  155. .modal-footer
  156. button.btn.btn-default(
  157. ng-click="cancel()",
  158. ng-disabled="state.inflight"
  159. ) #{translate("cancel")}
  160. button.btn.btn-danger(
  161. ng-click="restore()",
  162. ng-disabled="state.inflight"
  163. )
  164. span(ng-show="!state.inflight") #{translate("restore")}
  165. span(ng-show="state.inflight") #{translate("restoring")} ...