Difference between revisions of "MediaWiki:Gadget-calculator-search.js"

From WikiAnesthesia
 
(10 intermediate revisions by the same user not shown)
Line 10: Line 10:
         }
         }


         var searchHeading = 'Search';
         var searchHeading = $searchContainer.data( 'title' ) ? ' ' + $searchContainer.data( 'title' ) : 'Search';
        searchHeading += $searchContainer.data( 'title' ) ? ' ' + $searchContainer.data( 'title' ) : '';


         var $searchHeading = $( '<h4>' ).append( searchHeading );
         var $searchHeading = $( '<h4>' ).append( searchHeading );


         var searchPlaceholderText = 'Search ';
         var searchPlaceholderText;


         if( $searchContainer.data( 'search-placeholder' ) ){
         if( $searchContainer.data( 'search-placeholder' ) ){
             searchPlaceholderText += $searchContainer.data( 'search-placeholder' );
             searchPlaceholderText = $searchContainer.data( 'search-placeholder' );
         } else {
         } else {
             searchPlaceholderText += $searchContainer.data( 'title' ) ? ' ' + $searchContainer.data( 'title' ) : 'calculations';
            searchPlaceholderText = 'Search ';
             searchPlaceholderText += $searchContainer.data( 'title' ) ? $searchContainer.data( 'title' ) : 'calculations';
         }
         }


Line 34: Line 34:
             .on( 'input', function() {
             .on( 'input', function() {
                 mw.calculators.searchCalculations( $( this ).val() );
                 mw.calculators.searchCalculations( $( this ).val() );
            } )
            .on( 'keypress', function( e ) {
                if( event.keyCode === 13 ) {
                    e.preventDefault();
                    return false;
                }
             } );
             } );


Line 43: Line 49:
                     $searchInput ) );
                     $searchInput ) );


         $searchContainer.append( $( '<form>', {
         if( $( mw.calculators.selectors.calculationCategories ).length ) {
            id: 'calculator-search-category-form'
            $searchContainer.append( $( '<form>', {
        } ) );
                id: 'calculator-search-category-form'
            } ) );
 
 
            var categoryPlaceholderText;
 
            if( $searchContainer.data( 'category-placeholder' ) ){
                categoryPlaceholderText = $searchContainer.data( 'category-placeholder' );
            } else {
                categoryPlaceholderText = '(Show all categories)';
            }


        mw.trackSubscribe( 'mw.calculators.CalculatorRendered', function() {
             var categorySelectAttributes = {
             var categorySelectAttributes = {
                 id: 'calculator-category-input',
                 id: 'calculator-category-input',
Line 60: Line 75:


             $categorySelectInput.append( $( '<option>', {
             $categorySelectInput.append( $( '<option>', {
                 text: '(Show all categories)',
                 text: categoryPlaceholderText,
                 value: ''
                 value: ''
             } ) );
             } ) );


             $( '.calculator' ).each( function() {
             $( mw.calculators.selectors.calculationCategories ).each( function() {
                 $categorySelectInput.append( $( '<option>', {
                 $categorySelectInput.append( $( '<option>', {
                     value: $( this ).data( 'id' ),
                     value: $( this ).data( 'id' ),
Line 77: Line 92:
                     .append(
                     .append(
                         $categorySelectInput ) );
                         $categorySelectInput ) );
         } );
         }
     };
     };


     mw.calculators.searchCalculations = function( searchText ) {
     mw.calculators.searchCalculations = function( searchText ) {
        var $calculators = $( '.calculator' );
         var reSearch = new RegExp( searchText, 'im' );
         var reSearch = new RegExp( searchText, 'im' );


         $calculators.each( function() {
        // Search categories and calculations contained within categories
             // Get the calculations contained by the calculator
         $( mw.calculators.selectors.calculationCategories ).each( function() {
             var $calculations = $( this ).find( '.calculator-calculation' );
             // Get the calculations contained by the category
             var $calculations = $( this ).find( mw.calculators.selectors.calculations );


             // If no search text is defined or if the search text matches one of the search terms,
             // If no search text is defined or if the search text matches one of the search terms,
             // show the calculator and all calculations.
             // show the category and all calculations.
             var showCalculator = !searchText || reSearch.test( $( this ).data( 'search' ) );
             var showCalculationCategory = !searchText || reSearch.test( $( this ).data( 'search' ) );


             if( showCalculator ) {
             if( showCalculationCategory ) {
                 // If the entire calculator should be shown, show all calculations
                 // If the entire category should be shown, show all calculations
                 $calculations.each( function() {
                 $calculations.each( function() {
                     $( this ).show();
                     $( this ).show();
                 } );
                 } );
             } else {
             } else {
                 // If we aren't certain we should show the entire calculator, see if the search matches
                 // If we aren't certain we should show the entire category, see if the search matches
                 // any of the contained calculations.
                 // any of the contained calculations.
                 $calculations.each( function() {
                 $calculations.each( function() {
Line 108: Line 122:


                         // Make sure the calculator heading and structure gets shown
                         // Make sure the calculator heading and structure gets shown
                         showCalculator = true;
                         showCalculationCategory = true;
                     } else {
                     } else {
                         $( this ).hide();
                         $( this ).hide();
Line 117: Line 131:
             // If either the calculator or any contained calculations matched, show the calculator container
             // If either the calculator or any contained calculations matched, show the calculator container
             // (i.e. title and structure for the calculations)
             // (i.e. title and structure for the calculations)
             if( showCalculator ) {
             if( showCalculationCategory ) {
                 $( this ).show();
                 $( this ).show();
             } else {
             } else {
Line 123: Line 137:
             }
             }
         } );
         } );
        // Search calculations not contained by a category.
        $( mw.calculators.selectors.calculations ).not( mw.calculators.selectors.calculationCategories  + ' ' + mw.calculators.selectors.calculations ).each(
            function() {
                if( !searchText || reSearch.test( $( this ).data( 'search' ) ) ) {
                    $( this ).show();
                } else {
                    $( this ).hide();
                }
            }
        );
     };
     };


     mw.calculators.selectCategory = function( calculatorId ) {
     mw.calculators.selectCategory = function( calculationCategoryId ) {
         $( '.calculator' ).each( function() {
         $( mw.calculators.selectors.calculationCategories ).each( function() {
             if( !calculatorId || $( this ).data( 'id' ) === calculatorId ) {
             if( !calculationCategoryId || $( this ).data( 'id' ) === calculationCategoryId ) {
                 $( this ).show();
                 $( this ).show();
             } else {
             } else {

Latest revision as of 16:40, 5 April 2022

/**
 * @author Chris Rishel
 */
( function() {
    mw.calculators.initializeSearch = function() {
        var $searchContainer = $( '#calculator-search' );

        if( !$searchContainer.length ) {
            return;
        }

        var searchHeading = $searchContainer.data( 'title' ) ? ' ' + $searchContainer.data( 'title' ) : 'Search';

        var $searchHeading = $( '<h4>' ).append( searchHeading );

        var searchPlaceholderText;

        if( $searchContainer.data( 'search-placeholder' ) ){
            searchPlaceholderText = $searchContainer.data( 'search-placeholder' );
        } else {
            searchPlaceholderText = 'Search ';
            searchPlaceholderText += $searchContainer.data( 'title' ) ? $searchContainer.data( 'title' ) : 'calculations';
        }

        var searchInputAttributes = {
            id: 'calculator-search-input',
            class: 'form-control form-control-sm',
            type: 'text',
            placeholder: searchPlaceholderText,
            autocomplete: 'off'
        };

        var $searchInput = $( '<input>', searchInputAttributes )
            .on( 'input', function() {
                mw.calculators.searchCalculations( $( this ).val() );
            } )
            .on( 'keypress', function( e ) {
                if( event.keyCode === 13 ) {
                    e.preventDefault();
                    return false;
                }
            } );

        $searchContainer.append( $searchHeading );

        $searchContainer
            .append( $( '<form>' )
                .append(
                    $searchInput ) );

        if( $( mw.calculators.selectors.calculationCategories ).length ) {
            $searchContainer.append( $( '<form>', {
                id: 'calculator-search-category-form'
            } ) );


            var categoryPlaceholderText;

            if( $searchContainer.data( 'category-placeholder' ) ){
                categoryPlaceholderText = $searchContainer.data( 'category-placeholder' );
            } else {
                categoryPlaceholderText = '(Show all categories)';
            }

            var categorySelectAttributes = {
                id: 'calculator-category-input',
                class: 'custom-select custom-select-sm'
            };

            var $categorySelectInput = $( '<select>', categorySelectAttributes )
                .on( 'change', function() {
                    mw.calculators.selectCategory( $( this ).val() );
                } );


            $categorySelectInput.append( $( '<option>', {
                text: categoryPlaceholderText,
                value: ''
            } ) );

            $( mw.calculators.selectors.calculationCategories ).each( function() {
                $categorySelectInput.append( $( '<option>', {
                    value: $( this ).data( 'id' ),
                    html: $( this ).data( 'title' )
                } ) );
            } );

            $( '#calculator-search-category-form' )
                .replaceWith( $( '<form>', {
                    id: 'calculator-search-category-form'
                } )
                    .append(
                        $categorySelectInput ) );
        }
    };

    mw.calculators.searchCalculations = function( searchText ) {
        var reSearch = new RegExp( searchText, 'im' );

        // Search categories and calculations contained within categories
        $( mw.calculators.selectors.calculationCategories ).each( function() {
            // Get the calculations contained by the category
            var $calculations = $( this ).find( mw.calculators.selectors.calculations );

            // If no search text is defined or if the search text matches one of the search terms,
            // show the category and all calculations.
            var showCalculationCategory = !searchText || reSearch.test( $( this ).data( 'search' ) );

            if( showCalculationCategory ) {
                // If the entire category should be shown, show all calculations
                $calculations.each( function() {
                    $( this ).show();
                } );
            } else {
                // If we aren't certain we should show the entire category, see if the search matches
                // any of the contained calculations.
                $calculations.each( function() {
                    var showCalculation = !searchText || reSearch.test( $( this ).data( 'search' ) );

                    if( showCalculation ) {
                        $( this ).show();

                        // Make sure the calculator heading and structure gets shown
                        showCalculationCategory = true;
                    } else {
                        $( this ).hide();
                    }
                } );
            }

            // If either the calculator or any contained calculations matched, show the calculator container
            // (i.e. title and structure for the calculations)
            if( showCalculationCategory ) {
                $( this ).show();
            } else {
                $( this ).hide();
            }
        } );

        // Search calculations not contained by a category.
        $( mw.calculators.selectors.calculations ).not( mw.calculators.selectors.calculationCategories  + ' ' + mw.calculators.selectors.calculations ).each(
            function() {
                if( !searchText || reSearch.test( $( this ).data( 'search' ) ) ) {
                    $( this ).show();
                } else {
                    $( this ).hide();
                }
            }
        );
    };

    mw.calculators.selectCategory = function( calculationCategoryId ) {
        $( mw.calculators.selectors.calculationCategories ).each( function() {
            if( !calculationCategoryId || $( this ).data( 'id' ) === calculationCategoryId ) {
                $( this ).show();
            } else {
                $( this ).hide();
            }
        } );
    };

    mw.calculators.initializeSearch();
}() );