bug[TW19304]: Fix issues found in CR pre-demo for demo

Change-Id: Ifff7358aacd649b81c0b61d328389e5a4793d944
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/AtsUtil.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/AtsUtil.java
index b6900b7..d11b06c 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/AtsUtil.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/util/AtsUtil.java
@@ -63,7 +63,7 @@
    }
 
    public static String getActionUrl(String atsIdOrid, AtsApi atsApi) {
-      return getActionUrl(atsIdOrid, ATS_DEFAULT_ACTION_URL, atsApi);
+      return getActionUrl(atsIdOrid, "", atsApi);
    }
 
    public static String getActionUrl(String atsIdOrid, String defaultUrl, AtsApi atsApi) {
@@ -73,7 +73,11 @@
    }
 
    public static String getBaseActionUiUrl(String defaultUrl, AtsApi atsApi) {
-      return atsApi.getConfigValue(AtsUtil.ATS_CONFIG_ACTION_URL_KEY, defaultUrl);
+      String configUrl = atsApi.getConfigValue(AtsUtil.ATS_CONFIG_ACTION_URL_KEY, defaultUrl);
+      if (Strings.isInValid(configUrl)) {
+         configUrl = System.getProperty("osee.application.server") + ATS_DEFAULT_ACTION_URL;
+      }
+      return configUrl;
    }
 
    public static String resolveAjaxToBaseApplicationServer(String html, AtsApi atsApi) {
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
index 908531a..e04c716 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
@@ -34,7 +34,8 @@
       atsValidators.add(new AtsXComboValidator());
       atsValidators.add(new AtsXComboBooleanValidator());
       atsValidators.add(new AtsXListValidator());
-      atsValidators.add(new AtsXSignAndDateValidator());
+      atsValidators.add(new AtsXWidgetAttrValidator());
+      atsValidators.add(new AtsXPointsAttrValidator());
    }
 
    @Override
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXPointsAttrValidator.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXPointsAttrValidator.java
new file mode 100644
index 0000000..62ddfa7
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXPointsAttrValidator.java
@@ -0,0 +1,50 @@
+/*********************************************************************
+ * Copyright (c) 2021 Boeing
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ **********************************************************************/
+
+package org.eclipse.osee.ats.core.validator;
+
+import java.util.Arrays;
+import org.eclipse.osee.ats.api.AtsApi;
+import org.eclipse.osee.ats.api.IAtsWorkItem;
+import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
+import org.eclipse.osee.ats.api.util.IValueProvider;
+import org.eclipse.osee.ats.api.workdef.IAtsStateDefinition;
+import org.eclipse.osee.ats.api.workdef.IAtsWidgetDefinition;
+import org.eclipse.osee.ats.api.workdef.WidgetResult;
+import org.eclipse.osee.ats.api.workdef.WidgetStatus;
+import org.eclipse.osee.framework.core.data.AttributeTypeToken;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsXPointsAttrValidator extends AtsXWidgetValidator {
+
+   @Override
+   public WidgetResult validateTransition(IAtsWorkItem workItem, IValueProvider provider, IAtsWidgetDefinition widgetDef, IAtsStateDefinition fromStateDef, IAtsStateDefinition toStateDef, AtsApi atsApi) {
+      WidgetResult result = WidgetResult.Success;
+      if ("XEstimatedPointsWidget".equals(widgetDef.getXWidgetName())) {
+         boolean found = false;
+         for (AttributeTypeToken attrType : Arrays.asList(AtsAttributeTypes.Points, AtsAttributeTypes.PointsNumeric)) {
+            if (atsApi.getAttributeResolver().getAttributeCount(workItem, attrType) > 0) {
+               found = true;
+               break;
+            }
+         }
+         if (!found) {
+            result = new WidgetResult(WidgetStatus.Invalid_Incompleted, "[%s] is required for transition to [%s]",
+               widgetDef.getName(), toStateDef.getName());
+         }
+      }
+      return result;
+   }
+}
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXSignAndDateValidator.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXWidgetAttrValidator.java
similarity index 80%
rename from plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXSignAndDateValidator.java
rename to plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXWidgetAttrValidator.java
index 80e6354..eacbe24 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXSignAndDateValidator.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXWidgetAttrValidator.java
@@ -23,28 +23,23 @@
 import org.eclipse.osee.ats.api.workdef.IAtsWidgetDefinition;
 import org.eclipse.osee.ats.api.workdef.WidgetResult;
 import org.eclipse.osee.ats.api.workdef.WidgetStatus;
-import org.eclipse.osee.ats.core.internal.AtsApiService;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
 
 /**
+ * Add any xwidgets that need attr type(s) to be valid
+ *
  * @author Donald G. Dunne
  */
-public class AtsXSignAndDateValidator extends AtsXWidgetValidator {
+public class AtsXWidgetAttrValidator extends AtsXWidgetValidator {
 
-   AtsApi atsApi;
-
-   private final List<SignAndDateWidget> widgets = Arrays.asList( //
-      new SignAndDateWidget("XTleReviewedWidget", AtsAttributeTypes.TleReviewedBy, AtsAttributeTypes.TleReviewedDate) //
+   private final List<AttributeWidget> widgets = Arrays.asList( //
+      new AttributeWidget("XTleReviewedWidget", AtsAttributeTypes.TleReviewedBy, AtsAttributeTypes.TleReviewedDate) //
    );
 
-   public AtsXSignAndDateValidator() {
-      atsApi = AtsApiService.get();
-   }
-
    @Override
-   public WidgetResult validateTransition(IAtsWorkItem workItem, IValueProvider provider, IAtsWidgetDefinition widgetDef, IAtsStateDefinition fromStateDef, IAtsStateDefinition toStateDef, AtsApi atsServices) {
+   public WidgetResult validateTransition(IAtsWorkItem workItem, IValueProvider provider, IAtsWidgetDefinition widgetDef, IAtsStateDefinition fromStateDef, IAtsStateDefinition toStateDef, AtsApi atsApi) {
       WidgetResult result = WidgetResult.Success;
-      for (SignAndDateWidget sdWidget : widgets) {
+      for (AttributeWidget sdWidget : widgets) {
          if (sdWidget.getWidgetName().equals(widgetDef.getXWidgetName())) {
             result = validateWidgetIsRequired(provider, widgetDef, fromStateDef, toStateDef);
             if (!result.isSuccess()) {
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/SignAndDateWidget.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AttributeWidget.java
similarity index 91%
rename from plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/SignAndDateWidget.java
rename to plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AttributeWidget.java
index dcda016..8f74c41 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/SignAndDateWidget.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AttributeWidget.java
@@ -19,11 +19,11 @@
 /**
  * @author Donald G. Dunne
  */
-public class SignAndDateWidget {
+public class AttributeWidget {
    private String widgetName;
    private List<AttributeTypeToken> attrTypes = new ArrayList<>();
 
-   public SignAndDateWidget(String widgetName, AttributeTypeToken... attrTypes) {
+   public AttributeWidget(String widgetName, AttributeTypeToken... attrTypes) {
       this.widgetName = widgetName;
       for (AttributeTypeToken type : attrTypes) {
          this.attrTypes.add(type);
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/WorkDefTaskDemoForCrEstimating.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/WorkDefTaskDemoForCrEstimating.java
index ea9992e..afe93c3 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/WorkDefTaskDemoForCrEstimating.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/WorkDefTaskDemoForCrEstimating.java
@@ -59,7 +59,7 @@
             new WidgetDefinition(Description, "XTextDam", FILL_VERTICALLY, AUTO_SAVE), //
             new WidgetDefinition(Assumptions, "XTextDam", FILL_VERTICALLY, AUTO_SAVE), //
             new CompositeLayoutItem(4, //
-               new WidgetDefinition("Estimated Points", "XPointsWidget", AUTO_SAVE), //
+               new WidgetDefinition("Estimated Points", "XEstimatedPointsWidget", REQUIRED_FOR_TRANSITION, AUTO_SAVE), //
                new WidgetDefinition(EstimatedCompletionDate, "XDateDam", AUTO_SAVE) //
             ), //
             new WidgetDefinition("TLE Reviewed Estimate", AtsAttributeTypes.TleReviewedDate, "XTleReviewedWidget",
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/header/WfeTransitionHeader.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/header/WfeTransitionHeader.java
index 2d72a16..70708d1 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/header/WfeTransitionHeader.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/header/WfeTransitionHeader.java
@@ -281,10 +281,12 @@
          @Override
          public void done(IJobChangeEvent event) {
             TransitionResults results = operation.getResults();
-            results.setAtsApi(AtsApiService.get());
-            if (results.isErrors()) {
-               TransitionResultsUi.reportDialog("Transition Failed", results);
-               AtsUtilClient.logExceptions(results);
+            if (results != null) {
+               results.setAtsApi(AtsApiService.get());
+               if (results.isErrors()) {
+                  TransitionResultsUi.reportDialog("Transition Failed", results);
+                  AtsUtilClient.logExceptions(results);
+               }
             }
             editor.getWorkFlowTab().setLoading(false);
             transitionHeader.refresh();
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
index ced00f3..bd10662 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
@@ -216,8 +216,8 @@
          return new XHyperlinkFeatureDam(name);
       } else if (widgetName.equals(XDateWithValidateDam.WIDGET_ID)) {
          return new XDateWithValidateDam(name);
-      } else if (widgetName.equals(XPointsWidget.WIDGET_ID)) {
-         return new XPointsWidget();
+      } else if (widgetName.equals(XEstimatedPointsWidget.WIDGET_ID)) {
+         return new XEstimatedPointsWidget();
       } else if (widgetName.equals(XTleReviewedWidget.WIDGET_ID)) {
          return new XTleReviewedWidget();
       }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XPointsWidget.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XEstimatedPointsWidget.java
similarity index 90%
rename from plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XPointsWidget.java
rename to plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XEstimatedPointsWidget.java
index 9a2ce08..0e282d6 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XPointsWidget.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XEstimatedPointsWidget.java
@@ -28,29 +28,29 @@
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 import org.eclipse.osee.framework.ui.plugin.util.ListSelectionDialog;
 import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactWidget;
-import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelCmdValueSelection;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelValueSelDam;
 import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
 import org.eclipse.osee.framework.ui.swt.Displays;
 
 /**
  * @author Donald G. Dunne
  */
-public class XPointsWidget extends XHyperlinkLabelCmdValueSelection implements ArtifactWidget {
+public class XEstimatedPointsWidget extends XHyperlinkLabelValueSelDam implements ArtifactWidget {
 
-   public static final Object WIDGET_ID = XPointsWidget.class.getSimpleName();
+   public static final Object WIDGET_ID = XEstimatedPointsWidget.class.getSimpleName();
    public float points = 0;
    private final AtsApi atsApi;
    private IAtsWorkItem workItem;
    private AttributeTypeToken pointsAttrType = AttributeTypeToken.SENTINEL;
 
-   public XPointsWidget() {
-      super("Points", true, 50);
+   public XEstimatedPointsWidget() {
+      super("Estimated Points", true, 50);
       atsApi = AtsApiService.get();
    }
 
    @Override
    public String getCurrentValue() {
-      AttributeTypeToken pointsAttrType = getPointsAttrType();
+      AttributeTypeToken pointsAttrType = getAttributeType();
       if (pointsAttrType == null) {
          pointsAttrType = AtsAttributeTypes.PointsNumeric;
       }
@@ -59,7 +59,7 @@
 
    @Override
    public boolean handleSelection() {
-      AttributeTypeToken pointsAttrType = getPointsAttrType();
+      AttributeTypeToken pointsAttrType = getAttributeType();
       if (pointsAttrType == AtsAttributeTypes.PointsNumeric) {
          EntryDialog dialog = new EntryDialog("Enter Points", "Enter Points");
          if (dialog.open() == Window.OK) {
@@ -99,12 +99,13 @@
    @Override
    public boolean handleClear() {
       IAtsChangeSet changes = atsApi.createChangeSet("Remove Points");
-      changes.deleteAttributes(workItem, getPointsAttrType());
+      changes.deleteAttributes(workItem, getAttributeType());
       changes.executeIfNeeded();
       return true;
    }
 
-   public AttributeTypeToken getPointsAttrType() {
+   @Override
+   public AttributeTypeToken getAttributeType() {
       if (pointsAttrType.isInvalid()) {
          IAtsTeamWorkflow teamWf = workItem.getParentTeamWorkflow();
          if (teamWf != null) {
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/cr/CreateNewChangeRequestBlam.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/cr/CreateNewChangeRequestBlam.java
index b78216d..3872e9f 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/cr/CreateNewChangeRequestBlam.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/cr/CreateNewChangeRequestBlam.java
@@ -13,6 +13,7 @@
 package org.eclipse.osee.ats.ide.workflow.cr;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -184,10 +185,12 @@
          descWidget = (XText) xWidget;
       } else if (xWidget.getLabel().equals(CHANGE_TYPE)) {
          changeWidget = (XCombo) xWidget;
+         changeWidget.setDataStrings(Arrays.asList("Improvement", "Problem"));
       } else if (xWidget.getLabel().equals(PRIORITY)) {
          priorityWidget = (XCombo) xWidget;
       } else if (xWidget.getLabel().equals(PROGRAM)) {
          XCombo programCombo = (XCombo) xWidget;
+         programCombo.setToolTip("Selection if multiple Change Request programs exist");
          List<String> aiStrs = new ArrayList<String>();
          for (IAtsActionableItem ai : getProgramCrAis()) {
             aiStrs.add(ai.getName());
@@ -196,6 +199,9 @@
          if (aiStrs.size() == 1) {
             programCombo.getComboBox().select(1);
          }
+         if (aiStrs.size() == 1) {
+            programCombo.setEditable(false);
+         }
          programCombo.getLabelWidget().addMouseListener(new MouseAdapter() {
 
             @Override
@@ -242,6 +248,11 @@
    }
 
    @Override
+   public String getTitle() {
+      return getName();
+   }
+
+   @Override
    public boolean showInBlamSection() {
       return false;
    }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstFactory.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstFactory.java
index 1ce00e6..4bf62fe 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstFactory.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstFactory.java
@@ -35,8 +35,10 @@
    public static XViewerColumn Assignee_Col =
       new XViewerColumn("ats.taskest.assignee", "Assignees", 120, XViewerAlign.Left, true, SortDataType.String, false,
          "Assignee(s) of Estimating task.  Double-click to open task.");
-   public static XViewerColumn Estimated_Points_Col = new XViewerColumn("ats.taskest.est.points", "Est Points", 40,
+   public static XViewerColumn Estimated_Points_Col = new XViewerColumn("ats.taskest.est.points", "Est Points", 70,
       XViewerAlign.Left, true, SortDataType.Float, false, "Double-click to open task.");
+   public static XViewerColumn Tle_Reviewed_Col = new XViewerColumn("ats.taskest.tle.reviewed", "TLE Reviewed", 50,
+      XViewerAlign.Left, true, SortDataType.Boolean, false, "Double-click to open task.");
    public static XViewerColumn Estimated_Completion_Date_Col = new XViewerColumn("ats.taskest.est.completion.date",
       "Est Completion Date", 60, XViewerAlign.Left, true, SortDataType.Date, false, null);
    public static XViewerColumn Description_Col = new XViewerColumn("ats.taskest.description", "Description", 120,
@@ -50,7 +52,7 @@
 
    public TaskEstFactory(IOseeTreeReportProvider reportProvider) {
       super(NAMESPACE, reportProvider);
-      registerColumns(Check_Col, Name_Col, Status_Col, Assignee_Col, Estimated_Points_Col,
+      registerColumns(Check_Col, Name_Col, Status_Col, Assignee_Col, Estimated_Points_Col, Tle_Reviewed_Col,
          Estimated_Completion_Date_Col, Description_Col, Assumptions_Col, Notes_Col, Attachments_Col);
    }
 
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstLabelProvider.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstLabelProvider.java
index cc4d8a3..622d710 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstLabelProvider.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/task/widgets/estimates/TaskEstLabelProvider.java
@@ -49,24 +49,27 @@
 
    @Override
    public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
-      TaskEstDefinition taskDef = (TaskEstDefinition) element;
+      TaskEstDefinition ted = (TaskEstDefinition) element;
       if (xCol.equals(TaskEstFactory.Check_Col)) {
-         if (taskDef.isManual()) {
+         if (ted.isManual()) {
             return ImageManager.getImage(AtsImage.TASK);
          }
-         if (taskDef.hasTask()) {
+         if (ted.hasTask()) {
             return null;
          }
-         if (taskDef.isChecked()) {
+         if (ted.isChecked()) {
             return ImageManager.getImage(FrameworkImage.CHECKBOX_CHECK_TRUE);
          } else {
             return ImageManager.getImage(FrameworkImage.CHECKBOX_CHECK_UNSET);
          }
-      }
-      if (xCol.equals(TaskEstFactory.Assignee_Col)) {
-         if (taskDef.hasTask()) {
-            return AssigneeColumnUI.instance.getColumnImage(taskDef.getTask(), xCol, columnIndex);
+      } else if (xCol.equals(TaskEstFactory.Assignee_Col)) {
+         if (ted.hasTask()) {
+            return AssigneeColumnUI.instance.getColumnImage(ted.getTask(), xCol, columnIndex);
          }
+      } else if (atsApi.getAttributeResolver().getAttributeCount(ted.getTask(),
+         AtsAttributeTypes.TleReviewedDate) == 1) {
+         return ImageManager.getImage(FrameworkImage.CHECKBOX_CHECK_TRUE);
+
       }
       return null;
    }
@@ -118,6 +121,14 @@
                xTaskEstViewer.getPointsAttrType(), ""));
          }
          return "";
+      } else if (xCol.equals(TaskEstFactory.Tle_Reviewed_Col)) {
+         if (ted.hasTask()) {
+            if (atsApi.getAttributeResolver().getAttributeCount(ted.getTask(),
+               AtsAttributeTypes.TleReviewedDate) == 1) {
+               return "Reviewed";
+            }
+         }
+         return "";
       } else if (xCol.equals(TaskEstFactory.Attachments_Col)) {
          if (ted.hasTask()) {
             int count = atsApi.getRelationResolver().getRelated(ted.getTask(),
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelCmdValueSelection.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelCmdValueSelection.java
index cc227c0..1e17b27 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelCmdValueSelection.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelCmdValueSelection.java
@@ -34,8 +34,8 @@
 
    Label valueLabel;
    Hyperlink selectHyperLinkLabel, clearHyperLinkLabel;
-   private final boolean supportClear;
-   private Integer truncateValueLength = null;
+   protected boolean supportClear;
+   protected Integer truncateValueLength = null;
 
    public XHyperlinkLabelCmdValueSelection(String label) {
       this(label, false);
@@ -214,4 +214,5 @@
          clearHyperLinkLabel.setEnabled(true);
       }
    }
+
 }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelDam.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelDam.java
new file mode 100644
index 0000000..817e93b
--- /dev/null
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelDam.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Boeing.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.core.data.AttributeTypeToken;
+import org.eclipse.osee.framework.core.util.Result;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.skynet.internal.Activator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XHyperlinkLabelValueSelDam extends XHyperlinkLabelCmdValueSelection implements AttributeWidget {
+
+   private Artifact artifact;
+   private AttributeTypeToken attributeType;
+
+   public XHyperlinkLabelValueSelDam(String label) {
+      this(label, false);
+   }
+
+   public XHyperlinkLabelValueSelDam(String label, boolean supportClear, Integer truncateValueLength) {
+      super(label);
+      this.supportClear = supportClear;
+      this.truncateValueLength = truncateValueLength;
+   }
+
+   public XHyperlinkLabelValueSelDam(String label, boolean supportClear) {
+      this(label, supportClear, null);
+   }
+
+   @Override
+   public Artifact getArtifact() {
+      return artifact;
+   }
+
+   /**
+    * Hyperlink Selection is save on selection
+    */
+   @Override
+   public void saveToArtifact() {
+      // do nothing
+   }
+
+   /**
+    * Hyperlink Selection is save on selection
+    */
+   @Override
+   public void revert() {
+      // do nothing
+   }
+
+   /**
+    * Hyperlink Selection is save on selection
+    */
+   @Override
+   public Result isDirty() {
+      return Result.FalseResult;
+   }
+
+   @Override
+   public void setAttributeType(Artifact artifact, AttributeTypeToken attributeType) {
+      this.artifact = artifact;
+      this.attributeType = attributeType;
+   }
+
+   @Override
+   public AttributeTypeToken getAttributeType() {
+      return attributeType;
+   }
+
+   @Override
+   public IStatus isValid() {
+      IStatus status = super.isValid();
+      if (status.isOK()) {
+         try {
+            if (getArtifact() != null && getAttributeType() != null) {
+               status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, getArtifact(), getAttributeType(),
+                  getCurrentValue());
+               if (status.isOK() && isRequiredEntry() && Strings.isInValid(getCurrentValue())) {
+                  status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+                     String.format("Must enter [%s]", attributeType.getUnqualifiedName()));
+               }
+            }
+         } catch (OseeCoreException ex) {
+            status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error getting Artifact", ex);
+         }
+      }
+      return status;
+   }
+
+}