From 39a9ccdea2d860cb4cff45c32a2c58b25cd708cd Mon Sep 17 00:00:00 2001 From: Derek Macias Date: Fri, 15 Jan 2016 01:36:30 -0700 Subject: [PATCH] add reset filers button, fix filter saves, download repo only if different --- .../emhttp/plugins/NerdPack/NerdPack.page | 2 +- .../NerdPack/include/DownloadHelpers.php | 17 +- .../NerdPack/javascript/jquery.NerdPack.js | 65 +- .../javascript/jquery.tablesorter.pager.js | 1178 ----------------- .../plugins/NerdPack/scripts/packagemanager | 4 +- 5 files changed, 46 insertions(+), 1220 deletions(-) delete mode 100644 source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.tablesorter.pager.js diff --git a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/NerdPack.page b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/NerdPack.page index d7e11025..58f1d697 100644 --- a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/NerdPack.page +++ b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/NerdPack.page @@ -45,7 +45,7 @@ get_content_from_github($pkg_desc, $desc_file); -  + : diff --git a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/include/DownloadHelpers.php b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/include/DownloadHelpers.php index feee36a5..adf1983e 100644 --- a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/include/DownloadHelpers.php +++ b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/include/DownloadHelpers.php @@ -68,19 +68,22 @@ function get_content_from_github($repo, $file){ curl_setopt($ch, CURLOPT_URL, $repo); $content = curl_exec($ch); curl_close($ch); - if (!empty($content)) - file_put_contents($file, $content); + if ((!empty($content)) && ($content != file_get_contents($file))) + file_put_contents($file, $content); } -// Compare the github sha value of a file -function file_check_sha($file, $sha){ +// Compare the github sha1 value of a file +function file_check_sha1($file, $sha1){ $size = filesize($file); $handle = fopen($file, "rb"); $contents = fread($handle, $size); fclose($handle); + + // create a sha1 like github does $str = "blob ".$size."\0".$contents; - $sha_file = sha1($str); - $return = ($sha_file == $sha) ? true : false; + $sha1_file = sha1($str); + + $return = ($sha1_file == $sha1) ? true : false; return $return; } -?> +?> \ No newline at end of file diff --git a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.NerdPack.js b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.NerdPack.js index 8a662ccc..41baf482 100644 --- a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.NerdPack.js +++ b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.NerdPack.js @@ -1,20 +1,4 @@ $(function(){ - //tablesorter options - $('#tblPackages').tablesorter({ - sortList: [[0,1]], - widgets: ['saveSort', 'filter', 'stickyHeaders'], - widgetOptions: { - stickyHeaders_filteredToTop: true, - filter_hideEmpty : true, - filter_saveFilters : true, - filter_functions: { - '.filter-version' : true, - '.filter-downloaded' : true, - '.filter-installed' : true - } - } - }); - // "uninstall package" switch and cookie $('#uninstallpkg') .switchButton({ @@ -114,26 +98,43 @@ function packageQuery() { ""+ ""); + $('#'+data[i].pkgname) - .switchButton({ - labels_placement: 'right', - on_label: 'On', - off_label: 'Off', - checked: data[i].config == "yes" + .switchButton({ + labels_placement: 'right', + on_label: 'On', + off_label: 'Off', + checked: data[i].config == "yes" }) - .change(function() { - var par = $(this).parent().parent(); - if(this.checked) - par.find('.pkgvalue').val("yes"); - else - par.find('.pkgvalue').val("no"); - $("#btnApply").prop("disabled", false); - checkDepends(); + .change(function() { + var par = $(this).parent().parent(); + if(this.checked) + par.find('.pkgvalue').val("yes"); + else + par.find('.pkgvalue').val("no"); + $("#btnApply").prop("disabled", false); + checkDepends(); }); } - }, - complete : function () { $("#tblPackages").trigger("update"); + + //tablesorter options + $('#tblPackages').tablesorter({ + sortList: [[0,1]], + widgets: ['saveSort', 'filter', 'stickyHeaders'], + widgetOptions: { + stickyHeaders_filteredToTop: true, + filter_hideEmpty : true, + filter_liveSearch : true, + filter_saveFilters : true, + filter_reset : 'button.reset', + filter_functions: { + '.filter-version' : true, + '.filter-downloaded' : true, + '.filter-installed' : true + } + } + }); }, error: function () { } @@ -149,4 +150,4 @@ function checkDepends() { $('#python').switchButton({checked: true}); $('#python','.pkgvalue').val('yes'); } -}; +}; \ No newline at end of file diff --git a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.tablesorter.pager.js b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.tablesorter.pager.js deleted file mode 100644 index 60ac5964..00000000 --- a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/javascript/jquery.tablesorter.pager.js +++ /dev/null @@ -1,1178 +0,0 @@ -/*! - * tablesorter (FORK) pager plugin - * updated 11/22/2015 (v2.24.6) - */ -/*jshint browser:true, jquery:true, unused:false */ -;(function($) { - 'use strict'; - /*jshint supernew:true */ - var ts = $.tablesorter; - - $.extend({ tablesorterPager: new function() { - - this.defaults = { - // target the pager markup - container: null, - - // use this format: "http://mydatabase.com?page={page}&size={size}&{sortList:col}&{filterList:fcol}" - // where {page} is replaced by the page number, {size} is replaced by the number of records to show, - // {sortList:col} adds the sortList to the url into a "col" array, and {filterList:fcol} adds - // the filterList to the url into an "fcol" array. - // So a sortList = [[2,0],[3,0]] becomes "&col[2]=0&col[3]=0" in the url - // and a filterList = [[2,Blue],[3,13]] becomes "&fcol[2]=Blue&fcol[3]=13" in the url - ajaxUrl: null, - - // modify the url after all processing has been applied - customAjaxUrl: function(table, url) { return url; }, - - // ajax error callback from $.tablesorter.showError function - // ajaxError: function( config, xhr, settings, exception ){ return exception; }; - // returning false will abort the error message - ajaxError: null, - - // modify the $.ajax object to allow complete control over your ajax requests - ajaxObject: { - dataType: 'json' - }, - - // set this to false if you want to block ajax loading on init - processAjaxOnInit: true, - - // process ajax so that the following information is returned: - // [ total_rows (number), rows (array of arrays), headers (array; optional) ] - // example: - // [ - // 100, // total rows - // [ - // [ "row1cell1", "row1cell2", ... "row1cellN" ], - // [ "row2cell1", "row2cell2", ... "row2cellN" ], - // ... - // [ "rowNcell1", "rowNcell2", ... "rowNcellN" ] - // ], - // [ "header1", "header2", ... "headerN" ] // optional - // ] - ajaxProcessing: function(ajax){ return [ 0, [], null ]; }, - - // output default: '{page}/{totalPages}' - // possible variables: {size}, {page}, {totalPages}, {filteredPages}, {startRow}, - // {endRow}, {filteredRows} and {totalRows} - output: '{startRow} to {endRow} of {totalRows} rows', // '{page}/{totalPages}' - - // apply disabled classname to the pager arrows when the rows at either extreme is visible - updateArrows: true, - - // starting page of the pager (zero based index) - page: 0, - - // reset pager after filtering; set to desired page # - // set to false to not change page at filter start - pageReset: 0, - - // Number of visible rows - size: 10, - - // Number of options to include in the pager number selector - maxOptionSize: 20, - - // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage in jquery.tablesorter.widgets.js) - savePages: true, - - // defines custom storage key - storageKey: 'tablesorter-pager', - - // if true, the table will remain the same height no matter how many records are displayed. The space is made up by an empty - // table row set to a height to compensate; default is false - fixedHeight: false, - - // count child rows towards the set page size? (set true if it is a visible table row within the pager) - // if true, child row(s) may not appear to be attached to its parent row, may be split across pages or - // may distort the table if rowspan or cellspans are included. - countChildRows: false, - - // remove rows from the table to speed up the sort of large tables. - // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with the pager enabled. - removeRows: false, // removing rows in larger tables speeds up the sort - - // css class names of pager arrows - cssFirst: '.first', // go to first page arrow - cssPrev: '.prev', // previous page arrow - cssNext: '.next', // next page arrow - cssLast: '.last', // go to last page arrow - cssGoto: '.gotoPage', // go to page selector - select dropdown that sets the current page - cssPageDisplay: '.pagedisplay', // location of where the "output" is displayed - cssPageSize: '.pagesize', // page size selector - select dropdown that sets the "size" option - cssErrorRow: 'tablesorter-errorRow', // error information row - - // class added to arrows when at the extremes (i.e. prev/first arrows are "disabled" when on the first page) - cssDisabled: 'disabled', // Note there is no period "." in front of this class name - - // stuff not set by the user - totalRows: 0, - totalPages: 0, - filteredRows: 0, - filteredPages: 0, - ajaxCounter: 0, - currentFilters: [], - startRow: 0, - endRow: 0, - $size: null, - last: {} - - }; - - var pagerEvents = 'filterInit filterStart filterEnd sortEnd disablePager enablePager destroyPager updateComplete ' + - 'pageSize pageSet pageAndSize pagerUpdate refreshComplete ', - - $this = this, - - // hide arrows at extremes - pagerArrows = function( table, p, disable ) { - var a = 'addClass', - r = 'removeClass', - d = p.cssDisabled, - dis = !!disable, - first = ( dis || p.page === 0 ), - tp = getTotalPages( table, p ), - last = ( dis || (p.page === tp - 1) || tp === 0 ); - if ( p.updateArrows ) { - p.$container.find(p.cssFirst + ',' + p.cssPrev)[ first ? a : r ](d).attr('aria-disabled', first); - p.$container.find(p.cssNext + ',' + p.cssLast)[ last ? a : r ](d).attr('aria-disabled', last); - } - }, - - calcFilters = function(table, p) { - var normalized, indx, len, - c = table.config, - hasFilters = c.$table.hasClass('hasFilters'); - if (hasFilters && !p.ajaxUrl) { - if (ts.isEmptyObject(c.cache)) { - // delayInit: true so nothing is in the cache - p.filteredRows = p.totalRows = c.$tbodies.eq(0).children('tr').not( p.countChildRows ? '' : '.' + c.cssChildRow ).length; - } else { - p.filteredRows = 0; - normalized = c.cache[0].normalized; - len = normalized.length; - for (indx = 0; indx < len; indx++) { - p.filteredRows += p.regexRows.test(normalized[indx][c.columns].$row[0].className) ? 0 : 1; - } - } - } else if (!hasFilters) { - p.filteredRows = p.totalRows; - } - }, - - updatePageDisplay = function(table, p, completed) { - if ( p.initializing ) { return; } - var s, t, $out, indx, len, options, - c = table.config, - namespace = c.namespace + 'pager', - sz = parsePageSize( p, p.size, 'get' ); // don't allow dividing by zero - if (p.countChildRows) { t.push(c.cssChildRow); } - p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method - c.totalRows = p.totalRows; - parsePageNumber( table, p ); - calcFilters(table, p); - c.filteredRows = p.filteredRows; - p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0; - if ( getTotalPages( table, p ) >= 0 ) { - t = (p.size * p.page > p.filteredRows) && completed; - p.page = (t) ? p.pageReset || 0 : p.page; - p.startRow = (t) ? p.size * p.page + 1 : (p.filteredRows === 0 ? 0 : p.size * p.page + 1); - p.endRow = Math.min( p.filteredRows, p.totalRows, p.size * ( p.page + 1 ) ); - $out = p.$container.find(p.cssPageDisplay); - // form the output string (can now get a new output string from the server) - s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || p.output : p.output ) - // {page} = one-based index; {page+#} = zero based index +/- value - .replace(/\{page([\-+]\d+)?\}/gi, function(m, n){ - return p.totalPages ? p.page + (n ? parseInt(n, 10) : 1) : 0; - }) - // {totalPages}, {extra}, {extra:0} (array) or {extra : key} (object) - .replace(/\{\w+(\s*:\s*\w+)?\}/gi, function(m){ - var len, indx, - str = m.replace(/[{}\s]/g, ''), - extra = str.split(':'), - data = p.ajaxData, - // return zero for default page/row numbers - deflt = /(rows?|pages?)$/i.test(str) ? 0 : ''; - if (/(startRow|page)/.test(extra[0]) && extra[1] === 'input') { - len = ('' + (extra[0] === 'page' ? p.totalPages : p.totalRows)).length; - indx = extra[0] === 'page' ? p.page + 1 : p.startRow; - return ''; - } - return extra.length > 1 && data && data[extra[0]] ? data[extra[0]][extra[1]] : p[str] || (data ? data[str] : deflt) || deflt; - }); - if ( p.$goto.length ) { - t = ''; - options = buildPageSelect( table, p ); - len = options.length; - for (indx = 0; indx < len; indx++) { - t += ''; - } - // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228 - p.$goto.html(t).val( p.page + 1 ); - } - if ($out.length) { - $out[ ($out[0].nodeName === 'INPUT') ? 'val' : 'html' ](s); - // rebind startRow/page inputs - $out.find('.ts-startRow, .ts-page').unbind('change' + namespace).bind('change' + namespace, function(){ - var v = $(this).val(), - pg = $(this).hasClass('ts-startRow') ? Math.floor( v / p.size ) + 1 : v; - c.$table.triggerHandler('pageSet' + namespace, [ pg ]); - }); - } - } - pagerArrows( table, p ); - fixHeight(table, p); - if (p.initialized && completed !== false) { - if (c.debug) { - console.log('Pager: Triggering pagerComplete'); - } - c.$table.triggerHandler('pagerComplete', p); - // save pager info to storage - if (p.savePages && ts.storage) { - ts.storage(table, p.storageKey, { - page : p.page, - size : p.size - }); - } - } - }, - - buildPageSelect = function( table, p ) { - // Filter the options page number link array if it's larger than 'maxOptionSize' - // as large page set links will slow the browser on large dom inserts - var i, central_focus_size, focus_option_pages, insert_index, option_length, focus_length, - pg = getTotalPages( table, p ) || 1, - // make skip set size multiples of 5 - skip_set_size = Math.ceil( ( pg / p.maxOptionSize ) / 5 ) * 5, - large_collection = pg > p.maxOptionSize, - current_page = p.page + 1, - start_page = skip_set_size, - end_page = pg - skip_set_size, - option_pages = [ 1 ], - // construct default options pages array - option_pages_start_page = (large_collection) ? skip_set_size : 1; - - for ( i = option_pages_start_page; i <= pg; ) { - option_pages.push(i); - i = i + ( large_collection ? skip_set_size : 1 ); - } - option_pages.push(pg); - if (large_collection) { - focus_option_pages = []; - // don't allow central focus size to be > 5 on either side of current page - central_focus_size = Math.max( Math.floor( p.maxOptionSize / skip_set_size ) - 1, 5 ); - - start_page = current_page - central_focus_size; - if (start_page < 1) { start_page = 1; } - end_page = current_page + central_focus_size; - if (end_page > pg) { end_page = pg; } - // construct an array to get a focus set around the current page - for (i = start_page; i <= end_page ; i++) { - focus_option_pages.push(i); - } - - // keep unique values - option_pages = $.grep(option_pages, function(value, indx) { - return $.inArray(value, option_pages) === indx; - }); - - option_length = option_pages.length; - focus_length = focus_option_pages.length; - - // make sure at all option_pages aren't replaced - if (option_length - focus_length > skip_set_size / 2 && option_length + focus_length > p.maxOptionSize ) { - insert_index = Math.floor(option_length / 2) - Math.floor(focus_length / 2); - Array.prototype.splice.apply(option_pages, [ insert_index, focus_length ]); - } - option_pages = option_pages.concat(focus_option_pages); - - } - - // keep unique values again - option_pages = $.grep(option_pages, function(value, indx) { - return $.inArray(value, option_pages) === indx; - }) - .sort(function(a, b) { return a - b; }); - - return option_pages; - }, - - fixHeight = function(table, p) { - var d, h, - c = table.config, - $b = c.$tbodies.eq(0); - $b.find('tr.pagerSavedHeightSpacer').remove(); - if (p.fixedHeight && !p.isDisabled) { - h = $.data(table, 'pagerSavedHeight'); - if (h) { - d = h - $b.height(); - if ( d > 5 && $.data(table, 'pagerLastSize') === p.size && $b.children('tr:visible').length < p.size ) { - $b.append(''); - } - } - } - }, - - changeHeight = function(table, p) { - var h, - c = table.config, - $b = c.$tbodies.eq(0); - $b.find('tr.pagerSavedHeightSpacer').remove(); - if (!$b.children('tr:visible').length) { - $b.append(' '); - } - h = $b.children('tr').eq(0).height() * p.size; - $.data(table, 'pagerSavedHeight', h); - fixHeight(table, p); - $.data(table, 'pagerLastSize', p.size); - }, - - hideRows = function(table, p){ - if (!p.ajaxUrl) { - var i, - lastIndex = 0, - c = table.config, - rows = c.$tbodies.eq(0).children('tr'), - l = rows.length, - s = ( p.page * p.size ), - e = s + p.size, - f = c.widgetOptions && c.widgetOptions.filter_filteredRow || 'filtered', - last = 0, // for cache indexing - j = 0; // size counter - p.cacheIndex = []; - for ( i = 0; i < l; i++ ){ - if ( !rows[i].className.match(f) ) { - if (j === s && rows[i].className.match(c.cssChildRow)) { - // hide child rows @ start of pager (if already visible) - rows[i].style.display = 'none'; - } else { - rows[i].style.display = ( j >= s && j < e ) ? '' : 'none'; - if (last !== j && j >= s && j < e) { - p.cacheIndex.push(i); - last = j; - } - // don't count child rows - j += rows[i].className.match(c.cssChildRow + '|' + c.selectorRemove.slice(1)) && !p.countChildRows ? 0 : 1; - if ( j === e && rows[i].style.display !== 'none' && rows[i].className.match(ts.css.cssHasChild) ) { - lastIndex = i; - } - } - } - } - // add any attached child rows to last row of pager. Fixes part of issue #396 - if ( lastIndex > 0 && rows[lastIndex].className.match(ts.css.cssHasChild) ) { - while ( ++lastIndex < l && rows[lastIndex].className.match(c.cssChildRow) ) { - rows[lastIndex].style.display = ''; - } - } - } - }, - - hideRowsSetup = function(table, p){ - p.size = parsePageSize( p, p.$size.val(), 'get' ); - p.$size.val( parsePageSize( p, p.size, 'set' ) ); - $.data(table, 'pagerLastSize', p.size); - pagerArrows( table, p ); - if ( !p.removeRows ) { - hideRows(table, p); - $(table).bind('sortEnd filterEnd '.split(' ').join(table.config.namespace + 'pager '), function(){ - hideRows(table, p); - }); - } - }, - - renderAjax = function(data, table, p, xhr, settings, exception){ - // process data - if ( typeof p.ajaxProcessing === 'function' ) { - - // in case nothing is returned by ajax, empty out the table; see #1032 - // but do it before calling pager_ajaxProcessing because that function may add content - // directly to the table - table.config.$tbodies.eq(0).empty(); - - // ajaxProcessing result: [ total, rows, headers ] - var i, j, t, hsh, $f, $sh, $headers, $h, icon, th, d, l, rr_count, len, - c = table.config, - $table = c.$table, - tds = '', - result = p.ajaxProcessing(data, table, xhr) || [ 0, [] ], - hl = $table.find('thead th').length; - - // Clean up any previous error. - ts.showError( table ); - - if ( exception ) { - if (c.debug) { - console.error('Pager: >> Ajax Error', xhr, settings, exception); - } - ts.showError( table, xhr, settings, exception ); - c.$tbodies.eq(0).children('tr').detach(); - p.totalRows = 0; - } else { - // process ajax object - if (!$.isArray(result)) { - p.ajaxData = result; - c.totalRows = p.totalRows = result.total; - c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total; - th = result.headers; - d = result.rows || []; - } else { - // allow [ total, rows, headers ] or [ rows, total, headers ] - t = isNaN(result[0]) && !isNaN(result[1]); - // ensure a zero returned row count doesn't fail the logical || - rr_count = result[t ? 1 : 0]; - p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count; - // can't set filtered rows when returning an array - c.totalRows = c.filteredRows = p.filteredRows = p.totalRows; - // set row data to empty array if nothing found - see http://stackoverflow.com/q/30875583/145346 - d = p.totalRows === 0 ? [] : result[t ? 0 : 1] || []; // row data - th = result[2]; // headers - } - l = d && d.length; - if (d instanceof jQuery) { - if (p.processAjaxOnInit) { - // append jQuery object - c.$tbodies.eq(0).empty(); - c.$tbodies.eq(0).append(d); - } - } else if (l) { - // build table from array - for ( i = 0; i < l; i++ ) { - tds += ''; - for ( j = 0; j < d[i].length; j++ ) { - // build tbody cells; watch for data containing HTML markup - see #434 - tds += /^\s*' + d[i][j] + ''; - } - tds += ''; - } - // add rows to first tbody - if (p.processAjaxOnInit) { - c.$tbodies.eq(0).html( tds ); - } - } - p.processAjaxOnInit = true; - // only add new header text if the length matches - if ( th && th.length === hl ) { - hsh = $table.hasClass('hasStickyHeaders'); - $sh = hsh ? c.widgetOptions.$sticky.children('thead:first').children('tr').children() : ''; - $f = $table.find('tfoot tr:first').children(); - // don't change td headers (may contain pager) - $headers = c.$headers.filter( 'th ' ); - len = $headers.length; - for ( j = 0; j < len; j++ ) { - $h = $headers.eq( j ); - // add new test within the first span it finds, or just in the header - if ( $h.find('.' + ts.css.icon).length ) { - icon = $h.find('.' + ts.css.icon).clone(true); - $h.find('.tablesorter-header-inner').html( th[j] ).append(icon); - if ( hsh && $sh.length ) { - icon = $sh.eq(j).find('.' + ts.css.icon).clone(true); - $sh.eq(j).find('.tablesorter-header-inner').html( th[j] ).append(icon); - } - } else { - $h.find('.tablesorter-header-inner').html( th[j] ); - if (hsh && $sh.length) { - $sh.eq(j).find('.tablesorter-header-inner').html( th[j] ); - } - } - $f.eq(j).html( th[j] ); - } - } - } - if (c.showProcessing) { - ts.isProcessing(table); // remove loading icon - } - // make sure last pager settings are saved, prevents multiple server side calls with - // the same parameters - p.totalPages = Math.ceil( p.totalRows / parsePageSize( p, p.size, 'get' ) ); - p.last.totalRows = p.totalRows; - p.last.currentFilters = p.currentFilters; - p.last.sortList = (c.sortList || []).join(','); - updatePageDisplay(table, p, false); - // tablesorter core updateCache (not pager) - ts.updateCache( c, function(){ - if (p.initialized) { - // apply widgets after table has rendered & after a delay to prevent - // multiple applyWidget blocking code from blocking this trigger - setTimeout(function(){ - if (c.debug) { - console.log('Pager: Triggering pagerChange'); - } - $table.triggerHandler( 'pagerChange', p ); - ts.applyWidget( table ); - updatePageDisplay(table, p, true); - }, 0); - } - }); - - } - if (!p.initialized) { - p.initialized = true; - p.initializing = false; - if (table.config.debug) { - console.log('Pager: Triggering pagerInitialized'); - } - $(table).triggerHandler( 'pagerInitialized', p ); - ts.applyWidget( table ); - updatePageDisplay(table, p); - } - }, - - getAjax = function(table, p) { - var url = getAjaxUrl(table, p), - $doc = $(document), - counter, - c = table.config, - namespace = c.namespace + 'pager'; - if ( url !== '' ) { - if (c.showProcessing) { - ts.isProcessing(table, true); // show loading icon - } - $doc.bind('ajaxError' + namespace, function(e, xhr, settings, exception) { - renderAjax(null, table, p, xhr, settings, exception); - $doc.unbind('ajaxError' + namespace); - }); - - counter = ++p.ajaxCounter; - - p.last.ajaxUrl = url; // remember processed url - p.ajaxObject.url = url; // from the ajaxUrl option and modified by customAjaxUrl - p.ajaxObject.success = function(data, status, jqxhr) { - // Refuse to process old ajax commands that were overwritten by new ones - see #443 - if (counter < p.ajaxCounter){ - return; - } - renderAjax(data, table, p, jqxhr); - $doc.unbind('ajaxError' + namespace); - if (typeof p.oldAjaxSuccess === 'function') { - p.oldAjaxSuccess(data); - } - }; - if (c.debug) { - console.log('Pager: Ajax initialized', p.ajaxObject); - } - $.ajax(p.ajaxObject); - } - }, - - getAjaxUrl = function(table, p) { - var indx, len, - c = table.config, - url = (p.ajaxUrl) ? p.ajaxUrl - // allow using "{page+1}" in the url string to switch to a non-zero based index - .replace(/\{page([\-+]\d+)?\}/, function(s, n){ return p.page + (n ? parseInt(n, 10) : 0); }) - .replace(/\{size\}/g, p.size) : '', - sortList = c.sortList, - filterList = p.currentFilters || $(table).data('lastSearch') || [], - sortCol = url.match(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/), - filterCol = url.match(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/), - arry = []; - if (sortCol) { - sortCol = sortCol[1]; - len = sortList.length; - for (indx = 0; indx < len; indx++) { - arry.push(sortCol + '[' + sortList[indx][0] + ']=' + sortList[indx][1]); - } - // if the arry is empty, just add the col parameter... "&{sortList:col}" becomes "&col" - url = url.replace(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join('&') : sortCol ); - arry = []; - } - if (filterCol) { - filterCol = filterCol[1]; - len = filterList.length; - for (indx = 0; indx < len; indx++) { - if (filterList[indx]) { - arry.push(filterCol + '[' + indx + ']=' + encodeURIComponent(filterList[indx])); - } - } - // if the arry is empty, just add the fcol parameter... "&{filterList:fcol}" becomes "&fcol" - url = url.replace(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join('&') : filterCol ); - p.currentFilters = filterList; - } - if ( typeof p.customAjaxUrl === 'function' ) { - url = p.customAjaxUrl(table, url); - } - if (c.debug) { - console.log('Pager: Ajax url = ' + url); - } - return url; - }, - - renderTable = function(table, rows, p) { - var $tb, index, count, added, - $t = $(table), - c = table.config, - f = c.$table.hasClass('hasFilters'), - l = rows && rows.length || 0, // rows may be undefined - s = ( p.page * p.size ), - e = p.size; - if ( l < 1 ) { - if (c.debug) { - console.warn('Pager: >> No rows for pager to render'); - } - // empty table, abort! - return; - } - if ( p.page >= p.totalPages ) { - // lets not render the table more than once - moveToLastPage(table, p); - } - p.cacheIndex = []; - p.isDisabled = false; // needed because sorting will change the page and re-enable the pager - if (p.initialized) { - if (c.debug) { - console.log('Pager: Triggering pagerChange'); - } - $t.triggerHandler( 'pagerChange', p ); - } - if ( !p.removeRows ) { - hideRows(table, p); - } else { - ts.clearTableBody(table); - $tb = ts.processTbody(table, c.$tbodies.eq(0), true); - // not filtered, start from the calculated starting point (s) - // if filtered, start from zero - index = f ? 0 : s; - count = f ? 0 : s; - added = 0; - while (added < e && index < rows.length) { - if (!f || !/filtered/.test(rows[index][0].className)){ - count++; - if (count > s && added <= e) { - added++; - p.cacheIndex.push(index); - $tb.append(rows[index]); - } - } - index++; - } - ts.processTbody(table, $tb, false); - } - updatePageDisplay(table, p); - if (table.isUpdating) { - if (c.debug) { - console.log('Pager: Triggering updateComplete'); - } - $t.triggerHandler('updateComplete', [ table, true ]); - } - }, - - showAllRows = function(table, p) { - var index, $controls, len; - if ( p.ajax ) { - pagerArrows( table, p, true ); - } else { - $.data(table, 'pagerLastPage', p.page); - $.data(table, 'pagerLastSize', p.size); - p.page = 0; - p.size = p.totalRows; - p.totalPages = 1; - $(table) - .addClass('pagerDisabled') - .removeAttr('aria-describedby') - .find('tr.pagerSavedHeightSpacer').remove(); - renderTable(table, table.config.rowsCopy, p); - p.isDisabled = true; - ts.applyWidget( table ); - if (table.config.debug) { - console.log('Pager: Disabled'); - } - } - // disable size selector - $controls = p.$size - .add( p.$goto ) - .add( p.$container.find( '.ts-startRow, .ts-page' ) ); - len = $controls.length; - for ( index = 0; index < len; index++ ) { - $controls.eq( index ) - .attr( 'aria-disabled', 'true' ) - .addClass( p.cssDisabled )[0].disabled = true; - } - }, - - // updateCache if delayInit: true - updateCache = function(table) { - var c = table.config, - p = c.pager; - // tablesorter core updateCache (not pager) - ts.updateCache( c, function(){ - var i, - rows = [], - n = table.config.cache[0].normalized; - p.totalRows = n.length; - for (i = 0; i < p.totalRows; i++) { - rows.push(n[i][c.columns].$row); - } - c.rowsCopy = rows; - moveToPage(table, p, true); - }); - }, - - moveToPage = function(table, p, pageMoved) { - if ( p.isDisabled ) { return; } - var c = table.config, - $t = $(table), - l = p.last; - if ( pageMoved !== false && p.initialized && ts.isEmptyObject(c.cache)) { - return updateCache(table); - } - // abort page move if the table has filters and has not been initialized - if (p.ajax && ts.hasWidget(table, 'filter') && !c.widgetOptions.filter_initialized) { return; } - parsePageNumber( table, p ); - calcFilters(table, p); - // fixes issue where one currentFilter is [] and the other is ['','',''], - // making the next if comparison think the filters are different (joined by commas). Fixes #202. - l.currentFilters = (l.currentFilters || []).join('') === '' ? [] : l.currentFilters; - p.currentFilters = (p.currentFilters || []).join('') === '' ? [] : p.currentFilters; - // don't allow rendering multiple times on the same page/size/totalRows/filters/sorts - if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows && - (l.currentFilters || []).join(',') === (p.currentFilters || []).join(',') && - // check for ajax url changes see #730 - (l.ajaxUrl || '') === (p.ajaxObject.url || '') && - // & ajax url option changes (dynamically add/remove/rename sort & filter parameters) - (l.optAjaxUrl || '') === (p.ajaxUrl || '') && - l.sortList === (c.sortList || []).join(',') ) { return; } - if (c.debug) { - console.log('Pager: Changing to page ' + p.page); - } - p.last = { - page : p.page, - size : p.size, - // fixes #408; modify sortList otherwise it auto-updates - sortList : (c.sortList || []).join(','), - totalRows : p.totalRows, - currentFilters : p.currentFilters || [], - ajaxUrl : p.ajaxObject.url || '', - optAjaxUrl : p.ajaxUrl || '' - }; - if (p.ajax) { - getAjax(table, p); - } else if (!p.ajax) { - renderTable(table, c.rowsCopy, p); - } - $.data(table, 'pagerLastPage', p.page); - if (p.initialized && pageMoved !== false) { - if (c.debug) { - console.log('Pager: Triggering pageMoved'); - } - $t.triggerHandler('pageMoved', p); - ts.applyWidget( table ); - if (table.isUpdating) { - if (c.debug) { - console.log('Pager: Triggering updateComplete'); - } - $t.triggerHandler('updateComplete', [ table, true ]); - } - } - }, - - getTotalPages = function( table, p ) { - return ts.hasWidget( table, 'filter' ) ? Math.min( p.totalPages, p.filteredPages ) : p.totalPages; - }, - - // set to either set or get value - parsePageSize = function( p, size, mode ) { - var s = parseInt( size, 10 ) || p.size || p.settings.size || 10, - // if select does not contain an "all" option, use size - setAll = p.$size.find( 'option[value="all"]' ).length ? 'all' : p.totalRows; - return /all/i.test( size ) || s === p.totalRows ? - // "get" to get `p.size` or "set" to set `p.$size.val()` - ( mode === 'get' ? p.totalRows : setAll ) : - ( mode === 'get' ? s : p.size ); - }, - - parsePageNumber = function( table, p ) { - var min = getTotalPages( table, p ) - 1; - p.page = parseInt( p.page, 10 ); - if ( p.page < 0 || isNaN( p.page ) ) { p.page = 0; } - if ( p.page > min && min >= 0 ) { p.page = min; } - return p.page; - }, - - setPageSize = function(table, size, p) { - p.size = parsePageSize( p, size, 'get' ); - p.$size.val( parsePageSize( p, p.size, 'set' ) ); - $.data(table, 'pagerLastPage', parsePageNumber( table, p ) ); - $.data(table, 'pagerLastSize', p.size); - p.totalPages = Math.ceil( p.totalRows / p.size ); - p.filteredPages = Math.ceil( p.filteredRows / p.size ); - moveToPage(table, p); - }, - - moveToFirstPage = function(table, p) { - p.page = 0; - moveToPage(table, p); - }, - - moveToLastPage = function(table, p) { - p.page = getTotalPages( table, p ) - 1; - moveToPage(table, p); - }, - - moveToNextPage = function(table, p) { - p.page++; - var last = getTotalPages( table, p ) - 1; - if ( p.page >= last ) { - p.page = last; - } - moveToPage(table, p); - }, - - moveToPrevPage = function(table, p) { - p.page--; - if ( p.page <= 0 ) { - p.page = 0; - } - moveToPage(table, p); - }, - - destroyPager = function(table, p) { - var c = table.config, - namespace = c.namespace + 'pager', - ctrls = [ p.cssFirst, p.cssPrev, p.cssNext, p.cssLast, p.cssGoto, p.cssPageSize ].join( ',' ); - showAllRows(table, p); - p.$container - // hide pager controls - .hide() - // unbind - .find( ctrls ) - .unbind( namespace ); - c.appender = null; // remove pager appender function - c.$table.unbind( namespace ); - if (ts.storage) { - ts.storage(table, p.storageKey, ''); - } - delete c.pager; - delete c.rowsCopy; - }, - - enablePager = function(table, p, triggered) { - var info, size, - c = table.config; - p.$size.add(p.$goto).add(p.$container.find('.ts-startRow, .ts-page')) - .removeClass(p.cssDisabled) - .removeAttr('disabled') - .attr('aria-disabled', 'false'); - p.isDisabled = false; - p.page = $.data(table, 'pagerLastPage') || p.page || 0; - size = p.$size.find('option[selected]').val(); - p.size = $.data(table, 'pagerLastSize') || parsePageSize( p, p.size, 'get' ); - p.$size.val( parsePageSize( p, p.size, 'set' ) ); // set page size - p.totalPages = Math.ceil( getTotalPages( table, p ) / p.size ); - // if table id exists, include page display with aria info - if ( table.id ) { - info = table.id + '_pager_info'; - p.$container.find(p.cssPageDisplay).attr('id', info); - c.$table.attr('aria-describedby', info); - } - changeHeight(table, p); - if ( triggered ) { - // tablesorter core update table - ts.update( c ); - setPageSize(table, p.size, p); - hideRowsSetup(table, p); - if (c.debug) { - console.log('Pager: Enabled'); - } - } - }; - - $this.appender = function(table, rows) { - var c = table.config, - p = c.pager; - if ( !p.ajax ) { - c.rowsCopy = rows; - p.totalRows = p.countChildRows ? c.$tbodies.eq(0).children('tr').length : rows.length; - p.size = $.data(table, 'pagerLastSize') || p.size || p.settings.size || 10; - p.totalPages = Math.ceil( p.totalRows / p.size ); - renderTable(table, rows, p); - // update display here in case all rows are removed - updatePageDisplay(table, p, false); - } - }; - - $this.construct = function(settings) { - return this.each(function() { - // check if tablesorter has initialized - if (!(this.config && this.hasInitialized)) { return; } - var t, ctrls, fxn, - table = this, - c = table.config, - wo = c.widgetOptions, - p = c.pager = $.extend( true, {}, $.tablesorterPager.defaults, settings ), - $t = c.$table, - namespace = c.namespace + 'pager', - // added in case the pager is reinitialized after being destroyed. - pager = p.$container = $(p.container).addClass('tablesorter-pager').show(); - // save a copy of the original settings - p.settings = $.extend( true, {}, $.tablesorterPager.defaults, settings ); - if (c.debug) { - console.log('Pager: Initializing'); - } - p.oldAjaxSuccess = p.oldAjaxSuccess || p.ajaxObject.success; - c.appender = $this.appender; - p.initializing = true; - if (p.savePages && ts.storage) { - t = ts.storage(table, p.storageKey) || {}; // fixes #387 - p.page = isNaN(t.page) ? p.page : t.page; - p.size = ( isNaN(t.size) ? p.size : t.size ) || p.settings.size || 10; - $.data(table, 'pagerLastSize', p.size); - } - - // skipped rows - p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')'); - - $t - // .unbind( namespace ) adding in jQuery 1.4.3 ( I think ) - .unbind( pagerEvents.split(' ').join(namespace + ' ').replace(/\s+/g, ' ') ) - .bind('filterInit filterStart '.split(' ').join(namespace + ' '), function(e, filters) { - p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch'); - // don't change page if filters are the same (pager updating, etc) - if (e.type === 'filterStart' && p.pageReset !== false && (c.lastCombinedFilter || '') !== (p.currentFilters || []).join('')) { - p.page = p.pageReset; // fixes #456 & #565 - } - }) - // update pager after filter widget completes - .bind('filterEnd sortEnd '.split(' ').join(namespace + ' '), function() { - p.currentFilters = c.$table.data('lastSearch'); - if (p.initialized || p.initializing) { - if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) { - // make sure we have a copy of all table rows once the cache has been built - updateCache(table); - } - updatePageDisplay(table, p, false); - moveToPage(table, p, false); - ts.applyWidget( table ); - } - }) - .bind('disablePager' + namespace, function(e){ - e.stopPropagation(); - showAllRows(table, p); - }) - .bind('enablePager' + namespace, function(e){ - e.stopPropagation(); - enablePager(table, p, true); - }) - .bind('destroyPager' + namespace, function(e){ - e.stopPropagation(); - destroyPager(table, p); - }) - .bind('updateComplete' + namespace, function(e, table, triggered){ - e.stopPropagation(); - // table can be unintentionally undefined in tablesorter v2.17.7 and earlier - // don't recalculate total rows/pages if using ajax - if ( !table || triggered || p.ajax ) { return; } - var $rows = c.$tbodies.eq(0).children('tr').not(c.selectorRemove); - p.totalRows = $rows.length - ( p.countChildRows ? 0 : $rows.filter('.' + c.cssChildRow).length ); - p.totalPages = Math.ceil( p.totalRows / p.size ); - if ($rows.length && c.rowsCopy && c.rowsCopy.length === 0) { - // make a copy of all table rows once the cache has been built - updateCache(table); - } - if ( p.page >= p.totalPages ) { - moveToLastPage(table, p); - } - hideRows(table, p); - changeHeight(table, p); - updatePageDisplay(table, p, true); - }) - .bind('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){ - e.stopPropagation(); - setPageSize(table, parsePageSize( p, size, 'get' ), p); - hideRows(table, p); - updatePageDisplay(table, p, false); - }) - .bind('pageSet pagerUpdate '.split(' ').join(namespace + ' '), function(e, num){ - e.stopPropagation(); - // force pager refresh - if (e.type === 'pagerUpdate') { - num = typeof num === 'undefined' ? p.page + 1 : num; - p.last.page = true; - } - p.page = (parseInt(num, 10) || 1) - 1; - moveToPage(table, p, true); - updatePageDisplay(table, p, false); - }) - .bind('pageAndSize' + namespace, function(e, page, size){ - e.stopPropagation(); - p.page = (parseInt(page, 10) || 1) - 1; - setPageSize(table, parsePageSize( p, size, 'get' ), p); - moveToPage(table, p, true); - hideRows(table, p); - updatePageDisplay(table, p, false); - }); - - // clicked controls - ctrls = [ p.cssFirst, p.cssPrev, p.cssNext, p.cssLast ]; - fxn = [ moveToFirstPage, moveToPrevPage, moveToNextPage, moveToLastPage ]; - if (c.debug && !pager.length) { - console.warn('Pager: >> Container not found'); - } - pager.find(ctrls.join(',')) - .attr('tabindex', 0) - .unbind('click' + namespace) - .bind('click' + namespace, function(e){ - e.stopPropagation(); - var i, $t = $(this), l = ctrls.length; - if ( !$t.hasClass(p.cssDisabled) ) { - for (i = 0; i < l; i++) { - if ($t.is(ctrls[i])) { - fxn[i](table, p); - break; - } - } - } - }); - - // goto selector - p.$goto = pager.find(p.cssGoto); - if ( p.$goto.length ) { - p.$goto - .unbind('change' + namespace) - .bind('change' + namespace, function(){ - p.page = $(this).val() - 1; - moveToPage(table, p, true); - updatePageDisplay(table, p, false); - }); - } else if (c.debug) { - console.warn('Pager: >> Goto selector not found'); - } - // page size selector - p.$size = pager.find(p.cssPageSize); - if ( p.$size.length ) { - // setting an option as selected appears to cause issues with initial page size - p.$size.find('option').removeAttr('selected'); - p.$size.unbind('change' + namespace).bind('change' + namespace, function() { - if ( !$(this).hasClass(p.cssDisabled) ) { - var size = $(this).val(); - p.$size.val( size ); // in case there are more than one pagers - setPageSize(table, size, p); - changeHeight(table, p); - } - return false; - }); - } else if (c.debug) { - console.warn('Pager: >> Size selector not found'); - } - - // clear initialized flag - p.initialized = false; - // before initialization event - $t.triggerHandler('pagerBeforeInitialized', p); - - enablePager(table, p, false); - if ( typeof p.ajaxUrl === 'string' ) { - // ajax pager; interact with database - p.ajax = true; - // When filtering with ajax, allow only custom filtering function, disable default - // filtering since it will be done server side. - c.widgetOptions.filter_serversideFiltering = true; - c.serverSideSorting = true; - moveToPage(table, p); - } else { - p.ajax = false; - // Regular pager; all rows stored in memory - ts.appendCache( c, true ); // true = don't apply widgets - hideRowsSetup(table, p); - } - - // pager initialized - if (!p.ajax && !p.initialized) { - p.initializing = false; - p.initialized = true; - moveToPage(table, p); - if (c.debug) { - console.log('Pager: Triggering pagerInitialized'); - } - c.$table.triggerHandler( 'pagerInitialized', p ); - if ( !( c.widgetOptions.filter_initialized && ts.hasWidget(table, 'filter') ) ) { - updatePageDisplay(table, p, false); - } - } - - // make the hasWidget function think that the pager widget is being used - c.widgetInit.pager = true; - }); - }; - - }() }); - - // see #486 - ts.showError = function( table, xhr, settings, exception ) { - var $row, - $table = $( table ), - c = $table[0].config, - wo = c && c.widgetOptions, - errorRow = c.pager && c.pager.cssErrorRow || - wo && wo.pager_css && wo.pager_css.errorRow || - 'tablesorter-errorRow', - typ = typeof xhr, - valid = true, - message = '', - removeRow = function(){ - c.$table.find( 'thead' ).find( '.' + errorRow ).remove(); - }; - - if ( !$table.length ) { - console.error('tablesorter showError: no table parameter passed'); - return; - } - - // ajaxError callback for plugin or widget - see #992 - if ( typeof c.pager.ajaxError === 'function' ) { - valid = c.pager.ajaxError( c, xhr, settings, exception ); - if ( valid === false ) { - return removeRow(); - } else { - message = valid; - } - } else if ( typeof wo.pager_ajaxError === 'function' ) { - valid = wo.pager_ajaxError( c, xhr, settings, exception ); - if ( valid === false ) { - return removeRow(); - } else { - message = valid; - } - } - - if ( message === '' ) { - if ( typ === 'object' ) { - message = - xhr.status === 0 ? 'Not connected, verify Network' : - xhr.status === 404 ? 'Requested page not found [404]' : - xhr.status === 500 ? 'Internal Server Error [500]' : - exception === 'parsererror' ? 'Requested JSON parse failed' : - exception === 'timeout' ? 'Time out error' : - exception === 'abort' ? 'Ajax Request aborted' : - 'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']'; - } else if ( typ === 'string' ) { - // keep backward compatibility (external usage just passes a message string) - message = xhr; - } else { - // remove all error rows - return removeRow(); - } - } - - // allow message to include entire row HTML! - $row = ( /tr\>/.test(message) ? $(message) : $('' + message + '') ) - .click( function() { - $( this ).remove(); - }) - // add error row to thead instead of tbody, or clicking on the header will result in a parser error - .appendTo( c.$table.find( 'thead:first' ) ) - .addClass( errorRow + ' ' + c.selectorRemove.slice(1) ) - .attr({ - role : 'alert', - 'aria-live' : 'assertive' - }); - - }; - - // extend plugin scope - $.fn.extend({ - tablesorterPager: $.tablesorterPager.construct - }); - -})(jQuery); diff --git a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/scripts/packagemanager b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/scripts/packagemanager index fce60eb9..21ce5dd4 100755 --- a/source/NerdPack/usr/local/emhttp/plugins/NerdPack/scripts/packagemanager +++ b/source/NerdPack/usr/local/emhttp/plugins/NerdPack/scripts/packagemanager @@ -95,13 +95,13 @@ foreach($pkg_cfg as $pkg_name => $pkg_pref) { //get preferences for each package $pkg_gitname = array_values($pkg_matches)[0]["name"]; $pkg_file = $pkg_path.$pkg_gitname; $pkg_url = array_values($pkg_matches)[0]["download_url"]; - $pkg_sha = array_values($pkg_matches)[0]["sha"]; + $pkg_sha1 = array_values($pkg_matches)[0]["sha"]; logger("Downloading $pkg_gitname package...", $argq); get_file_from_url($pkg_file, $pkg_url); - if(file_check_sha($pkg_file, $pkg_sha)) + if(file_check_sha1($pkg_file, $pkg_sha1)) logger("$pkg_gitname package downloaded sucessfully!", $argq); else logger("$pkg_gitname package download failed!", $argq);