var repoindex = (function(repoindex) { var RepoEntry = {}; RepoEntry.prototype = new repoindex.Entry(); RepoEntry.prototype.constructor = RepoEntry; RepoEntry = function(repoName, repoInfo, enabled) { if(enabled === undefined) { // per default enable all repos with a fix number of packages except the local database enabled = repoInfo.packageCount && repoName !== "local"; } repoindex.Entry.prototype.constructor.call(this, repoName, repoInfo, enabled); this.info.currentServer = 0; this.rowElement.onclick = function(e) { repoindex.pageManager.repoManager.showRepoInfoForIndex(this.entry.index, typeof e === "object" && e.button === 1); }; this.initTableRow = function() { this.rowElement.addCell(this.name); 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) { repoindex.pageManager.repoManager.updateEnabledAll(false); } this.repo.toggleEnabled(); return false; }; this.link.appendChild(document.createTextNode(repoName)); this.link.title = repoInfo.desc; // use Bootstrap tooltip this.link.setAttribute("data-placement", "bottom"); $(this.link).tooltip(); if(repoInfo.packageCount) { // create badge with package count var span = document.createElement("span"); span.className = "badge"; span.appendChild(document.createTextNode(repoInfo.packageCount)); this.link.appendChild(document.createTextNode(" ")); this.link.appendChild(span); } this.link.add = function() { repoindex.pageManager.repoManager.buttonContainer.appendChild(this); }; this.link.remove = function() { this.parentNode.removeChild(this); }; }; this.createLink(); this.link.add(); // provide a function to toggle enabled/disabled this.updateEnabled = function(enabled, noNotify) { if(this.enabled !== enabled) { this.link.className = (this.enabled = enabled) ? "btn btn-primary" : "btn btn-default"; if(!noNotify) { this.statusChanged(this); } } }; this.toggleEnabled = function() { this.updateEnabled(!this.enabled); }; }; 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) { repoFilter.push(repoEntries[i].name); } } pageMgr.packageManager.filterRepos = pageMgr.groupManager.filterRepos = repoFilter; pageMgr.packageManager.invalidate(); pageMgr.groupManager.invalidate(); }; // provide a function to add repo entries this.addEntry = function(repoName, repoInfo) { var entry = new RepoEntry(repoName, repoInfo); entry.statusChanged = this.applyRepoStatusChange; entry.pageManager = this; entry.repoEntryManager = this; entry.index = this.entries.length; this.entries.push(entry); return entry; }; this.baseRemoveEntries = this.removeEntries; this.removeEntries = function() { for(var i = 0; i < this.entries.length; ++i) { this.entries[i].link.remove(); } this.baseRemoveEntries(); }; this.updateEnabledAll = function(enabled, noNotify) { for(var i = 0; i < this.entries.length; ++i) { this.entries[i].updateEnabled(enabled, true); } if(!noNotify) { this.applyRepoStatusChange(); } }; // 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]; entry.add(mgr.entryContainer); // adds entry to the entry container }, mgr.filteredEntries.length); } }; this.infoBox = document.getElementById("repos_info"); this.showRepoInfo = function(repo, newTab) { var determineEntry = function() { var res = repoindex.pageManager.repoManager.entries.filter(function(entry) { return entry.name === repo; }); // entry exists? if(res.length > 0) { // yes -> full package info available? repoindex.pageManager.repoManager.showRepoInfoForIndex(res[0].index, newTab); } else { // no -> show error repoindex.pageManager.repoManager.showRepoNotFound(repo); } }; // basic repo info available? if(repoindex.client.hasBasicRepoInfo) { // yes -> can determine entry instantly determineEntry(); } else { // no -> request info, use callback to determine entry when info becomes available repoindex.client.requestBasicRepoInfo(determineEntry); } }; this.showRepoInfoForIndex = function(entryIndex, newTab) { var entry = this.entryByIndex(entryIndex); if(entry) { // -> find info container and make info table var infoContainer = repoindex.pageManager.createRepoInfoPane(entry, newTab); infoContainer.wipeChildren(); var infoTable = repoindex.makeInfoTable(); var tb = infoTable.tbodyElement; var info = entry.info; 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, ", ")); var invokeUpgradeLookupParams = {repo: entry.name, invoke: "upgradelookup"}; repoindex.setDownloadButton(repoindex.addField(tb, "Upgrades"), "check for upgrades", repoindex.makeHash(repoindex.Pages.Repositories, invokeUpgradeLookupParams, true), function() { repoindex.pageManager.repoManager.showAvailableUpgrades(entry.name); repoindex.pageManager.denoteHash(repoindex.Pages.Repositories, invokeUpgradeLookupParams); }, "refresh"); // set currentInfo (the pageManager needs this value to upgrade the hash) this.currentInfo = info; // ensures, that the "Package Info" box (with the properties just set) is shown repoindex.pageManager.showRepoInfo(); infoContainer.appendChild(infoTable.tableElement); } }; this.showRepoNotFound = function(repo) { repoindex.pageManager.msgboxCritical( "Repository not found", "The repository " + repoindex.escapeHtml(repo) + " can not be found.", true); }; this.showAvailableUpgrades = function(repo) { var requestUpgrades = function() { var showUpgrades = function(availableUpgrades) { // check for errors if(Array.isArray(availableUpgrades.errors)) { for(var i = 0; i < availableUpgrades.errors.length; ++i) { repoindex.pageManager.addError("Error: " + availableUpgrades.errors[i]); } } else { // create package entries for the upgrades var upgradeEntries = []; var upgrades = [ { name: "software upgrade", namePlural: "software upgrades", style: "background-color: " + repoindex.softwareUpgradeBackgroundColor, color: repoindex.softwareUpgradeBackgroundColor, entries: Array.isArray(availableUpgrades.softwareUpgrades) ? availableUpgrades.softwareUpgrades : [], count: Array.isArray(availableUpgrades.softwareUpgrades) ? availableUpgrades.softwareUpgrades.length : 0 }, { name: "package-only upgrade", namePlural: "package-only upgrades", style: "background-color: " + repoindex.packageUpgradeBackgroundColor, color: repoindex.packageUpgradeBackgroundColor, entries: Array.isArray(availableUpgrades.packageOnlyUpgrades) ? availableUpgrades.packageOnlyUpgrades : [], count: Array.isArray(availableUpgrades.packageOnlyUpgrades) ? availableUpgrades.packageOnlyUpgrades.length : 0 }, { name: "downgrade", namePlural: "downgrades", style: "background-color: " + repoindex.downgradesBackgroundColor, color: repoindex.downgradesBackgroundColor, entries: Array.isArray(availableUpgrades.downgrades) ? availableUpgrades.downgrades : [], count: Array.isArray(availableUpgrades.downgrades) ? availableUpgrades.downgrades.length : 0 }, { name: "orphaned package", namePlural: "orphaned packages", style: "background-color: " + repoindex.orphanedPackageBackgroundColor, color: repoindex.orphanedPackageBackgroundColor, entries: Array.isArray(availableUpgrades.orphanedPackages) ? availableUpgrades.orphanedPackages : [], count: Array.isArray(availableUpgrades.orphanedPackages) ? availableUpgrades.orphanedPackages.length : 0 } ]; var pkgMgr = repoindex.pageManager.packageManager; var repoMgr = repoindex.pageManager.repoManager; 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 var upgradeEntry = upgrades[i1].entries[i2]; if(upgradeEntry.pkg) { var packageInfo = repoindex.client.getPackageInfo(upgradeEntry.repo, upgradeEntry.name); packageInfo.basics = upgradeEntry.pkg; // find associated repo entry var repoEntry; if((repoEntry = repoMgr.entryByName(packageInfo.repo))) { repoEntry.updateEnabled(true); // ensure repo is enabled } var newEntry = pkgMgr.createCustomEntry(repoEntry, upgradeEntry.name, packageInfo, upgrades[i1].color); newEntry.curVer = upgradeEntry.curVer; newEntry.index = upgradeEntries.length; newEntry.updateTableRow(); } else { repoindex.pageManager.addError("Upgrade entry replied by server does not include package info."); } upgradeEntries.push(newEntry); } } // show warnings if(Array.isArray(availableUpgrades.warnings)) { for(var i = 0; i < availableUpgrades.warnings.length; ++i) { repoindex.pageManager.addError("Warning: " + availableUpgrades.warnings[i]); } } // show upgrades via package manager pkgMgr.filterName = undefined; pkgMgr.customSelection = upgradeEntries; pkgMgr.customSelectionName = "upgrade"; pkgMgr.customSelectionNamePlural = "upgrades"; var quandityInfo = repoindex.makeQuandityInfo(upgrades); if(quandityInfo) { pkgMgr.customSelectionInfoText = "Upgrades for the repository " + repoindex.escapeHtml(repo) + ": " + quandityInfo + repoindex.removeFilterButtonHtml; } pkgMgr.filterDescr = "for the repository" pkgMgr.invalidate(); repoindex.pageManager.setPage(repoindex.Pages.Packages); } }; repoindex.client.checkForUpgrades(repo, null, showUpgrades); }; // basic repo info available? if(repoindex.client.hasBasicRepoInfo) { // yes -> request upgrades instantly requestUpgrades(); } else { // no -> request info, use callback to go on requesting upgrades when repo info becomes available repoindex.client.requestBasicRepoInfo(requestUpgrades); } }; }; return repoindex; })(repoindex || {});