MediaWiki:Gadget-calculator-search.js
From WikiAnesthesia
Revision as of 16:40, 5 April 2022 by Chris Rishel (talk | contribs)
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/** * @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(); }() );