web/wp-admin/js/theme.dev.js
changeset 204 09a1c134465b
parent 203 f507feede89a
child 205 a4f7897e21a9
equal deleted inserted replaced
203:f507feede89a 204:09a1c134465b
     1 /**
       
     2  * Theme Browsing
       
     3  *
       
     4  * Controls visibility of theme details on manage and install themes pages.
       
     5  */
       
     6 jQuery( function($) {
       
     7 	$('#availablethemes').on( 'click', '.theme-detail', function (event) {
       
     8 		var theme   = $(this).closest('.available-theme'),
       
     9 			details = theme.find('.themedetaildiv');
       
    10 
       
    11 		if ( ! details.length ) {
       
    12 			details = theme.find('.install-theme-info .theme-details');
       
    13 			details = details.clone().addClass('themedetaildiv').appendTo( theme ).hide();
       
    14 		}
       
    15 
       
    16 		details.toggle();
       
    17 		event.preventDefault();
       
    18 	});
       
    19 });
       
    20 
       
    21 /**
       
    22  * Theme Install
       
    23  *
       
    24  * Displays theme previews on theme install pages.
       
    25  */
       
    26 jQuery( function($) {
       
    27 	if( ! window.postMessage )
       
    28 		return;
       
    29 
       
    30 	var preview = $('#theme-installer'),
       
    31 		info    = preview.find('.install-theme-info'),
       
    32 		panel   = preview.find('.wp-full-overlay-main'),
       
    33 		body    = $( document.body );
       
    34 
       
    35 	preview.on( 'click', '.close-full-overlay', function( event ) {
       
    36 		preview.fadeOut( 200, function() {
       
    37 			panel.empty();
       
    38 			body.removeClass('theme-installer-active full-overlay-active');
       
    39 		});
       
    40 		event.preventDefault();
       
    41 	});
       
    42 
       
    43 	preview.on( 'click', '.collapse-sidebar', function( event ) {
       
    44 		preview.toggleClass( 'collapsed' ).toggleClass( 'expanded' );
       
    45 		event.preventDefault();
       
    46 	});
       
    47 
       
    48 	$('#availablethemes').on( 'click', '.install-theme-preview', function( event ) {
       
    49 		var src;
       
    50 
       
    51 		info.html( $(this).closest('.installable-theme').find('.install-theme-info').html() );
       
    52 		src = info.find( '.theme-preview-url' ).val();
       
    53 		panel.html( '<iframe src="' + src + '" />');
       
    54 		preview.fadeIn( 200, function() {
       
    55 			body.addClass('theme-installer-active full-overlay-active');
       
    56 		});
       
    57 		event.preventDefault();
       
    58 	});
       
    59 });
       
    60 
       
    61 var ThemeViewer;
       
    62 
       
    63 (function($){
       
    64 	ThemeViewer = function( args ) {
       
    65 
       
    66 		function init() {
       
    67 			$( '#filter-click, #mini-filter-click' ).unbind( 'click' ).click( function() {
       
    68 				$( '#filter-click' ).toggleClass( 'current' );
       
    69 				$( '#filter-box' ).slideToggle();
       
    70 				$( '#current-theme' ).slideToggle( 300 );
       
    71 				return false;
       
    72 			});
       
    73 
       
    74 			$( '#filter-box :checkbox' ).unbind( 'click' ).click( function() {
       
    75 				var count = $( '#filter-box :checked' ).length,
       
    76 					text  = $( '#filter-click' ).text();
       
    77 
       
    78 				if ( text.indexOf( '(' ) != -1 )
       
    79 					text = text.substr( 0, text.indexOf( '(' ) );
       
    80 
       
    81 				if ( count == 0 )
       
    82 					$( '#filter-click' ).text( text );
       
    83 				else
       
    84 					$( '#filter-click' ).text( text + ' (' + count + ')' );
       
    85 			});
       
    86 
       
    87 			/* $('#filter-box :submit').unbind( 'click' ).click(function() {
       
    88 				var features = [];
       
    89 				$('#filter-box :checked').each(function() {
       
    90 					features.push($(this).val());
       
    91 				});
       
    92 
       
    93 				listTable.update_rows({'features': features}, true, function() {
       
    94 					$( '#filter-click' ).toggleClass( 'current' );
       
    95 					$( '#filter-box' ).slideToggle();
       
    96 					$( '#current-theme' ).slideToggle( 300 );
       
    97 				});
       
    98 
       
    99 				return false;
       
   100 			}); */
       
   101 		}
       
   102 
       
   103 		// These are the functions we expose
       
   104 		var api = {
       
   105 			init: init
       
   106 		};
       
   107 
       
   108 	return api;
       
   109 	}
       
   110 })(jQuery);
       
   111 
       
   112 jQuery( document ).ready( function($) {
       
   113 	theme_viewer = new ThemeViewer();
       
   114 	theme_viewer.init();
       
   115 });
       
   116 
       
   117 
       
   118 /**
       
   119  * Class that provides infinite scroll for Themes admin screens
       
   120  *
       
   121  * @since 3.4
       
   122  *
       
   123  * @uses ajaxurl
       
   124  * @uses list_args
       
   125  * @uses theme_list_args
       
   126  * @uses $('#_ajax_fetch_list_nonce').val()
       
   127 * */
       
   128 var ThemeScroller;
       
   129 (function($){
       
   130 	ThemeScroller = {
       
   131 		querying: false,
       
   132 		scrollPollingDelay: 500,
       
   133 		failedRetryDelay: 4000,
       
   134 		outListBottomThreshold: 300,
       
   135 
       
   136 		/**
       
   137 		 * Initializer
       
   138 		 *
       
   139 		 * @since 3.4
       
   140 		 * @access private
       
   141 		 */
       
   142 		init: function() {
       
   143 			var self = this;
       
   144 
       
   145 			// Get out early if we don't have the required arguments.
       
   146 			if ( typeof ajaxurl === 'undefined' ||
       
   147 				 typeof list_args === 'undefined' ||
       
   148 				 typeof theme_list_args === 'undefined' ) {
       
   149 					$('.pagination-links').show();
       
   150 					return;
       
   151 			}
       
   152 
       
   153 			// Handle inputs
       
   154 			this.nonce = $('#_ajax_fetch_list_nonce').val();
       
   155 			this.nextPage = ( theme_list_args.paged + 1 );
       
   156 
       
   157 			// Cache jQuery selectors
       
   158 			this.$outList = $('#availablethemes');
       
   159 			this.$spinner = $('div.tablenav.bottom').children( 'img.ajax-loading' );
       
   160 			this.$window = $(window);
       
   161 			this.$document = $(document);
       
   162 
       
   163 			/**
       
   164 			 * If there are more pages to query, then start polling to track
       
   165 			 * when user hits the bottom of the current page
       
   166 			 */
       
   167 			if ( theme_list_args.total_pages >= this.nextPage )
       
   168 				this.pollInterval =
       
   169 					setInterval( function() {
       
   170 						return self.poll();
       
   171 					}, this.scrollPollingDelay );
       
   172 		},
       
   173 
       
   174 		/**
       
   175 		 * Checks to see if user has scrolled to bottom of page.
       
   176 		 * If so, requests another page of content from self.ajax().
       
   177 		 *
       
   178 		 * @since 3.4
       
   179 		 * @access private
       
   180 		 */
       
   181 		poll: function() {
       
   182 			var bottom = this.$document.scrollTop() + this.$window.innerHeight();
       
   183 
       
   184 			if ( this.querying ||
       
   185 				( bottom < this.$outList.height() - this.outListBottomThreshold ) )
       
   186 				return;
       
   187 
       
   188 			this.ajax();
       
   189 		},
       
   190 
       
   191 		/**
       
   192 		 * Applies results passed from this.ajax() to $outList
       
   193 		 *
       
   194 		 * @since 3.4
       
   195 		 * @access private
       
   196 		 *
       
   197 		 * @param results Array with results from this.ajax() query.
       
   198 		 */
       
   199 		process: function( results ) {
       
   200 			if ( results === undefined ) {
       
   201 				clearInterval( this.pollInterval );
       
   202 				return;
       
   203 			}
       
   204 
       
   205 			if ( this.nextPage > theme_list_args.total_pages )
       
   206 				clearInterval( this.pollInterval );
       
   207 
       
   208 			if ( this.nextPage <= ( theme_list_args.total_pages + 1 ) )
       
   209 				this.$outList.append( results.rows );
       
   210 		},
       
   211 
       
   212 		/**
       
   213 		 * Queries next page of themes
       
   214 		 *
       
   215 		 * @since 3.4
       
   216 		 * @access private
       
   217 		 */
       
   218 		ajax: function() {
       
   219 			var self = this;
       
   220 
       
   221 			this.querying = true;
       
   222 
       
   223 			var query = {
       
   224 				action: 'fetch-list',
       
   225 				paged: this.nextPage,
       
   226 				s: theme_list_args.search,
       
   227 				tab: theme_list_args.tab,
       
   228 				type: theme_list_args.type,
       
   229 				_ajax_fetch_list_nonce: this.nonce,
       
   230 				'features[]': theme_list_args.features,
       
   231 				'list_args': list_args
       
   232 			};
       
   233 
       
   234 			this.$spinner.css( 'visibility', 'visible' );
       
   235 			$.getJSON( ajaxurl, query )
       
   236 				.done( function( response ) {
       
   237 					self.nextPage++;
       
   238 					self.process( response );
       
   239 					self.$spinner.css( 'visibility', 'hidden' );
       
   240 					self.querying = false;
       
   241 				})
       
   242 				.fail( function() {
       
   243 					self.$spinner.css( 'visibility', 'hidden' );
       
   244 					self.querying = false;
       
   245 					setTimeout( function() { self.ajax(); }, self.failedRetryDelay );
       
   246 				});
       
   247 		}
       
   248 	}
       
   249 
       
   250 	$(document).ready( function($) {
       
   251 		ThemeScroller.init();
       
   252 	});
       
   253 
       
   254 })(jQuery);