view.doc.html.hook.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. js::set('hasPrivDiff', (bool)common::hasPriv('doc', 'diff'));
  3. js::set('diffLang', $lang->doc->diff);
  4. js::set('objectType', isset($type) ? $type : '');
  5. ?>
  6. <script>
  7. var arrVersionDiff = [];
  8. var isVersionDiff = false;
  9. /**
  10. * Add diffButton dom.
  11. *
  12. * @access public
  13. * @return void
  14. */
  15. function appendExchangeDom()
  16. {
  17. $('#docVersionMenu .drop-title').append('<div id="changeBtn" class="text-primary" style="cursor: pointer; display: flex; align-items: center;"><i class="icon icon-exchange"></i>' + diffLang + '</div>');
  18. }
  19. $('body').on('click', '#diffBtnGroup', function()
  20. {
  21. setTimeout(function()
  22. {
  23. if($('#changeBtn').length == 0 && ($('.drop-body li').length >1) && hasPrivDiff) appendExchangeDom();
  24. $('button[data-id=confirm]').attr('disabled', (arrVersionDiff.length !== 2))
  25. }, 10)
  26. })
  27. /**
  28. * Refresh checkbox dom.
  29. *
  30. * @access public
  31. * @return void
  32. */
  33. function refreshCheckbox()
  34. {
  35. var $inputs = $('#docVersionMenu .checkbox-primary input');
  36. if(arrVersionDiff.length == 2)
  37. {
  38. for(var i = 0; i < $inputs.length; i++)
  39. {
  40. var $input = $($inputs[i]);
  41. if(!$input.prop('checked'))
  42. {
  43. $input.addClass('disabled');
  44. $input.attr('disabled', true);
  45. $input.closest('.checkbox-primary').addClass('disabled');
  46. }
  47. }
  48. }
  49. else if(arrVersionDiff.length < 2)
  50. {
  51. for(var i = 0; i < $inputs.length; i++)
  52. {
  53. var $input = $($inputs[i]);
  54. $input.removeClass('disabled');
  55. $input.attr('disabled', false);
  56. $input.closest('.checkbox-primary').removeClass('disabled');
  57. }
  58. }
  59. }
  60. /**
  61. * Update data arrVersionDiff.
  62. *
  63. * @access public
  64. * @return void
  65. */
  66. function updateArrVersion()
  67. {
  68. arrVersionDiff = [];
  69. var $checkboxs = $('.drop-body .checkbox-primary input')
  70. for(var i = 0; i < $checkboxs.length ; i ++)
  71. {
  72. var $checkbox = $($checkboxs[i]);
  73. if($checkbox.prop('checked')) arrVersionDiff.push($checkbox.data());
  74. }
  75. $('button[data-id=confirm]').attr('disabled', (arrVersionDiff.length !== 2))
  76. }
  77. /**
  78. * Refresh dom view.
  79. *
  80. * @access public
  81. * @return void
  82. */
  83. function reloadView(newV, oldV)
  84. {
  85. var param = 'objectType=' + objectType + '&docID=' + docID + '&newVersion=' + newV + '&oldVersion=' + oldV;
  86. $.get(createLink('doc', 'diff', param), function(data)
  87. {
  88. $('#diffContain').empty();
  89. $('#diffContain').append(data);
  90. })
  91. }
  92. /**
  93. * Render buttonGroup dom.
  94. *
  95. * @access public
  96. * @return void
  97. */
  98. function renderdiffBtnGroup()
  99. {
  100. var $btnGroup = $('#diffBtnGroup');
  101. var oldV = arrVersionDiff[0].version;
  102. var newV = arrVersionDiff[1].version;
  103. if(newV < oldV)
  104. {
  105. var tmpArr = [newV, oldV];
  106. newV = tmpArr[1];
  107. oldV = tmpArr[0];
  108. }
  109. if(isVersionDiff)
  110. {
  111. var tmpArr = [newV, oldV];
  112. newV = tmpArr[1];
  113. oldV = tmpArr[0];
  114. }
  115. var leftDom = $btnGroup.find('a.left-dom').html('V' + oldV + '<span class="caret"></span>');
  116. var rightDom = $btnGroup.find('a.right-dom').html('V' + newV + '<span class="caret"></span>');
  117. reloadView(newV, oldV);
  118. }
  119. $('body').on('click', '#docVersionMenu .drop-bottom', function(e)
  120. {
  121. var data = $(e.target).data();
  122. e.stopPropagation();
  123. if(data.id == 'cancel')
  124. {
  125. $('#docVersionMenu').removeClass('diff');
  126. }
  127. else if(data.id == 'confirm')
  128. {
  129. if(arrVersionDiff.length == 2)
  130. {
  131. var $btnGroup = $('#diffBtnGroup');
  132. $btnGroup.addClass('show-diff');
  133. renderdiffBtnGroup();
  134. }
  135. $(this.closest('.open.btn-group')).removeClass('open');
  136. }
  137. }).on('click', '#docVersionMenu .drop-body .li-item', function(e)
  138. {
  139. var $input = $(this).find('input');
  140. if(!$(e.target).is('input')) $input.trigger('click');
  141. updateArrVersion();
  142. refreshCheckbox();
  143. }).on('click', '#exchangeDiffBtn', function()
  144. {
  145. isVersionDiff = !isVersionDiff;
  146. var $btn = $(this);
  147. renderdiffBtnGroup();
  148. if(isVersionDiff)
  149. {
  150. $btn.addClass('text-primary');
  151. }
  152. else
  153. {
  154. $btn.removeClass('text-primary');
  155. }
  156. });
  157. </script>
  158. <style>
  159. #diffContain > .main-content {height: calc(100vh - 200px); overflow-y: auto;}
  160. .htmldiff {white-space:pre-wrap;}
  161. .htmldiff del img{border:2px solid red;}
  162. .htmldiff ins img{border:2px solid green;}
  163. .htmldiff del {color: #D91B1B; text-decoration: line-through;}
  164. .htmldiff ins {color: #0CA76F; background: rgba(208, 246, 232, 0.4); text-decoration: none; border-left:2px solid #dfd; border-right:2px solid #dfd;}
  165. </style>