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
}