using System; using System.Data; using System.Collections; using System.Threading; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.ProjectManagement; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.DocumentEngine; using CMS.UIControls; using CMS.ExtendedControls; using TreeNode = CMS.DocumentEngine.TreeNode; public partial class CMSModules_ProjectManagement_Controls_UI_ProjectTask_Edit : CMSAdminEditControl { #region "Variables" private ProjectTaskInfo mProjectTaskObj = null; private int mProjectID = 0; private int mProjectTaskAssigneeID = 0; private int mProjectTaskOwnerID = 0; private bool mShowOKButton = true; private bool mDisplayTaskUrl = false; #endregion #region "Properties" /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return plcMess; } } /// /// Indicates if control is used on live site /// public override bool IsLiveSite { get { return base.IsLiveSite; } set { base.IsLiveSite = value; plcMess.IsLiveSite = value; txtProjectTaskDisplayName.IsLiveSite = value; } } /// /// Gets or sets the value that indicates whether task url should be displayed. /// public bool DisplayTaskURL { get { return mDisplayTaskUrl; } set { mDisplayTaskUrl = value; } } /// /// Gets or sets the value that indicates whether validators should be disabled /// If true only server side validation will be working /// public bool DisableOnSiteValidators { get { return ValidationHelper.GetBoolean(GetValue("DisableOnSiteValidators"), false); } set { SetValue("DisableOnSiteValidators", value); } } /// /// Gets or sets the value that indicates whether OK button should be displayed. /// public bool ShowOKButton { get { return mShowOKButton; } set { mShowOKButton = value; } } /// /// Gets or sets the project task info object. /// public ProjectTaskInfo ProjectTaskObj { get { if (mProjectTaskObj == null) { mProjectTaskObj = ProjectTaskInfoProvider.GetProjectTaskInfo(ItemID); } return mProjectTaskObj; } set { mProjectTaskObj = value; } } /// /// ID of task's project. /// public int ProjectGroupID { get { // First check if task has project if (ProjectTaskObj != null) { ProjectInfo pi = ProjectInfoProvider.GetProjectInfo(ProjectTaskObj.ProjectTaskProjectID); if (pi != null) { return pi.ProjectGroupID; } } return ModuleCommands.CommunityGetCurrentGroupID(); } } /// /// Task's project ID. /// public int ProjectID { get { return mProjectID; } set { mProjectID = value; } } /// /// Task assignee ID. /// public int ProjectTaskAssigneeID { set { mProjectTaskAssigneeID = value; } } /// /// Task owner ID. /// public int ProjectTaskOwnerID { set { mProjectTaskOwnerID = value; } } #endregion #region "Page events" protected override void OnInit(EventArgs e) { // DelayedReload selectorAssignee.UniSelector.Value = "-1"; selectorOwner.UniSelector.Value = "-1"; base.OnInit(e); } protected void Page_Load(object sender, EventArgs e) { SetupControls(); // Set edited task if (ProjectTaskObj != null) { // Check if the project exists EditedObject = ProjectTaskObj; } // Check whether the project still exists if ((ProjectID > 0) && (ProjectInfoProvider.GetProjectInfo(ProjectID) == null)) { RedirectToInformation("editedobject.notexists"); } // Initialize HTML Editor htmlTaskDescription.AutoDetectLanguage = false; htmlTaskDescription.DefaultLanguage = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; htmlTaskDescription.EditorAreaCSS = ""; htmlTaskDescription.ToolbarSet = "ProjectManagement"; // Check stop processing if (StopProcessing) { return; } ReloadData(); btnOk.Visible = ShowOKButton; // Set associated controls for form controls due to validity lblProjectTaskOwnerID.AssociatedControlClientID = selectorOwner.ValueElementID; lblProjectTaskAssignedToUserID.AssociatedControlClientID = selectorAssignee.ValueElementID; } public override void ReloadData(bool forceReload) { // Load the form data if (forceReload || !URLHelper.IsPostback()) { LoadData(); } // Set current group id to the user selectors selectorAssignee.GroupID = ProjectGroupID; selectorOwner.GroupID = ProjectGroupID; base.ReloadData(forceReload); } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); // Load data for Task URL field if ((DisplayTaskURL) && (ItemID != 0)) { string url = CreateTaskURL(); if (!String.IsNullOrEmpty(url)) { plcTaskUrl.Visible = true; txtTaskUrl.Text = url; } else { plcTaskUrl.Visible = false; } } else { plcTaskUrl.Visible = false; } } /// /// CreateURL of current task from current document. /// private string CreateTaskURL() { String url = String.Empty; if (ProjectTaskObj != null) { if (ProjectTaskObj.ProjectTaskProjectID != 0) { // Find project node url ProjectInfo pi = ProjectInfoProvider.GetProjectInfo(ProjectTaskObj.ProjectTaskProjectID); if (pi != null) { TreeProvider tree = new TreeProvider(CMSContext.CurrentUser); TreeNode treeNode = tree.SelectSingleNode(pi.ProjectNodeID); if (treeNode != null) { SiteInfo si = SiteInfoProvider.GetSiteInfo(pi.ProjectSiteID); if (si != null) { // Create absolute URL of project's node url = URLHelper.GetAbsoluteUrl(CMSContext.GetUrl(treeNode.NodeAliasPath, String.Empty, si.SiteName)); // Add projectID as parameter url = URLHelper.UpdateParameterInUrl(url, "projectid", ProjectTaskObj.ProjectTaskProjectID.ToString()); // Add taskID as parameter url = URLHelper.UpdateParameterInUrl(url, "taskid", ProjectTaskObj.ProjectTaskID.ToString()); } } } } else { // If Ad hoc task create url to current node url = URLHelper.GetAbsoluteUrl(URLHelper.CurrentURL); // Remove query url = URLHelper.RemoveQuery(url); // Add task ID url = URLHelper.UpdateParameterInUrl(url, "taskid", ProjectTaskObj.ProjectTaskID.ToString()); } } return url; } protected void btnOk_Click(object sender, EventArgs e) { // Validate and save the data Save(); } #endregion #region "Private methods" /// /// Initializes form controls. /// private void SetupControls() { // Button // btnOk.Text = GetString("general.ok"); htmlTaskDescription.IsLiveSite = IsLiveSite; // Set labels/tooltips lblProjectTaskHours.Text = "(" + GetString("pm.projecttask.hours") + ")"; lblProjectTaskDisplayName.ToolTip = GetString("pm.projecttask.tooltip.displayname"); lblProjectTaskAssignedToUserID.ToolTip = GetString("pm.projecttask.tooltip.assignee"); lblProjectTaskProgress.ToolTip = GetString("pm.projecttask.tooltip.progress"); lblProjectTaskEstimate.ToolTip = GetString("pm.projecttask.tooltip.estimate"); lblProjectTaskOwnerID.ToolTip = GetString("pm.projecttask.tooltip.owner"); lblProjectTaskDeadline.ToolTip = GetString("pm.projecttask.tooltip.deadline"); lblProjectTaskStatusID.ToolTip = GetString("pm.projecttask.tooltip.status"); lblProjectTaskPriorityID.ToolTip = GetString("pm.projecttask.tooltip.priority"); lblProjectTaskIsPrivate.ToolTip = GetString("pm.projecttask.tooltip.private"); lblProjectTaskDescription.ToolTip = GetString("pm.projecttask.tooltip.description"); lblTaskUrl.ToolTip = GetString("pm.projecttask.tooltip.taskUrl"); // Disable validators if it is required if (DisableOnSiteValidators) { rfvProjectTaskDisplayName.Enabled = false; rvHours.Enabled = false; regexProgress.Enabled = false; } // Validators rfvProjectTaskDisplayName.ErrorMessage = GetString("general.requiresdisplayname"); regexProgress.ErrorMessage = GetString("pm.projecttask.intnumber"); rvHours.ErrorMessage = GetString("pm.projecttask.positivenumber"); // user filter settings selectorAssignee.IsLiveSite = IsLiveSite; selectorAssignee.ShowSiteFilter = false; selectorAssignee.ApplyValueRestrictions = false; selectorOwner.IsLiveSite = IsLiveSite; selectorOwner.ShowSiteFilter = false; selectorOwner.ApplyValueRestrictions = false; if (IsLiveSite) { selectorAssignee.HideDisabledUsers = true; selectorAssignee.HideNonApprovedUsers = true; selectorAssignee.HideHiddenUsers = true; selectorOwner.HideDisabledUsers = true; selectorOwner.HideNonApprovedUsers = true; selectorOwner.HideHiddenUsers = true; } // Display 'Changes were saved' message if required if (QueryHelper.GetBoolean("saved", false) && !URLHelper.IsPostback()) { ShowChangesSaved(); } } /// /// Loads the data into the form. /// private void LoadData() { // If dealayed reload or not postback with not delayed reload if (!URLHelper.IsPostback() || (drpTaskStatus.Items.Count == 0)) { drpTaskStatus.DataSource = ProjectTaskStatusInfoProvider.GetProjectTaskStatuses(true); drpTaskStatus.DataValueField = "TaskStatusID"; drpTaskStatus.DataTextField = "TaskStatusDisplayName"; drpTaskStatus.DataBind(); drpTaskPriority.DataSource = ProjectTaskPriorityInfoProvider.GetProjectTaskPriorities(true); drpTaskPriority.DataValueField = "TaskPriorityID"; drpTaskPriority.DataTextField = "TaskPriorityDisplayName"; drpTaskPriority.DataBind(); } // Clear selector selection selectorOwner.UniSelector.Value = String.Empty; selectorAssignee.UniSelector.Value = String.Empty; // Load the form from the info object if (ProjectTaskObj != null) { txtProjectTaskDisplayName.Text = ProjectTaskObj.ProjectTaskDisplayName; if (ProjectTaskObj.ProjectTaskAssignedToUserID > 0) { selectorAssignee.UniSelector.Value = ProjectTaskObj.ProjectTaskAssignedToUserID; selectorAssignee.ReloadData(); } txtProjectTaskProgress.Text = ProjectTaskObj.ProjectTaskProgress.ToString(); txtProjectTaskHours.Text = ProjectTaskObj.ProjectTaskHours.ToString(); if (ProjectTaskObj.ProjectTaskOwnerID > 0) { selectorOwner.UniSelector.Value = ProjectTaskObj.ProjectTaskOwnerID; selectorOwner.ReloadData(); } dtpProjectTaskDeadline.SelectedDateTime = ProjectTaskObj.ProjectTaskDeadline; chkProjectTaskIsPrivate.Checked = ProjectTaskObj.ProjectTaskIsPrivate; htmlTaskDescription.ResolvedValue = ProjectTaskObj.ProjectTaskDescription; SetStatusDrp(ProjectTaskObj.ProjectTaskStatusID); SetPriorityDrp(ProjectTaskObj.ProjectTaskPriorityID); } else { // Set only available user CurrentUserInfo cui = CMSContext.CurrentUser; if (!IsLiveSite || !cui.UserIsDisabledManually) { // Load default data selectorOwner.UniSelector.Value = (mProjectTaskOwnerID > 0) ? mProjectTaskOwnerID : CMSContext.CurrentUser.UserID; selectorAssignee.UniSelector.Value = (mProjectTaskAssigneeID > 0) ? mProjectTaskAssigneeID : CMSContext.CurrentUser.UserID; selectorAssignee.ReloadData(); selectorOwner.ReloadData(); } LoadDefaultPriority(); } } /// /// Saves the data. /// public bool Save() { // Validate the form if (Validate()) { // New task if (ProjectTaskObj == null) { // New task - check permission of project task (ad-hoc task are allowed to create) if (!CheckPermissions("CMS.ProjectManagement", ProjectManagementPermissionType.CREATE, PERMISSION_MANAGE)) { return false; } ProjectTaskInfo pi = new ProjectTaskInfo(); pi.ProjectTaskProjectOrder = 0; pi.ProjectTaskUserOrder = 0; pi.ProjectTaskProjectID = ProjectID; pi.ProjectTaskCreatedByID = CMSContext.CurrentUser.UserID; mProjectTaskObj = pi; } else { ItemID = ProjectTaskObj.ProjectTaskID; if (!CheckPermissions("CMS.ProjectManagement", ProjectManagementPermissionType.MODIFY, PERMISSION_MANAGE)) { return false; } } // Initialize object ProjectTaskObj.ProjectTaskDisplayName = txtProjectTaskDisplayName.Text.Trim(); int assignedToUserId = ValidationHelper.GetInteger(selectorAssignee.UniSelector.Value, 0); if (assignedToUserId != ProjectTaskObj.ProjectTaskAssignedToUserID) { // If the task is reassigned - reset user order ProjectTaskObj.ProjectTaskUserOrder = ProjectTaskInfoProvider.GetTaskMaxOrder(ProjectTaskOrderByEnum.UserOrder, assignedToUserId) + 1; ProjectTaskObj.ProjectTaskAssignedToUserID = assignedToUserId; } ProjectTaskObj.ProjectTaskProgress = ValidationHelper.GetInteger(txtProjectTaskProgress.Text, 0); ProjectTaskObj.ProjectTaskHours = ValidationHelper.GetDouble(txtProjectTaskHours.Text, 0); ProjectTaskObj.ProjectTaskOwnerID = ValidationHelper.GetInteger(selectorOwner.UniSelector.Value, 0); ProjectTaskObj.ProjectTaskDeadline = dtpProjectTaskDeadline.SelectedDateTime; if ((ProjectTaskObj.ProjectTaskDeadline != DateTimeHelper.ZERO_TIME) && (ProjectTaskObj.ProjectTaskDeadline > DateTime.Now)) { ProjectTaskObj.ProjectTaskNotificationSent = false; } ProjectTaskObj.ProjectTaskStatusID = ValidationHelper.GetInteger(drpTaskStatus.SelectedValue, 0); ProjectTaskObj.ProjectTaskPriorityID = ValidationHelper.GetInteger(drpTaskPriority.SelectedValue, 0); ProjectTaskObj.ProjectTaskIsPrivate = chkProjectTaskIsPrivate.Checked; ProjectTaskObj.ProjectTaskDescription = htmlTaskDescription.ResolvedValue; // Use try/catch due to license check try { // Save object data to database ProjectTaskInfoProvider.SetProjectTaskInfo(ProjectTaskObj); ItemID = ProjectTaskObj.ProjectTaskID; RaiseOnSaved(); ShowChangesSaved(); return true; } catch (Exception ex) { ShowError(ex.Message); } } return false; } /// /// Validates the form. If validation succeeds returns true, otherwise returns false. /// private bool Validate() { // Validate required fields string errorMessage = new Validator() .NotEmpty(txtProjectTaskDisplayName.Text.Trim(), rfvProjectTaskDisplayName.ErrorMessage).Result; if (!dtpProjectTaskDeadline.IsValidRange()) { errorMessage = GetString("general.errorinvaliddatetimerange"); } // Check if progress is out of range if (txtProjectTaskProgress.Text.Length > 0) { regexProgress.Validate(); if ((!regexProgress.IsValid) || (!ValidationHelper.IsInteger(txtProjectTaskProgress.Text))) { errorMessage = GetString("pm.projecttask.progressrange"); } else { int progress = ValidationHelper.GetInteger(txtProjectTaskProgress.Text, 0); if ((progress < 0) || (progress > 100) || (txtProjectTaskProgress.Text.Length > 3)) { errorMessage = GetString("pm.projecttask.progressrange"); } } } // Check if hours is out of range if (txtProjectTaskHours.Text.Length > 0) { rvHours.Validate(); if ((!rvHours.IsValid) || (!ValidationHelper.IsDouble(txtProjectTaskHours.Text))) { errorMessage = GetString("pm.projecttask.estimate") + " " + rvHours.ErrorMessage.ToLowerCSafe(); } else { double hours = ValidationHelper.GetDouble(txtProjectTaskHours.Text, 0); if (hours < 0) { errorMessage = GetString("pm.projecttask.positivenumber"); } } } // Check if there is at least one status defined if (ValidationHelper.GetInteger(drpTaskStatus.SelectedValue, 0) == 0) { errorMessage = GetString("pm.projecttaskstatus.warningnorecord"); } // Check if there is at least one status defined if (ValidationHelper.GetInteger(drpTaskStatus.SelectedValue, 0) == 0) { errorMessage = GetString("pm.projecttaskpriority.warningnorecord"); } // Set the error message if (!String.IsNullOrEmpty(errorMessage)) { ShowError(errorMessage); return false; } return true; } /// /// Selects status in the drop down list. /// /// The selected value private void SetStatusDrp(int value) { if (drpTaskStatus.Items.FindByValue(value.ToString()) == null) { // Status not found (is disabled) - add manually ProjectTaskStatusInfo status = ProjectTaskStatusInfoProvider.GetProjectTaskStatusInfo(value); drpTaskStatus.Items.Add(new ListItem(status.TaskStatusDisplayName, status.TaskStatusID.ToString())); } drpTaskStatus.SelectedValue = value.ToString(); } /// /// Selects priority in the drop down list. /// /// The selected value private void SetPriorityDrp(int value) { if (drpTaskPriority.Items.FindByValue(value.ToString()) == null) { // Priority not found (is disabled) - add manually ProjectTaskPriorityInfo priority = ProjectTaskPriorityInfoProvider.GetProjectTaskPriorityInfo(value); drpTaskPriority.Items.Add(new ListItem(priority.TaskPriorityDisplayName, priority.TaskPriorityID.ToString())); } drpTaskPriority.SelectedValue = value.ToString(); } /// /// Loads and set default priority. /// private void LoadDefaultPriority() { ProjectTaskPriorityInfo defaultPriority = ProjectTaskPriorityInfoProvider.GetDefaultPriority(); if (defaultPriority != null) { try { drpTaskPriority.SelectedValue = defaultPriority.TaskPriorityID.ToString(); } catch { } } } /// /// Clears current form. /// public override void ClearForm() { mProjectTaskObj = null; txtProjectTaskDisplayName.Text = String.Empty; txtProjectTaskHours.Text = String.Empty; txtProjectTaskProgress.Text = String.Empty; chkProjectTaskIsPrivate.Checked = false; dtpProjectTaskDeadline.SelectedDateTime = DateTimeHelper.ZERO_TIME; selectorOwner.UniSelector.Value = String.Empty; selectorAssignee.UniSelector.Value = String.Empty; htmlTaskDescription.Value = String.Empty; drpTaskStatus.SelectedIndex = 0; LoadDefaultPriority(); base.ClearForm(); } /// /// Sets the error text. /// /// Error message public void SetError(string errorText) { // Check whether error message is defined if (!String.IsNullOrEmpty(errorText)) { ShowError(errorText); } } #endregion }