2018-10-23 11:25:46 +02:00
/* global H5PAdminIntegration H5PUtils */
var H5PLibraryDetails = H5PLibraryDetails || { } ;
2014-03-26 08:43:29 +01:00
( function ( $ ) {
H5PLibraryDetails . PAGER _SIZE = 20 ;
/ * *
* Initializing
* /
H5PLibraryDetails . init = function ( ) {
2015-02-27 13:59:42 +01:00
H5PLibraryDetails . $adminContainer = H5P . jQuery ( H5PAdminIntegration . containerSelector ) ;
H5PLibraryDetails . library = H5PAdminIntegration . libraryInfo ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// currentContent holds the current list if data (relevant for filtering)
H5PLibraryDetails . currentContent = H5PLibraryDetails . library . content ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// The current page index (for pager)
H5PLibraryDetails . currentPage = 0 ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// The current filter
H5PLibraryDetails . currentFilter = '' ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// We cache the filtered results, so we don't have to do unneccessary searches
H5PLibraryDetails . filterCache = [ ] ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// Append library info
H5PLibraryDetails . $adminContainer . append ( H5PLibraryDetails . createLibraryInfo ( ) ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// Append node list
H5PLibraryDetails . $adminContainer . append ( H5PLibraryDetails . createContentElement ( ) ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
2014-10-01 10:05:04 +02:00
* Create the library details view
2014-03-26 08:43:29 +01:00
* /
H5PLibraryDetails . createLibraryInfo = function ( ) {
var $libraryInfo = $ ( '<div class="h5p-library-info"></div>' ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
$ . each ( H5PLibraryDetails . library . info , function ( title , value ) {
$libraryInfo . append ( H5PUtils . createLabeledField ( title , value ) ) ;
} ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
return $libraryInfo ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
2014-10-01 10:05:04 +02:00
* Create the content list with searching and paging
2014-03-26 08:43:29 +01:00
* /
H5PLibraryDetails . createContentElement = function ( ) {
2014-05-28 13:18:24 +02:00
if ( H5PLibraryDetails . library . notCached !== undefined ) {
return H5PUtils . getRebuildCache ( H5PLibraryDetails . library . notCached ) ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
if ( H5PLibraryDetails . currentContent === undefined ) {
H5PLibraryDetails . $content = $ ( '<div class="h5p-content empty">' + H5PLibraryDetails . library . translations . noContent + '</div>' ) ;
}
else {
H5PLibraryDetails . $content = $ ( '<div class="h5p-content"><h3>' + H5PLibraryDetails . library . translations . contentHeader + '</h3></div>' ) ;
H5PLibraryDetails . createSearchElement ( ) ;
H5PLibraryDetails . createPageSizeSelector ( ) ;
H5PLibraryDetails . createContentTable ( ) ;
H5PLibraryDetails . createPagerElement ( ) ;
return H5PLibraryDetails . $content ;
}
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Creates the content list
* /
H5PLibraryDetails . createContentTable = function ( ) {
// Remove it if it exists:
2018-10-23 11:25:46 +02:00
if ( H5PLibraryDetails . $contentTable ) {
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $contentTable . remove ( ) ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $contentTable = H5PUtils . createTable ( ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
var i = ( H5PLibraryDetails . currentPage * H5PLibraryDetails . PAGER _SIZE ) ;
var lastIndex = ( i + H5PLibraryDetails . PAGER _SIZE ) ;
2014-10-01 10:05:04 +02:00
2018-10-23 11:25:46 +02:00
if ( lastIndex > H5PLibraryDetails . currentContent . length ) {
2014-03-26 08:43:29 +01:00
lastIndex = H5PLibraryDetails . currentContent . length ;
}
2018-10-23 11:25:46 +02:00
for ( ; i < lastIndex ; i ++ ) {
2014-03-26 08:43:29 +01:00
var content = H5PLibraryDetails . currentContent [ i ] ;
H5PLibraryDetails . $contentTable . append ( H5PUtils . createTableRow ( [ '<a href="' + content . url + '">' + content . title + '</a>' ] ) ) ;
}
2014-10-01 10:05:04 +02:00
// Appends it to the browser DOM
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $contentTable . insertAfter ( H5PLibraryDetails . $search ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Creates the pager element on the bottom of the list
* /
H5PLibraryDetails . createPagerElement = function ( ) {
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . $previous = $ ( '<button type="button" class="previous h5p-admin"><</button>' ) ;
H5PLibraryDetails . $next = $ ( '<button type="button" class="next h5p-admin">></button>' ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . $previous . on ( 'click' , function ( ) {
2018-10-23 11:25:46 +02:00
if ( H5PLibraryDetails . $previous . hasClass ( 'disabled' ) ) {
2017-08-07 16:38:09 +02:00
return ;
}
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . currentPage -- ;
H5PLibraryDetails . updatePager ( ) ;
H5PLibraryDetails . createContentTable ( ) ;
} ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . $next . on ( 'click' , function ( ) {
2018-10-23 11:25:46 +02:00
if ( H5PLibraryDetails . $next . hasClass ( 'disabled' ) ) {
2017-08-07 16:38:09 +02:00
return ;
}
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . currentPage ++ ;
H5PLibraryDetails . updatePager ( ) ;
H5PLibraryDetails . createContentTable ( ) ;
} ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
// This is the Page x of y widget:
H5PLibraryDetails . $pagerInfo = $ ( '<span class="pager-info"></span>' ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . $pager = $ ( '<div class="h5p-content-pager"></div>' ) . append ( H5PLibraryDetails . $previous , H5PLibraryDetails . $pagerInfo , H5PLibraryDetails . $next ) ;
H5PLibraryDetails . $content . append ( H5PLibraryDetails . $pager ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . $pagerInfo . on ( 'click' , function ( ) {
var width = H5PLibraryDetails . $pagerInfo . innerWidth ( ) ;
H5PLibraryDetails . $pagerInfo . hide ( ) ;
2014-03-26 08:43:29 +01:00
2017-08-07 16:38:09 +02:00
// User has updated the pageNumber
2018-10-23 11:25:46 +02:00
var pageNumerUpdated = function ( ) {
2017-08-07 16:38:09 +02:00
var newPageNum = $gotoInput . val ( ) - 1 ;
var intRegex = /^\d+$/ ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
$goto . remove ( ) ;
H5PLibraryDetails . $pagerInfo . css ( { display : 'inline-block' } ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
// Check if input value is valid, and that it has actually changed
2018-10-23 11:25:46 +02:00
if ( ! ( intRegex . test ( newPageNum ) && newPageNum >= 0 && newPageNum < H5PLibraryDetails . getNumPages ( ) && newPageNum != H5PLibraryDetails . currentPage ) ) {
2017-08-07 16:38:09 +02:00
return ;
}
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . currentPage = newPageNum ;
H5PLibraryDetails . updatePager ( ) ;
H5PLibraryDetails . createContentTable ( ) ;
} ;
// We create an input box where the user may type in the page number
// he wants to be displayed.
// Reson for doing this is when user has ten-thousands of elements in list,
// this is the easiest way of getting to a specified page
var $gotoInput = $ ( '<input/>' , {
type : 'number' ,
min : 1 ,
max : H5PLibraryDetails . getNumPages ( ) ,
on : {
// Listen to blur, and the enter-key:
'blur' : pageNumerUpdated ,
'keyup' : function ( event ) {
if ( event . keyCode === 13 ) {
pageNumerUpdated ( ) ;
2014-03-26 08:43:29 +01:00
}
}
2017-08-07 16:38:09 +02:00
}
} ) . css ( { width : width } ) ;
var $goto = $ ( '<span/>' , {
'class' : 'h5p-pager-goto'
} ) . css ( { width : width } ) . append ( $gotoInput ) . insertAfter ( H5PLibraryDetails . $pagerInfo ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
$gotoInput . focus ( ) ;
} ) ;
2014-10-01 10:05:04 +02:00
2017-08-07 16:38:09 +02:00
H5PLibraryDetails . updatePager ( ) ;
2014-03-26 08:43:29 +01:00
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Calculates number of pages
* /
H5PLibraryDetails . getNumPages = function ( ) {
return Math . ceil ( H5PLibraryDetails . currentContent . length / H5PLibraryDetails . PAGER _SIZE ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Update the pager text , and enables / disables the next and previous buttons as needed
* /
H5PLibraryDetails . updatePager = function ( ) {
H5PLibraryDetails . $pagerInfo . css ( { display : 'inline-block' } ) ;
2014-10-01 10:05:04 +02:00
2018-10-23 11:25:46 +02:00
if ( H5PLibraryDetails . getNumPages ( ) > 0 ) {
2014-03-26 08:43:29 +01:00
var message = H5PUtils . translateReplace ( H5PLibraryDetails . library . translations . pageXOfY , {
'$x' : ( H5PLibraryDetails . currentPage + 1 ) ,
'$y' : H5PLibraryDetails . getNumPages ( )
} ) ;
H5PLibraryDetails . $pagerInfo . html ( message ) ;
}
else {
H5PLibraryDetails . $pagerInfo . html ( '' ) ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $previous . toggleClass ( 'disabled' , H5PLibraryDetails . currentPage <= 0 ) ;
H5PLibraryDetails . $next . toggleClass ( 'disabled' , H5PLibraryDetails . currentContent . length < ( H5PLibraryDetails . currentPage + 1 ) * H5PLibraryDetails . PAGER _SIZE ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Creates the search element
* /
H5PLibraryDetails . createSearchElement = function ( ) {
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $search = $ ( '<div class="h5p-content-search"><input placeholder="' + H5PLibraryDetails . library . translations . filterPlaceholder + '" type="search"></div>' ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
var performSeach = function ( ) {
var searchString = $ ( '.h5p-content-search > input' ) . val ( ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// If search string same as previous, just do nothing
2018-10-23 11:25:46 +02:00
if ( H5PLibraryDetails . currentFilter === searchString ) {
2014-03-26 08:43:29 +01:00
return ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
if ( searchString . trim ( ) . length === 0 ) {
// If empty search, use the complete list
H5PLibraryDetails . currentContent = H5PLibraryDetails . library . content ;
}
2018-10-23 11:25:46 +02:00
else if ( H5PLibraryDetails . filterCache [ searchString ] ) {
2014-03-26 08:43:29 +01:00
// If search is cached, no need to filter
H5PLibraryDetails . currentContent = H5PLibraryDetails . filterCache [ searchString ] ;
}
else {
var listToFilter = H5PLibraryDetails . library . content ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// Check if we can filter the already filtered results (for performance)
2018-10-23 11:25:46 +02:00
if ( searchString . length > 1 && H5PLibraryDetails . currentFilter === searchString . s ubstr ( 0 , H5PLibraryDetails . currentFilter . length ) ) {
2014-03-26 08:43:29 +01:00
listToFilter = H5PLibraryDetails . currentContent ;
}
2018-10-23 11:25:46 +02:00
H5PLibraryDetails . currentContent = $ . grep ( listToFilter , function ( content ) {
2014-03-26 08:43:29 +01:00
return content . title && content . title . match ( new RegExp ( searchString , 'i' ) ) ;
} ) ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . currentFilter = searchString ;
// Cache the current result
H5PLibraryDetails . filterCache [ searchString ] = H5PLibraryDetails . currentContent ;
H5PLibraryDetails . currentPage = 0 ;
H5PLibraryDetails . createContentTable ( ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// Display search results:
if ( H5PLibraryDetails . $searchResults ) {
H5PLibraryDetails . $searchResults . remove ( ) ;
}
if ( searchString . trim ( ) . length > 0 ) {
2014-10-01 10:05:04 +02:00
H5PLibraryDetails . $searchResults = $ ( '<span class="h5p-admin-search-results">' + H5PLibraryDetails . currentContent . length + ' hits on ' + H5PLibraryDetails . currentFilter + '</span>' ) ;
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $search . append ( H5PLibraryDetails . $searchResults ) ;
}
H5PLibraryDetails . updatePager ( ) ;
} ;
2014-10-01 10:05:04 +02:00
var inputTimer ;
2014-03-26 08:43:29 +01:00
$ ( 'input' , H5PLibraryDetails . $search ) . on ( 'change keypress paste input' , function ( ) {
// Here we start the filtering
// We wait at least 500 ms after last input to perform search
2018-10-23 11:25:46 +02:00
if ( inputTimer ) {
2014-03-26 08:43:29 +01:00
clearTimeout ( inputTimer ) ;
}
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
inputTimer = setTimeout ( function ( ) {
performSeach ( ) ;
} , 500 ) ;
} ) ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
H5PLibraryDetails . $content . append ( H5PLibraryDetails . $search ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
/ * *
* Creates the page size selector
* /
H5PLibraryDetails . createPageSizeSelector = function ( ) {
H5PLibraryDetails . $search . append ( '<div class="h5p-admin-pager-size-selector">' + H5PLibraryDetails . library . translations . pageSizeSelectorLabel + ':<span data-page-size="10">10</span><span class="selected" data-page-size="20">20</span><span data-page-size="50">50</span><span data-page-size="100">100</span><span data-page-size="200">200</span></div>' ) ;
2014-10-01 10:05:04 +02:00
// Listen to clicks on the page size selector:
2014-03-26 08:43:29 +01:00
$ ( '.h5p-admin-pager-size-selector > span' , H5PLibraryDetails . $search ) . on ( 'click' , function ( ) {
H5PLibraryDetails . PAGER _SIZE = $ ( this ) . data ( 'page-size' ) ;
$ ( '.h5p-admin-pager-size-selector > span' , H5PLibraryDetails . $search ) . removeClass ( 'selected' ) ;
$ ( this ) . addClass ( 'selected' ) ;
H5PLibraryDetails . currentPage = 0 ;
H5PLibraryDetails . createContentTable ( ) ;
H5PLibraryDetails . updatePager ( ) ;
} ) ;
} ;
2014-10-01 10:05:04 +02:00
2014-03-26 08:43:29 +01:00
// Initialize me:
$ ( document ) . ready ( function ( ) {
if ( ! H5PLibraryDetails . initialized ) {
H5PLibraryDetails . initialized = true ;
H5PLibraryDetails . init ( ) ;
}
} ) ;
2014-10-01 10:05:04 +02:00
} ) ( H5P . jQuery ) ;