16 public partial class Detail : System.Web.UI.Page
17 {
18 ObjectWorkflowDetails WorkflowDetailsUserControl;
19
20 private int objectID = 0;
21 public int ObjectID
22 {
23 get { return objectID; }
24 set { objectID = value; }
25 }
26
27 private string objectType;
28 public string ObjectType
29 {
30 get { return objectType; }
31 set { objectType = value; }
32 }
33
34 protected void Page_Init(object sender, EventArgs e)
35 {
36 if (Page.Request.QueryString["ObjectID"] != null)
37 {
38 objectID = Convert.ToInt32(Page.Request.QueryString["ObjectID"]);
39 }
40 else
41 {
42 objectID = 1; //temp for testing
43 }
44
45 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString());
46
47 LoadObjectWorkflows(connection);
48
49 if (Page.IsPostBack == false)
50 {
51 int workflowID = 0;
52
53 if (Page.Request.QueryString["WorkflowID"] != null)
54 {
55 workflowID = Convert.ToInt32(Page.Request.QueryString["WorkflowID"]);
56 }
57
58 if (TabContainer1.Tabs.Count > 0 && workflowID > 0) // If a specific workflowID was called for, show it initially
59 {
60 for (int i = 0; i < TabContainer1.Tabs.Count; i++)
61 {
62 if (Convert.ToInt32(TabContainer1.Tabs[i].ID.Replace("Workflow_", "")) == workflowID)
63 {
64 TabContainer1.ActiveTabIndex = i;
65 break;
66 }
67 }
68 }
69 else if (TabContainer1.Tabs.Count > 0) // If no specific workflowID was called for, show the first one initially
70 {
71 TabContainer1.ActiveTabIndex = 0;
72 }
73 }
74 }
75
76 private void LoadObjectWorkflows(SqlConnection connection)
77 {
78 using (connection)
79 {
... {SQL Omitted}
109
110
111 SqlCommand command = new SqlCommand(sqlString.ToString(), connection);
112
113 connection.Open();
114
115 command.Parameters.Add(new SqlParameter("@ObjectID", objectID));
116
117 SqlDataReader reader = command.ExecuteReader();
118
119 while (reader.Read())
120 {
121 //Build Tabs for each active workflow
122 AddTab(reader["Name"].ToString(), Convert.ToInt32(reader["WorkflowID"].ToString()), Convert.ToDateTime(reader["StateEntryTime"]), Convert.ToDateTime(reader["WorkflowEntryTime"]), Convert.ToInt32(reader["DurationMin"].ToString()), Convert.ToInt32(reader["DurationMax"].ToString()), Convert.ToInt32(reader["DurationMedian"].ToString()), reader["ObjectType"].ToString(), Convert.ToInt32(reader["SessionID"].ToString()));
123
124 //Set the page & object details titles
125 Page.Title = string.Format("{0} Details", reader["ObjectType"].ToString());
126 ObjectDetailsLabel.Text = string.Format("{0} Details", reader["ObjectType"].ToString());
127 }
128
129 reader.Close();
130 }
131 }
132
133 private void AddTab(string WorkflowName, int workflowID, DateTime currentStateEntryTime, DateTime workflowEntryTime, int minDuration, int maxDuration, int medianDuration, string objectType, int sessionID)
134 {
135 WorkflowDetailsUserControl = ((ObjectWorkflowDetails)LoadControl("~/Controls/ObjectWorkflowDetails.ascx"));
136
137 AjaxControlToolkit.TabPanel thePanel = new AjaxControlToolkit.TabPanel();
138 thePanel.HeaderText = WorkflowName;
139 thePanel.ID = string.Format("Workflow_{0}", workflowID);
140
141 WorkflowDetailsUserControl.ID = string.Format("WorkflowDetails_{0}", workflowID);
142 WorkflowDetailsUserControl.WorkflowID = workflowID;
143 WorkflowDetailsUserControl.ObjectID = objectID;
144 WorkflowDetailsUserControl.CurrentStateStartTime = currentStateEntryTime;
145 WorkflowDetailsUserControl.WorkflowEntryTime = workflowEntryTime;
146 WorkflowDetailsUserControl.ObjectType = objectType;
147
148 WorkflowDetailsUserControl.MinStateDurationMinutes = (minDuration == 0 ? medianDuration * .5 : minDuration);
149 WorkflowDetailsUserControl.MaxStateDurationMinutes = (maxDuration == 0 ? medianDuration * 1.5 : maxDuration);
150 WorkflowDetailsUserControl.MedStateDurationMinutes = medianDuration;
151 WorkflowDetailsUserControl.SessionID = sessionID;
152
153 thePanel.Controls.Add(WorkflowDetailsUserControl);
154 TabContainer1.Tabs.Add(thePanel);
155 }
156
157 protected void SetParams(object sender, SqlDataSourceSelectingEventArgs e)
158 {
159 e.Command.Parameters["@ObjectID"].Value = objectID;
160 }
161
162 protected void SetObjectAttributeParams(object sender, SqlDataSourceSelectingEventArgs e)
163 {
164 e.Command.Parameters["@p_objectid"].Value = objectID;
165 }
166
167 protected void BuildAttributeList(object sender, RepeaterItemEventArgs e)
168 {
169 Master.AddAttributeName(Convert.ToInt32(((System.Data.DataRowView)(e.Item.DataItem)).Row["AttributeID"].ToString()), ((System.Data.DataRowView)(e.Item.DataItem)).Row["AttributeName"].ToString());
170
171 if (Session["DefaultAttributeName"] != null && Session["DefaultAttributeName"].ToString() == ((System.Data.DataRowView)(e.Item.DataItem)).Row["AttributeName"].ToString())
172 {
173 DefaultObjectAttributeName.Text = ((System.Data.DataRowView)(e.Item.DataItem)).Row["AttributeName"].ToString();
174 DefaultObjectAttributeValue.Text = ((System.Data.DataRowView)(e.Item.DataItem)).Row["ValueData"].ToString();
177 }
178 }
179 }
User Control HTML:
13 <asp:Timer ID="Timer1" runat="server" Interval="10000" OnTick="UpdateWorkflowDuration"></asp:Timer>
14 <asp:HiddenField runat="server" ID="ChangeState" OnValueChanged="ChangeObjectState" />
15
16 <asp:UpdatePanel runat="server" ID="WorkflowUpdatePanel" RenderMode="inline" UpdateMode="Conditional">
17
18 <Triggers>
19 <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
20 </Triggers>
21
22 <ContentTemplate>
23 <div class="CurrentStep">
24 <div class="StepTimer">
25 <div class="DurationMax">— Max<br /> <%= FormatDuration(TimeSpan.FromMinutes(Convert.ToDouble(MaxStateDurationMinutes)), true)%></div>
26 <div class="DurationMedian">Median —<br /><%= FormatDuration(TimeSpan.FromMinutes(Convert.ToDouble(MedStateDurationMinutes)), true)%> </div>
27 <div class="DurationMin">— Min<br /> <%= FormatDuration(TimeSpan.FromMinutes(Convert.ToDouble(MinStateDurationMinutes)), true)%></div>
28 <div class="DurationCur">Curr<br /><asp:label runat="server" ID="StepDuration"></asp:label></div>
29 <img runat="server" src="~/images/progress/Mask.gif" alt="" class="progressBorder" />
30 <img runat="server" id="StepTimerOverlay" src="~/images/Progress/Overlay.gif" alt="" class="percentImage" />
31 </div>
32 </div>
...
89 <asp:SqlDataSource ID="SQL_CurrentState" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionStringAgility %>"
90 SelectCommand="SELECT Workflow.State.Name, Workflow.State.IsMilestone, Workflow.State.Description, Workflow.State.StateID FROM Workflow.Workflow INNER JOIN Workflow.State ON Workflow.Workflow.WorkflowID = Workflow.State.WorkflowID INNER JOIN Object.ObjectType ON Workflow.Workflow.ObjectTypeID = Object.ObjectType.ObjectTypeID LEFT OUTER JOIN Workflow.ObjectState ON Workflow.State.StateID = Workflow.ObjectState.StateID WHERE (Workflow.Workflow.WorkflowID = @WorkflowID) AND (Workflow.ObjectState.ObjectID = @ObjectID) GROUP BY Workflow.State.Name, Workflow.State.Description, Workflow.State.StateID, Object.ObjectType.Name, ISNULL(Workflow.State.DurationMin, 0), ISNULL(Workflow.State.DurationMax, 0), Workflow.State.IsMilestone, Workflow.ObjectState.EntryTime, DATEDIFF(Minute, Workflow.ObjectState.EntryTime, GETDATE())" OnSelecting="SetParams">
91 <SelectParameters>
92 <asp:Parameter Name="ObjectID" DefaultValue="0" Type="Int32" />
93 <asp:Parameter Name="WorkflowID" DefaultValue="0" Type="Int32" />
94 </SelectParameters>
95 </asp:SqlDataSource>
...
114 </ContentTemplate>
115 </asp:UpdatePanel>