feature[ats_ATS64164]: CPA: Cleanup ActionPage layout

Change-Id: I821832f6868a43ec52208fd35d03b02ed7425a86
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/IAtsServer.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/IAtsServer.java
index a599579..8e7b53c 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/IAtsServer.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/IAtsServer.java
@@ -84,4 +84,6 @@
 
    ArtifactReadable getActionById(String id);
 
+   String getConfigValue(String key);
+
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/action/IWorkItemPage.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/action/IWorkItemPage.java
index 6695720..f4fb2fc 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/action/IWorkItemPage.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/action/IWorkItemPage.java
@@ -18,8 +18,8 @@
  */
 public interface IWorkItemPage {
 
-   String getHtml(ArtifactReadable action, String title, IResourceRegistry registry) throws Exception;
+   String getHtml(ArtifactReadable action, String title, IResourceRegistry registry, boolean details) throws Exception;
 
-   String getHtmlWithTransition(ArtifactReadable action, String title, IResourceRegistry registry) throws Exception;
+   String getHtmlWithTransition(ArtifactReadable action, String title, IResourceRegistry registry, boolean details) throws Exception;
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/AtsServerImpl.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/AtsServerImpl.java
index 4ef1afc..efb7c8d 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/AtsServerImpl.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/AtsServerImpl.java
@@ -12,6 +12,7 @@
 
 import java.util.List;
 import org.eclipse.osee.ats.api.IAtsObject;
+import org.eclipse.osee.ats.api.data.AtsArtifactToken;
 import org.eclipse.osee.ats.api.notify.IAtsNotificationService;
 import org.eclipse.osee.ats.api.review.IAtsReviewService;
 import org.eclipse.osee.ats.api.team.IAtsConfigItemFactory;
@@ -51,6 +52,8 @@
 import org.eclipse.osee.ats.impl.internal.workitem.ConfigItemFactory;
 import org.eclipse.osee.ats.impl.internal.workitem.WorkItemFactory;
 import org.eclipse.osee.ats.impl.internal.workitem.WorkItemPage;
+import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
+import org.eclipse.osee.framework.core.enums.CoreBranches;
 import org.eclipse.osee.framework.database.IOseeDatabaseService;
 import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
 import org.eclipse.osee.framework.jdk.core.type.OseeStateException;
@@ -304,4 +307,22 @@
       return action;
    }
 
+   @Override
+   public String getConfigValue(String key) {
+      String result = null;
+      @SuppressWarnings("unchecked")
+      ArtifactReadable atsConfig =
+         orcsApi.getQueryFactory(null).fromBranch(CoreBranches.COMMON).andIds(AtsArtifactToken.AtsConfig).getResults().getExactlyOne();
+      if (atsConfig != null) {
+         for (Object obj : atsConfig.getAttributeValues(CoreAttributeTypes.GeneralStringData)) {
+            String str = (String) obj;
+            if (str.startsWith(key)) {
+               result = str.replaceFirst(key + "=", "");
+               break;
+            }
+         }
+      }
+      return result;
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/ActionPage.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/ActionPage.java
index fac5bb9..43ff508 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/ActionPage.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/ActionPage.java
@@ -11,10 +11,15 @@
 package org.eclipse.osee.ats.impl.internal.workitem;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import org.eclipse.osee.ats.api.IAtsWorkItem;
+import org.eclipse.osee.ats.api.data.AtsArtifactTypes;
 import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
+import org.eclipse.osee.ats.api.data.AtsRelationTypes;
 import org.eclipse.osee.ats.api.workdef.IAtsCompositeLayoutItem;
 import org.eclipse.osee.ats.api.workdef.IAtsLayoutItem;
 import org.eclipse.osee.ats.api.workdef.IAtsStateDefinition;
@@ -24,10 +29,13 @@
 import org.eclipse.osee.ats.impl.IAtsServer;
 import org.eclipse.osee.ats.impl.resource.AtsResourceTokens;
 import org.eclipse.osee.framework.core.data.IAttributeType;
+import org.eclipse.osee.framework.core.data.IOseeBranch;
 import org.eclipse.osee.framework.jdk.core.type.IResourceRegistry;
 import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
 import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
 import org.eclipse.osee.framework.jdk.core.util.Conditions;
+import org.eclipse.osee.framework.jdk.core.util.DateUtil;
 import org.eclipse.osee.framework.jdk.core.util.Lib;
 import org.eclipse.osee.framework.jdk.core.util.Strings;
 import org.eclipse.osee.logger.Log;
@@ -42,6 +50,13 @@
  */
 public class ActionPage {
 
+   private static final String DEFECT_TABLE_HEADER =
+      "<table border=\"1\" align=\"center\" width=\"98%\"><tr><th>Severity</th><th>Disposition</th><th>Closed</th><th>User</th><th>Created</th><th>Injected</th><th>Description</th><th>Location</th><th>Resolution</th></tr>";
+   private static final String ROLE_TABLE_HEADER =
+      "<table border=\"1\" align=\"center\" width=\"90%\"><tr><th>Role</th><th>User</th><th>Completed</th><th>Hours Spent</th></tr>";
+   private static final String COMMIT_MANAGER_WIDGET_NAME = "Commit Manager";
+   private static final String REVIEW_DEFECT_WIDGET_NAME = "Review Defect";
+   private static final String ROLE_WIDGET_NAME = "Role";
    private String pageTemplate;
    private PageCreator page;
    private IAtsWorkItem workItem;
@@ -51,13 +66,19 @@
    private final IAtsServer atsServer;
    private final Log logger;
    private boolean addTransition = false;
+   private static final List<String> roleKeys = Arrays.asList("role", "userId", "completed", "hoursSpent");
+   private static final List<String> defectKeys = Arrays.asList("severity", "disposition", "closed", "user", "date",
+      "injectionActivity", "description", "location", "resolution");
+   private static List<String> ignoredWidgets;
+   private final boolean details;
 
-   public ActionPage(Log logger, IAtsServer atsServer, IResourceRegistry registry, ArtifactReadable action, String title) {
+   public ActionPage(Log logger, IAtsServer atsServer, IResourceRegistry registry, ArtifactReadable action, String title, boolean details) {
       this.logger = logger;
       this.atsServer = atsServer;
       this.registry = registry;
       this.action = action;
       this.title = title;
+      this.details = details;
    }
 
    private IAtsWorkItem getWorkItem() {
@@ -102,7 +123,7 @@
       }
 
       addStates(page, workItem, action);
-      addDebug(page, workItem, action);
+      addDetails(page, workItem, action);
 
       return page.realizePage(AtsResourceTokens.AtsActionHtml);
    }
@@ -116,15 +137,40 @@
    }
 
    private String getTeamStr(ArtifactReadable action) {
-      String results = action.getSoleAttributeAsString(AtsAttributeTypes.TeamDefinition);
-      results = atsServer.getArtifactByGuid(results).getName();
+      String results = action.getSoleAttributeAsString(AtsAttributeTypes.TeamDefinition, "");
+      if (Strings.isValid(results)) {
+         results = atsServer.getArtifactByGuid(results).getName();
+      } else {
+         ArtifactReadable teamWf = getParentTeamWf(action);
+         if (teamWf != null) {
+            results = getTeamStr(teamWf);
+         }
+      }
       return results;
    }
 
+   private ArtifactReadable getParentTeamWf(ArtifactReadable action2) {
+      ArtifactReadable teamWf = null;
+      if (action.isOfType(AtsArtifactTypes.TeamWorkflow)) {
+         teamWf = action;
+      } else if (action.isOfType(AtsArtifactTypes.ReviewArtifact)) {
+         teamWf = action.getRelated(AtsRelationTypes.TeamWorkflowToReview_Team).getOneOrNull();
+      } else if (action.isOfType(AtsArtifactTypes.Task)) {
+         teamWf = action.getRelated(AtsRelationTypes.TeamWfToTask_TeamWf).getOneOrNull();
+      }
+      return teamWf;
+   }
+
    private String getAIStr(ArtifactReadable action) {
-      String results = action.getSoleAttributeAsString(AtsAttributeTypes.ActionableItem);
-      results = atsServer.getArtifactByGuid(results).getName();
-      return results;
+      StringBuilder sb = new StringBuilder();
+      ArtifactReadable teamWf = getParentTeamWf(action);
+      if (teamWf != null) {
+         for (AttributeReadable<Object> aiGuid : teamWf.getAttributes(AtsAttributeTypes.ActionableItem)) {
+            sb.append(atsServer.getArtifactByGuid(aiGuid.toString()).getName());
+            sb.append(", ");
+         }
+      }
+      return sb.toString().replaceFirst(", $", "");
    }
 
    private String getCreatedByStr(IAtsWorkItem workItem, ArtifactReadable action) {
@@ -199,22 +245,118 @@
       addLayoutItems(sb, workItem, items);
    }
 
+   private boolean inComposite = false;
+
    private void addLayoutItems(StringBuilder sb, IAtsWorkItem workItem, Collection<IAtsLayoutItem> items) {
       for (IAtsLayoutItem layout : items) {
          if (layout instanceof IAtsCompositeLayoutItem) {
+            inComposite = true;
+            sb.append("<tr><td><table width=\"100%\"><tr>");
             addWidgets(sb, workItem, ((IAtsCompositeLayoutItem) layout).getaLayoutItems());
+            sb.append("</tr></table></td></tr>");
+            inComposite = false;
          } else {
-            addWidget(sb, workItem, (IAtsWidgetDefinition) layout);
+            IAtsWidgetDefinition widget = (IAtsWidgetDefinition) layout;
+            if (!getIgnoreWidgetNames().contains(widget.getName())) {
+               if (!inComposite) {
+                  sb.append("<tr><td>");
+               } else {
+                  sb.append("<td>");
+               }
+               addWidget(sb, workItem, widget);
+               if (!inComposite) {
+                  sb.append("</td></tr>");
+               } else {
+                  sb.append("</td>");
+               }
+            }
          }
       }
    }
 
-   private void addWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition layout) {
-      sb.append("<tr><td>");
-      sb.append(layout.getName());
+   private void addWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) {
+      if (widget.getName().equals(ROLE_WIDGET_NAME)) {
+         addRoleWidget(sb, workItem, widget);
+      } else if (widget.getName().equals(REVIEW_DEFECT_WIDGET_NAME)) {
+         addDefectWidget(sb, workItem, widget);
+      } else if (widget.getName().equals(COMMIT_MANAGER_WIDGET_NAME)) {
+         addCommitManager(sb, workItem, widget);
+      } else {
+         addWidgetDefault(sb, workItem, widget);
+      }
+   }
+
+   private void addCommitManager(StringBuilder sb, IAtsWorkItem workItem2, IAtsWidgetDefinition widget) {
+      sb.append("Commit Manager: ");
+      IOseeBranch branch = atsServer.getBranchService().getBranch((IAtsTeamWorkflow) workItem);
+      if (branch != null) {
+         sb.append(branch.getName());
+      }
+   }
+
+   private List<String> getIgnoreWidgetNames() {
+      if (ignoredWidgets == null) {
+         ignoredWidgets = new ArrayList<String>();
+         for (String widgetName : atsServer.getConfigValue("IgnoredWidgetNames").split(";")) {
+            ignoredWidgets.add(widgetName);
+         }
+      }
+      return ignoredWidgets;
+   }
+
+   private void addRoleWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) {
+      sb.append("Roles: ");
+      Collection<String> roles =
+         atsServer.getAttributeResolver().getAttributesToStringList(workItem, AtsAttributeTypes.Role);
+      if (!roles.isEmpty()) {
+         sb.append(ROLE_TABLE_HEADER);
+         for (String xml : roles) {
+            sb.append("<tr>");
+            for (String key : roleKeys) {
+               sb.append("<td>");
+               String data = AXml.getTagData(xml, key);
+               if (key.equals("userId")) {
+                  data = atsServer.getUserService().getUserById(data).getName();
+               }
+               sb.append(data);
+               sb.append("</td>");
+            }
+            sb.append("</tr>");
+         }
+         sb.append("</table>");
+      }
+   }
+
+   private void addDefectWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) {
+      sb.append("Defects: ");
+      Collection<String> defects =
+         atsServer.getAttributeResolver().getAttributesToStringList(workItem, AtsAttributeTypes.ReviewDefect);
+      if (!defects.isEmpty()) {
+         sb.append(DEFECT_TABLE_HEADER);
+         for (String xml : defects) {
+            sb.append("<tr>");
+            for (String key : defectKeys) {
+               sb.append("<td>");
+               String data = AXml.getTagData(xml, key);
+               if (key.equals("user")) {
+                  data = atsServer.getUserService().getUserById(data).getName();
+               } else if (key.equals("date")) {
+                  data = DateUtil.getDateStr(new Date(Long.valueOf(data)), DateUtil.MMDDYYHHMM);
+               }
+               sb.append(data);
+               sb.append("</td>");
+            }
+            sb.append("</tr>");
+         }
+         sb.append("</table>");
+      }
+   }
+
+   private void addWidgetDefault(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) {
+      sb.append(widget.getName());
       sb.append(": <b>");
       try {
-         IAttributeType attributeType = atsServer.getAttributeResolver().getAttributeType(layout.getAtrributeName());
+         IAttributeType attributeType = atsServer.getAttributeResolver().getAttributeType(widget.getAtrributeName());
          Collection<String> attributesToStringList =
             atsServer.getAttributeResolver().getAttributesToStringList(workItem, attributeType);
          if (attributesToStringList.size() > 1) {
@@ -225,7 +367,7 @@
       } catch (OseeCoreException ex) {
          sb.append("exception: " + ex.getLocalizedMessage());
       }
-      sb.append("</b></td></tr>");
+      sb.append("</b>");
    }
 
    private String getStateHtmlTemplate() throws IOException {
@@ -235,17 +377,28 @@
       return pageTemplate;
    }
 
-   private static void addDebug(PageCreator page, IAtsWorkItem workItem, ArtifactReadable artifact) {
+   private void addDetails(PageCreator page, IAtsWorkItem workItem, ArtifactReadable artifact) {
       StringBuilder sb = new StringBuilder();
-      try {
-         for (AttributeReadable<?> attr : artifact.getAttributes()) {
-            sb.append(String.format("%s [%s]\n", attr.getAttributeType(),
-               AHTML.textToHtml(String.valueOf(attr.getValue()))));
+      if (details) {
+         try {
+            addDetail(sb, "Guid", artifact.getGuid());
+            addDetail(sb, "Artifact Type", artifact.getArtifactType().getName());
+            sb.append("</br><b>Attribute Raw Data:</b></br>");
+            for (AttributeReadable<?> attr : artifact.getAttributes()) {
+               addDetail(sb, attr.getAttributeType().getName(), AHTML.textToHtml(String.valueOf(attr.getValue())));
+            }
+         } catch (OseeCoreException ex) {
+            sb.append("exception: " + ex.getLocalizedMessage());
          }
-      } catch (OseeCoreException ex) {
-         sb.append("exception: " + ex.getLocalizedMessage());
       }
-      page.addKeyValuePair("debug", sb.toString());
+      page.addKeyValuePair("details", sb.toString());
+   }
+
+   private static void addDetail(StringBuilder sb, String key, String value) {
+      sb.append(key);
+      sb.append(": <b>");
+      sb.append(value);
+      sb.append("</b></br>");
    }
 
    public boolean isAddTransition() {
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/AtsWorkItemServiceImpl.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/AtsWorkItemServiceImpl.java
index c0d8d62..349cf25 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/AtsWorkItemServiceImpl.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/AtsWorkItemServiceImpl.java
@@ -68,7 +68,7 @@
 
    @Override
    public IAtsTeamWorkflow getParentTeamWorkflow(IAtsWorkItem workItem) throws OseeCoreException {
-      return workItemFactory.getWorkItem(workItem).getParentTeamWorkflow();
+      return workItem.getParentTeamWorkflow();
    }
 
    @Override
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/WorkItemPage.java b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/WorkItemPage.java
index 470c9e9..51b7a3b 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/WorkItemPage.java
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/internal/workitem/WorkItemPage.java
@@ -30,14 +30,14 @@
    }
 
    @Override
-   public String getHtml(ArtifactReadable action, String title, IResourceRegistry registry) throws Exception {
-      ActionPage page = new ActionPage(logger, atsServer, registry, action, title);
+   public String getHtml(ArtifactReadable action, String title, IResourceRegistry registry, boolean details) throws Exception {
+      ActionPage page = new ActionPage(logger, atsServer, registry, action, title, details);
       return page.generate();
    }
 
    @Override
-   public String getHtmlWithTransition(ArtifactReadable action, String title, IResourceRegistry registry) throws Exception {
-      ActionPage page = new ActionPage(logger, atsServer, registry, action, title);
+   public String getHtmlWithTransition(ArtifactReadable action, String title, IResourceRegistry registry, boolean details) throws Exception {
+      ActionPage page = new ActionPage(logger, atsServer, registry, action, title, details);
       page.addTransitionStates();
       return page.generate();
    }
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsAction.html b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsAction.html
index 6b336b1..0c76f6e 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsAction.html
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsAction.html
@@ -12,7 +12,7 @@
 <div class="container">
    <div><h2>ATS - <?atsId?></h2><div>
 	
-<table border="1" cellpadding="3" cellspacing="0" width="100%" class="table table-striped">
+<table border="2" cellpadding="3" cellspacing="0" width="100%" class="table table-striped">
    <tr>
       <td colspan="3">Title: <b><?title?></b></td>
    </tr>
@@ -25,13 +25,12 @@
    
    <tr>
    	<td>Team: <b><?team?></b></td>
-   	<td>Id: <b><?id?></b></td>
+		<td>Targeted Version: <b><?version?></b></td>
    	<td>ATS Id: <b><?atsId?></b></td>
 	</tr>
 	
    <tr>
-		<td>Targeted Version: <b><?version?></b></td>
-		<td colspan="2">Assignees: <b><?assignees?></b></td>
+		<td colspan="3">Assignees: <b><?assignees?></b></td>
 	</tr>
 	
    <tr>
@@ -53,11 +52,12 @@
 <?transition?>
 </div>
 
-<table border="1" cellpadding="3" cellspacing="0" width="100%">
+<table cellpadding="3" cellspacing="0" width="100%">
    <tr><td>
       <?states?>   
    </td></tr>
 </table>
 
+<?details?>
 </body>
 </html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsState.html b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsState.html
index 7ba5a68..e10462a 100644
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsState.html
+++ b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsState.html
@@ -1,6 +1,6 @@
 
-<table border="1" align="center" bgcolor="#FFFFF0" cellpadding="3" cellspacing="0" width="95%" class="table table-striped">
+<table border="2" align="center" cellpadding="3" cellspacing="0" width="95%" class="table table-striped">
 		<tr><td align="center" colspan="3">TITLE</td></tr>
-		<tr><td>WIDGETS</td></tr>
+		WIDGETS
 </table>
 </br>
diff --git a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsWidget.html b/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsWidget.html
deleted file mode 100644
index 0eb5f1e..0000000
--- a/plugins/org.eclipse.osee.ats.impl/src/org/eclipse/osee/ats/impl/resource/html/atsWidget.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-<table width="95%">
-		WIDGETS
-</table>
diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/ActionResource.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/ActionResource.java
index 66eed79..7f4fc16 100644
--- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/ActionResource.java
+++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/ActionResource.java
@@ -78,7 +78,25 @@
    @Produces(MediaType.TEXT_HTML)
    public String getAction(@PathParam("id") String id) throws Exception {
       ArtifactReadable action = AtsServerService.get().getActionById(id);
-      return atsServer.getWorkItemPage().getHtml(action, "Action - " + id, resourceRegistry);
+      if (action == null) {
+         return AHTML.simplePage(String.format("Action with id [%s] can not be found", id));
+      }
+      return atsServer.getWorkItemPage().getHtml(action, "Action - " + id, resourceRegistry, false);
+   }
+
+   /**
+    * @param id (guid, atsId) of action to display
+    * @return html representation of the action
+    */
+   @Path("{id}/details")
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getActionWithDetails(@PathParam("id") String id) throws Exception {
+      ArtifactReadable action = AtsServerService.get().getActionById(id);
+      if (action == null) {
+         return AHTML.simplePage(String.format("Action with id [%s] can not be found", id));
+      }
+      return atsServer.getWorkItemPage().getHtml(action, "Action - " + id, resourceRegistry, true);
    }
 
    /**
@@ -139,7 +157,7 @@
          htmlStr =
             atsServer.getWorkItemPage().getHtml(
                ((ArtifactReadable) action.getTeamWorkflows().iterator().next().getStoreObject()),
-               "Action Created - " + action.getGuid(), resourceRegistry);
+               "Action Created - " + action.getGuid(), resourceRegistry, false);
       }
 
       return Response.status(200).entity(htmlStr).build();
@@ -154,7 +172,7 @@
       if (action != null) {
          IAtsWorkItem workItem = atsServer.getWorkItemFactory().getWorkItem(action);
          if (workItem != null) {
-            results = atsServer.getWorkItemPage().getHtml(action, "Action - " + searchId, resourceRegistry);
+            results = atsServer.getWorkItemPage().getHtml(action, "Action - " + searchId, resourceRegistry, false);
          } else {
             results = AHTML.simplePage(String.format("Undisplayable %s", action));
          }
@@ -167,7 +185,7 @@
             if (legacyQueryResults.size() == 1) {
                results =
                   atsServer.getWorkItemPage().getHtml(legacyQueryResults.getExactlyOne(), "Action - " + searchId,
-                     resourceRegistry);
+                     resourceRegistry, false);
                break;
             } else if (legacyQueryResults.size() > 1) {
                results = getGuidListHtml(legacyQueryResults);
diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/StateResource.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/StateResource.java
index 117733e..ace5957 100644
--- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/StateResource.java
+++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/resources/StateResource.java
@@ -56,16 +56,6 @@
    }
 
    /**
-    * @return html representation of action with states
-    */
-   @GET
-   @Produces(MediaType.TEXT_HTML)
-   public String getStates() throws Exception {
-      ArtifactReadable action = atsServer.getArtifactByGuid(guid);
-      return atsServer.getWorkItemPage().getHtml(action, "Action - " + guid, resourceRegistry);
-   }
-
-   /**
     * @param id
     * @return html representation w/ transition ui
     */
@@ -74,7 +64,7 @@
    @Produces(MediaType.TEXT_HTML)
    public String getTransition() throws Exception {
       ArtifactReadable action = AtsServerService.get().getActionById(guid);
-      return atsServer.getWorkItemPage().getHtmlWithTransition(action, "Action - " + guid, resourceRegistry);
+      return atsServer.getWorkItemPage().getHtmlWithTransition(action, "Action - " + guid, resourceRegistry, false);
    }
 
    /**
@@ -131,7 +121,8 @@
          // reload before display
          action = atsServer.getArtifactByGuid(guid);
          htmlStr =
-            atsServer.getWorkItemPage().getHtml(action, "Action Transitioned - " + action.getGuid(), resourceRegistry);
+            atsServer.getWorkItemPage().getHtml(action, "Action Transitioned - " + action.getGuid(), resourceRegistry,
+               false);
       } else {
          throw new OseeCoreException("Unhandled operation [%s]", operation);
       }