using System;
using System.Data;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.ExtendedControls;
using CMS.GlobalHelper;
using CMS.ProjectManagement;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
public partial class CMSModules_ProjectManagement_Controls_UI_ProjectTask_List : CMSAdminListControl, IPostBackEventHandler, INamingContainer
{
#region "Variables"
private int mProjectID;
private bool mUsePostbackOnEdit = false;
private ProjectTaskOrderByEnum mOrderByType = ProjectTaskOrderByEnum.NotSpecified;
private int mGroupID = 0;
private StatusDisplayTypeEnum mStatusDisplayType = StatusDisplayTypeEnum.Icon;
private string mOrderBy = String.Empty;
private string mProjects = String.Empty;
private bool showArrows = false;
private string rowColor = null;
private bool mRegisterEditScript = true;
private const int MAX_TITLE_LENGTH = 50;
///
/// Build condition event.
///
public delegate string BuildConditionEvent(object sender, string whereCondition);
///
/// Build condition event is fired when where condition for list control is built.
///
public event BuildConditionEvent BuildCondition;
#endregion
#region "Properties"
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
return plcMess;
}
}
///
/// Gets or sets the edit page URL.
///
public string EditPageURL
{
get
{
return ValidationHelper.GetString(GetValue("EditPageURL"), "Edit.aspx");
}
set
{
SetValue("EditPageURL", value);
}
}
///
/// Gets or sets the additional querystring parameters in edit page URL.
///
public string EditPageParameters
{
get
{
return ValidationHelper.GetString(GetValue("EditPageParameters"), String.Empty);
}
set
{
SetValue("EditPageParameters", value);
}
}
///
/// Gets or sets the value that indicates whether community group should be used for filtering
/// This option is used for My projects web part
///
public bool IgnoreCommunityGroup
{
get
{
return ValidationHelper.GetBoolean(GetValue("IgnoreCommunityGroup"), false);
}
set
{
SetValue("IgnoreCommunityGroup", value);
}
}
///
/// If true control registers edit script.
///
public bool RegisterEditScript
{
get
{
return mRegisterEditScript;
}
set
{
mRegisterEditScript = value;
}
}
///
/// Gets or sets the site name.
///
public string SiteName
{
get
{
return ValidationHelper.GetString(GetValue("SiteName"), String.Empty);
}
set
{
SetValue("SiteName", value);
}
}
///
/// Inner grid.
///
public UniGrid Grid
{
get
{
return gridElem;
}
}
///
/// Status display type.
///
public StatusDisplayTypeEnum StatusDisplayType
{
get
{
return mStatusDisplayType;
}
set
{
mStatusDisplayType = value;
}
}
///
/// Group ID of task.
///
public int CommunityGroupID
{
get
{
return mGroupID;
}
set
{
mGroupID = value;
}
}
///
/// ID of object which is being reminded.
///
public int ReminderTaskID
{
get
{
return ValidationHelper.GetInteger(ViewState["ReminderTaskID"], 0);
}
set
{
ViewState["ReminderTaskID"] = value;
}
}
///
/// Indicates whether redirect or postback on edit.
///
public bool UsePostbackOnEdit
{
get
{
return mUsePostbackOnEdit;
}
set
{
mUsePostbackOnEdit = value;
}
}
///
/// Indicates if the control should perform the operations.
///
public override bool StopProcessing
{
get
{
return base.StopProcessing;
}
set
{
base.StopProcessing = value;
gridElem.StopProcessing = value;
}
}
///
/// Indicates if the control is used on the live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
plcMess.IsLiveSite = value;
gridElem.IsLiveSite = value;
}
}
///
/// ProjectID.
///
public int ProjectID
{
get
{
return mProjectID;
}
set
{
mProjectID = value;
}
}
///
/// Gets or sets the order by.
/// Possible options: "ProjectTaskProjectOrder", "ProjectTaskUserOrder"
///
public ProjectTaskOrderByEnum OrderByType
{
get
{
return mOrderByType;
}
set
{
mOrderByType = value;
}
}
///
/// Order by added to OrderByType.
///
public string OrderBy
{
get
{
return mOrderBy;
}
set
{
mOrderBy = value;
}
}
#endregion
#region "Page methods"
protected void Page_Load(object sender, EventArgs e)
{
BuildConditions();
reminderPopupDialog.Hide();
// Grid initialization
gridElem.OnAction += new OnActionEventHandler(gridElem_OnAction);
gridElem.OnExternalDataBound += new OnExternalDataBoundEventHandler(gridElem_OnExternalDataBound);
gridElem.GridView.RowDataBound += new GridViewRowEventHandler(GridView_RowDataBound);
gridElem.GridView.RowCreated += new GridViewRowEventHandler(GridView_RowCreated);
gridElem.ZeroRowsText = GetString("pm.projectstask.notasksfound");
gridElem.DelayedReload = true;
QueryDataParameters parameters = new QueryDataParameters();
parameters.Add("@Now", DateTime.Now);
gridElem.QueryParameters = parameters;
switch (OrderByType)
{
case ProjectTaskOrderByEnum.ProjectOrder:
gridElem.OrderBy = "ProjectTaskProjectOrder";
break;
case ProjectTaskOrderByEnum.UserOrder:
gridElem.OrderBy = "ProjectTaskUserOrder";
break;
}
if (!String.IsNullOrEmpty(OrderBy))
{
gridElem.OrderBy += (!String.IsNullOrEmpty(gridElem.OrderBy)) ? ", " : "";
gridElem.OrderBy += OrderBy;
}
}
///
/// Reloads data
///
public override void ReloadData()
{
BuildConditions();
gridElem.ReloadData();
base.ReloadData();
}
protected override void OnPreRender(EventArgs e)
{
ReloadData();
base.OnPreRender(e);
// Show or hide messages
lblReminderError.Visible = !string.IsNullOrEmpty(lblReminderError.Text);
if (RegisterEditScript)
{
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "EditRedirectTaskScript", ScriptHelper.GetScript(@"
function EditProjectTask(id) {
var usePostback = '" + UsePostbackOnEdit + @"';
var projectId = parseInt('" + ProjectID + @"');
var groupId = parseInt('" + CommunityGroupID + @"');
if (usePostback == 'False') {
window.location.replace('" + EditPageURL + @"?projectTaskId=' + id + '&projectid='+projectId+'&groupid='+groupId+'" + EditPageParameters + @"' );
return false;
}
return true;
}
"));
}
}
///
/// Raises build condition event.
///
public string RaiseBuildCondition()
{
if (BuildCondition != null)
{
return BuildCondition(this, gridElem.WhereCondition);
}
return gridElem.WhereCondition;
}
#endregion
#region "Grid events"
///
/// Handles the RowCreated event of the GridView control.
///
/// The source of the event
/// The instance containing the event data
private void GridView_RowCreated(object sender, GridViewRowEventArgs e)
{
rowColor = null;
}
///
/// Handles the RowDataBound event of the GridView control.
///
/// The source of the event
/// The instance containing the event data
private void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (!String.IsNullOrEmpty(rowColor))
{
e.Row.Attributes.Add("style", "background-color: " + rowColor);
}
}
}
///
/// Handles UniGrid's OnExternalDataBound event.
///
/// Sender object (image button if it is an external databoud for action button)
/// External source name of the column specified in the grid XML
/// Source parameter (original value of the field)
protected object gridElem_OnExternalDataBound(object sender, string sourceName, object parameter)
{
DataRowView row = null;
switch (sourceName.ToLowerCSafe())
{
case "up":
case "down":
ImageButton button = ((ImageButton)sender);
button.Visible = showArrows;
break;
case "taskprogress":
row = (DataRowView)parameter;
int progress = ValidationHelper.GetInteger(row["ProjectTaskProgress"], 0);
return ProjectTaskInfoProvider.GenerateProgressHtml(progress, true);
case "projecttaskdisplayname":
case "projectdisplayname":
string displayname = parameter.ToString();
if (displayname.Length > MAX_TITLE_LENGTH)
{
return "" + HTMLHelper.HTMLEncode(TextHelper.LimitLength(displayname, MAX_TITLE_LENGTH)) + "";
}
else
{
return HTMLHelper.HTMLEncode(displayname);
}
case "projecttaskdeadline":
DateTime dt = ValidationHelper.GetDateTime(parameter, DateTimeHelper.ZERO_TIME);
if (dt == DateTimeHelper.ZERO_TIME)
{
return String.Empty;
}
return CMSContext.ConvertDateTime(dt, this);
case "taskstatus":
row = parameter as DataRowView;
if (row != null)
{
string statusName = ValidationHelper.GetString(row["TaskStatusDisplayName"], String.Empty);
statusName = HTMLHelper.HTMLEncode(statusName);
string iconPath = HTMLHelper.HTMLEncode(ValidationHelper.GetString(row["TaskStatusIcon"], String.Empty));
// Get row color
rowColor = ValidationHelper.GetString(row["TaskStatusColor"], "");
switch (StatusDisplayType)
{
// Text
case StatusDisplayTypeEnum.Text:
return statusName;
// Icon
case StatusDisplayTypeEnum.Icon:
if (!String.IsNullOrEmpty(iconPath))
{
return "

";
}
return statusName;
// Icon and text
case StatusDisplayTypeEnum.IconAndText:
if (!String.IsNullOrEmpty(iconPath))
{
return "
" + statusName;
}
return statusName;
}
}
return row.ToString();
case "assigneeformattedfullname":
row = (DataRowView)parameter;
string assigneeUserName = ValidationHelper.GetString(row["AssigneeUserName"], String.Empty);
string assigneeFullName = ValidationHelper.GetString(row["AssigneeFullName"], String.Empty);
return HTMLHelper.HTMLEncode(Functions.GetFormattedUserName(assigneeUserName, assigneeFullName, IsLiveSite));
case "ownerformattedfullname":
row = (DataRowView)parameter;
string ownerUserName = ValidationHelper.GetString(row["OwnerUserName"], String.Empty);
string ownerFullName = ValidationHelper.GetString(row["OwnerFullName"], String.Empty);
return HTMLHelper.HTMLEncode(Functions.GetFormattedUserName(ownerUserName, ownerFullName, IsLiveSite));
// Display name with link - used in webparts
case "linkeddisplayname":
row = (DataRowView)parameter;
string displayName = ValidationHelper.GetString(row["ProjectTaskDisplayName"], String.Empty);
int projectTaskID = ValidationHelper.GetInteger(row["ProjectTaskID"], 0);
string url = SettingsKeyProvider.GetStringValue(CMSContext.CurrentSiteName + ".CMSTaskDetailPage");
return String.Format("{2}", url + "?ProjectTaskID=" + projectTaskID, HTMLHelper.HTMLEncode(displayName), HTMLHelper.HTMLEncode(TextHelper.LimitLength(displayName, MAX_TITLE_LENGTH)));
// Display name with link to ajax window
case "editlinkdisplayname":
row = (DataRowView)parameter;
string editDisplayName = ValidationHelper.GetString(row["ProjectTaskDisplayName"], String.Empty);
int editProjectTaskID = ValidationHelper.GetInteger(row["ProjectTaskID"], 0);
return String.Format("{1}", HTMLHelper.HTMLEncode(editDisplayName), HTMLHelper.HTMLEncode(TextHelper.LimitLength(editDisplayName, MAX_TITLE_LENGTH)));
}
return parameter;
}
///
/// Handles UniGrid's OnAction event.
///
/// Name of the action which should be performed
/// ID of the item the action should be performed with
protected void gridElem_OnAction(string actionName, object actionArgument)
{
showArrows = GetSortingArrowsVisibility();
int projectTaskId = ValidationHelper.GetInteger(actionArgument, 0);
RaiseOnAction(actionName, actionArgument);
if (projectTaskId > 0)
{
switch (actionName.ToLowerCSafe())
{
case "edit":
SelectedItemID = projectTaskId;
RaiseOnEdit();
break;
case "delete":
// Delete the object
SelectedItemID = projectTaskId;
if (CheckPermissions("CMS.ProjectManagement", ProjectManagementPermissionType.DELETE, PERMISSION_MANAGE))
{
// Use try/catch due to license check
try
{
ProjectTaskInfoProvider.DeleteProjectTaskInfo(projectTaskId);
RaiseOnDelete();
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
// Reload data
gridElem.ReloadData();
break;
case "up":
// Do not check permissions for user order
if ((OrderByType != ProjectTaskOrderByEnum.ProjectOrder) || (CheckPermissions("CMS.ProjectManagement", ProjectManagementPermissionType.MODIFY, PERMISSION_MANAGE)
&& showArrows))
{
// Use try/catch due to license check
try
{
gridElem.SortDirect = string.Empty;
gridElem.ReloadData();
ProjectTaskInfoProvider.MoveTaskUp(projectTaskId, OrderByType);
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
break;
case "down":
// Do not check permissions for user order
if ((OrderByType != ProjectTaskOrderByEnum.ProjectOrder) || (CheckPermissions("CMS.ProjectManagement", ProjectManagementPermissionType.MODIFY, PERMISSION_MANAGE)
&& showArrows))
{
// Use try/catch due to license check
try
{
gridElem.SortDirect = string.Empty;
gridElem.ReloadData();
ProjectTaskInfoProvider.MoveTaskDown(projectTaskId, OrderByType);
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
break;
case "reminder":
ReminderTaskID = projectTaskId;
txtReminderText.Text = string.Empty;
ShowReminderPopup();
break;
}
}
}
///
/// Reminder button OK clicked.
///
/// Sender object
/// Event args
protected void btnReminderOK_onClick(object sender, EventArgs e)
{
string errorMessage = "";
if (txtReminderText.Text.Length > 0)
{
ProjectTaskInfo taskInfo = ProjectTaskInfoProvider.GetProjectTaskInfo(ReminderTaskID);
if (taskInfo != null)
{
if (taskInfo.ProjectTaskAssignedToUserID > 0)
{
ProjectTaskInfoProvider.SendNotificationEmail(ProjectTaskEmailNotificationTypeEnum.TaskReminder, taskInfo, CMSContext.CurrentSiteName, txtReminderText.Text);
ShowConfirmation(GetString("pm.projecttask.remindersent"));
}
else
{
errorMessage = GetString("pm.projecttask.remindernoassignee");
}
}
}
else
{
errorMessage = GetString("pm.projecttask.remindermessageerror");
}
if (String.IsNullOrEmpty(errorMessage))
{
CloseAjaxWindow();
}
else
{
ShowReminderPopup();
lblReminderError.Text = errorMessage;
}
}
#endregion
#region "IPostBackEventHandler Members"
public void RaisePostBackEvent(string eventArgument)
{
int id = ValidationHelper.GetInteger(eventArgument, 0);
RaiseOnAction("edit", id);
}
#endregion
#region "Private methods"
///
/// Close ajax window.
///
private void CloseAjaxWindow()
{
reminderPopupDialog.Hide();
}
///
/// Show the reminder popup.
///
private void ShowReminderPopup()
{
reminderPopupDialog.Show();
titleElem.TitleText = GetString("pm.projecttask.reminder");
titleElem.TitleImage = GetImageUrl("Objects/PM_ProjectTask/reminder.png");
}
///
/// Build where condition for query.
///
private void BuildConditions()
{
showArrows = GetSortingArrowsVisibility();
// Check whether groups should be checked
if (!IgnoreCommunityGroup)
{
// Display only tasks related to specific group or do not display any group task
if (CommunityGroupID > 0)
{
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "ProjectGroupID = " + CommunityGroupID);
}
else
{
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "ProjectGroupID IS NULL");
}
}
// Show tasks of the current site for project list
if (ProjectID > 0)
{
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "(ProjectSiteID IS NULL) OR (ProjectSiteID = " + CMSContext.CurrentSiteID) + ")";
}
// Show tasks with dependence on sitename setting for task list
else
{
// Check whether sitename is required
if (!String.IsNullOrEmpty(SiteName))
{
SiteInfo si = SiteInfoProvider.GetSiteInfo(SiteName);
// Display tasks only for specific site
if (si != null)
{
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "(ProjectSiteID IS NULL) OR (ProjectSiteID = " + si.SiteID + ")");
}
// If sitename wasn't found do not display any records
else
{
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "1=2");
}
}
}
// Check if the user has "Read" permissions to the module, if yes then show all tasks, if no then show only task which are NOT private
CurrentUserInfo cui = CMSContext.CurrentUser;
if (ProjectID > 0)
{
// Show only tasks related to project
gridElem.WhereCondition = SqlHelperClass.AddWhereCondition(gridElem.WhereCondition, "ProjectTaskProjectID =" + ProjectID);
}
// Raise build condition
gridElem.WhereCondition = RaiseBuildCondition();
}
///
/// Gets the sorting arrows visibility according to the settings of the project or other circumstances.
///
private bool GetSortingArrowsVisibility()
{
bool arrowsVisible = false;
// Hide/show sorting arrows with dependence on project ordering
if (ProjectID > 0)
{
if (ProjectInfoProvider.IsAuthorizedPerProject(ProjectID, ProjectManagementPermissionType.MODIFY, CMSContext.CurrentUser)
|| CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.ProjectManagement", PERMISSION_MANAGE))
{
arrowsVisible = true;
if (OrderByType == ProjectTaskOrderByEnum.ProjectOrder)
{
ProjectInfo projectObj = ProjectInfoProvider.GetProjectInfo(ProjectID);
if (projectObj != null)
{
arrowsVisible = projectObj.ProjectAllowOrdering;
}
}
}
}
// Tasks list only
else
{
// Show sorting only for all site tasks
if (String.IsNullOrEmpty(SiteName))
{
arrowsVisible = true;
}
}
return arrowsVisible;
}
#endregion
}