| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- /* 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 );
|