privacy-tools.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /**
  2. * Interactions used by the User Privacy tools in WordPress.
  3. *
  4. * @output wp-admin/js/privacy-tools.js
  5. */
  6. // Privacy request action handling
  7. jQuery( document ).ready( function( $ ) {
  8. var strings = window.privacyToolsL10n || {};
  9. function setActionState( $action, state ) {
  10. $action.children().addClass( 'hidden' );
  11. $action.children( '.' + state ).removeClass( 'hidden' );
  12. }
  13. function clearResultsAfterRow( $requestRow ) {
  14. $requestRow.removeClass( 'has-request-results' );
  15. if ( $requestRow.next().hasClass( 'request-results' ) ) {
  16. $requestRow.next().remove();
  17. }
  18. }
  19. function appendResultsAfterRow( $requestRow, classes, summaryMessage, additionalMessages ) {
  20. var itemList = '',
  21. resultRowClasses = 'request-results';
  22. clearResultsAfterRow( $requestRow );
  23. if ( additionalMessages.length ) {
  24. $.each( additionalMessages, function( index, value ) {
  25. itemList = itemList + '<li>' + value + '</li>';
  26. });
  27. itemList = '<ul>' + itemList + '</ul>';
  28. }
  29. $requestRow.addClass( 'has-request-results' );
  30. if ( $requestRow.hasClass( 'status-request-confirmed' ) ) {
  31. resultRowClasses = resultRowClasses + ' status-request-confirmed';
  32. }
  33. if ( $requestRow.hasClass( 'status-request-failed' ) ) {
  34. resultRowClasses = resultRowClasses + ' status-request-failed';
  35. }
  36. $requestRow.after( function() {
  37. return '<tr class="' + resultRowClasses + '"><th colspan="5">' +
  38. '<div class="notice inline notice-alt ' + classes + '">' +
  39. '<p>' + summaryMessage + '</p>' +
  40. itemList +
  41. '</div>' +
  42. '</td>' +
  43. '</tr>';
  44. });
  45. }
  46. $( '.export-personal-data-handle' ).click( function( event ) {
  47. var $this = $( this ),
  48. $action = $this.parents( '.export-personal-data' ),
  49. $requestRow = $this.parents( 'tr' ),
  50. requestID = $action.data( 'request-id' ),
  51. nonce = $action.data( 'nonce' ),
  52. exportersCount = $action.data( 'exporters-count' ),
  53. sendAsEmail = $action.data( 'send-as-email' ) ? true : false;
  54. event.preventDefault();
  55. event.stopPropagation();
  56. $action.blur();
  57. clearResultsAfterRow( $requestRow );
  58. function onExportDoneSuccess( zipUrl ) {
  59. var summaryMessage = strings.emailSent;
  60. setActionState( $action, 'export-personal-data-success' );
  61. appendResultsAfterRow( $requestRow, 'notice-success', summaryMessage, [] );
  62. $this.hide();
  63. if ( 'undefined' !== typeof zipUrl ) {
  64. window.location = zipUrl;
  65. } else if ( ! sendAsEmail ) {
  66. onExportFailure( strings.noExportFile );
  67. }
  68. }
  69. function onExportFailure( errorMessage ) {
  70. setActionState( $action, 'export-personal-data-failed' );
  71. if ( errorMessage ) {
  72. appendResultsAfterRow( $requestRow, 'notice-error', strings.exportError, [ errorMessage ] );
  73. }
  74. }
  75. function doNextExport( exporterIndex, pageIndex ) {
  76. $.ajax(
  77. {
  78. url: window.ajaxurl,
  79. data: {
  80. action: 'wp-privacy-export-personal-data',
  81. exporter: exporterIndex,
  82. id: requestID,
  83. page: pageIndex,
  84. security: nonce,
  85. sendAsEmail: sendAsEmail
  86. },
  87. method: 'post'
  88. }
  89. ).done( function( response ) {
  90. var responseData = response.data;
  91. if ( ! response.success ) {
  92. // e.g. invalid request ID
  93. onExportFailure( response.data );
  94. return;
  95. }
  96. if ( ! responseData.done ) {
  97. setTimeout( doNextExport( exporterIndex, pageIndex + 1 ) );
  98. } else {
  99. if ( exporterIndex < exportersCount ) {
  100. setTimeout( doNextExport( exporterIndex + 1, 1 ) );
  101. } else {
  102. onExportDoneSuccess( responseData.url );
  103. }
  104. }
  105. }).fail( function( jqxhr, textStatus, error ) {
  106. // e.g. Nonce failure
  107. onExportFailure( error );
  108. });
  109. }
  110. // And now, let's begin
  111. setActionState( $action, 'export-personal-data-processing' );
  112. doNextExport( 1, 1 );
  113. });
  114. $( '.remove-personal-data-handle' ).click( function( event ) {
  115. var $this = $( this ),
  116. $action = $this.parents( '.remove-personal-data' ),
  117. $requestRow = $this.parents( 'tr' ),
  118. requestID = $action.data( 'request-id' ),
  119. nonce = $action.data( 'nonce' ),
  120. erasersCount = $action.data( 'erasers-count' ),
  121. hasRemoved = false,
  122. hasRetained = false,
  123. messages = [];
  124. event.stopPropagation();
  125. $action.blur();
  126. clearResultsAfterRow( $requestRow );
  127. function onErasureDoneSuccess() {
  128. var summaryMessage = strings.noDataFound;
  129. var classes = 'notice-success';
  130. setActionState( $action, 'remove-personal-data-success' );
  131. if ( false === hasRemoved ) {
  132. if ( false === hasRetained ) {
  133. summaryMessage = strings.noDataFound;
  134. } else {
  135. summaryMessage = strings.noneRemoved;
  136. classes = 'notice-warning';
  137. }
  138. } else {
  139. if ( false === hasRetained ) {
  140. summaryMessage = strings.foundAndRemoved;
  141. } else {
  142. summaryMessage = strings.someNotRemoved;
  143. classes = 'notice-warning';
  144. }
  145. }
  146. appendResultsAfterRow( $requestRow, classes, summaryMessage, messages );
  147. $this.hide();
  148. }
  149. function onErasureFailure() {
  150. setActionState( $action, 'remove-personal-data-failed' );
  151. appendResultsAfterRow( $requestRow, 'notice-error', strings.removalError, [] );
  152. }
  153. function doNextErasure( eraserIndex, pageIndex ) {
  154. $.ajax({
  155. url: window.ajaxurl,
  156. data: {
  157. action: 'wp-privacy-erase-personal-data',
  158. eraser: eraserIndex,
  159. id: requestID,
  160. page: pageIndex,
  161. security: nonce
  162. },
  163. method: 'post'
  164. }).done( function( response ) {
  165. var responseData = response.data;
  166. if ( ! response.success ) {
  167. onErasureFailure();
  168. return;
  169. }
  170. if ( responseData.items_removed ) {
  171. hasRemoved = hasRemoved || responseData.items_removed;
  172. }
  173. if ( responseData.items_retained ) {
  174. hasRetained = hasRetained || responseData.items_retained;
  175. }
  176. if ( responseData.messages ) {
  177. messages = messages.concat( responseData.messages );
  178. }
  179. if ( ! responseData.done ) {
  180. setTimeout( doNextErasure( eraserIndex, pageIndex + 1 ) );
  181. } else {
  182. if ( eraserIndex < erasersCount ) {
  183. setTimeout( doNextErasure( eraserIndex + 1, 1 ) );
  184. } else {
  185. onErasureDoneSuccess();
  186. }
  187. }
  188. }).fail( function() {
  189. onErasureFailure();
  190. });
  191. }
  192. // And now, let's begin
  193. setActionState( $action, 'remove-personal-data-processing' );
  194. doNextErasure( 1, 1 );
  195. });
  196. // Privacy policy page, copy button.
  197. $( document ).on( 'click', function( event ) {
  198. var $target = $( event.target );
  199. var $parent, $container, range;
  200. if ( $target.is( 'button.privacy-text-copy' ) ) {
  201. $parent = $target.parent().parent();
  202. $container = $parent.find( 'div.wp-suggested-text' );
  203. if ( ! $container.length ) {
  204. $container = $parent.find( 'div.policy-text' );
  205. }
  206. if ( $container.length ) {
  207. try {
  208. window.getSelection().removeAllRanges();
  209. range = document.createRange();
  210. $container.addClass( 'hide-privacy-policy-tutorial' );
  211. range.selectNodeContents( $container[0] );
  212. window.getSelection().addRange( range );
  213. document.execCommand( 'copy' );
  214. $container.removeClass( 'hide-privacy-policy-tutorial' );
  215. window.getSelection().removeAllRanges();
  216. } catch ( er ) {}
  217. }
  218. }
  219. });
  220. });