in scripts/widget/Widget.tsx [24:145]
private render(widgetSettings: WidgetContracts.WidgetSettings, suppressAnimation:boolean= false): IPromise<WidgetContracts.WidgetStatus> {
let settings = WidgetSettingsHelper.Parse<ReleaseWidgetSettings>(widgetSettings.customSettings.data);
let context = VSS.getWebContext();
let size = {
width: widgetSettings.size.columnSpan * 160,
height: widgetSettings.size.rowSpan * 160
};
document.getElementById("widgetcontainer").style.fontSize = "xx-small";
if (widgetSettings.size.columnSpan > 1) {
document.getElementById("widgetcontainer").style.fontSize = "x-small";
}
if (widgetSettings.size.rowSpan > 1) {
document.getElementById("widgetcontainer").style.fontSize = "small";
}
//Clear previous values
this.clearAll();
//check to see if on prem
// TO DO: dirty method that should be revised
//if (context.collection.uri.includes(".visualstudio.com") || context.collection.uri.includes("dev.azure.com")) {
if (context.account.name.includes("Team Foundation Server")) {
this.isOnPrem = true;
} else {
this.isOnPrem = false;
}
if (settings.releaseDefinitionName != null) {
document.getElementById("releasedefinitionname").innerHTML = settings.releaseDefinitionName;
}
if (settings.releaseEnvironmentName != null) {
document.getElementById("environmentname").innerHTML = settings.releaseEnvironmentName;
}
// Check to see if we have project id within settings
// if we do not then do not have any data
if (settings.projectName != null && settings.projectName != "") {
getLatestRelease(context, settings.projectName, settings.releaseDefinitionId, settings.releaseEnvironmentId, this.isOnPrem).then(latestDeployment => {
let latestattemptid = "";
let deploymentenvironmentid = "";
let latestreleaseid = "";
if (Array.isArray(latestDeployment) && latestDeployment.length) {
document.getElementById("releasename").innerHTML = latestDeployment[0].release.name;
document.getElementById("deploymentstatus").innerHTML = latestDeployment[0].deploymentStatus;
document.getElementById("buildused").innerHTML = latestDeployment[0].release.artifacts[0].alias;
if (settings.colorShowChecked) {
if (latestDeployment[0].deploymentStatus == "succeeded") {
document.getElementById("widgetcontainer").style.borderColor = "green";
} else if (latestDeployment[0].deploymentStatus == "failed") {
document.getElementById("widgetcontainer").style.borderColor = "coral";
} else if (latestDeployment[0].deploymentStatus == "notDeployed") {
document.getElementById("widgetcontainer").style.borderColor = "yellow";
} else {
document.getElementById("widgetcontainer").style.borderColor = "white";
}
}
// TO DO: select a library and utilize it for date formatting
// TO DO: for tfs 2018 rtm and u1, api does not have completedOn
// so will need to calculate it
document.getElementById("starttime").innerHTML = this.formatDate(latestDeployment[0].startedOn);
if (latestDeployment[0].completedOn != null) {
document.getElementById("endtime").innerHTML = this.formatDate(latestDeployment[0].completedOn);
document.getElementById("timetaken").innerHTML = this.timeDifference(latestDeployment[0].startedOn, latestDeployment[0].completedOn);
} else {
document.getElementById("endtime").innerHTML = this.formatDate(latestDeployment[0].lastModifiedOn);
document.getElementById("timetaken").innerHTML = this.timeDifference(latestDeployment[0].startedOn, latestDeployment[0].lastModifiedOn);
}
latestattemptid = latestDeployment[0].attempt;
deploymentenvironmentid = latestDeployment[0].releaseEnvironment.id;
latestreleaseid = latestDeployment[0].release.id;
}
getLatestReleaseEnvironment(context, settings.projectName, latestreleaseid, deploymentenvironmentid, this.isOnPrem).then(latestDeploymentEnv => {
if (Array.isArray(latestDeploymentEnv) && latestDeploymentEnv.length) {
let containsError = latestDeploymentEnv[0].deploySteps.find(e => e.status == "failed" && e.attempt == latestattemptid);
if (containsError != null) {
let releasePhaseError = containsError.releaseDeployPhases.find(e => e.status == "failed" || e.status == "canceled");
let deploymentJobError = releasePhaseError.deploymentJobs.find(e => e.job.status == "failed" || e.job.status == "canceled");
let taskError = deploymentJobError.tasks.find(e => e.status == "failed");
document.getElementById("errormessage").innerHTML = taskError.issues[0].message;
document.getElementById("errormessage").title = taskError.issues[0].message;
document.getElementById("errorcontainer").style.visibility = "visible";
// Set max height for error message so that url is visible
// (user can click on url to open a new tab to see full message)
// TO DO: dirty method that should be revised
let errormessageheight = size.height - 12 - document.getElementById("errorlabelcontainer").offsetTop;
if (document.getElementById("errorlabelcontainer").offsetHeight > errormessageheight) {
document.getElementById("errorlabelcontainer").style.height = errormessageheight.toString() + "px";
document.getElementById("errorlabelcontainer").style.overflow = "hidden";
}
var url = "";
if (this.isOnPrem) {
// TO DO: differentiate between tfs 2018 versions
// Only TFS 2018U2 and greater can support new log location
url = createLogUrlOnPrem(context.collection.uri, settings.projectName, latestreleaseid, deploymentenvironmentid);
//url = createLogUrlOnPremForTFS2018U1AndBelow(context.collection.uri, settings.projectName, latestreleaseid, settings.releaseDefinitionId);
} else {
url = createLogUrl(context.collection.name, settings.projectName, latestreleaseid, deploymentenvironmentid);
}
(document.getElementById("url") as HTMLAnchorElement).href = url;
}
}
});
});
} else {
// TO DO : show a message to user to configure widget
}
return WidgetHelpers.WidgetStatusHelper.Success();
}