From 4eac9731fe77023488cdf3aa124a6aa1e5444a59 Mon Sep 17 00:00:00 2001 From: George Halkiadakis Date: Mon, 13 Mar 2023 02:35:32 +0200 Subject: setup needed libraries for browser-scripting --- .../js/dataTables/dataTables.alphabetSearch.js | 401 +++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 html/assets/js/dataTables/dataTables.alphabetSearch.js (limited to 'html/assets/js/dataTables/dataTables.alphabetSearch.js') diff --git a/html/assets/js/dataTables/dataTables.alphabetSearch.js b/html/assets/js/dataTables/dataTables.alphabetSearch.js new file mode 100644 index 0000000..5a5dc11 --- /dev/null +++ b/html/assets/js/dataTables/dataTables.alphabetSearch.js @@ -0,0 +1,401 @@ +/*! AlphabetSearch for DataTables v1.2.5 + * 2014 SpryMedia Ltd - datatables.net/license + * Gyrocode LLC - MIT License + */ + +/** + * @summary AlphabetSearch + * @description Show an set of alphabet buttons alongside a table providing + * search input options + * @version 1.2.5 + * @file dataTables.alphabetSearch.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2014 SpryMedia Ltd. + * @author Gyrocode LLC (www.gyrocode.com) + * @contact www.gyrocode.com/contacts + * @copyright Copyright (c) Gyrocode LLC + * + * License MIT - http://datatables.net/license/mit + * + * For more detailed information please see: + * https://www.gyrocode.com/projects/jquery-datatables-alphabetsearch/ + */ +(function($){ + + +// Search function +$.fn.dataTable.Api.register( 'alphabetSearch()', function ( searchTerm ) { + this.iterator( 'table', function ( context ) { + context.alphabetSearch.letter = searchTerm; + } ); + + return this; +} ); + +// Recalculate the alphabet display for updated data +$.fn.dataTable.Api.register( 'alphabetSearch.recalc()', function () { + this.iterator( 'table', function ( context ) { + draw( + new $.fn.dataTable.Api( context ), + $('div.alphabet', this.table().container()), + context + ); + } ); + + return this; +} ); + + +// Search plug-in +$.fn.dataTable.ext.search.push( function ( context, searchData ) { + // Ensure that table has alphabet search feature enabled + if ( ! context.hasOwnProperty('alphabetSearch') ) { + return true; + } + + // Ensure that there is a search applied to this table before running it + if ( ! context.alphabetSearch.letterSearch ) { + return true; + } + + var letter = searchData[context.alphabetSearch.column] + .toString() + .replace(/<.*?>/g, '') + .charAt(0).toUpperCase(); + + + if(context.alphabetSearch.letterSearch !== '#'){ + if ( letter === context.alphabetSearch.letterSearch ) { + return true; + } + } else { + //Only English Letters + if (/^[a-zA-Z]+$/.test(letter)){ + return true; + } + } + + return false; +} ); + + +// Order plug-in +// +// NOTES: If sorting by alphabetized column +// there would be two calls to this method +$.fn.dataTable.ext.order['alphabetSearch'] = function ( context, col ) +{ + var order_col = this.api().order()[0][0]; + var order_method = this.api().order()[0][1]; + + // If sorting by column other than the one being alphabetized + if(order_col !== context.alphabetSearch.column){ + context.alphabetSearch.pass = 0; + } + + var data = this.api().column( col, { order: 'index' } ).data().map( function (value, index) { + var letter = value.replace(/<.*?>/g, '').charAt(0).toUpperCase(); + + // If sorting by alphabetized column + return (order_col === context.alphabetSearch.column) + ? ( + // If first pass + ( !context.alphabetSearch.pass ) + // Ignore + ? + '' + // Otherwise, if it's a second pass + : + ( + // If method is ascending sort + ( order_method === 'asc' ) + // Return first letter + ? letter + : String.fromCharCode(65535 - letter.charCodeAt(0)) + ) + ) + // Otherwise, if sorting by column other than the one being alphabetized, + // return first letter + : letter; + } ); + + // If sorting by alphabetized column + if(order_col === context.alphabetSearch.column){ + // If pass is not defined, set it to 0 + if(!context.alphabetSearchPass){ context.alphabetSearch.pass = 0; } + // Increment pass counter and reset it to 0 if it's a second pass + context.alphabetSearch.pass = (context.alphabetSearch.pass + 1) % 2; + } + + return data; +}; + + +// Private support methods +function bin ( data ) { + var letter, bins = {}; + + for ( var i=0, ien=data.length ; i/g, '') + .charAt(0).toUpperCase(); + if (/^[a-zA-Z]+$/.test(letter)) { + letter = '#'; + } + if ( bins[letter] ) { + bins[letter]++; + } + else { + bins[letter] = 1; + } + } + + return bins; +} + +function draw ( table, alphabet, context ) +{ + alphabet.empty(); + + if(context.oLanguage.alphabetSearch.infoDisplay !== ''){ + $('') + .html(context.oLanguage.alphabetSearch.infoDisplay) + .appendTo( alphabet ); + } + + var columnData = table.column(context.alphabetSearch.column, { search: 'applied' } ).data(); + var bins = bin( columnData ); + + var alphabetList = $('