using System;
using System.Data;
using System.Collections;
using System.Data.SqlTypes;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.FormControls;
using CMS.GlobalHelper;
using CMS.OnlineMarketing;
using CMS.Scheduler;
using CMS.SettingsProvider;
using CMS.ExtendedControls;
using CMS.ExtendedControls.ActionsConfig;
using CMS.UIControls;
public partial class CMSModules_ContactManagement_Controls_UI_ContactGroup_Edit : CMSAdminEditControl
{
#region "Variables"
private int mSiteID = 0;
private int deleteScheduledTaskId = 0;
private TaskInfo task = null;
private HeaderAction mBtnEvaluate;
private HeaderAction mBtnSave;
string scheduleInterval = string.Empty;
#endregion
#region "Properties"
///
/// UIForm control used for editing objects properties.
///
public UIForm UIFormControl
{
get
{
return EditForm;
}
}
///
/// Indicates if the control should perform the operations.
///
public override bool StopProcessing
{
get
{
return base.StopProcessing;
}
set
{
base.StopProcessing = value;
EditForm.StopProcessing = value;
}
}
///
/// Indicates if the control is used on the live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
EditForm.IsLiveSite = value;
}
}
///
/// SiteID of current contact group.
///
public int SiteID
{
get
{
return mSiteID;
}
set
{
mSiteID = value;
if ((mSiteID > 0) && !CMSContext.CurrentUser.UserSiteManagerAdmin)
{
mSiteID = CMSContext.CurrentSiteID;
}
}
}
#endregion
#region "Page events"
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
EditForm.OnBeforeSave += new EventHandler(EditForm_OnBeforeSave);
EditForm.OnAfterSave += new EventHandler(EditForm_OnAfterSave);
InitHeaderActions(false);
}
protected void Page_Load(object sender, EventArgs e)
{
string url = "Frameset.aspx?groupid={%EditedObject.ID%}&saved=1";
url = URLHelper.AddParameterToUrl(url, "siteid", SiteID.ToString());
if (ContactHelper.IsSiteManager)
{
url = URLHelper.AddParameterToUrl(url, "issitemanager", "1");
}
EditForm.RedirectUrlAfterCreate = url;
// Get edited contact group
ContactGroupInfo cgi = (ContactGroupInfo)EditForm.EditedObject;
// Get scheduled task
if (cgi.ContactGroupScheduledTaskID > 0)
{
task = TaskInfoProvider.GetTaskInfo(cgi.ContactGroupScheduledTaskID);
}
if (!RequestHelper.IsPostBack())
{
// Hide dialog for condition when creating new contact group
plcUpdate.Visible = (cgi.ContactGroupID > 0);
chkSchedule.Checked = schedulerInterval.Visible = ((task != null) && task.TaskEnabled);
if (schedulerInterval.Visible)
{
// Initialize interval control
schedulerInterval.ScheduleInterval = task.TaskInterval;
}
}
// Set proper resolver to condition builder
conditionBuilder.ResolverName = "ContactResolver";
if (task != null)
{
// Display info panel for dynamic contact group
pnlInfo.Visible = true;
// Display basic info about dynamic contact group
InitInfoPanel(cgi, false);
}
}
#endregion
#region "Events"
///
/// OnBeforeSave event handler.
///
protected void EditForm_OnBeforeSave(object sender, EventArgs e)
{
// Set site ID only when creating new object
if ((EditForm.EditedObject != null))
{
int groupId = EditForm.EditedObject.Generalized.ObjectID;
if (groupId == 0)
{
if (SiteID > 0)
{
EditForm.Data["ContactGroupSiteID"] = SiteID;
}
else
{
EditForm.Data["ContactGroupSiteID"] = DBNull.Value;
}
}
else
{
if (!chkDynamic.Checked)
{
// Remove dynamic condition
EditForm.Data.SetValue("ContactGroupDynamicCondition", null);
// Remove dynamicaly created members
if (ValidationHelper.GetBoolean(hdnConfirmDelete.Value, false))
{
ContactGroupMemberInfoProvider.DeleteContactGroupMembers("ContactGroupMemberContactGroupID = " + groupId + " AND (ContactGroupMemberFromCondition = 1 AND (ContactGroupMemberFromAccount = 0 OR ContactGroupMemberFromAccount IS NULL) AND (ContactGroupMemberFromManual = 0 OR ContactGroupMemberFromManual IS NULL))", groupId, false, false);
}
}
else
{
// Get new condition
string condition = ((FormEngineUserControl)EditForm.FieldControls["ContactGroupDynamicCondition"]).Value.ToString();
// Display error if the condition is empty
if (string.IsNullOrEmpty(condition))
{
EditForm.StopProcessing = true;
EditForm.ErrorLabel.Text = GetString("om.contactgroup.nocondition");
}
else
{
// Get current object to compare dynamic conditions
ContactGroupInfo currentGroup = ContactGroupInfoProvider.GetContactGroupInfo(EditForm.EditedObject.Generalized.ObjectID);
if ((currentGroup != null) && (!condition.EqualsCSafe(currentGroup.ContactGroupDynamicCondition, true)))
{
// Set 'Rebuild required' status
EditForm.Data["ContactGroupStatus"] = 2;
}
}
}
}
}
}
///
/// OnAfterSave event handler.
///
protected void EditForm_OnAfterSave(object sender, EventArgs e)
{
// Get edited contact group
ContactGroupInfo cgi = (ContactGroupInfo)EditForm.EditedObject;
if (chkDynamic.Checked)
{
// Set info for scheduled task
task = GetScheduledTask(cgi);
// Update scheduled task
if (chkSchedule.Checked)
{
if (!schedulerInterval.CheckOneDayMinimum())
{
// If problem occurred while setting schedule interval
EditForm.ErrorLabel.Text = GetString("Newsletter_Edit.NoDaySelected");
EditForm.ErrorLabel.Visible = true;
EditForm.StopProcessing = true;
return;
}
if (!IsValidDate(SchedulingHelper.DecodeInterval(scheduleInterval).StartTime))
{
// Start date is not in valid format
EditForm.ErrorLabel.Text = GetString("Newsletter.IncorrectDate");
EditForm.ErrorLabel.Visible = true;
EditForm.StopProcessing = true;
return;
}
task.TaskInterval = scheduleInterval;
task.TaskNextRunTime = SchedulingHelper.GetNextTime(task.TaskInterval, new DateTime(), new DateTime());
task.TaskEnabled = true;
}
else
{
task.TaskInterval = scheduleInterval;
task.TaskNextRunTime = TaskInfoProvider.NO_TIME;
task.TaskEnabled = false;
}
TaskInfoProvider.SetTaskInfo(task);
cgi.ContactGroupScheduledTaskID = task.TaskID;
pnlInfo.Visible = true;
InitInfoPanel(cgi, true);
}
else
{
if (cgi.ContactGroupScheduledTaskID > 0)
{
// Store task ID for deletion
deleteScheduledTaskId = cgi.ContactGroupScheduledTaskID;
}
cgi.ContactGroupScheduledTaskID = 0;
cgi.ContactGroupStatus = ContactGroupStatusEnum.Unspecified;
schedulerInterval.Visible = false;
pnlInfo.Visible = false;
}
// Update contact group
ContactGroupInfoProvider.SetContactGroupInfo(cgi);
if (deleteScheduledTaskId > 0)
{
// Delete scheduled task if schedule evaluation was unchecked
TaskInfoProvider.DeleteTaskInfo(deleteScheduledTaskId);
}
InitHeaderActions(false);
((CMSPage)Page).CurrentMaster.HeaderActions.ReloadData();
// Refresh breadcrumbs after data are loaded
ScriptHelper.RefreshTabHeader(Page, null);
}
///
/// Checkbox chkDynamic event handler.
///
protected void chkDynamic_CheckedChanged(object sender, EventArgs e)
{
plcDynamic.Visible = chkDynamic.Checked;
// Set confirmation dialog
if (!chkDynamic.Checked)
{
ContactGroupInfo cgi = ContactGroupInfoProvider.GetContactGroupInfo(EditForm.EditedObject.Generalized.ObjectID);
if ((cgi != null) && (!String.IsNullOrEmpty(cgi.ContactGroupDynamicCondition)))
{
InitHeaderActions(true);
((CMSPage)Page).CurrentMaster.HeaderActions.ReloadData();
}
}
}
///
/// Checkbox chkSchedule event handler.
///
protected void chkSchedule_CheckedChanged(object sender, EventArgs e)
{
schedulerInterval.Visible = chkSchedule.Checked;
if (schedulerInterval.Visible && (task != null))
{
// Set scheduled interval
schedulerInterval.ScheduleInterval = task.TaskInterval;
schedulerInterval.ReloadData();
}
}
#endregion
#region "Methods"
///
/// Initializes header action control.
///
private void InitHeaderActions(bool confirmDelete)
{
bool isDynamic = !String.IsNullOrEmpty(ValidationHelper.GetString(EditForm.Data["ContactGroupDynamicCondition"], null));
if (!RequestHelper.IsPostBack())
{
plcDynamic.Visible = chkDynamic.Checked = isDynamic;
}
mBtnSave = mBtnSave ?? new SaveAction(Page);
if (confirmDelete)
{
ScriptHelper.RegisterStartupScript(Page, typeof(string), "ConfirmDelete", ScriptHelper.GetScript(
@"
function ConfirmDelete()
{
document.getElementById('" + hdnConfirmDelete.ClientID + "').value = confirm('" + GetString("om.contactgroup.ConfirmDelete") + @"');
}"));
mBtnSave.OnClientClick = "ConfirmDelete();";
}
else
{
mBtnSave.OnClientClick = String.Empty;
}
mBtnEvaluate = mBtnEvaluate ?? new HeaderAction()
{
ControlType = HeaderActionTypeEnum.Hyperlink,
Text = GetString("om.contacgroup.rebuild"),
ImageUrl = GetImageUrl("CMSModules/CMS_ContactManagement/evaluate.png"),
CommandName = "evaluate",
CommandArgument = "false",
Visible = isDynamic
};
HeaderActions.AddAction(mBtnSave);
HeaderActions.AddAction(mBtnEvaluate);
HeaderActions.ActionPerformed += HeaderActions_ActionPerformed;
}
///
/// Actions handler.
///
protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e)
{
if (ContactGroupHelper.AuthorizedModifyContactGroup(SiteID, true))
{
switch (e.CommandName.ToLowerCSafe())
{
case "save":
if (chkDynamic.Checked)
{
// Get scheduled interval string
scheduleInterval = schedulerInterval.ScheduleInterval;
}
// Save changes in the contact group
if (EditForm.SaveData(null))
{
mBtnEvaluate.Visible = chkDynamic.Checked;
ScriptHelper.RefreshTabHeader(Page, null);
}
break;
case "evaluate":
if (EditForm.EditedObject != null)
{
ContactGroupInfo cgi = (ContactGroupInfo)EditForm.EditedObject;
if (cgi != null)
{
// Set 'Rebuilding' status
cgi.ContactGroupStatus = ContactGroupStatusEnum.Rebuilding;
ContactGroupInfoProvider.SetContactGroupInfo(cgi);
// Evaluate the membership of the contact group
ContactGroupEvaluator evaluator = new ContactGroupEvaluator();
evaluator.ContactGroupID = cgi.ContactGroupID;
evaluator.Execute(null);
EditForm.InfoLabel.Text = GetString("om.contactgroup.evaluationstarted");
EditForm.InfoLabel.Visible = true;
// Get scheduled task and update last run time
if (cgi.ContactGroupScheduledTaskID > 0)
{
task = TaskInfoProvider.GetTaskInfo(cgi.ContactGroupScheduledTaskID);
if (task != null)
{
task.TaskLastRunTime = DateTime.Now;
TaskInfoProvider.SetTaskInfo(task);
// Initialize interval control
schedulerInterval.ScheduleInterval = task.TaskInterval;
schedulerInterval.ReloadData();
}
}
// Display basic info about dynamic contact group
InitInfoPanel(cgi, false);
}
}
break;
}
}
}
///
/// Returns scheduled task of the contact group or creates new one.
///
/// Contact group info
private TaskInfo GetScheduledTask(ContactGroupInfo cgi)
{
if (cgi == null)
{
return null;
}
if (cgi.ContactGroupScheduledTaskID > 0)
{
return TaskInfoProvider.GetTaskInfo(ValidationHelper.GetInteger(cgi.ContactGroupScheduledTaskID, 0)) ??
CreateScheduledTask(cgi);
}
else
{
return CreateScheduledTask(cgi);
}
}
///
/// Creates new scheduled task with basic properties set.
///
/// Contact group info
private TaskInfo CreateScheduledTask(ContactGroupInfo cgi)
{
return new TaskInfo()
{
TaskAssemblyName = "CMS.OnlineMarketing",
TaskClass = "CMS.OnlineMarketing.ContactGroupEvaluator",
TaskEnabled = true,
TaskLastResult = string.Empty,
TaskSiteID = cgi.ContactGroupSiteID,
TaskData = cgi.ContactGroupID.ToString(),
TaskDisplayName = "Contact group '" + cgi.ContactGroupDisplayName + "' rebuild",
TaskName = "ContactGroupRebuild_" + cgi.ContactGroupName,
TaskType = ScheduledTaskTypeEnum.System
};
}
///
/// Returns if start date of the scheduled interval is valid.
///
/// Start date of the scheduled interval
private bool IsValidDate(DateTime date)
{
return (date > SqlDateTime.MinValue.Value) && (date < SqlDateTime.MaxValue.Value);
}
///
/// Initializes panel with basic info.
///
/// Contact group info object
/// If TRUE number of group members is reloaded
private void InitInfoPanel(ContactGroupInfo cgi, bool forceReload)
{
if (cgi != null && task != null)
{
pnlInfo.GroupingText = GetString("om.contactgroup.info");
pnlInfo.Attributes.Add("style", "margin:0 30px;");
// Last evaluation time
if (task.TaskLastRunTime != DateTimeHelper.ZERO_TIME)
{
lblLastEvalValue.Text = task.TaskLastRunTime.ToString();
}
else
{
lblLastEvalValue.Text = GetString("general.na");
}
// Display contact group status...
switch (cgi.ContactGroupStatus)
{
case ContactGroupStatusEnum.Rebuilding:
// Status and progress if the status is 'Rebuilding'
ltrProgress.Text = String.Empty;
string buildStr = GetString("om.contactgroup.rebuilding");
ltrProgress.Text = "
";
lblStatusValue.Text = "" + buildStr + "";
break;
case ContactGroupStatusEnum.Ready:
// 'Ready' status
lblStatusValue.Text = "" + GetString("om.contactgroup.ready") + "";
break;
case ContactGroupStatusEnum.ConditionChanged:
// 'Condition changed' status
lblStatusValue.Text = "" + GetString("om.contactgroup.rebuildrequired") + "";
break;
}
// Display current number of contacts in the group
if (!RequestHelper.IsPostBack() || (cgi.ContactGroupStatus == ContactGroupStatusEnum.Rebuilding)
|| (DateTime.Now.Subtract(cgi.ContactGroupLastModified).TotalSeconds < 5) || forceReload)
{
lblNumberOfItemsValue.Text = ContactGroupMemberInfoProvider.GetNumberOfContactsInGroup(cgi.ContactGroupID, true).ToString();
}
}
}
#endregion
}