fl-builder-revisions.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. ( function( $ ) {
  2. /**
  3. * Revisions manager for the builder.
  4. *
  5. * @since 2.0
  6. * @class Revisions
  7. */
  8. var Revisions = {
  9. /**
  10. * Initialize builder revisions.
  11. *
  12. * @since 2.0
  13. * @method init
  14. */
  15. init: function()
  16. {
  17. this.setupMainMenuData();
  18. $( '.fl-builder--revision-actions select' ).on( 'change', this.selectChanged );
  19. $( '.fl-cancel-revision-preview' ).on( 'click', this.exitPreview.bind( this ) );
  20. $( '.fl-apply-revision-preview' ).on( 'click', this.applyClicked.bind( this ) );
  21. FLBuilder.addHook( 'revisionItemClicked', this.itemClicked.bind( this ) );
  22. FLBuilder.addHook( 'didPublishLayout', this.refreshItems.bind( this ) );
  23. },
  24. /**
  25. * Adds the revision items to the main menu data.
  26. *
  27. * @since 2.0
  28. * @method setupMainMenuData
  29. */
  30. setupMainMenuData: function()
  31. {
  32. var posts = FLBuilderConfig.revisions.posts,
  33. authors = FLBuilderConfig.revisions.authors,
  34. template = wp.template( 'fl-revision-list-item' ),
  35. select = $( '.fl-builder--revision-actions select' ),
  36. date = '',
  37. author = '',
  38. i = 0;
  39. FLBuilderConfig.mainMenu.revisions.items = [];
  40. select.html( '' );
  41. if ( 0 === posts.length ) {
  42. FLBuilderConfig.mainMenu.revisions.items.push( {
  43. eventName : 'noRevisionsMessage',
  44. type : 'event',
  45. label : wp.template( 'fl-no-revisions-message' )()
  46. } );
  47. } else {
  48. for ( ; i < posts.length; i++ ) {
  49. date = FLBuilderStrings.revisionDate.replace( '%s', posts[ i ].date.diff );
  50. date += ' (' + posts[ i ].date.published + ')';
  51. author = FLBuilderStrings.revisionAuthor.replace( '%s', authors[ posts[ i ].author ].name );
  52. FLBuilderConfig.mainMenu.revisions.items.push( {
  53. eventName : 'revisionItemClicked',
  54. type : 'event',
  55. label : template( {
  56. id : posts[ i ].id,
  57. date : date,
  58. author : author,
  59. avatar : authors[ posts[ i ].author ].avatar
  60. } )
  61. } );
  62. select.append( '<option value="' + posts[ i ].id + '">' + date + '</option>' );
  63. }
  64. }
  65. FLBuilder.triggerHook( 'renderRevisionsPanel' );
  66. },
  67. /**
  68. * Refreshes the items in the revisions menu.
  69. *
  70. * @since 2.0
  71. * @method refreshItems
  72. */
  73. refreshItems: function()
  74. {
  75. FLBuilder.ajax( {
  76. action: 'refresh_revision_items'
  77. }, this.refreshItemsComplete.bind( this ) );
  78. },
  79. /**
  80. * Re-renders the revision items when they have been refreshed.
  81. *
  82. * @since 2.0
  83. * @method preview
  84. * @param {Number} id
  85. */
  86. refreshItemsComplete: function( response )
  87. {
  88. FLBuilderConfig.revisions = JSON.parse( response );
  89. this.setupMainMenuData();
  90. },
  91. /**
  92. * Callback for when a revision item is clicked
  93. * to preview a revision.
  94. *
  95. * @since 2.0
  96. * @method itemClicked
  97. * @param {Object} e
  98. * @param {Object} item
  99. */
  100. itemClicked: function( e, item )
  101. {
  102. var id = $( item ).find( '.fl-revision-list-item' ).attr( 'data-revision-id' );
  103. // Save existing settings first if any exist. Don't proceed if it fails.
  104. if ( ! FLBuilder._triggerSettingsSave( false, true ) ) {
  105. return;
  106. }
  107. $( '.fl-builder--revision-actions select' ).val( id );
  108. this.preview( id );
  109. },
  110. /**
  111. * Callback for when the revision select is changed.
  112. *
  113. * @since 2.0
  114. * @method selectChanged
  115. * @param {Object} e
  116. */
  117. selectChanged: function( e )
  118. {
  119. Revisions.preview( $( this ).val() );
  120. },
  121. /**
  122. * Restores a revision when the apply button is clicked.
  123. *
  124. * @since 2.0
  125. * @method applyClicked
  126. * @param {Object} e
  127. */
  128. applyClicked: function( e )
  129. {
  130. var id = $( '.fl-builder--revision-actions select' ).val();
  131. Revisions.restore( id );
  132. },
  133. /**
  134. * Previews a revision with the specified ID.
  135. *
  136. * @since 2.0
  137. * @method preview
  138. * @param {Number} id
  139. */
  140. preview: function( id )
  141. {
  142. $( '.fl-builder--revision-actions' ).css( 'display', 'flex' );
  143. FLBuilder.triggerHook( 'didEnterRevisionPreview' );
  144. FLBuilder.showAjaxLoader();
  145. FLBuilder.ajax( {
  146. action : 'render_revision_preview',
  147. revision_id : id
  148. }, this.previewRenderComplete.bind( this ) );
  149. },
  150. /**
  151. * Previews a revision with the specified ID.
  152. *
  153. * @since 2.0
  154. * @method previewRenderComplete
  155. * @param {String} response
  156. */
  157. previewRenderComplete: function( response )
  158. {
  159. FLBuilder._renderLayout( response, function() {
  160. FLBuilder._destroyOverlayEvents();
  161. FLBuilder._removeAllOverlays();
  162. } );
  163. },
  164. /**
  165. * Exits a revision preview and restores the original layout.
  166. *
  167. * @since 2.0
  168. * @method exitPreview
  169. */
  170. exitPreview: function()
  171. {
  172. $( '.fl-builder--revision-actions' ).hide();
  173. FLBuilder.triggerHook( 'didExitRevisionPreview' );
  174. FLBuilder._bindOverlayEvents();
  175. FLBuilder._updateLayout();
  176. },
  177. /**
  178. * Restores the layout to a revision with the specified ID.
  179. *
  180. * @since 2.0
  181. * @method restore
  182. * @param {Number} id
  183. */
  184. restore: function( id )
  185. {
  186. $( '.fl-builder--revision-actions' ).hide();
  187. FLBuilder.triggerHook( 'didExitRevisionPreview' );
  188. FLBuilder.showAjaxLoader();
  189. FLBuilder._bindOverlayEvents();
  190. FLBuilder.ajax( {
  191. action : 'restore_revision',
  192. revision_id : id
  193. }, Revisions.restoreComplete );
  194. },
  195. /**
  196. * Callback for when a revision is restored.
  197. *
  198. * @since 2.0
  199. * @method restoreComplete
  200. * @param {String} response
  201. */
  202. restoreComplete: function( response ) {
  203. var data = JSON.parse( response );
  204. FLBuilder._renderLayout( data.layout );
  205. FLBuilder.triggerHook( 'didRestoreRevisionComplete', data.config );
  206. }
  207. };
  208. $( function() { Revisions.init(); } );
  209. } )( jQuery );