private render()

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();
    }