Add upstream
This commit is contained in:
		| @@ -0,0 +1,360 @@ | ||||
| /* globals jetpack_search_filter_admin, jQuery, analytics */ | ||||
|  | ||||
| ( function( $, args ) { | ||||
| 	var defaultFilterCount = ( 'undefined' !== typeof args && args.defaultFilterCount ) ? | ||||
| 		args.defaultFilterCount : | ||||
| 		5; // Just in case we couldn't find the defaultFiltercount arg | ||||
|  | ||||
| 	$( document ).ready( function() { | ||||
| 		setListeners(); | ||||
|  | ||||
| 		window.JetpackSearch = window.JetpackSearch || {}; | ||||
| 		window.JetpackSearch.addFilter = addFilter; | ||||
|  | ||||
| 		// Initialize Tracks | ||||
| 		if ( 'undefined' !== typeof analytics && args.tracksUserData ) { | ||||
| 			analytics.initialize( args.tracksUserData.userid, args.tracksUserData.username ); | ||||
| 		} | ||||
| 	} ); | ||||
|  | ||||
| 	function generateFilterTitlePlaceholder( container ) { | ||||
| 		var placeholder = null, | ||||
| 			isModified = null, | ||||
| 			isMonth = null, | ||||
| 			type = container.find( '.filter-select' ).val(); | ||||
|  | ||||
| 		if ( 'taxonomy' === type ) { | ||||
| 			placeholder = container.find('.taxonomy-select option:selected').text().trim(); | ||||
| 		} else if ( 'date_histogram' === type && args && args.i18n ) { | ||||
| 			isModified = ( -1 !== container.find( '.date-field-select' ).val().indexOf( 'modified' ) ); | ||||
| 			isMonth = ( 'month' === container.find( '.date-interval-select' ).val() ); | ||||
|  | ||||
| 			if ( isMonth ) { | ||||
| 				placeholder = isModified ? | ||||
| 					args.i18n.monthUpdated : | ||||
| 					args.i18n.month; | ||||
| 			} else { | ||||
| 				placeholder = isModified ? | ||||
| 					args.i18n.yearUpdated : | ||||
| 					args.i18n.year; | ||||
| 			} | ||||
| 		} else { | ||||
| 			placeholder = container.find('.filter-select option:selected').text().trim(); | ||||
| 		} | ||||
|  | ||||
| 		$( container ).find('.jetpack-search-filters-widget__title input').prop( 'placeholder', placeholder ); | ||||
| 	} | ||||
|  | ||||
| 	var addFilter = function( filtersContainer, args ) { | ||||
| 		var template = _.template( | ||||
| 			filtersContainer | ||||
| 				.closest( '.jetpack-search-filters-widget' ) | ||||
| 				.find( '.jetpack-search-filters-widget__filter-template' ) | ||||
| 				.html() | ||||
| 		); | ||||
| 		generateFilterTitlePlaceholder( filtersContainer.append( template( args ) ) ); | ||||
| 	}; | ||||
|  | ||||
| 	var setListeners = function( widget ) { | ||||
| 		widget = ( 'undefined' === typeof widget ) ? | ||||
| 			$( '.jetpack-search-filters-widget' ): | ||||
| 			widget; | ||||
|  | ||||
| 		var getContainer = function( el ) { | ||||
| 			return $( el ).closest('.jetpack-search-filters-widget__filter'); | ||||
| 		}; | ||||
|  | ||||
| 		widget.on( 'change', '.filter-select', function() { | ||||
| 			var select = $( this ), | ||||
| 				selectVal = select.val(), | ||||
| 				eventArgs = { | ||||
| 					is_customizer: args.tracksEventData.is_customizer | ||||
| 				}; | ||||
|  | ||||
| 			eventArgs.type = selectVal; | ||||
|  | ||||
| 			select | ||||
| 				.closest( '.jetpack-search-filters-widget__filter' ) | ||||
| 				.attr( 'class', 'jetpack-search-filters-widget__filter' ) | ||||
| 				.addClass( 'is-' + selectVal ); | ||||
|  | ||||
| 			generateFilterTitlePlaceholder( getContainer( this ) ); | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_filter_type', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		// enable showing sort controls only if showing search box is enabled | ||||
| 		widget.on( 'change', '.jetpack-search-filters-widget__search-box-enabled', function() { | ||||
| 			var checkbox = $( this ), | ||||
| 				checkboxVal = checkbox.is(':checked'), | ||||
| 				filterParent = checkbox.closest( '.jetpack-search-filters-widget' ), | ||||
| 				sortControl = filterParent.find( '.jetpack-search-filters-widget__sort-controls-enabled' ); | ||||
|  | ||||
| 			filterParent.toggleClass( 'hide-post-types' ); | ||||
|  | ||||
| 			if ( checkboxVal ) { | ||||
| 				sortControl.removeAttr( 'disabled' ); | ||||
| 				trackAndBumpMCStats( 'enabled_search_box', args.tracksEventData ); | ||||
| 			} else { | ||||
| 				sortControl.prop( 'checked', false ); | ||||
| 				sortControl.prop( 'disabled', true ); | ||||
| 				trackAndBumpMCStats( 'disabled_search_box', args.tracksEventData ); | ||||
| 			} | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', '.jetpack-search-filters-widget__sort-controls-enabled', function() { | ||||
| 			if ( $( this ).is( ':checked' ) ) { | ||||
| 				trackAndBumpMCStats( 'enabled_sort_controls', args.tracksEventData ); | ||||
| 			} else { | ||||
| 				trackAndBumpMCStats( 'disabled_sort_controls', args.tracksEventData ); | ||||
| 			} | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'click', '.jetpack-search-filters-widget__post-types-select input[type="checkbox"]', function( e ) { | ||||
| 			var t = $( this ); | ||||
| 			var siblingsChecked = t.closest( '.jetpack-search-filters-widget' ) | ||||
| 				.find( '.jetpack-search-filters-widget__post-types-select input[type="checkbox"]:checked' ); | ||||
|  | ||||
| 			if ( 0 === siblingsChecked.length ) { | ||||
| 				e.preventDefault(); | ||||
| 				e.stopPropagation(); | ||||
|  | ||||
| 				trackAndBumpMCStats( 'attempted_no_post_types', args.tracksEventData ); | ||||
| 			} | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', '.jetpack-search-filters-widget__post-types-select input[type="checkbox"]', function() { | ||||
| 			var t = $( this ); | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer, | ||||
| 				post_type:  t.val() | ||||
| 			}; | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			if ( t.is( ':checked' ) ) { | ||||
| 				trackAndBumpMCStats( 'added_post_type', eventArgs ); | ||||
| 			} else { | ||||
| 				trackAndBumpMCStats( 'removed_post_type', eventArgs ); | ||||
| 			} | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', '.jetpack-search-filters-widget__sort-order', function() { | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer | ||||
| 			}; | ||||
|  | ||||
| 			eventArgs.order = $( this ).val(); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_sort_order', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', '.jetpack-search-filters-widget__taxonomy-select select', function() { | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer | ||||
| 			}; | ||||
|  | ||||
| 			eventArgs.taxonomy = $( this ).val(); | ||||
|  | ||||
| 			generateFilterTitlePlaceholder( getContainer( this ) ); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_taxonomy', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', 'select.date-field-select', function() { | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer | ||||
| 			}; | ||||
|  | ||||
| 			eventArgs.field = $( this ).val(); | ||||
|  | ||||
| 			generateFilterTitlePlaceholder( getContainer( this ) ); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_date_field', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', 'select.date-interval-select', function() { | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer | ||||
| 			}; | ||||
|  | ||||
| 			eventArgs.interval = $( this ).val(); | ||||
|  | ||||
| 			generateFilterTitlePlaceholder( getContainer( this ) ); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_date_interval', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'change', 'input.filter-count', function() { | ||||
| 			var eventArgs = { | ||||
| 				is_customizer: args.tracksEventData.is_customizer | ||||
| 			}; | ||||
|  | ||||
| 			eventArgs.count = $( this ).val(); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			trackAndBumpMCStats( 'changed_filter_count', eventArgs ); | ||||
| 		} ); | ||||
|  | ||||
| 		// add filter button | ||||
| 		widget.on( 'click', '.jetpack-search-filters-widget__add-filter', function( e ) { | ||||
| 			e.preventDefault(); | ||||
|  | ||||
| 			var filtersContainer = $( this ) | ||||
| 				.closest( '.jetpack-search-filters-widget' ) | ||||
| 				.find( '.jetpack-search-filters-widget__filters' ); | ||||
|  | ||||
| 			addFilter( filtersContainer, { | ||||
| 				type: 'taxonomy', | ||||
| 				taxonomy: '', | ||||
| 				post_type: '', | ||||
| 				field: '', | ||||
| 				interval: '', | ||||
| 				count: defaultFilterCount, | ||||
| 				name_placeholder: '', | ||||
| 				name: '' | ||||
| 			} ); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
|  | ||||
| 			// Trigger change event to let legacy widget admin know the widget state is "dirty" | ||||
| 			filtersContainer | ||||
| 				.find( '.jetpack-search-filters-widget__filter' ) | ||||
| 				.find( 'input, textarea, select' ) | ||||
| 				.change(); | ||||
|  | ||||
| 			trackAndBumpMCStats( 'added_filter', args.tracksEventData ); | ||||
| 		} ); | ||||
|  | ||||
| 		widget.on( 'click', '.jetpack-search-filters-widget__controls .delete', function( e ) { | ||||
| 			e.preventDefault(); | ||||
| 			var filter = $( this ).closest( '.jetpack-search-filters-widget__filter' ), | ||||
| 				eventArgs = { | ||||
| 					is_customizer: args.tracksEventData.is_customizer | ||||
| 				}; | ||||
|  | ||||
| 			eventArgs.type = filter.find( '.filter-select' ).val(); | ||||
|  | ||||
| 			switch ( eventArgs.type ) { | ||||
| 				case 'taxonomy': | ||||
| 					eventArgs.taxonomy = filter.find( '.jetpack-search-filters-widget__taxonomy-select select' ).val(); | ||||
| 					break; | ||||
| 				case 'date_histogram': | ||||
| 					eventArgs.dateField = filter.find( '.jetpack-search-filters-widget__date-histogram-select:first select' ).val(); | ||||
| 					eventArgs.dateInterval = filter.find( '.jetpack-search-filters-widget__date-histogram-select:nth-child( 2 ) select' ).val(); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			eventArgs.filterCount = filter.find( '.filter-count' ).val(); | ||||
|  | ||||
| 			trackAndBumpMCStats( 'deleted_filter', eventArgs ); | ||||
|  | ||||
| 			filter.find( 'input, textarea, select' ).change(); | ||||
| 			filter.remove(); | ||||
|  | ||||
| 			if ( wp && wp.customize ) { | ||||
| 				wp.customize.state( 'saved' ).set( false ); | ||||
| 			} | ||||
| 		} ); | ||||
|  | ||||
| 		// make the filters sortable | ||||
| 		$( '.jetpack-search-filters-widget__filters' ).sortable( { | ||||
| 			placeholder: 'jetpack-search-filters-widget__filter-placeholder', | ||||
| 			axis: 'y', | ||||
| 			revert: true, | ||||
| 			cancel: 'input,textarea,button,select,option,.jetpack-search-filters-widget__controls a', | ||||
| 			change: function() { | ||||
| 				if ( wp && wp.customize ) { | ||||
| 					wp.customize.state( 'saved' ).set( false ); | ||||
| 				} | ||||
| 			}, | ||||
| 			update: function( e, ui ) { | ||||
| 				$( ui.item ).find( 'input, textarea, select' ).change(); | ||||
| 			} | ||||
| 		} ) | ||||
| 		.disableSelection(); | ||||
| 	}; | ||||
|  | ||||
| 	// When widgets are updated, remove and re-add listeners | ||||
| 	$( document ).on( 'widget-updated widget-added', function( e, widget ) { | ||||
| 		widget = $( widget ); | ||||
|  | ||||
| 		var id = widget.attr( 'id' ), | ||||
| 			isJetpackSearch = ( id && ( -1 !== id.indexOf( 'jetpack-search-filters' ) ) ); | ||||
|  | ||||
| 		if ( ! isJetpackSearch ) { | ||||
| 			 return; | ||||
| 		} | ||||
|  | ||||
| 		// Intentionally not tracking widget additions and updates here as these events | ||||
| 		// seem noisy in the customizer. We'll track those via PHP. | ||||
|  | ||||
| 		widget.off( 'change', '.filter-select' ); | ||||
| 		widget.off( 'click', '.jetpack-search-filters-widget__controls .delete' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__use-filters' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__search-box-enabled' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__sort-controls-enabled' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__sort-controls-enabled' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__post-type-selector' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__sort-order' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__taxonomy-select' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__date-histogram-select:first select' ); | ||||
| 		widget.off( 'change', '.jetpack-search-filters-widget__date-histogram-select:eq(1) select' ); | ||||
| 		widget.off( 'click', '.jetpack-search-filters-widget__post-types-select input[type="checkbox"]' ); | ||||
| 		widget.off( 'click', '.jetpack-search-filters-widget__add-filter'); | ||||
|  | ||||
| 		setListeners( widget ); | ||||
| 	} ); | ||||
|  | ||||
| 	/** | ||||
| 	 * This function will fire both a Tracks and MC stat. | ||||
| 	 * | ||||
| 	 * Tracks: Will be prefixed by 'jetpack_widget_search_' and use underscores. | ||||
| 	 * MC: Will not be prefixed, and will use dashes. | ||||
| 	 * | ||||
| 	 * Logic borrowed from `idc-notice.js`. | ||||
| 	 * | ||||
| 	 * @param eventName string | ||||
| 	 * @param extraProps object | ||||
| 	 */ | ||||
| 	function trackAndBumpMCStats( eventName, extraProps ) { | ||||
| 		if ( 'undefined' === typeof extraProps || 'object' !== typeof extraProps ) { | ||||
| 			extraProps = {}; | ||||
| 		} | ||||
|  | ||||
| 		if ( eventName && eventName.length && 'undefined' !== typeof analytics && analytics.tracks && analytics.mc ) { | ||||
| 			// Format for Tracks | ||||
| 			eventName = eventName.replace( /-/g, '_' ); | ||||
| 			eventName = eventName.indexOf( 'jetpack_widget_search_' ) !== 0 ? 'jetpack_widget_search_' + eventName : eventName; | ||||
| 			analytics.tracks.recordEvent( eventName, extraProps ); | ||||
|  | ||||
| 			// Now format for MC stats | ||||
| 			eventName = eventName.replace( 'jetpack_widget_search_', '' ); | ||||
| 			eventName = eventName.replace( /_/g, '-' ); | ||||
| 			analytics.mc.bumpStat( 'jetpack-search-widget', eventName ); | ||||
| 		} | ||||
| 	} | ||||
| } )( jQuery, jetpack_search_filter_admin ); | ||||
| @@ -0,0 +1,19 @@ | ||||
| jQuery( document ).ready( function() { | ||||
| 	var filter_list = jQuery( '.jetpack-search-filters-widget__filter-list' ); | ||||
|  | ||||
| 	filter_list.on( 'click', 'a', function() { | ||||
| 		var checkbox = jQuery( this ).siblings( 'input[type="checkbox"]' ); | ||||
| 		checkbox.prop( 'checked', ! checkbox.prop( 'checked' ) ); | ||||
| 	} ); | ||||
|  | ||||
| 	filter_list | ||||
| 		.find( 'input[type="checkbox"]' ) | ||||
| 		.prop( 'disabled', false ) | ||||
| 		.css( 'cursor', 'inherit' ) | ||||
| 		.on( 'click', function() { | ||||
| 			var anchor = jQuery( this ).siblings( 'a' ); | ||||
| 			if ( anchor.length ) { | ||||
| 				window.location.href = anchor.prop( 'href' ); | ||||
| 			} | ||||
| 		} ); | ||||
| } ); | ||||
		Reference in New Issue
	
	Block a user