зеркало из https://github.com/mono/moma-tool.git
ReportView.aspx, ReportView.aspx.cs: Implement the individual report view.
Overview.aspx, Overview.aspx.cs: Give controls meaningful IDs. MoMA.css: Style some report view divs. svn path=/trunk/moma-tool/; revision=115866
This commit is contained in:
Родитель
a9157df294
Коммит
b0386953f0
|
@ -1,4 +1,4 @@
|
|||
#region Auto-generated classes for nhibernate database on 2008-09-03 16:20:12Z
|
||||
#region Auto-generated classes for nhibernate database on 2008-10-13 17:08:47Z
|
||||
|
||||
//
|
||||
// ____ _ __ __ _ _
|
||||
|
@ -7,7 +7,7 @@
|
|||
// | |_| | |_) | | | | __/ || (_| | |
|
||||
// |____/|_.__/|_| |_|\___|\__\__,_|_|
|
||||
//
|
||||
// Auto-generated from nhibernate on 2008-09-03 16:20:12Z
|
||||
// Auto-generated from nhibernate on 2008-10-13 17:08:47Z
|
||||
// Please visit http://linq.to/db for more information
|
||||
|
||||
#endregion
|
||||
|
@ -42,6 +42,8 @@ namespace MomaTool.Database.Linq
|
|||
public Table<IssueType> IssueType { get { return GetTable<IssueType>(); } }
|
||||
public Table<MomADefinition> MomADefinition { get { return GetTable<MomADefinition>(); } }
|
||||
public Table<Report> Report { get { return GetTable<Report>(); } }
|
||||
public Table<ReportComment> ReportComment { get { return GetTable<ReportComment>(); } }
|
||||
public Table<ReportMetadata> ReportMetadata { get { return GetTable<ReportMetadata>(); } }
|
||||
|
||||
}
|
||||
|
||||
|
@ -249,21 +251,6 @@ namespace MomaTool.Database.Linq
|
|||
|
||||
#region Parents
|
||||
|
||||
private System.Data.Linq.EntityRef<IssueType> issueType;
|
||||
[Association(Storage = "issueType", ThisKey = "IssueTypeID", Name = "fk_issue_issue_type")]
|
||||
[DebuggerNonUserCode]
|
||||
public IssueType IssueType
|
||||
{
|
||||
get
|
||||
{
|
||||
return issueType.Entity;
|
||||
}
|
||||
set
|
||||
{
|
||||
issueType.Entity = value;
|
||||
}
|
||||
}
|
||||
|
||||
private System.Data.Linq.EntityRef<Report> report;
|
||||
[Association(Storage = "report", ThisKey = "ReportID", Name = "fk_issue_report")]
|
||||
[DebuggerNonUserCode]
|
||||
|
@ -279,6 +266,21 @@ namespace MomaTool.Database.Linq
|
|||
}
|
||||
}
|
||||
|
||||
private System.Data.Linq.EntityRef<IssueType> issueType;
|
||||
[Association(Storage = "issueType", ThisKey = "IssueTypeID", Name = "fk_issue_issue_type")]
|
||||
[DebuggerNonUserCode]
|
||||
public IssueType IssueType
|
||||
{
|
||||
get
|
||||
{
|
||||
return issueType.Entity;
|
||||
}
|
||||
set
|
||||
{
|
||||
issueType.Entity = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -939,6 +941,28 @@ namespace MomaTool.Database.Linq
|
|||
}
|
||||
}
|
||||
|
||||
[Association(Storage = null, OtherKey = "ReportID", Name = "report_metadata_report_id_fkey")]
|
||||
[DebuggerNonUserCode]
|
||||
public EntityMSet<ReportMetadata> ReportMetadata
|
||||
{
|
||||
get
|
||||
{
|
||||
// L212 - child data available only when part of query
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
[Association(Storage = null, OtherKey = "ReportID", Name = "report_comment_report_id_fkey")]
|
||||
[DebuggerNonUserCode]
|
||||
public EntityMSet<ReportComment> ReportComment
|
||||
{
|
||||
get
|
||||
{
|
||||
// L212 - child data available only when part of query
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -960,6 +984,339 @@ namespace MomaTool.Database.Linq
|
|||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
[Table(Name = "public.report_comment")]
|
||||
public partial class ReportComment : INotifyPropertyChanged
|
||||
{
|
||||
#region INotifyPropertyChanged handling
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region string Comment
|
||||
|
||||
private string comment;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "comment", Name = "comment", DbType = "text", CanBeNull = false, Expression = null)]
|
||||
public string Comment
|
||||
{
|
||||
get
|
||||
{
|
||||
return comment;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != comment)
|
||||
{
|
||||
comment = value;
|
||||
OnPropertyChanged("Comment");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region System.DateTime CommentDate
|
||||
|
||||
private System.DateTime commentDate;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "commentDate", Name = "comment_date", DbType = "timestamp without time zone", CanBeNull = false, Expression = null)]
|
||||
public System.DateTime CommentDate
|
||||
{
|
||||
get
|
||||
{
|
||||
return commentDate;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != commentDate)
|
||||
{
|
||||
commentDate = value;
|
||||
OnPropertyChanged("CommentDate");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region string CommentER
|
||||
|
||||
private string commentEr;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "commentEr", Name = "commenter", DbType = "character varying(255)", CanBeNull = false, Expression = null)]
|
||||
public string CommentER
|
||||
{
|
||||
get
|
||||
{
|
||||
return commentEr;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != commentEr)
|
||||
{
|
||||
commentEr = value;
|
||||
OnPropertyChanged("CommentER");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region bool EmailEd
|
||||
|
||||
private bool emailEd;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "emailEd", Name = "emailed", DbType = "boolean", CanBeNull = false, Expression = null)]
|
||||
public bool EmailEd
|
||||
{
|
||||
get
|
||||
{
|
||||
return emailEd;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != emailEd)
|
||||
{
|
||||
emailEd = value;
|
||||
OnPropertyChanged("EmailEd");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region int ID
|
||||
|
||||
[AutoGenId]
|
||||
private int id;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "id", Name = "id", DbType = "integer(32,0)", IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false, Expression = "nextval('report_comment_id_seq')")]
|
||||
public int ID
|
||||
{
|
||||
get
|
||||
{
|
||||
return id;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != id)
|
||||
{
|
||||
id = value;
|
||||
OnPropertyChanged("ID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region int ReportID
|
||||
|
||||
private int reportID;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "reportID", Name = "report_id", DbType = "integer(32,0)", CanBeNull = false, Expression = null)]
|
||||
public int ReportID
|
||||
{
|
||||
get
|
||||
{
|
||||
return reportID;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != reportID)
|
||||
{
|
||||
reportID = value;
|
||||
OnPropertyChanged("ReportID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Parents
|
||||
|
||||
private System.Data.Linq.EntityRef<Report> report;
|
||||
[Association(Storage = "report", ThisKey = "ReportID", Name = "report_comment_report_id_fkey")]
|
||||
[DebuggerNonUserCode]
|
||||
public Report Report
|
||||
{
|
||||
get
|
||||
{
|
||||
return report.Entity;
|
||||
}
|
||||
set
|
||||
{
|
||||
report.Entity = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
[Table(Name = "public.report_metadata")]
|
||||
public partial class ReportMetadata : INotifyPropertyChanged
|
||||
{
|
||||
#region INotifyPropertyChanged handling
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region string ApplicationName
|
||||
|
||||
private string applicationName;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "applicationName", Name = "application_name", DbType = "character varying(200)", Expression = null)]
|
||||
public string ApplicationName
|
||||
{
|
||||
get
|
||||
{
|
||||
return applicationName;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != applicationName)
|
||||
{
|
||||
applicationName = value;
|
||||
OnPropertyChanged("ApplicationName");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region string ApplicationType
|
||||
|
||||
private string applicationType;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "applicationType", Name = "application_type", DbType = "character varying(100)", Expression = null)]
|
||||
public string ApplicationType
|
||||
{
|
||||
get
|
||||
{
|
||||
return applicationType;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != applicationType)
|
||||
{
|
||||
applicationType = value;
|
||||
OnPropertyChanged("ApplicationType");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region int ID
|
||||
|
||||
[AutoGenId]
|
||||
private int id;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "id", Name = "id", DbType = "integer(32,0)", IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false, Expression = "nextval('report_metadata_id_seq')")]
|
||||
public int ID
|
||||
{
|
||||
get
|
||||
{
|
||||
return id;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != id)
|
||||
{
|
||||
id = value;
|
||||
OnPropertyChanged("ID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region string Importance
|
||||
|
||||
private string importance;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "importance", Name = "importance", DbType = "character varying(100)", Expression = null)]
|
||||
public string Importance
|
||||
{
|
||||
get
|
||||
{
|
||||
return importance;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != importance)
|
||||
{
|
||||
importance = value;
|
||||
OnPropertyChanged("Importance");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region int ReportID
|
||||
|
||||
private int reportID;
|
||||
[DebuggerNonUserCode]
|
||||
[Column(Storage = "reportID", Name = "report_id", DbType = "integer(32,0)", CanBeNull = false, Expression = null)]
|
||||
public int ReportID
|
||||
{
|
||||
get
|
||||
{
|
||||
return reportID;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != reportID)
|
||||
{
|
||||
reportID = value;
|
||||
OnPropertyChanged("ReportID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Parents
|
||||
|
||||
private System.Data.Linq.EntityRef<Report> report;
|
||||
[Association(Storage = "report", ThisKey = "ReportID", Name = "report_metadata_report_id_fkey")]
|
||||
[DebuggerNonUserCode]
|
||||
public Report Report
|
||||
{
|
||||
get
|
||||
{
|
||||
return report.Entity;
|
||||
}
|
||||
set
|
||||
{
|
||||
report.Entity = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
|
|
@ -27,4 +27,21 @@
|
|||
|
||||
.content
|
||||
{
|
||||
}
|
||||
/* Make this the context box for the main body content */
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.reportview_metadata
|
||||
{
|
||||
float: left;
|
||||
}
|
||||
|
||||
.reportview_comments
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
|
||||
.reportview_issues
|
||||
{
|
||||
clear: both;
|
||||
}
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
This view is only available to logged-in users.
|
||||
</AnonymousTemplate>
|
||||
<LoggedInTemplate>
|
||||
<asp:Label ID="Label1" runat="server" Text="Latest 20 Reports:"></asp:Label>
|
||||
<asp:Label ID="Latest20Label" runat="server" Text="Latest 20 Reports:"></asp:Label>
|
||||
<br />
|
||||
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
|
||||
<asp:GridView ID="Latest20GridView" runat="server" AutoGenerateColumns="False">
|
||||
<Columns>
|
||||
<asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/ReportView.aspx?ReportID={0}"
|
||||
HeaderText="Details" Text="View" />
|
||||
|
@ -24,9 +24,9 @@
|
|||
<asp:BoundField DataField="Total" HeaderText="Total" />
|
||||
</Columns>
|
||||
</asp:GridView>
|
||||
<asp:Label ID="Label2" runat="server" Text="Most needed API:"></asp:Label>
|
||||
<asp:Label ID="MostNeededLabel" runat="server" Text="Most needed API:"></asp:Label>
|
||||
<br />
|
||||
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False">
|
||||
<asp:GridView ID="MostNeededGridView" runat="server" AutoGenerateColumns="False">
|
||||
<Columns>
|
||||
<asp:BoundField DataField="Namespace" HeaderText="Namespace" />
|
||||
<asp:BoundField DataField="Class" HeaderText="Class" />
|
||||
|
@ -35,9 +35,9 @@
|
|||
<asp:BoundField DataField="Apps" HeaderText="Apps" />
|
||||
</Columns>
|
||||
</asp:GridView>
|
||||
<asp:Label ID="Label3" runat="server" Text="Issues per Application"></asp:Label>
|
||||
<asp:Label ID="IssuesPerAppLabel" runat="server" Text="Issues per Application"></asp:Label>
|
||||
<br />
|
||||
<zgw:zedgraphweb ID="ZedGraph1" runat="server"></zgw:zedgraphweb>
|
||||
<zgw:zedgraphweb ID="IssuesPerAppGraph" runat="server"></zgw:zedgraphweb>
|
||||
</LoggedInTemplate>
|
||||
</asp:LoginView>
|
||||
</asp:Content>
|
||||
|
|
|
@ -276,7 +276,7 @@ public partial class Overview : System.Web.UI.Page
|
|||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
// ... and we need to find it from inside the LoginView
|
||||
GridView grid1 = (GridView)LoginView1.FindControl("GridView1");
|
||||
GridView grid1 = (GridView)LoginView1.FindControl("Latest20GridView");
|
||||
|
||||
string connstr = ConfigurationManager.ConnectionStrings["MomaDB"].ConnectionString;
|
||||
NpgsqlConnection conn = new NpgsqlConnection(connstr);
|
||||
|
@ -304,6 +304,16 @@ public partial class Overview : System.Web.UI.Page
|
|||
*/
|
||||
foreach (OverviewData ov in grid1_q)
|
||||
{
|
||||
/* This works with MS LINQ, but not with DBLINQ - the ToArray() blows up */
|
||||
#if NAUGHT
|
||||
var q = (from iss in db.Issue where iss.ReportID == ov.ID group iss by iss.IssueTypeID into g orderby g.Key select new { issue_type_id = g.Key, Count = g.Count() }).ToArray();
|
||||
|
||||
ov.Miss = q[miss_id].Count;
|
||||
ov.Niex = q[niex_id].Count;
|
||||
ov.Pinv = q[pinv_id].Count;
|
||||
ov.Todo = q[todo_id].Count;
|
||||
#endif
|
||||
|
||||
ov.Miss = (from issue in db.Issue where issue.ReportID == ov.ID && issue.IssueTypeID == miss_id select issue.ID).ToList().Count;
|
||||
ov.Niex = (from issue in db.Issue where issue.ReportID == ov.ID && issue.IssueTypeID == niex_id select issue.ID).ToList().Count;
|
||||
ov.Pinv = (from issue in db.Issue where issue.ReportID == ov.ID && issue.IssueTypeID == pinv_id select issue.ID).ToList().Count;
|
||||
|
@ -314,7 +324,7 @@ public partial class Overview : System.Web.UI.Page
|
|||
grid1.DataSource = grid1_q;
|
||||
grid1.DataBind();
|
||||
|
||||
GridView grid2 = (GridView)LoginView1.FindControl("GridView2");
|
||||
GridView grid2 = (GridView)LoginView1.FindControl("MostNeededGridView");
|
||||
|
||||
/* FIXME: figure out the LINQ version of the count(distinct)... */
|
||||
var grid2_q = db.ExecuteQuery<OverviewMostNeeded>(@"select count(distinct(issue.report_id)) as Apps, issue.method_namespace as Namespace, issue.method_class as Class, issue.method_name as Method, issue_type.display_name as Type from issue, issue_type where issue_type.id = issue.issue_type_id group by method_namespace, method_class, method_name, display_name order by Apps desc limit 20;");
|
||||
|
@ -334,7 +344,7 @@ public partial class Overview : System.Web.UI.Page
|
|||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
ZedGraphWeb zg1 = (ZedGraphWeb)LoginView1.FindControl("ZedGraph1");
|
||||
ZedGraphWeb zg1 = (ZedGraphWeb)LoginView1.FindControl("IssuesPerAppGraph");
|
||||
zg1.RenderGraph += new ZedGraph.Web.ZedGraphWebControlEventHandler(this.OnRenderGraph1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,13 +6,59 @@
|
|||
This view is only available to logged-in users.
|
||||
</AnonymousTemplate>
|
||||
<LoggedInTemplate>
|
||||
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
|
||||
<Columns>
|
||||
<asp:BoundField DataField="ID" HeaderText="ID" />
|
||||
<asp:BoundField DataField="ReportFilename" HeaderText="Filename" />
|
||||
<asp:BoundField DataField="ReporterName" HeaderText="Name" />
|
||||
</Columns>
|
||||
</asp:GridView>
|
||||
<div class="reportview_metadata">
|
||||
<asp:UpdatePanel ID="ReportMetaDataUpdatePanel" runat="server" UpdateMode="Conditional">
|
||||
<ContentTemplate>
|
||||
<asp:Label ID="ReportIDLabel" runat="server" Text=""></asp:Label>
|
||||
<br />
|
||||
<asp:Label ID="ApplicationLabel" runat="server" Text="Application:"></asp:Label>
|
||||
<asp:TextBox ID="ApplicationContent" runat="server" AutoPostBack="True"
|
||||
ontextchanged="ApplicationContent_TextChanged"></asp:TextBox><br />
|
||||
<asp:Label ID="ImportanceLabel" runat="server" Text="Importance:"></asp:Label>
|
||||
<asp:DropDownList ID="ImportanceDropDownList" runat="server"
|
||||
AutoPostBack="True"
|
||||
onselectedindexchanged="Importance_SelectedIndexChanged">
|
||||
<asp:ListItem>Important</asp:ListItem>
|
||||
<asp:ListItem>Useful</asp:ListItem>
|
||||
<asp:ListItem>Not useful</asp:ListItem>
|
||||
</asp:DropDownList>
|
||||
<br />
|
||||
<asp:Label ID="AuthorLabel" runat="server" Text="Author:"></asp:Label>
|
||||
<asp:Label ID="AuthorContent" runat="server" Text=""></asp:Label><br />
|
||||
<asp:Label ID="EmailLabel" runat="server" Text="Email:"></asp:Label>
|
||||
<asp:Label ID="EmailContent" runat="server" Text=""></asp:Label><br />
|
||||
<asp:Label ID="WebsiteLabel" runat="server" Text="Website:"></asp:Label>
|
||||
<asp:Label ID="WebsiteContent" runat="server" Text=""></asp:Label><br />
|
||||
<asp:Label ID="FrameworkVersionLabel" runat="server" Text="Framework Version:"></asp:Label>
|
||||
<asp:Label ID="FrameworkVersionContent" runat="server"></asp:Label><br />
|
||||
<asp:Label ID="ApplicationTypeLabel" runat="server" Text="Application Type:"></asp:Label>
|
||||
<asp:TextBox ID="ApplicationTypeContent" runat="server" AutoPostBack="True"
|
||||
ontextchanged="ApplicationType_TextChanged"></asp:TextBox><br />
|
||||
<asp:Button ID="UpdateButton" runat="server" Text="Update" OnClick="UpdateButton_Click" />
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
<div class="reportview_comments">
|
||||
<asp:UpdatePanel ID="CommentUpdatePanel" runat="server" UpdateMode="Conditional">
|
||||
<ContentTemplate>
|
||||
<asp:Label ID="CommentsLabel" runat="server" Text="Comments:"></asp:Label><br />
|
||||
<asp:TextBox ID="Comments" runat="server" ReadOnly="True" TextMode="MultiLine"
|
||||
Columns="40" Rows="12"></asp:TextBox><br />
|
||||
<asp:TextBox ID="NewComment" runat="server" Rows="6" TextMode="MultiLine"
|
||||
Columns="40"></asp:TextBox><br />
|
||||
<asp:CheckBox ID="SendCommentCheckBox" runat="server" Checked="True" Text="Send comment to submitter" /><br />
|
||||
<asp:Button ID="CommentButton" runat="server" Text="Add Comment"
|
||||
onclick="CommentButton_Click" />
|
||||
</ContentTemplate>
|
||||
<%--<Triggers>
|
||||
<asp:AsyncPostBackTrigger ControlID="CommentButton" EventName="Click" />
|
||||
</Triggers>--%>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
<div class="reportview_issues">
|
||||
<asp:GridView ID="IssuesGridView" runat="server">
|
||||
</asp:GridView>
|
||||
</div>
|
||||
</LoggedInTemplate>
|
||||
</asp:LoginView>
|
||||
</asp:Content>
|
||||
|
|
|
@ -13,40 +13,307 @@ using System.Xml.Linq;
|
|||
|
||||
using MomaTool.Database.Linq;
|
||||
using Npgsql;
|
||||
using System.Data.Linq;
|
||||
using System.Net.Mail;
|
||||
using System.Text;
|
||||
|
||||
public partial class ReportView : System.Web.UI.Page
|
||||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
// GridView1 only available to logged-in users
|
||||
// Content only available to logged-in users
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
string id_qs = Request.QueryString["ReportID"];
|
||||
int id;
|
||||
|
||||
if (id_qs != null)
|
||||
if (!Page.IsPostBack)
|
||||
{
|
||||
id = int.Parse(id_qs);
|
||||
}
|
||||
else
|
||||
{
|
||||
id = 1;
|
||||
}
|
||||
|
||||
string connstr = ConfigurationManager.ConnectionStrings["MomaDB"].ConnectionString;
|
||||
NpgsqlConnection conn = new NpgsqlConnection(connstr);
|
||||
MoMADB db = new MoMADB(conn);
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
Report report = this.GetReport(db, id);
|
||||
MomADefinition def = this.GetMomaDefinition(db, report.MomADefinitionID);
|
||||
ReportMetadata report_meta = this.GetMetadata(db, id);
|
||||
|
||||
// ... and we need to find it from inside the LoginView
|
||||
GridView grid = (GridView)LoginView1.FindControl("GridView1");
|
||||
grid.DataSource = (from rep in db.Report
|
||||
where rep.ID == id
|
||||
select new {
|
||||
ID = rep.ID,
|
||||
ReportFileName = rep.ReportFilename,
|
||||
ReporterName = rep.ReporterName
|
||||
});
|
||||
grid.DataBind();
|
||||
// ... and we need to find it from inside the LoginView
|
||||
Label report_id_label = (Label)LoginView1.FindControl("ReportIDLabel");
|
||||
report_id_label.Text = "Report " + report.ID;
|
||||
|
||||
DropDownList importance_ddl = (DropDownList)LoginView1.FindControl("ImportanceDropDownList");
|
||||
importance_ddl.SelectedValue = report_meta.Importance;
|
||||
|
||||
TextBox application_content_textbox = (TextBox)LoginView1.FindControl("ApplicationContent");
|
||||
application_content_textbox.Text = report_meta.ApplicationName;
|
||||
|
||||
Label author_content_label = (Label)LoginView1.FindControl("AuthorContent");
|
||||
author_content_label.Text = report.ReporterName;
|
||||
|
||||
Label email_content_label = (Label)LoginView1.FindControl("EmailContent");
|
||||
email_content_label.Text = report.ReporterEmail;
|
||||
|
||||
Label website_content_label = (Label)LoginView1.FindControl("WebsiteContent");
|
||||
website_content_label.Text = report.ReporterHomepage;
|
||||
|
||||
Label framework_version_content_label = (Label)LoginView1.FindControl("FrameworkVersionContent");
|
||||
// I get NullReferenceException here if I try to use report.MomADefinition.DisplayName
|
||||
// with dblinq
|
||||
framework_version_content_label.Text = def.DisplayName;
|
||||
|
||||
TextBox application_type_content_textbox = (TextBox)LoginView1.FindControl("ApplicationTypeContent");
|
||||
application_type_content_textbox.Text = report_meta.ApplicationType;
|
||||
|
||||
var issues_q = (from iss in db.Issue
|
||||
from type in db.IssueType
|
||||
where iss.ReportID == id && iss.IssueTypeID == type.ID
|
||||
select new
|
||||
{
|
||||
Type = type.LookupName,
|
||||
Namespace = iss.MethodNamesPace,
|
||||
ClassName = iss.MethodClass,
|
||||
Method = iss.MethodName
|
||||
});
|
||||
GridView grid1 = (GridView)LoginView1.FindControl("IssuesGridView");
|
||||
grid1.DataSource = issues_q;
|
||||
grid1.DataBind();
|
||||
|
||||
// Make the default text go away when the user clicks in the Comments box
|
||||
// (but ensure that it won't blow away a half-entered comment!)
|
||||
TextBox new_comment_textbox = (TextBox)LoginView1.FindControl("NewComment");
|
||||
new_comment_textbox.Text = "Type your comment here...";
|
||||
new_comment_textbox.Attributes.Add("onFocus", "if (this.value == 'Type your comment here...') this.value='';");
|
||||
|
||||
this.UpdateComments(db, id);
|
||||
|
||||
if (!report.ReporterEmail.Contains("@"))
|
||||
{
|
||||
CheckBox send_comment_checkbox = (CheckBox)LoginView1.FindControl("SendCommentCheckBox");
|
||||
|
||||
/* Hide the email checkbox, as we can't email the submitter anyway... */
|
||||
send_comment_checkbox.Visible = false;
|
||||
send_comment_checkbox.Checked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void UpdateButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
Report report = this.GetReport(db, id);
|
||||
ReportMetadata report_meta = this.GetMetadata(db, id);
|
||||
|
||||
DropDownList importance_ddl = (DropDownList)LoginView1.FindControl("ImportanceDropDownList");
|
||||
report_meta.Importance = importance_ddl.SelectedValue;
|
||||
|
||||
TextBox application_content_textbox = (TextBox)LoginView1.FindControl("ApplicationContent");
|
||||
report_meta.ApplicationName = application_content_textbox.Text;
|
||||
|
||||
TextBox application_type_content_textbox = (TextBox)LoginView1.FindControl("ApplicationTypeContent");
|
||||
report_meta.ApplicationType = application_type_content_textbox.Text;
|
||||
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
}
|
||||
}
|
||||
|
||||
Report GetReport(MoMADB db, int id)
|
||||
{
|
||||
Report report = (from rep in db.Report
|
||||
where rep.ID == id
|
||||
select rep).First();
|
||||
|
||||
return report;
|
||||
}
|
||||
|
||||
MomADefinition GetMomaDefinition(MoMADB db, int? def_id)
|
||||
{
|
||||
MomADefinition definition = (from def in db.MomADefinition
|
||||
where def.ID == def_id
|
||||
select def).First();
|
||||
|
||||
return definition;
|
||||
}
|
||||
|
||||
ReportMetadata GetMetadata(MoMADB db, int report_id)
|
||||
{
|
||||
// FirstOrDefault() doesn't work in dblinq, and this can fail if noone has created the
|
||||
// metadata entry yet, so we have to fart about with the array instead
|
||||
ReportMetadata report_meta;
|
||||
var report_meta_q = (from rep_meta in db.ReportMetadata
|
||||
where rep_meta.ReportID == report_id
|
||||
select rep_meta).ToArray();
|
||||
if (report_meta_q.Length == 0)
|
||||
{
|
||||
// Need to create a default metadata entry
|
||||
report_meta = new ReportMetadata();
|
||||
report_meta.ReportID = report_id;
|
||||
report_meta.Importance = "Useful";
|
||||
report_meta.ApplicationName = "";
|
||||
report_meta.ApplicationType = "";
|
||||
|
||||
db.ReportMetadata.Add(report_meta);
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
}
|
||||
else
|
||||
{
|
||||
report_meta = report_meta_q[0];
|
||||
}
|
||||
|
||||
return report_meta;
|
||||
}
|
||||
|
||||
ReportComment[] GetComments(MoMADB db, int report_id)
|
||||
{
|
||||
ReportComment[] comment_q = (from comm in db.ReportComment
|
||||
where comm.ReportID == report_id
|
||||
orderby comm.CommentDate ascending
|
||||
select comm).ToArray();
|
||||
|
||||
return comment_q;
|
||||
}
|
||||
|
||||
MoMADB OpenDB()
|
||||
{
|
||||
string connstr = ConfigurationManager.ConnectionStrings["MomaDB"].ConnectionString;
|
||||
NpgsqlConnection conn = new NpgsqlConnection(connstr);
|
||||
MoMADB db = new MoMADB(conn);
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
int GetID()
|
||||
{
|
||||
string id_qs = Request.QueryString["ReportID"];
|
||||
int id;
|
||||
|
||||
if (id_qs != null)
|
||||
{
|
||||
id = int.Parse(id_qs);
|
||||
}
|
||||
else
|
||||
{
|
||||
id = 1;
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void UpdateComments(MoMADB db, int report_id)
|
||||
{
|
||||
ReportComment[] comments = this.GetComments(db, report_id);
|
||||
TextBox comments_textbox = (TextBox)LoginView1.FindControl("Comments");
|
||||
comments_textbox.Text = "";
|
||||
|
||||
foreach (ReportComment comm in comments)
|
||||
{
|
||||
comments_textbox.Text += comm.Comment;
|
||||
comments_textbox.Text += "\n";
|
||||
comments_textbox.Text += comm.CommentER;
|
||||
comments_textbox.Text += " @ ";
|
||||
comments_textbox.Text += comm.CommentDate;
|
||||
comments_textbox.Text += "\n\n\n";
|
||||
}
|
||||
|
||||
/* FIXME: figure out how to scroll to the end of the textbox */
|
||||
}
|
||||
|
||||
protected void ApplicationContent_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
Report report = this.GetReport(db, id);
|
||||
ReportMetadata report_meta = this.GetMetadata(db, id);
|
||||
|
||||
TextBox application_content_textbox = (TextBox)LoginView1.FindControl("ApplicationContent");
|
||||
report_meta.ApplicationName = application_content_textbox.Text;
|
||||
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
}
|
||||
}
|
||||
protected void ApplicationType_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
Report report = this.GetReport(db, id);
|
||||
ReportMetadata report_meta = this.GetMetadata(db, id);
|
||||
|
||||
TextBox application_type_content_textbox = (TextBox)LoginView1.FindControl("ApplicationTypeContent");
|
||||
report_meta.ApplicationType = application_type_content_textbox.Text;
|
||||
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
}
|
||||
}
|
||||
protected void Importance_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
Report report = this.GetReport(db, id);
|
||||
ReportMetadata report_meta = this.GetMetadata(db, id);
|
||||
|
||||
DropDownList importance_ddl = (DropDownList)LoginView1.FindControl("ImportanceDropDownList");
|
||||
report_meta.Importance = importance_ddl.SelectedValue;
|
||||
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
}
|
||||
}
|
||||
protected void CommentButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Page.User.Identity.IsAuthenticated)
|
||||
{
|
||||
int id = this.GetID();
|
||||
MoMADB db = this.OpenDB();
|
||||
ReportComment comment = new ReportComment();
|
||||
CheckBox send_comment_checkbox = (CheckBox)LoginView1.FindControl("SendCommentCheckBox");
|
||||
TextBox newcomment_textbox = (TextBox)LoginView1.FindControl("NewComment");
|
||||
Label email_content_label = (Label)LoginView1.FindControl("EmailContent");
|
||||
|
||||
comment.Comment = newcomment_textbox.Text;
|
||||
comment.ReportID = id;
|
||||
comment.CommentER = Page.User.Identity.Name;
|
||||
comment.CommentDate = DateTime.Now;
|
||||
comment.EmailEd = send_comment_checkbox.Checked;
|
||||
|
||||
db.ReportComment.Add(comment);
|
||||
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
|
||||
|
||||
if (send_comment_checkbox.Checked)
|
||||
{
|
||||
/* Email the comment (we know the address is available, as the checkbox can't be
|
||||
* checked otherwise)
|
||||
*/
|
||||
StringBuilder email_text = new StringBuilder();
|
||||
|
||||
email_text.AppendFormat("{0} added a comment to your MoMA report:\n\n", Page.User.Identity.Name);
|
||||
email_text.AppendFormat("{0}", newcomment_textbox.Text);
|
||||
email_text.AppendFormat("\n\nSee {0} for this report.\n", Page.Request.Url.ToString());
|
||||
|
||||
string from_addr = Membership.GetUser().Email;
|
||||
|
||||
MailMessage mess = new MailMessage(from_addr, "dick@acm.org"/*email_content_label.Text*/);
|
||||
mess.Subject = "New comment on MoMA report " + id.ToString();
|
||||
mess.Body = email_text.ToString();
|
||||
mess.IsBodyHtml = false;
|
||||
|
||||
SmtpClient smtp = new SmtpClient();
|
||||
try
|
||||
{
|
||||
smtp.Send(mess);
|
||||
}
|
||||
catch (SmtpException ex)
|
||||
{
|
||||
/* Not sure what we can do here, except inform the commenter that the email didn't
|
||||
* get sent
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
this.UpdateComments(db, id);
|
||||
newcomment_textbox.Text = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче