2015-08-10 22:46:01 +02:00
var repoindex = ( function ( repoindex ) {
repoindex . softwareUpgradeBackgroundColor = "#dfffdd" ;
repoindex . packageUpgradeBackgroundColor = "#dde3ff" ;
repoindex . downgradesBackgroundColor = "#ffeecb" ;
repoindex . orphanedPackageBackgroundColor = "#fdd" ;
var PackageEntry = { } ;
PackageEntry . prototype = new repoindex . Entry ( ) ;
PackageEntry . prototype . constructor = PackageEntry ;
2015-09-21 22:16:19 +02:00
PackageEntry = function ( repoEntry , packageName , packageInfo , color ) {
2015-09-04 14:37:01 +02:00
this . repoEntry = repoEntry ; // might be undefined
2015-09-21 22:16:19 +02:00
repoindex . Entry . prototype . constructor . call ( this , packageName , packageInfo ) ;
2015-08-10 22:46:01 +02:00
// init row element
if ( color ) {
this . rowElement . style . backgroundColor = color ;
}
2016-02-10 21:09:20 +01:00
this . rowElement . onclick = function ( e ) {
repoindex . pageManager . packageManager . showPackageInfoForIndex ( 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
var basics = this . info . basics ? this . info . basics : { } ;
2015-09-04 14:37:01 +02:00
var srcOnly = this . repoEntry && this . repoEntry . info . srcOnly ;
2015-09-21 22:16:19 +02:00
var pkgOnly = this . repoEntry && this . repoEntry . info . pkgOnly ;
var version = this . curVer ? ( this . curVer + " → " + ( basics . ver ? basics . ver : "?" ) ) : basics . ver ;
var values = [ srcOnly ? "n/a" : basics . arch , this . info . repo , this . name , version , basics . desc , srcOnly ? "n/a" : basics . bdate , pkgOnly ? "n/a" : basics . flagdate ] ;
2015-08-10 22:46:01 +02:00
for ( var i = 0 ; i < 7 ; ++ i ) {
2015-08-19 02:13:28 +02:00
this . rowElement . addCell ( repoindex . makeStr ( values [ i ] ) ) ;
2015-08-10 22:46:01 +02:00
}
} ;
this . initTableRow ( ) ;
} ;
repoindex . PackageEntryManager = { } ;
repoindex . PackageEntryManager . prototype = new repoindex . EntryManager ( ) ;
repoindex . PackageEntryManager = function ( pagination , repoEntries ) {
repoindex . EntryManager . prototype . constructor . call ( this , PackageEntry , document . getElementById ( "packages" ) , pagination , repoEntries ) ;
this . entryName = "package" ;
this . entryNamePlural = "packages" ;
this . containerName = "repository" ;
this . containerNamePlural = "repositories" ;
this . getContainerQuantity = repoindex . entryManagerGetRepoQuantity ;
2015-09-21 22:16:19 +02:00
this . createCustomEntry = function ( repoEntry , packageName , packageInfo , color ) {
return new PackageEntry ( repoEntry , packageName , packageInfo , color ) ;
2015-08-10 22:46:01 +02:00
} ;
2015-09-21 22:16:19 +02:00
this . addEntry = function ( repoEntry , packageName , packageInfo ) {
packageInfo . repo = repoEntry . name ;
packageInfo . name = packageName ;
packageInfo . received = false ;
var entry = new PackageEntry ( repoEntry , packageName , packageInfo ) ;
entry . index = this . entries . length ;
2015-09-04 14:37:01 +02:00
this . entries . push ( entry ) ;
return entry ;
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
2015-12-08 00:24:45 +01:00
var packageSelection = { } ; // package selection for requesting package info
2015-09-04 14:37:01 +02:00
var entriesRequired = false ;
2015-08-10 22:46:01 +02:00
pageElement . forRange ( function ( i ) {
var entry = mgr . filteredEntries [ i ] ;
entry . add ( mgr . entryContainer ) ;
2015-12-08 00:24:45 +01:00
if ( ! entry . info . basics ) {
2015-09-04 14:37:01 +02:00
var repoArray = packageSelection [ entry . info . repo ] ;
if ( ! Array . isArray ( repoArray ) ) {
packageSelection [ entry . info . repo ] = [ { index : entry . info . index , name : entry . info . name } ] ;
} else {
repoArray . push ( { index : entry . info . index , name : entry . info . name } ) ;
}
entriesRequired = true ;
2015-08-10 22:46:01 +02:00
}
} , mgr . filteredEntries . length ) ;
2015-09-21 22:16:19 +02:00
var updateTableRows = function ( ) {
pageElement . forRange ( function ( i ) {
mgr . filteredEntries [ i ] . updateTableRow ( ) ;
} , mgr . filteredEntries . length ) ;
} ;
2015-09-04 14:37:01 +02:00
if ( entriesRequired ) {
2015-09-21 22:16:19 +02:00
repoindex . client . requestBasicPackagesInfo ( packageSelection , updateTableRows ) ;
2015-08-10 22:46:01 +02:00
}
}
} ;
this . infoBox = document . getElementById ( "packages_info" ) ;
2016-02-10 21:09:20 +01:00
this . showPackageInfo = function ( repo , name , newTab ) {
2015-08-10 22:46:01 +02:00
var determineEntry = function ( ) {
var res = repoindex . pageManager . packageManager . entries . filter ( function ( entry ) {
return entry . info . repo === repo && entry . info . name === name ;
} ) ;
if ( res . length > 0 ) {
2016-02-10 21:09:20 +01:00
repoindex . pageManager . packageManager . showPackageInfoForIndex ( res [ 0 ] . index , newTab ) ;
2015-08-10 22:46:01 +02:00
} else {
repoindex . pageManager . packageManager . showPackageNotFound ( repo , name ) ;
}
} ;
// 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 . showPackageInfoForIndex = function ( entryIndex , newTab ) {
2015-08-10 22:46:01 +02:00
// check whether specified entry index is valid
var entry = this . entryByIndex ( entryIndex ) ;
if ( entry ) {
2016-01-03 00:22:48 +01:00
// show properties
2015-08-10 22:46:01 +02:00
var setProperties = function ( ) {
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 . createPackageInfoPane ( entry , newTab ) ;
2016-01-03 00:22:48 +01:00
infoContainer . wipeChildren ( ) ;
var infoTable = repoindex . makeInfoTable ( ) ;
var tb = infoTable . tbodyElement ;
2015-08-10 22:46:01 +02:00
// -> basic package info
2015-09-21 22:16:19 +02:00
var basics = entry . info . basics ? entry . info . basics : { } ;
2015-10-28 22:43:59 +01:00
repoindex . addPackageNames ( tb , "Name" , [ entry . name ] ) ;
2015-11-15 18:46:42 +01:00
switch ( entry . info . repo ) {
case "AUR" :
repoindex . setLink ( repoindex . addField ( tb , "Repository" ) , "AUR" , "https://aur.archlinux.org/packages/" + encodeURIComponent ( entry . name ) , window . open , "open AUR page" ) ;
break ;
case "core" :
case "extra" :
case "multilib" :
case "community" :
if ( basics . arch ) {
repoindex . setLink ( repoindex . addField ( tb , "Repository" ) , entry . info . repo , "https://www.archlinux.org/packages/" + entry . info . repo + "/" + basics . arch + "/" + encodeURIComponent ( entry . name ) , window . open , "open Arch Linux page" ) ;
break ;
}
default :
repoindex . addField ( tb , "Repository" , repoindex . makeStr ( entry . info . repo ) ) ;
}
2015-10-28 22:43:59 +01:00
repoindex . addField ( tb , "Version" , repoindex . makeStr ( basics . ver ) ) ;
repoindex . addField ( tb , "Description" , repoindex . makeStr ( basics . desc ) ) ;
if ( basics . arch ) {
repoindex . addField ( tb , "Architecture" , repoindex . makeStr ( basics . arch ) ) ;
} else if ( basics . archs ) {
repoindex . addField ( tb , "Architectures" , repoindex . makeArray ( basics . archs ) ) ;
}
2015-08-10 22:46:01 +02:00
// -> full package info
2015-09-21 22:16:19 +02:00
var details = entry . info . details ? entry . info . details : { } ;
if ( details . url ) {
2015-10-28 22:43:59 +01:00
repoindex . setLink ( repoindex . addField ( tb , "Upstream URL" ) , details . url , details . url , window . open ) ;
2015-08-10 22:46:01 +02:00
} else {
2015-10-28 22:43:59 +01:00
repoindex . addField ( tb , "Upstream URL" , "unknown" ) ;
}
repoindex . addField ( tb , "Licenses" , repoindex . makeArray ( details . lic ) ) ;
repoindex . addPackageNames ( tb , "Groups" , repoindex . pack ( details . grp ) , repoindex . Pages . Groups ) ;
repoindex . addPackageNames ( tb , "Provides" , repoindex . pkgNamesFromDeps ( details . prov ) ) ;
2016-02-18 17:11:37 +01:00
repoindex . addPackageNames ( tb , "Dependencies" , repoindex . pkgNamesFromDeps ( details . deps ) ) ;
2015-10-28 22:43:59 +01:00
repoindex . addPackageNames ( tb , "Optional deps" , repoindex . pkgNamesFromDeps ( details . optd ) ) ;
2016-02-18 17:11:37 +01:00
if ( details . mkd && details . mkd . length ) {
repoindex . addPackageNames ( tb , "Make deps" , repoindex . pkgNamesFromDeps ( details . mkd ) ) ;
}
if ( details . chkd && details . chkd . length ) {
repoindex . addPackageNames ( tb , "Check deps" , repoindex . pkgNamesFromDeps ( details . chkd ) ) ;
}
2016-02-25 22:53:33 +01:00
if ( details . requ || details . optf ) {
repoindex . addPackageNames ( tb , "Required by" , details . requ ) ;
repoindex . addPackageNames ( tb , "Optional for" , details . optf ) ;
}
2015-10-28 22:43:59 +01:00
repoindex . addPackageNames ( tb , "Conflicts with" , repoindex . pkgNamesFromDeps ( details . conf ) ) ;
repoindex . addPackageNames ( tb , "Replaces" , repoindex . pkgNamesFromDeps ( details . repl ) ) ;
2016-02-25 22:53:33 +01:00
if ( details . bav ) {
2016-02-15 18:26:05 +01:00
if ( entry . info . repo !== "local" ) { // local repo does no provide package size
repoindex . addField ( tb , "Package size" , repoindex . makeDataSize ( details . csize ) ) ;
}
2015-10-28 22:43:59 +01:00
repoindex . addField ( tb , "Install size" , repoindex . makeDataSize ( details . isize ) ) ;
repoindex . addField ( tb , "Packager" , details . pack ) ;
repoindex . addField ( tb , "Build date" , repoindex . makeStr ( basics . bdate ) ) ;
if ( entry . info . repo === "local" ) {
repoindex . addField ( tb , "Install date" , repoindex . makeStr ( details . idate ) ) ;
repoindex . addField ( tb , "Install reason" , details . expl ? "explicitly installed" : "installed as dependency" ) ;
}
repoindex . addField ( tb , "Install script" , repoindex . makeBool ( details . scri ) ) ;
2016-02-25 22:53:33 +01:00
repoindex . addField ( tb , "Validation methods" , repoindex . makeArray ( details . sig , ", " ) ) ;
2015-10-28 22:43:59 +01:00
repoindex . setTree ( repoindex . addField ( tb , "Package files" ) , repoindex . makeTree ( details . files ) ) ;
}
2016-02-25 22:53:33 +01:00
if ( details . sav ) {
if ( details . main ) {
repoindex . addField ( tb , "Maintainer" , repoindex . makeStr ( details . main ) ) ;
}
if ( basics . flagdate ) {
repoindex . addField ( tb , "Out-of-date" , repoindex . makeStr ( basics . flagdate ) ) ;
}
if ( details . fsub ) {
repoindex . addField ( tb , "First submitted" , repoindex . makeStr ( details . fsub ) ) ;
}
if ( details . lmod ) {
repoindex . addField ( tb , "Last modified" , repoindex . makeStr ( details . lmod ) ) ;
}
if ( details . votes ) {
repoindex . addField ( tb , "Votes" , repoindex . makeStr ( details . votes ) ) ;
}
}
2015-10-28 22:43:59 +01:00
// -> update download buttons
2016-02-25 22:53:33 +01:00
if ( details . bav || details . sav ) {
2015-10-28 22:43:59 +01:00
var downloadElement = repoindex . addField ( tb , "Download" ) ;
var spanElement ;
2016-02-25 22:53:33 +01:00
if ( details . bav ) {
2015-10-28 22:43:59 +01:00
spanElement = document . createElement ( "span" ) ;
var downloadPkgParams = { repo : entry . info . repo , pkg : entry . name , down : "pkg" } ;
repoindex . setDownloadButton ( spanElement , "package" , repoindex . makeHash ( repoindex . Pages . Packages , downloadPkgParams , true ) , function ( ) {
repoindex . pageManager . denoteHash ( repoindex . Pages . Packages , downloadPkgParams ) ;
repoindex . pageManager . packageManager . showMirrorsForIndex ( entryIndex ) ;
} ) ;
downloadElement . appendChild ( spanElement ) ;
}
2016-02-25 22:53:33 +01:00
if ( details . srctar && typeof details . srctar === "string" ) {
2015-10-28 22:43:59 +01:00
spanElement = document . createElement ( "span" ) ;
var downloadSrcParams = { repo : entry . info . repo , pkg : entry . name , down : "src" } ;
2016-02-25 22:53:33 +01:00
repoindex . setDownloadButton ( spanElement , "source" , repoindex . makeHash ( repoindex . Pages . Packages , downloadSrcParams , true ) , function ( ) {
repoindex . pageManager . denoteHash ( repoindex . Pages . Packages , downloadSrcParams ) ;
window . open ( "https://aur.archlinux.org" + details . srctar ) ;
} ) ;
2015-10-28 22:43:59 +01:00
downloadElement . appendChild ( spanElement ) ;
}
2015-08-10 22:46:01 +02:00
}
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
} ;
setProperties ( ) ;
2015-09-21 22:16:19 +02:00
if ( ! entry . info . basics || ! entry . info . details ) {
2015-08-10 22:46:01 +02:00
// don't have the full package info yet -> request full package info
2015-09-04 14:37:01 +02:00
var packageSelection = { } ;
2015-09-21 22:16:19 +02:00
packageSelection [ entry . info . repo ] = [ { index : entryIndex , name : entry . name } ] ;
repoindex . client . requestFullPackagesInfo ( packageSelection , setProperties ) ;
2015-08-10 22:46:01 +02:00
}
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 = entry . info ;
2015-08-10 22:46:01 +02:00
// ensures, that the "Package Info" box (with the properties just set) is shown
repoindex . pageManager . showPackageInfo ( true ) ;
}
} ;
this . showMirrors = function ( repo , name ) {
var determineEntry = function ( ) {
var res = repoindex . pageManager . packageManager . entries . filter ( function ( entry ) {
2015-09-21 22:16:19 +02:00
return entry . info . repo === repo && entry . name === name ;
2015-08-10 22:46:01 +02:00
} ) ;
// entry exists?
if ( res . length > 0 ) {
// yes -> full package info available?
2015-09-21 22:16:19 +02:00
var entry = res [ 0 ] ;
2015-08-10 22:46:01 +02:00
var showEntry = function ( ) {
2015-09-21 22:16:19 +02:00
repoindex . pageManager . packageManager . showMirrorsForIndex ( entry . index ) ;
2015-08-10 22:46:01 +02:00
} ;
2015-09-21 22:16:19 +02:00
if ( entry . info . details ) {
2015-08-10 22:46:01 +02:00
// yes -> show entry instantly
showEntry ( ) ;
} else {
// no -> request full info, use callback to show entry when info becomes available
2015-09-04 14:37:01 +02:00
var packageSelection = { } ;
2015-09-21 22:16:19 +02:00
packageSelection [ entry . info . repo ] = [ { index : entry . index , name : entry . name } ] ;
2015-09-12 20:37:04 +02:00
repoindex . client . requestFullPackagesInfo ( packageSelection , showEntry ) ;
2015-08-10 22:46:01 +02:00
}
} else {
// no -> show error
repoindex . pageManager . packageManager . showPackageNotFound ( repo , name ) ;
}
} ;
// 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
}
} ;
this . showMirrorsForIndex = function ( entryIndex ) {
2015-08-19 02:13:28 +02:00
var entry = this . entryByIndex ( entryIndex ) ;
if ( entry ) {
var info = entry . info ;
2015-09-21 22:16:19 +02:00
repoindex . setText ( "title_mirror_selection" , "Mirrors for package <i>" + repoindex . escapeHtml ( entry . name ) + "</i>" , true ) ;
2015-08-10 22:46:01 +02:00
var listMirrorSelection = document . getElementById ( "list_mirror_selection" ) ;
listMirrorSelection . wipeChildren ( ) ;
var repoEntries = repoindex . pageManager . repoManager . entries . filter ( function ( entry ) {
2015-09-21 22:16:19 +02:00
return entry . name === info . repo ;
2015-08-10 22:46:01 +02:00
} ) ;
var mirrorsAvailable = 0 ;
if ( repoEntries . length > 0 ) {
var mirrors = repoEntries [ 0 ] . info . servers ;
2015-09-06 15:34:39 +02:00
if ( Array . isArray ( mirrors ) && mirrors . length > 0 ) {
2015-08-10 22:46:01 +02:00
for ( var i = 0 ; i < mirrors . length ; ++ i ) {
var liElement = document . createElement ( "li" ) ;
var aElement = document . createElement ( "a" ) ;
2015-09-21 22:16:19 +02:00
var url = mirrors [ i ] + "/" + info . details . file ;
2015-08-10 22:46:01 +02:00
aElement . appendChild ( document . createTextNode ( url ) ) ;
aElement . href = url ;
aElement . onclick = function ( ) {
window . open ( this . href ) ;
return false ;
} ;
liElement . appendChild ( aElement ) ;
listMirrorSelection . appendChild ( liElement ) ;
}
mirrorsAvailable = 1 ;
}
}
2015-08-19 02:13:28 +02:00
}
if ( mirrorsAvailable !== 1 ) {
// no mirrors available?
if ( info . repo === "local" || info . repo === "LOCAL" ) {
// no surprise because its an package from the local database
mirrorsAvailable = - 1 ;
} else if ( info . repo === "aur" || info . repo === "AUR" ) {
// no surprise because its an AUR package
mirrorsAvailable = - 2 ;
2015-08-10 22:46:01 +02:00
}
}
2015-08-19 02:13:28 +02:00
if ( mirrorsAvailable === 1 ) {
repoindex . setText ( "status_mirror_selection" , "Select a mirror:" ) ;
} else if ( mirrorsAvailable === - 1 ) {
repoindex . setText ( "status_mirror_selection" , "The package belongs to the <i>local</i> database. Hence there are no mirrors available." , true ) ;
} else if ( mirrorsAvailable === - 2 ) {
repoindex . setText ( "status_mirror_selection" , "The package is from the <i>Arch Linux User Repository</i>. Hence there are no mirrors available." , true ) ;
} else {
repoindex . setText ( "status_mirror_selection" , "No mirrors available." ) ;
}
$ ( "#dlg_mirror_selection" ) . modal ( "show" ) ;
2015-08-10 22:46:01 +02:00
} ;
this . showPackageNotFound = function ( repo , name ) {
repoindex . pageManager . msgboxCritical (
"Package not found" ,
"The package <i>" + repoindex . escapeHtml ( name ) + "</i> can not be found in the repository <i>" + repoindex . escapeHtml ( repo ) + "</i>." ,
true ) ;
} ;
}
return repoindex ;
} ) ( repoindex || { } ) ;