2015-08-10 22:46:01 +02:00
var repoindex = ( function ( repoindex ) {
var RepoEntry = { } ;
RepoEntry . prototype = new repoindex . Entry ( ) ;
RepoEntry . prototype . constructor = RepoEntry ;
2015-09-12 20:37:04 +02:00
RepoEntry = function ( repoName , repoInfo , enabled ) {
2015-09-04 14:37:01 +02:00
if ( enabled === undefined ) {
2016-02-25 22:53:33 +01:00
// per default enable all repos with a fix number of packages except the local database
enabled = repoInfo . packageCount && repoName !== "local" ;
2015-09-04 14:37:01 +02:00
}
2015-09-12 20:37:04 +02:00
repoindex . Entry . prototype . constructor . call ( this , repoName , repoInfo , enabled ) ;
2015-08-10 22:46:01 +02:00
this . info . currentServer = 0 ;
2016-02-10 21:09:20 +01:00
this . rowElement . onclick = function ( e ) {
repoindex . pageManager . repoManager . showRepoInfoForIndex ( this . entry . index , typeof e === "object" && e . button === 1 ) ;
2015-08-10 22:46:01 +02:00
} ;
this . initTableRow = function ( ) {
2015-09-21 22:16:19 +02:00
this . rowElement . addCell ( this . name ) ;
2015-08-10 22:46:01 +02:00
this . rowElement . addCell ( this . info . desc ) ;
} ;
this . initTableRow ( ) ;
// create link
this . createLink = function ( ) {
this . link = document . createElement ( "a" ) ;
this . link . href = "#" ;
this . link . className = enabled ? "btn btn-primary" : "btn btn-default" ;
this . link . setAttribute ( "role" , "button" ) ;
this . link . repo = this ;
this . link . onclick = function ( ) {
if ( repoindex . pageManager . repoManager . buttonContainerExclusiveButton . checked ) {
2015-09-21 22:16:19 +02:00
repoindex . pageManager . repoManager . updateEnabledAll ( false ) ;
2015-08-10 22:46:01 +02:00
}
this . repo . toggleEnabled ( ) ;
return false ;
} ;
2015-09-21 22:16:19 +02:00
this . link . appendChild ( document . createTextNode ( repoName ) ) ;
2015-08-10 22:46:01 +02:00
this . link . title = repoInfo . desc ;
// use Bootstrap tooltip
this . link . setAttribute ( "data-placement" , "bottom" ) ;
$ ( this . link ) . tooltip ( ) ;
2015-09-21 22:16:19 +02:00
if ( repoInfo . packageCount ) {
2015-09-04 14:37:01 +02:00
// create badge with package count
var span = document . createElement ( "span" ) ;
span . className = "badge" ;
2015-09-21 22:16:19 +02:00
span . appendChild ( document . createTextNode ( repoInfo . packageCount ) ) ;
2015-09-04 14:37:01 +02:00
this . link . appendChild ( document . createTextNode ( " " ) ) ;
this . link . appendChild ( span ) ;
}
2015-08-10 22:46:01 +02:00
this . link . add = function ( ) {
repoindex . pageManager . repoManager . buttonContainer . appendChild ( this ) ;
} ;
this . link . remove = function ( ) {
2016-02-25 22:53:33 +01:00
this . parentNode . removeChild ( this ) ;
2015-08-10 22:46:01 +02:00
} ;
} ;
this . createLink ( ) ;
this . link . add ( ) ;
// provide a function to toggle enabled/disabled
2015-09-21 22:16:19 +02:00
this . updateEnabled = function ( enabled , noNotify ) {
2015-08-10 22:46:01 +02:00
if ( this . enabled !== enabled ) {
this . link . className = ( this . enabled = enabled ) ? "btn btn-primary" : "btn btn-default" ;
2015-09-21 22:16:19 +02:00
if ( ! noNotify ) {
this . statusChanged ( this ) ;
}
2015-08-10 22:46:01 +02:00
}
} ;
this . toggleEnabled = function ( ) {
2015-09-21 22:16:19 +02:00
this . updateEnabled ( ! this . enabled ) ;
2015-08-10 22:46:01 +02:00
} ;
} ;
repoindex . RepoEntryManager = { } ;
repoindex . RepoEntryManager . prototype = new repoindex . EntryManager ( ) ;
repoindex . RepoEntryManager . prototype . constructor = repoindex . RepoEntryManager ;
repoindex . RepoEntryManager = function ( pagination ) {
repoindex . EntryManager . prototype . constructor . call ( this , RepoEntry , document . getElementById ( "repos" ) , pagination ) ;
this . entryName = "repository" ;
this . entryNamePlural = "repositories" ;
this . buttonRow = document . getElementById ( "row_repos_buttons" ) ;
this . buttonContainer = document . getElementById ( "repos_buttons" ) ;
this . buttonContainerOptionsDropdown = document . getElementById ( "repos_buttons_options_dropdown" ) ;
this . buttonContainerExclusiveButton = document . getElementById ( "repos_buttons_exclusive" ) ;
this . applyRepoStatusChange = function ( ) {
// this is the RepoEntry object in this function!
var pageMgr = repoindex . pageManager ;
var repoEntries = pageMgr . repoManager . entries ;
var repoFilter = [ ] ;
for ( var i = 0 , end = repoEntries . length ; i < end ; ++ i ) {
if ( repoEntries [ i ] . enabled ) {
2015-09-21 22:16:19 +02:00
repoFilter . push ( repoEntries [ i ] . name ) ;
2015-08-10 22:46:01 +02:00
}
}
pageMgr . packageManager . filterRepos = pageMgr . groupManager . filterRepos = repoFilter ;
pageMgr . packageManager . invalidate ( ) ;
pageMgr . groupManager . invalidate ( ) ;
} ;
// provide a function to add repo entries
2015-09-21 22:16:19 +02:00
this . addEntry = function ( repoName , repoInfo ) {
var entry = new RepoEntry ( repoName , repoInfo ) ;
2015-08-10 22:46:01 +02:00
entry . statusChanged = this . applyRepoStatusChange ;
entry . pageManager = this ;
entry . repoEntryManager = this ;
2015-09-21 22:16:19 +02:00
entry . index = this . entries . length ;
2015-08-10 22:46:01 +02:00
this . entries . push ( entry ) ;
2015-09-04 14:37:01 +02:00
return entry ;
2015-08-10 22:46:01 +02:00
} ;
this . baseRemoveEntries = this . removeEntries ;
this . removeEntries = function ( ) {
for ( var i = 0 ; i < this . entries . length ; ++ i ) {
this . entries [ i ] . link . remove ( ) ;
}
this . baseRemoveEntries ( ) ;
} ;
2015-09-21 22:16:19 +02:00
this . updateEnabledAll = function ( enabled , noNotify ) {
2015-08-10 22:46:01 +02:00
for ( var i = 0 ; i < this . entries . length ; ++ i ) {
2015-09-21 22:16:19 +02:00
this . entries [ i ] . updateEnabled ( enabled , true ) ;
}
if ( ! noNotify ) {
this . applyRepoStatusChange ( ) ;
2015-08-10 22:46:01 +02:00
}
} ;
// handle a page selection
this . pagination . pageSelected = function ( pageElement ) {
var mgr = this . entryManager ;
// remove elements from previously selected page
mgr . entryContainer . wipeChildren ( ) ;
// if there is no page because there are no package entries, pageElement is null
if ( pageElement ) {
// show elements of selected page
pageElement . forRange ( function ( i ) {
var entry = mgr . filteredEntries [ i ] ;
2015-12-08 00:24:45 +01:00
entry . add ( mgr . entryContainer ) ; // adds entry to the entry container
2015-08-10 22:46:01 +02:00
} , mgr . filteredEntries . length ) ;
}
} ;
this . infoBox = document . getElementById ( "repos_info" ) ;
2016-02-10 21:09:20 +01:00
this . showRepoInfo = function ( repo , newTab ) {
2015-08-10 22:46:01 +02:00
var determineEntry = function ( ) {
var res = repoindex . pageManager . repoManager . entries . filter ( function ( entry ) {
2015-09-21 22:16:19 +02:00
return entry . name === repo ;
2015-08-10 22:46:01 +02:00
} ) ;
// entry exists?
if ( res . length > 0 ) {
// yes -> full package info available?
2016-02-10 21:09:20 +01:00
repoindex . pageManager . repoManager . showRepoInfoForIndex ( res [ 0 ] . index , newTab ) ;
2015-08-10 22:46:01 +02:00
} else {
// no -> show error
repoindex . pageManager . repoManager . showRepoNotFound ( repo ) ;
}
} ;
// basic repo info available?
2015-09-12 20:37:04 +02:00
if ( repoindex . client . hasBasicRepoInfo ) {
2015-08-10 22:46:01 +02:00
// yes -> can determine entry instantly
determineEntry ( ) ;
} else {
// no -> request info, use callback to determine entry when info becomes available
2015-09-12 20:37:04 +02:00
repoindex . client . requestBasicRepoInfo ( determineEntry ) ;
2015-08-10 22:46:01 +02:00
}
} ;
2016-02-10 21:09:20 +01:00
this . showRepoInfoForIndex = function ( entryIndex , newTab ) {
2015-08-10 22:46:01 +02:00
var entry = this . entryByIndex ( entryIndex ) ;
if ( entry ) {
2016-01-03 00:22:48 +01:00
// -> find info container and make info table
2016-02-10 21:09:20 +01:00
var infoContainer = repoindex . pageManager . createRepoInfoPane ( entry , newTab ) ;
2016-01-03 00:22:48 +01:00
infoContainer . wipeChildren ( ) ;
var infoTable = repoindex . makeInfoTable ( ) ;
var tb = infoTable . tbodyElement ;
2015-09-21 22:16:19 +02:00
var info = entry . info ;
2015-10-28 22:43:59 +01:00
repoindex . addField ( tb , "Name" , repoindex . makeStr ( entry . name ) ) ;
repoindex . addField ( tb , "Description" , repoindex . makeStr ( info . desc ) ) ;
repoindex . addField ( tb , "Package count" , repoindex . makeStr ( info . packageCount ) ) ;
repoindex . addField ( tb , "Usage" , repoindex . makeArray ( info . usage , ", " ) ) ;
repoindex . addField ( tb , "Signature level" , repoindex . makeArray ( info . sigLevel , ", " ) ) ;
repoindex . addField ( tb , "Source-only" , repoindex . makeBool ( info . srcOnly ) ) ;
repoindex . addField ( tb , "Upgrade sources" , repoindex . makeArray ( info . upgradeSources , ", " ) ) ;
2015-09-21 22:16:19 +02:00
var invokeUpgradeLookupParams = { repo : entry . name , invoke : "upgradelookup" } ;
2015-10-28 22:43:59 +01:00
repoindex . setDownloadButton ( repoindex . addField ( tb , "Upgrades" ) , "check for upgrades" , repoindex . makeHash ( repoindex . Pages . Repositories , invokeUpgradeLookupParams , true ) , function ( ) {
2015-09-21 22:16:19 +02:00
repoindex . pageManager . repoManager . showAvailableUpgrades ( entry . name ) ;
2015-09-12 20:37:04 +02:00
repoindex . pageManager . denoteHash ( repoindex . Pages . Repositories , invokeUpgradeLookupParams ) ;
2015-08-10 22:46:01 +02:00
} , "refresh" ) ;
2015-09-12 20:37:04 +02:00
// set currentInfo (the pageManager needs this value to upgrade the hash)
2015-09-21 22:16:19 +02:00
this . currentInfo = info ;
2015-08-10 22:46:01 +02:00
// ensures, that the "Package Info" box (with the properties just set) is shown
repoindex . pageManager . showRepoInfo ( ) ;
2016-01-03 00:22:48 +01:00
2016-02-10 21:09:20 +01:00
infoContainer . appendChild ( infoTable . tableElement ) ;
2015-08-10 22:46:01 +02:00
}
} ;
this . showRepoNotFound = function ( repo ) {
repoindex . pageManager . msgboxCritical (
"Repository not found" ,
"The repository <i>" + repoindex . escapeHtml ( repo ) + "</i> can not be found." ,
true ) ;
} ;
2015-09-12 20:37:04 +02:00
this . showAvailableUpgrades = function ( repo ) {
var requestUpgrades = function ( ) {
var showUpgrades = function ( availableUpgrades ) {
2015-08-10 22:46:01 +02:00
// check for errors
2015-09-12 20:37:04 +02:00
if ( Array . isArray ( availableUpgrades . errors ) ) {
for ( var i = 0 ; i < availableUpgrades . errors . length ; ++ i ) {
repoindex . pageManager . addError ( "Error: " + availableUpgrades . errors [ i ] ) ;
2015-08-10 22:46:01 +02:00
}
} else {
2015-09-12 20:37:04 +02:00
// create package entries for the upgrades
var upgradeEntries = [ ] ;
var upgrades = [
2015-08-10 22:46:01 +02:00
{
name : "software upgrade" ,
namePlural : "software upgrades" ,
style : "background-color: " + repoindex . softwareUpgradeBackgroundColor ,
color : repoindex . softwareUpgradeBackgroundColor ,
2015-09-12 20:37:04 +02:00
entries : Array . isArray ( availableUpgrades . softwareUpgrades ) ? availableUpgrades . softwareUpgrades : [ ] ,
count : Array . isArray ( availableUpgrades . softwareUpgrades ) ? availableUpgrades . softwareUpgrades . length : 0
2015-08-10 22:46:01 +02:00
} , {
name : "package-only upgrade" ,
namePlural : "package-only upgrades" ,
style : "background-color: " + repoindex . packageUpgradeBackgroundColor ,
color : repoindex . packageUpgradeBackgroundColor ,
2015-09-12 20:37:04 +02:00
entries : Array . isArray ( availableUpgrades . packageOnlyUpgrades ) ? availableUpgrades . packageOnlyUpgrades : [ ] ,
count : Array . isArray ( availableUpgrades . packageOnlyUpgrades ) ? availableUpgrades . packageOnlyUpgrades . length : 0
2015-08-10 22:46:01 +02:00
} , {
name : "downgrade" ,
namePlural : "downgrades" ,
style : "background-color: " + repoindex . downgradesBackgroundColor ,
color : repoindex . downgradesBackgroundColor ,
2015-09-12 20:37:04 +02:00
entries : Array . isArray ( availableUpgrades . downgrades ) ? availableUpgrades . downgrades : [ ] ,
count : Array . isArray ( availableUpgrades . downgrades ) ? availableUpgrades . downgrades . length : 0
2015-08-10 22:46:01 +02:00
} , {
name : "orphaned package" ,
namePlural : "orphaned packages" ,
style : "background-color: " + repoindex . orphanedPackageBackgroundColor ,
color : repoindex . orphanedPackageBackgroundColor ,
2015-09-12 20:37:04 +02:00
entries : Array . isArray ( availableUpgrades . orphanedPackages ) ? availableUpgrades . orphanedPackages : [ ] ,
count : Array . isArray ( availableUpgrades . orphanedPackages ) ? availableUpgrades . orphanedPackages . length : 0
2015-08-10 22:46:01 +02:00
}
] ;
var pkgMgr = repoindex . pageManager . packageManager ;
2015-09-04 14:37:01 +02:00
var repoMgr = repoindex . pageManager . repoManager ;
2015-09-12 20:37:04 +02:00
for ( var i1 = 0 ; i1 < upgrades . length ; ++ i1 ) {
// iterate through all kinds of "upgrades" declared above
for ( var i2 = 0 ; i2 < upgrades [ i1 ] . entries . length ; ++ i2 ) {
// iterate through all entries which have been assigned to the current upgrade type
2015-09-21 22:16:19 +02:00
var upgradeEntry = upgrades [ i1 ] . entries [ i2 ] ;
if ( upgradeEntry . pkg ) {
var packageInfo = repoindex . client . getPackageInfo ( upgradeEntry . repo , upgradeEntry . name ) ;
packageInfo . basics = upgradeEntry . pkg ;
2015-09-04 14:37:01 +02:00
// find associated repo entry
2015-09-21 22:16:19 +02:00
var repoEntry ;
if ( ( repoEntry = repoMgr . entryByName ( packageInfo . repo ) ) ) {
repoEntry . updateEnabled ( true ) ; // ensure repo is enabled
2015-09-04 14:37:01 +02:00
}
2015-09-21 22:16:19 +02:00
var newEntry = pkgMgr . createCustomEntry ( repoEntry , upgradeEntry . name , packageInfo , upgrades [ i1 ] . color ) ;
newEntry . curVer = upgradeEntry . curVer ;
newEntry . index = upgradeEntries . length ;
newEntry . updateTableRow ( ) ;
2015-08-19 02:13:28 +02:00
} else {
2015-09-21 22:16:19 +02:00
repoindex . pageManager . addError ( "Upgrade entry replied by server does not include package info." ) ;
2015-08-19 02:13:28 +02:00
}
2015-09-12 20:37:04 +02:00
upgradeEntries . push ( newEntry ) ;
2015-08-10 22:46:01 +02:00
}
}
2015-09-12 20:37:04 +02:00
// show warnings
if ( Array . isArray ( availableUpgrades . warnings ) ) {
for ( var i = 0 ; i < availableUpgrades . warnings . length ; ++ i ) {
repoindex . pageManager . addError ( "Warning: " + availableUpgrades . warnings [ i ] ) ;
2015-08-10 22:46:01 +02:00
}
}
2015-09-12 20:37:04 +02:00
// show upgrades via package manager
2015-08-19 02:13:28 +02:00
pkgMgr . filterName = undefined ;
2015-09-12 20:37:04 +02:00
pkgMgr . customSelection = upgradeEntries ;
2015-08-10 22:46:01 +02:00
pkgMgr . customSelectionName = "upgrade" ;
pkgMgr . customSelectionNamePlural = "upgrades" ;
2015-09-12 20:37:04 +02:00
var quandityInfo = repoindex . makeQuandityInfo ( upgrades ) ;
2015-08-10 22:46:01 +02:00
if ( quandityInfo ) {
2015-09-12 20:37:04 +02:00
pkgMgr . customSelectionInfoText = "Upgrades for the repository <i>"
2015-08-19 02:13:28 +02:00
+ repoindex . escapeHtml ( repo )
+ "</i>: " + quandityInfo
+ repoindex . removeFilterButtonHtml ;
2015-08-10 22:46:01 +02:00
}
pkgMgr . filterDescr = "for the repository"
pkgMgr . invalidate ( ) ;
repoindex . pageManager . setPage ( repoindex . Pages . Packages ) ;
}
} ;
2015-09-12 20:37:04 +02:00
repoindex . client . checkForUpgrades ( repo , null , showUpgrades ) ;
2015-08-10 22:46:01 +02:00
} ;
// basic repo info available?
2015-09-12 20:37:04 +02:00
if ( repoindex . client . hasBasicRepoInfo ) {
// yes -> request upgrades instantly
requestUpgrades ( ) ;
2015-08-10 22:46:01 +02:00
} else {
2015-09-12 20:37:04 +02:00
// no -> request info, use callback to go on requesting upgrades when repo info becomes available
repoindex . client . requestBasicRepoInfo ( requestUpgrades ) ;
2015-08-10 22:46:01 +02:00
}
} ;
} ;
return repoindex ;
} ) ( repoindex || { } ) ;