Нет описания

admin-pointer.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /**
  2. * Handles pointers throughout Popup Maker.
  3. */
  4. ( function( $ ) {
  5. window.pumPointers = window.pumPointers || {
  6. pointers: [],
  7. };
  8. window.skipTour = false;
  9. function open_pointer( id ) {
  10. id = parseInt( id );
  11. var pointer = pumPointers.pointers[id];
  12. // Checks if we need to do anything prior to opening pointer.
  13. if ( pointer.hasOwnProperty( 'pre' ) ) {
  14. // Checks if we need to do any clicks.
  15. if ( pointer.pre.hasOwnProperty( 'clicks' ) ) {
  16. $.each( pointer.pre.clicks, function( index, element ) {
  17. $( element ).click();
  18. } );
  19. }
  20. }
  21. // If target is not valid, exit early.
  22. var $target = $( pointer.target );
  23. if ( 0 === $target.length ) {
  24. return;
  25. }
  26. // Prepare the options to be passed to wp-pointer.
  27. var options = $.extend( pointer.options, {
  28. close: function() {
  29. $.post( ajaxurl, {
  30. pointer: pointer.pointer_id,
  31. action: 'dismiss-wp-pointer',
  32. } );
  33. // If we have other pointers left in tour, open the next.
  34. if ( false === skipTour && id !== pumPointers.pointers.length - 1 ) {
  35. open_pointer( id + 1 );
  36. }
  37. },
  38. buttons: function( event, t ) {
  39. var $btn_skip = $( '<button class="button" style="margin-right: 10px;">Skip tour</button>' );
  40. var $btn_next = $( '<button class="button button-primary">Next</button>' );
  41. var $btn_complete = $( '<button class="button button-primary">Thanks!</button>' );
  42. var $wrapper = $( '<div class=\"pum-pointer-buttons\" />' );
  43. $btn_skip.bind( 'click.point', function( e ) {
  44. e.preventDefault();
  45. skipTour = true;
  46. t.element.pointer( 'close' );
  47. for ( var i = 0; i < pumPointers.pointers.length; i++ ) {
  48. /**
  49. * If the user has never dismissed pointers before, there is a chance
  50. * their user meta key hasn't been set yet. If we fire too many of these
  51. * at once, WordPress will rewrite itself a few times causing not all
  52. * to be dismissed.
  53. */
  54. setTimeout( function( i ) {
  55. $.post( ajaxurl, {
  56. pointer: pumPointers.pointers[i].pointer_id,
  57. action: 'dismiss-wp-pointer',
  58. } );
  59. }, ( i * 500 ) + 1, i );
  60. }
  61. } );
  62. $btn_next.bind( 'click.pointer', function( e ) {
  63. e.preventDefault();
  64. t.element.pointer( 'close' );
  65. } );
  66. $btn_complete.bind( 'click.pointer', function( e ) {
  67. e.preventDefault();
  68. t.element.pointer( 'close' );
  69. } );
  70. // If this is the first pointer of a tour...
  71. if ( 1 !== pumPointers.pointers.length && 0 === id ) {
  72. // ... then show a skip tour button.
  73. $wrapper.append( $btn_skip );
  74. }
  75. // If this is the last pointer in tour...
  76. if ( id === pumPointers.pointers.length - 1 ) {
  77. // ... then show complete button.
  78. $wrapper.append( $btn_complete );
  79. } else {
  80. // ... else show next button.
  81. $wrapper.append( $btn_next );
  82. }
  83. return $wrapper;
  84. },
  85. } );
  86. // Show pointer after scrolling to target.
  87. var this_pointer = $target.pointer( options );
  88. $( 'html, body' ).animate( { scrollTop: $target.offset().top - 200 } );
  89. this_pointer.pointer( 'open' );
  90. }
  91. $( function( $ ) {
  92. /**
  93. * Since many of our fields and screens are dynamically loaded, we need to ensure
  94. * the first pointer doesn't start until after they are loaded. But, we can set those
  95. * JS files as dependencies as we these pointers could be loaded on any admin screen.
  96. */
  97. setTimeout( function() {
  98. if ( 0 < pumPointers.pointers.length ) {
  99. open_pointer( 0 );
  100. }
  101. }, 1000 );
  102. } );
  103. }( jQuery ) );