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.GlobalHelper; using CMS.ProjectManagement; using CMS.SettingsProvider; using CMS.DocumentEngine; using CMS.UIControls; using CMS.ExtendedControls; using TreeNode = CMS.DocumentEngine.TreeNode; public partial class CMSModules_ProjectManagement_Controls_UI_Project_Edit : CMSAdminEditControl { #region "Variables" private ProjectInfo mProjectObj = null; private int mProjectId = 0; private bool mDelayedReload = false; private int mProjectNodeID = 0; private Guid mCodenameGuid = Guid.Empty; #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; txtProjectDisplayName.IsLiveSite = value; txtProjectDescription.IsLiveSite = 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 the project info object. /// public ProjectInfo ProjectObj { get { if (mProjectObj == null) { mProjectObj = ProjectInfoProvider.GetProjectInfo(ProjectID); } return mProjectObj; } } /// /// Gets the guid which should be used for codename in simple mode. /// protected Guid CodenameGUID { get { if (mCodenameGuid == Guid.Empty) { mCodenameGuid = Guid.NewGuid(); } return mCodenameGuid; } } /// /// If false don't display ok button. /// public bool ShowOKButton { get { return ValidationHelper.GetBoolean(GetValue("ShowOKButton"), true); } set { SetValue("ShowOKButton", value); } } /// /// Gets or sets the value that indicates whether page selector should be displayed. /// public bool ShowPageSelector { get { return ValidationHelper.GetBoolean(GetValue("ShowPageSelector"), true); } set { SetValue("ShowPageSelector", value); } } /// /// ID of group where project belongs to. /// public int CommunityGroupID { get { return ValidationHelper.GetInteger(GetValue("CommunityGroupID"), 0); } set { SetValue("CommunityGroupID", value); userSelector.GroupID = CommunityGroupID; } } /// /// ID of document where project belongs to. /// public int ProjectNodeID { get { return mProjectNodeID; } set { mProjectNodeID = value; } } /// /// Project ID. /// public int ProjectID { get { return mProjectId; } set { mProjectId = value; mProjectObj = null; } } /// /// Indicates delayed reload not from page_load. /// public bool DelayedReload { get { return mDelayedReload; } set { mDelayedReload = value; } } #endregion #region "Page events" protected override void OnInit(EventArgs e) { userSelector.UniSelector.Value = "-1"; pageSelector.Value = "-1"; base.OnInit(e); } protected void Page_Load(object sender, EventArgs e) { if (StopProcessing) { return; } drpProjectStatus.DataBound += new EventHandler(drpProjectStatus_DataBound); SetupControls(); // Set edited object if (ProjectID > 0) { EditedObject = ProjectObj; } // Load the form data if ((!URLHelper.IsPostback()) && (!DelayedReload)) { LoadData(); } btnOk.Visible = ShowOKButton; // Set associated controls for form controls due to validity lblProjectOwner.AssociatedControlClientID = userSelector.ValueElementID; lblProjectPage.AssociatedControlClientID = pageSelector.ValueElementID; } protected void btnOk_Click(object sender, EventArgs e) { // Validate and save the data Save(); } #endregion #region "Public Methods" /// /// Saves control with actual data. /// public bool Save() { if (!CheckPermissions("CMS.ProjectManagement", PERMISSION_MANAGE)) { return false; } // Validate the form if (Validate()) { // Indicates whether project is new bool isNew = false; int progress = 0; // Ensure the info object if (ProjectObj == null) { // New project ProjectInfo pi = new ProjectInfo(); // First initialization of the Access property - allow authenticated users pi.ProjectAccess = 1222; pi.ProjectCreatedByID = CMSContext.CurrentUser.UserID; pi.ProjectOwner = 0; if (CommunityGroupID != 0) { pi.ProjectGroupID = CommunityGroupID; // Set default access to the group pi.ProjectAccess = 3333; } mProjectObj = pi; isNew = true; } else { // Existing project // Reset ProjectOrder if checkbox was unchecked if ((ProjectObj.ProjectAllowOrdering) && (!chkProjectAllowOrdering.Checked)) { ProjectInfoProvider.ResetProjectOrder(ProjectObj.ProjectID); } // Clear the hashtables if the codename has been changed if ((ProjectObj.ProjectGroupID > 0) && ProjectObj.ProjectName != txtProjectName.Text) { ProjectInfoProvider.Clear(true); } progress = ProjectInfoProvider.GetProjectProgress(ProjectObj.ProjectID); } ltrProjectProgress.Text = ProjectTaskInfoProvider.GenerateProgressHtml(progress, true); // Initialize object ProjectObj.ProjectSiteID = CMSContext.CurrentSiteID; if (DisplayMode == ControlDisplayModeEnum.Simple) { if (isNew) { ProjectObj.ProjectName = ValidationHelper.GetCodeName(txtProjectDisplayName.Text, 50) + ((CommunityGroupID > 0) ? "_group_" : "_general_") + CodenameGUID; } } else { ProjectObj.ProjectName = txtProjectName.Text.Trim(); } ProjectObj.ProjectDisplayName = txtProjectDisplayName.Text.Trim(); ProjectObj.ProjectDescription = txtProjectDescription.Text.Trim(); ProjectObj.ProjectStartDate = dtpProjectStartDate.SelectedDateTime; ProjectObj.ProjectDeadline = dtpProjectDeadline.SelectedDateTime; ProjectObj.ProjectOwner = ValidationHelper.GetInteger(userSelector.UniSelector.Value, 0); ProjectObj.ProjectStatusID = ValidationHelper.GetInteger(drpProjectStatus.SelectedValue, 0); ProjectObj.ProjectAllowOrdering = chkProjectAllowOrdering.Checked; // Set ProjectNodeID if (!ShowPageSelector) { // Set current node id for new project if (isNew && (CMSContext.CurrentDocument != null)) { ProjectObj.ProjectNodeID = CMSContext.CurrentDocument.NodeID; } } else { TreeProvider treeProvider = new TreeProvider(); TreeNode node = treeProvider.SelectSingleNode(ValidationHelper.GetGuid(pageSelector.Value, Guid.Empty), TreeProvider.ALL_CULTURES, CMSContext.CurrentSiteName); if (node != null) { ProjectObj.ProjectNodeID = node.NodeID; } else { ProjectObj.ProjectNodeID = 0; } } // Use try/catch due to license check try { // Save object data to database ProjectInfoProvider.SetProjectInfo(ProjectObj); ProjectID = ProjectObj.ProjectID; ItemID = ProjectObj.ProjectID; RaiseOnSaved(); // Set the info message ShowChangesSaved(); return true; } catch (Exception ex) { ShowError(ex.Message); } } return false; } /// /// Sets the error text. /// /// Error message public void SetError(string errorText) { // Check whether error message is defined if (!String.IsNullOrEmpty(errorText)) { ShowError(errorText); } } #endregion #region "Private methods" /// /// Initializes form controls. /// private void SetupControls() { // Button btnOk.Text = GetString("general.ok"); // Set tooltips lblProjectDisplayName.ToolTip = GetString("pm.project.tooltip.displayname"); lblProjectName.ToolTip = GetString("pm.project.tooltip.codename"); lblProjectDescription.ToolTip = GetString("pm.project.tooltip.description"); lblProjectStartDate.ToolTip = GetString("pm.project.tooltip.startdate"); lblProjectDeadline.ToolTip = GetString("pm.project.tooltip.deadline"); lblProjectProgress.ToolTip = GetString("pm.project.tooltip.progress"); lblProjectOwner.ToolTip = GetString("pm.project.tooltip.owner"); lblProjectStatusID.ToolTip = GetString("pm.project.tooltip.status"); lblProjectPage.ToolTip = GetString("pm.project.tooltip.page"); lblProjectAllowOrdering.ToolTip = GetString("pm.project.tooltip.allowOrdering"); // Disable validators if it is required if (DisableOnSiteValidators) { rfvProjectName.Enabled = false; rfvProjectDisplayName.Enabled = false; } // Validator texts rfvProjectName.ErrorMessage = GetString("general.requirescodename"); rfvProjectDisplayName.ErrorMessage = GetString("general.requiresdisplayname"); pageSelector.IsLiveSite = IsLiveSite; pageSelector.EnableSiteSelection = false; // Page selector - show only documents of the current group if (CommunityGroupID > 0) { GeneralizedInfo infoObj = ModuleCommands.CommunityGetGroupInfo(CommunityGroupID); if (infoObj != null) { Guid groupNodeGUID = ValidationHelper.GetGuid(infoObj.GetValue("GroupNodeGUID"), Guid.Empty); if (groupNodeGUID != Guid.Empty) { TreeProvider treeProvider = new TreeProvider(); TreeNode node = treeProvider.SelectSingleNode(groupNodeGUID, TreeProvider.ALL_CULTURES, CMSContext.CurrentSiteName); if (node != null) { pageSelector.ContentStartingPath = HttpUtility.UrlEncode(node.NodeAliasPath); } } else { pageSelector.Enabled = false; } } } userSelector.IsLiveSite = IsLiveSite; userSelector.SiteID = CMSContext.CurrentSiteID; userSelector.ShowSiteFilter = false; userSelector.GroupID = CommunityGroupID; userSelector.ApplyValueRestrictions = false; // Hide hidden & disabled user on live site if (IsLiveSite) { userSelector.HideHiddenUsers = true; userSelector.HideDisabledUsers = true; userSelector.HideNonApprovedUsers = true; } // Hide page selector on live site if (!ShowPageSelector) { plcProjectPage.Visible = false; } // Hide codename textbox for simple display mode if (DisplayMode == ControlDisplayModeEnum.Simple) { plcCodeName.Visible = false; } // Display 'Changes were saved' message if required if (QueryHelper.GetBoolean("saved", false) && !URLHelper.IsPostback()) { ShowChangesSaved(); } } public override void ReloadData() { LoadData(); base.ReloadData(); } /// /// Loads the data into the form. /// public void LoadData() { // Check if the projects belongs to the current site if ((ProjectObj != null) && (ProjectObj.ProjectSiteID != CMSContext.CurrentSiteID)) { return; } // If dealayed reload or not postback with not delayed reload if (((!URLHelper.IsPostback()) && (!DelayedReload)) || (DelayedReload)) { LoadDropDown(); } // Load the form from the info object if (ProjectObj != null) { txtProjectName.Text = ProjectObj.ProjectName; txtProjectDisplayName.Text = ProjectObj.ProjectDisplayName; txtProjectDescription.Text = ProjectObj.ProjectDescription; dtpProjectStartDate.SelectedDateTime = ProjectObj.ProjectStartDate; dtpProjectDeadline.SelectedDateTime = ProjectObj.ProjectDeadline; int progress = ProjectInfoProvider.GetProjectProgress(ProjectObj.ProjectID); ltrProjectProgress.Text = ProjectTaskInfoProvider.GenerateProgressHtml(progress, true); if (ProjectObj.ProjectOwner != 0) { userSelector.UniSelector.Value = ProjectObj.ProjectOwner; userSelector.ReloadData(); } else { userSelector.UniSelector.Value = String.Empty; } chkProjectAllowOrdering.Checked = ProjectObj.ProjectAllowOrdering; SetStatusDrp(ProjectObj.ProjectStatusID); if (ProjectObj.ProjectNodeID != 0) { SetProjectPage(ProjectObj.ProjectNodeID); } } else { userSelector.UniSelector.Value = ""; CurrentUserInfo cui = CMSContext.CurrentUser; if (!IsLiveSite || !cui.UserIsDisabledManually) { // Load default data userSelector.UniSelector.Value = CMSContext.CurrentUser.UserID; } pageSelector.Value = String.Empty; if (ProjectNodeID != 0) { SetProjectPage(ProjectNodeID); } ltrProjectProgress.Text = ProjectTaskInfoProvider.GenerateProgressHtml(0, true); // Hide progress bar for a new project plcProgress.Visible = false; } } /// /// Loads the data to the status dropdown field. /// private void LoadDropDown() { drpProjectStatus.DataSource = ProjectStatusInfoProvider.GetProjectStatuses(true); drpProjectStatus.DataValueField = "StatusID"; drpProjectStatus.DataTextField = "StatusDisplayName"; drpProjectStatus.DataBind(); } void drpProjectStatus_DataBound(object sender, EventArgs e) { foreach (ListItem li in drpProjectStatus.Items) { li.Text = ResHelper.LocalizeString(li.Text); } } /// /// Validates the form. If validation succeeds returns true, otherwise returns false. /// private bool Validate() { string codename = txtProjectName.Text.Trim(); if (DisplayMode == ControlDisplayModeEnum.Simple) { codename = ValidationHelper.GetCodeName(txtProjectDisplayName.Text, 50) + ((CommunityGroupID > 0) ? "_group_" : "_general_") + CodenameGUID; } // Validate required fields string errorMessage = new Validator() .NotEmpty(txtProjectDisplayName.Text.Trim(), rfvProjectDisplayName.ErrorMessage) .NotEmpty(codename, rfvProjectName.ErrorMessage) .IsCodeName(codename, GetString("general.invalidcodename")).Result; if (!dtpProjectDeadline.IsValidRange() || !dtpProjectStartDate.IsValidRange()) { errorMessage = GetString("general.errorinvaliddatetimerange"); } // Check the uniqueness of the codename ProjectInfo pi = ProjectInfoProvider.GetProjectInfo(codename, CMSContext.CurrentSiteID, CommunityGroupID); if ((pi != null) && (pi.ProjectID != ProjectID)) { errorMessage = GetString("general.codenameexists"); } // Check if there is at least one status defined if (ValidationHelper.GetInteger(drpProjectStatus.SelectedValue, 0) == 0) { errorMessage = GetString("pm.projectstatus.warningnorecord"); } // Set the error message if (!String.IsNullOrEmpty(errorMessage)) { ShowError(errorMessage); return false; } return true; } /// /// Selects status the in drop down list. /// /// The selected value private void SetStatusDrp(int value) { if (drpProjectStatus.Items.FindByValue(value.ToString()) == null) { // Status not found (is disabled) - add manually ProjectStatusInfo status = ProjectStatusInfoProvider.GetProjectStatusInfo(value); if (status != null) { drpProjectStatus.Items.Add(new ListItem(status.StatusDisplayName, status.StatusID.ToString())); } } drpProjectStatus.SelectedValue = value.ToString(); } /// /// Sets the project page. /// /// The node ID private void SetProjectPage(int nodeID) { TreeProvider treeProvider = new TreeProvider(); TreeNode node = treeProvider.SelectSingleNode(nodeID); if (node != null) { pageSelector.Value = node.NodeGUID.ToString(); } } /// /// Clears form. /// public override void ClearForm() { txtProjectDescription.Text = String.Empty; txtProjectDisplayName.Text = String.Empty; txtProjectName.Text = String.Empty; chkProjectAllowOrdering.Checked = true; dtpProjectStartDate.SelectedDateTime = DateTimeHelper.ZERO_TIME; dtpProjectDeadline.SelectedDateTime = DateTimeHelper.ZERO_TIME; userSelector.UniSelector.Value = ""; drpProjectStatus.SelectedIndex = 0; pageSelector.Clear(); base.ClearForm(); } #endregion }