Advertisement
Guest User

ACF collapser mod

a guest
Jul 17th, 2014
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. jQuery(document).ready(function($) {
  2.  
  3. /**
  4. * Collapse a row or rows
  5. */
  6. function acfRepeaterCollapseRow( $rows ) {
  7. $rows.addClass('collapsed-row')
  8. .data('acf-row-collapsed', true)
  9. .attr('aria-expanded', false);
  10. }
  11. /**
  12. * Expand a row or rows
  13. */
  14. function acfRepeaterExpandRow( $rows ) {
  15. $rows.removeClass('collapsed-row')
  16. .data('acf-row-collapsed', false)
  17. .attr('aria-expanded', true);
  18. }
  19.  
  20. /**
  21. * Indicate a collapsed rowset
  22. */
  23. function acfRepeaterExpandRowset( $wrapper ) {
  24. $button = $('.field-repeater-toggle-all', $wrapper).first();
  25.  
  26. $wrapper.removeClass('collapsed-repeater')
  27. .data('acf-rowset-collapsed', false);
  28. $button.text('Collapse All Rows');
  29. }
  30.  
  31. /**
  32. * Indicate an expanded rowset
  33. */
  34. function acfRepeaterCollapseRowset( $wrapper ) {
  35. $button = $('.field-repeater-toggle-all', $wrapper).first();
  36.  
  37. $wrapper.addClass('collapsed-repeater')
  38. .data('acf-rowset-collapsed', true);
  39. $button.text('Expand All Rows');
  40. }
  41.  
  42. /**
  43. * toggles set of repeater rows or flexible fields
  44. */
  45. function acfRepeaterToggleAll() {
  46. $rowsetButton = $(this);
  47. $rowsetWrapper = $(this).parent();
  48.  
  49. // select either nested or unnested repeater rows, not both
  50. if( true === $rowsetWrapper.data('acf-repeater-nested') ) {
  51. $rows = $('.row:data(acf-repeater-nested),.layout', $rowsetWrapper);
  52. } else {
  53. $rows = $('.row,.layout', $rowsetWrapper).not(':data(acf-repeater-nested)');
  54. }
  55.  
  56. // toggle repeater state and all rows
  57. if( true !== $rowsetWrapper.data('acf-rowset-collapsed') ) {
  58. acfRepeaterCollapseRowset( $rowsetWrapper );
  59. acfRepeaterCollapseRow( $rows );
  60. } else {
  61. acfRepeaterExpandRowset( $rowsetWrapper );
  62. acfRepeaterExpandRow( $rows );
  63. }
  64.  
  65. // prevent bubbling up to parent repeater rowset
  66. event.stopPropagation();
  67. }
  68.  
  69. /**
  70. * toggles single repeater row or flexible field
  71. */
  72. function acfRepeaterToggleSingle() {
  73. $rowButton = $(this);
  74. $rowButtonText = $('.screen-reader-text', $rowButton);
  75. $row = $rowButton.closest('.row,.layout');
  76.  
  77. // select either parent repeater field wrapper
  78. if( true === $row.data('acf-repeater-nested') ) {
  79. $rowsetWrapper = $row.closest( '.inner' );
  80. } else {
  81. $rowsetWrapper = $row.closest('.field_type-repeater,.field_type-flexible_content');
  82. }
  83.  
  84. // toggle the row state and button text
  85. if( true !== $row.data('acf-row-collapsed') ) {
  86. acfRepeaterCollapseRow( $row );
  87. $rowButtonText.text('Expand Row');
  88. } else {
  89. acfRepeaterExpandRow( $row );
  90. $rowButtonText.text('Collapse Row');
  91. }
  92.  
  93. if( true === acfRepeaterAllCollapsed( $rowsetWrapper ) ) {
  94. acfRepeaterCollapseRowset( $rowsetWrapper );
  95. } else {
  96. acfRepeaterExpandRowset( $rowsetWrapper );
  97. }
  98.  
  99. // prevent bubbling up to parent row button
  100. event.stopPropagation();
  101. }
  102.  
  103. /**
  104. * check to see if all rows in a rowset are collapsed
  105. * @param obj $rowsetWrapper jquery object
  106. * @return bool true if all rows in rowset are collapsed
  107. */
  108. function acfRepeaterAllCollapsed( $rowsetWrapper ) {
  109. // select either nested or unnested repeater rows, not both
  110. if( true === $rowsetWrapper.data('acf-repeater-nested') ) {
  111. $rows = $('.row:data(acf-repeater-nested),.layout:data(acf-repeater-nested)', $rowsetWrapper);
  112. } else {
  113. $rows = $('.row,.values .layout', $rowsetWrapper).not(':data(acf-repeater-nested)');
  114. }
  115.  
  116. // store every row collapsed state in an array
  117. var rowStates = new Array();
  118. $rows.each( function() {
  119. rowStates.push( $(this).data('acf-row-collapsed') );
  120. });
  121.  
  122. // check if any rows are expanded
  123. allCollapsed = 0 > $.inArray( false, rowStates );
  124.  
  125. return allCollapsed;
  126. }
  127. function init() { //wrapper here.
  128. // HTML to put above each repeater instance
  129. $collapseAllButton = '<button type="button" role="button" class="button field-repeater-toggle field-repeater-toggle-all">Collapse All Rows</button>';
  130. $collapseSingleButtonTable = '<td class="repeater-button-cell"><button type="button" role="button" class="button field-repeater-toggle field-repeater-toggle-single"><span class="screen-reader-text">Collapse Row</span></button></td>';
  131. $collapseSingleButton = '<button type="button" role="button" class="button field-repeater-toggle field-repeater-toggle-single"><span class="screen-reader-text">Collapse Row</span></button>';
  132.  
  133. // find each repeater & flexible instance, add the button if the field uses the row layout
  134. $('.field_type-repeater, .field_type-flexible_content').each( function() {
  135. $repeater = $(this);
  136.  
  137. // only use this on row layout
  138. if( $( '.acf-input-table', $repeater ).hasClass('row_layout') ) {
  139. $repeater.data('acf-rowset-collapsed', false).attr('aria-expanded', false);
  140.  
  141. // first: nested, second: parent
  142. if( $repeater.is( 'tr' ) ) {
  143. $repeater.children( 'td:last-child' )
  144. .children( '.inner' )
  145. .prepend( $collapseAllButton )
  146. .data('acf-rowset-collapsed', false)
  147. .data('acf-repeater-nested', true);
  148. $('.row,.row-clone', $repeater ).data('acf-repeater-nested', true);
  149. } else {
  150. $repeater.prepend( $collapseAllButton )
  151. .data('acf-rowset-collapsed', false);
  152. }
  153. }
  154. });
  155.  
  156. // iterator for adding IDs/aria-controls attributes to repeater buttons
  157. i = 1;
  158. // append single repeater collapse to each row of repeater field
  159. $('.field_type-repeater .row_layout .row,.field_type-repeater .row_layout .row-clone').each( function() {
  160. id = 'acf-repeater-' + i;
  161. i++;
  162.  
  163. $(this).prepend( $collapseSingleButtonTable )
  164. .data('acf-row-collapsed', false).attr('aria-expanded', true)
  165. .attr('id','acf-repeater-' + i)
  166. .attr('aria-live','off');
  167. $('.field-repeater-toggle-single', $(this)).first()
  168. .attr('aria-controls',id);
  169. });
  170.  
  171. // append single repeater collapse to flex fields
  172. $('.field_type-flexible_content .layout').each( function() {
  173. if( $('.acf-input-table', $(this)).hasClass('row_layout') ) {
  174. id = 'acf-repeater-' + i;
  175. i++;
  176.  
  177. $(this).prepend( $collapseSingleButton )
  178. .data('acf-row-collapsed', false)
  179. .attr('aria-expanded', true)
  180. .attr('id','acf-repeater-' + i)
  181. .attr('aria-live','off');
  182.  
  183. $('.field-repeater-toggle-single', $(this)).first()
  184. .attr('aria-controls',id);
  185. }
  186. });
  187.  
  188. // Bind click events to the toggle functions
  189. // delegated to higher DOM element to handle dynamically added repeaters
  190. $( '.field_type-repeater, .field_type-flexible_content' ).on(
  191. 'click',
  192. '.field-repeater-toggle-all',
  193. acfRepeaterToggleAll
  194. );
  195. $( '.field_type-repeater .row_layout,.field_type-flexible_content' ).on(
  196. 'click',
  197. '.field-repeater-toggle-single',
  198. acfRepeaterToggleSingle
  199. );
  200.  
  201. // prevent default flexible field collapsing for clarity
  202. $('.field_type-flexible_content').on(
  203. 'click',
  204. '.acf-fc-layout-handle',
  205. false
  206. );
  207. }
  208.  
  209. $('.editor_wrapper').change(function() {
  210. // binding function added. Listening element is custom for my layout, but can literally be anything you want
  211. init();
  212. });
  213.  
  214. init(); // initial init here.
  215.  
  216. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement