fl-theme-builder-layout-frontend-edit.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. ( function( $ ) {
  2. /**
  3. * Handles frontend editing UI logic for theme layouts.
  4. *
  5. * @class FLThemeBuilderLayoutFrontendEdit
  6. * @since 1.0
  7. */
  8. FLThemeBuilderLayoutFrontendEdit = {
  9. /**
  10. * Initialize.
  11. *
  12. * @since 1.0
  13. * @access private
  14. * @method _init
  15. */
  16. _init: function()
  17. {
  18. this._bind();
  19. this._initContent();
  20. },
  21. /**
  22. * Bind events.
  23. *
  24. * @since 1.0
  25. * @access private
  26. * @method _bind
  27. */
  28. _bind: function()
  29. {
  30. $( '.fl-theme-builder-preview-select' ).on( 'click', this._togglePreviewSelect );
  31. $( '.fl-theme-builder-preview-select-item' ).on( 'click', this._togglePreviewSelectItem );
  32. $( '.fl-theme-builder-preview-select-item' ).delegate( '.fl-theme-builder-preview-select-item-child', 'click', this._previewSelectItemChildClicked );
  33. },
  34. /**
  35. * Shows or hides the preview select menu.
  36. *
  37. * @since 1.0
  38. * @access private
  39. * @method _togglePreviewSelect
  40. */
  41. _togglePreviewSelect: function()
  42. {
  43. var select = $( '.fl-theme-builder-preview-select' );
  44. select.toggleClass( 'fl-theme-builder-preview-select-open' );
  45. },
  46. /**
  47. * Shows or hides an items children in the preview
  48. * select menu. Grabs children via AJAX if needed.
  49. *
  50. * @since 1.0
  51. * @access private
  52. * @method _togglePreviewSelectItem
  53. */
  54. _togglePreviewSelectItem: function( e )
  55. {
  56. var item = $( e.target ).closest( '.fl-theme-builder-preview-select-item' );
  57. children = item.find( '.fl-theme-builder-preview-select-item-children' ),
  58. loc = item.attr( 'data-location' ),
  59. loaded = item.attr( 'data-children-loaded' );
  60. loader = $( '<img src="' + FLBuilderLayoutConfig.paths.pluginUrl + 'img/ajax-loader.svg" />' ),
  61. title = $( '.fl-theme-builder-preview-select-title div span' );
  62. if ( undefined != loc ) {
  63. loc = loc.split( ':' );
  64. if ( 'general' == loc[0] ) {
  65. title.text( item.text() );
  66. $( '.fl-theme-builder-preview-select' ).removeClass( 'fl-theme-builder-preview-select-open' );
  67. FLBuilder.showAjaxLoader();
  68. FLBuilder.ajax( {
  69. action: 'update_preview_location',
  70. location: item.attr( 'data-location' )
  71. }, function() {
  72. FLBuilder.showAjaxLoader();
  73. window.parent.location.reload( true );
  74. } );
  75. } else if ( '0' == loaded ) {
  76. children.append( loader );
  77. if ( 'post' == loc[0] ) {
  78. FLBuilder.ajax( {
  79. action: 'get_preview_posts',
  80. post_type: loc[1]
  81. }, FLThemeBuilderLayoutFrontendEdit._previewSelectPostsLoaded );
  82. } else if ( 'taxonomy' == loc[0] ) {
  83. FLBuilder.ajax( {
  84. action: 'get_preview_terms',
  85. taxonomy: loc[1]
  86. }, FLThemeBuilderLayoutFrontendEdit._previewSelectTermsLoaded );
  87. }
  88. }
  89. }
  90. $( '.fl-theme-builder-preview-select-item-open' ).removeClass( 'fl-theme-builder-preview-select-item-open' );
  91. item.addClass( 'fl-theme-builder-preview-select-item-open' );
  92. e.stopPropagation();
  93. },
  94. /**
  95. * Callback for when posts have finished loading for
  96. * the preview select.
  97. *
  98. * @since 1.0
  99. * @access private
  100. * @method _previewSelectPostsLoaded
  101. * @param {String} response
  102. */
  103. _previewSelectPostsLoaded: function( response )
  104. {
  105. var data = JSON.parse( response ),
  106. item = $( '[data-location="post:' + data.postType + '"]' ),
  107. children = item.find( '.fl-theme-builder-preview-select-item-children' ),
  108. i = 0;
  109. item.attr( 'data-children-loaded', '1' );
  110. children.find( 'img' ).remove();
  111. for ( ; i < data.objects.length; i++ ) {
  112. children.append( '<div class="fl-theme-builder-preview-select-item-child" data-location="post:' + data.postType + ':' + data.objects[ i ].id + '">' + data.objects[ i ].name + '</div>' );
  113. }
  114. },
  115. /**
  116. * Callback for when terms have finished loading for
  117. * the preview select.
  118. *
  119. * @since 1.0
  120. * @access private
  121. * @method _previewSelectTermsLoaded
  122. * @param {String} response
  123. */
  124. _previewSelectTermsLoaded: function( response )
  125. {
  126. var data = JSON.parse( response ),
  127. item = $( '[data-location="taxonomy:' + data.taxonomy + '"]' ),
  128. children = item.find( '.fl-theme-builder-preview-select-item-children' ),
  129. i = 0;
  130. item.attr( 'data-children-loaded', '1' );
  131. children.find( 'img' ).remove();
  132. for ( ; i < data.objects.length; i++ ) {
  133. children.append( '<div class="fl-theme-builder-preview-select-item-child" data-location="taxonomy:' + data.taxonomy + ':' + data.objects[ i ].id + '">' + data.objects[ i ].name + '</div>' );
  134. }
  135. },
  136. /**
  137. * Sets the preview context when an item child is clicked.
  138. *
  139. * @since 1.0
  140. * @access private
  141. * @method _previewSelectItemChildClicked
  142. */
  143. _previewSelectItemChildClicked: function( e )
  144. {
  145. var child = $( e.target ).closest( '.fl-theme-builder-preview-select-item-child' );
  146. title = $( '.fl-theme-builder-preview-select-title div span' );
  147. title.text( child.text() );
  148. $( '.fl-theme-builder-preview-select' ).removeClass( 'fl-theme-builder-preview-select-open' );
  149. $( '.fl-theme-builder-preview-select-item-open' ).removeClass( 'fl-theme-builder-preview-select-item-open' );
  150. FLBuilder.showAjaxLoader();
  151. FLBuilder.ajax( {
  152. action: 'update_preview_location',
  153. location: child.attr( 'data-location' )
  154. }, function() {
  155. FLBuilder.showAjaxLoader();
  156. window.parent.location.reload( true );
  157. } );
  158. e.stopPropagation();
  159. },
  160. /**
  161. * When editing a "part" the main builder content area will
  162. * be moved to replace the part for editing.
  163. *
  164. * @since 1.0
  165. * @access private
  166. * @method _initContent
  167. */
  168. _initContent: function()
  169. {
  170. var part = $( '.fl-builder-content-primary[data-type="part"]' ),
  171. content = $( '.fl-builder-content-primary:not([data-type="part"])' );
  172. if ( part.length ) {
  173. content.after( '<div class="fl-theme-builder-content-placeholder" style="padding: 200px 100px; text-align:center; opacity:0.5;">Content Area</div>' );
  174. part.after( content );
  175. part.remove();
  176. }
  177. }
  178. };
  179. // Initialize
  180. $( function() { FLThemeBuilderLayoutFrontendEdit._init(); } );
  181. } )( jQuery );