using System; using System.Data.SqlTypes; 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.UIControls; using CMS.ExtendedControls; using TextBoxControl = CMSFormControls_Basic_TextBoxControl; public partial class CMSModules_Scoring_Controls_UI_Score_Edit : CMSAdminEditControl { #region "Variables" private TaskInfo task = null; 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; } } #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(); } protected void Page_Load(object sender, EventArgs e) { // Get edited score ScoreInfo score = (ScoreInfo)EditForm.EditedObject; EditForm.OnItemValidation += EditForm_OnItemValidation; string script = @" function StartRefreshTimer() { var timer = $find('" + timRefresh.ClientID + @"'); timer._startTimer(); } function StopRefreshTimer() { var timer = $find('" + timRefresh.ClientID + @"'); timer._stopTimer(); } function OnRecalculateButtonClick() { StopRefreshTimer(); if (confirm(" + ScriptHelper.GetString(GetString("om.score.recalculatewarning")) + @")) { return true; } else { StartRefreshTimer(); return false; } }"; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "RecalculateScoreTimer", ScriptHelper.GetScript(script)); // Get scheduled task if (score.ScoreScheduledTaskID > 0) { task = TaskInfoProvider.GetTaskInfo(score.ScoreScheduledTaskID); } if (!RequestHelper.IsPostBack()) { // Hide advanced properties when creating new score plcUpdate.Visible = (score.ScoreID > 0); chkSchedule.Checked = schedulerInterval.Visible = ((task != null) && task.TaskEnabled); if (schedulerInterval.Visible) { // Initialize interval control schedulerInterval.ScheduleInterval = task.TaskInterval; } } if (score.ScoreID > 0) { // Display info panel pnlInfo.Visible = true; // Display basic info about score InitInfoPanel(score); } // Set tab name of editing UI to refresh upon change EditForm.RefreshTab = GetString("general.general"); var sendAtScoreControl = (TextBoxControl)fSendAtScore.EditingControl; sendAtScoreControl.MaxLength = ValidationHelper.MAX_INT_LENGTH; sendAtScoreControl.FilterType = AjaxControlToolkit.FilterTypes.Numbers | AjaxControlToolkit.FilterTypes.Custom; sendAtScoreControl.ValidChars = "-"; // Allow multiple addresses in e-mail input control fEmail.EditingControl.SetValue("allowmultipleaddresses", true); } void EditForm_OnItemValidation(object sender, ref string errorMessage) { Control ctrl = (Control)sender; if (CMSString.Compare(ctrl.ID, "fcScoreNotificationEmail", true) == 0 || CMSString.Compare(ctrl.ID, "fcScoreEmailAtScore", true) == 0) { var sendAtScoreControl = (TextBoxControl)fSendAtScore.EditingControl; var emailControl = (FormEngineUserControl)fEmail.EditingControl; if (String.IsNullOrEmpty(sendAtScoreControl.Value.ToString()) != String.IsNullOrEmpty(emailControl.Value.ToString())) { errorMessage = GetString("om.score.requiredemailandscore"); } } } #endregion #region "Events" /// /// OnBeforeSave event handler. /// protected void EditForm_OnBeforeSave(object sender, EventArgs e) { if ((EditForm.EditedObject != null)) { if (EditForm.EditedObject.Generalized.ObjectID == 0) { // Set site ID only when creating new object EditForm.Data["ScoreSiteID"] = CMSContext.CurrentSiteID; // Set 'New' status EditForm.Data["ScoreStatus"] = 2; } } } /// /// OnAfterSave event handler. /// protected void EditForm_OnAfterSave(object sender, EventArgs e) { // Get edited contact group ScoreInfo score = (ScoreInfo)EditForm.EditedObject; // Set info for scheduled task task = ScoreInfoProvider.EnsureScheduledTask(score, schedulerInterval.ScheduleInterval, TaskInfoProvider.NO_TIME, false, false); // Update scheduled task if (chkSchedule.Checked) { if (!schedulerInterval.CheckOneDayMinimum()) { // If problem occurred while setting schedule interval EditForm.ShowError(GetString("Newsletter_Edit.NoDaySelected")); EditForm.StopProcessing = true; return; } if (!IsValidDate(SchedulingHelper.DecodeInterval(scheduleInterval).StartTime)) { // Start date is not in valid format EditForm.ShowError(GetString("Newsletter.IncorrectDate")); 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); score.ScoreScheduledTaskID = task.TaskID; pnlInfo.Visible = true; InitInfoPanel(score); // Update score ScoreInfoProvider.SetScoreInfo(score); InitHeaderActions(); ((CMSPage)Page).CurrentMaster.HeaderActions.ReloadData(); } /// /// Checkbox chkSchedule event handler. /// protected void chkSchedule_CheckedChanged(object sender, EventArgs e) { if (chkSchedule.Checked) { string script = @"alert(" + ScriptHelper.GetString(GetString("om.score.recalculatewarning")) + @");"; ScriptHelper.RegisterClientScriptBlock(chkSchedule, typeof(string), "ChkScheduleChange", ScriptHelper.GetScript(script)); } 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 isNew = ((EditForm.EditedObject != null) && (EditForm.EditedObject.Generalized.ObjectID == 0)); // Header actions string[,] actions; if (isNew) { actions = new string[1, 11]; } else { actions = new string[2, 11]; } // Init save button actions[0, 0] = HeaderActions.TYPE_SAVEBUTTON; actions[0, 1] = GetString("General.Save"); actions[0, 5] = GetImageUrl("CMSModules/CMS_Content/EditMenu/save.png"); actions[0, 6] = "save"; actions[0, 8] = "true"; if (!isNew) { // Init recalculate button actions[1, 0] = HeaderActions.TYPE_HYPERLINK; actions[1, 1] = GetString("om.score.recalculate"); actions[1, 2] = "return OnRecalculateButtonClick();"; actions[1, 5] = GetImageUrl("CMSModules/CMS_ContactManagement/evaluate.png"); actions[1, 6] = "recalculate"; actions[1, 8] = "false"; } ((CMSPage)Page).CurrentMaster.HeaderActions.ActionPerformed += HeaderActions_ActionPerformed; ((CMSPage)Page).CurrentMaster.HeaderActions.Actions = actions; } /// /// Actions handler. /// protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e) { // Check modify permission CheckPermissions("cms.scoring", "modify"); switch (e.CommandName.ToLowerCSafe()) { case "save": if (chkSchedule.Checked) { // Get scheduled interval string scheduleInterval = schedulerInterval.ScheduleInterval; } // Save changes in the contact group EditForm.SaveData(null); break; case "recalculate": if (EditForm.EditedObject != null) { ScoreInfo score = (ScoreInfo)EditForm.EditedObject; if (score != null) { // Set 'Recalculating' status score.ScoreStatus = ScoreStatusEnum.Recalculating; // Ensure scheduled task if (score.ScoreScheduledTaskID == 0) { // Create and initialize new scheduled task task = ScoreInfoProvider.EnsureScheduledTask(score, schedulerInterval.ScheduleInterval, TaskInfoProvider.NO_TIME, false, true); // Update score info score.ScoreScheduledTaskID = task.TaskID; } ScoreInfoProvider.SetScoreInfo(score); // Recalculate the score ScoreEvaluator evaluator = new ScoreEvaluator(); evaluator.ScoreID = score.ScoreID; evaluator.CheckScoreEnabled = false; evaluator.Execute(null); EditForm.ShowConfirmation(GetString("om.score.recalculationstarted")); // Get scheduled task and update last run time if (task == null) { task = TaskInfoProvider.GetTaskInfo(score.ScoreScheduledTaskID); } if (task != null) { task.TaskLastRunTime = DateTime.Now; TaskInfoProvider.SetTaskInfo(task); // Initialize interval control schedulerInterval.ScheduleInterval = task.TaskInterval; schedulerInterval.ReloadData(); } // Display basic info about score InitInfoPanel(score); } } break; } } /// /// 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. /// /// ScoreInfo object private void InitInfoPanel(ScoreInfo score) { if (score != null) { pnlInfo.GroupingText = GetString("om.score.info"); pnlInfo.Attributes.Add("style", "margin:0 30px;"); // Last evaluation time if ((task != null) && (task.TaskLastRunTime != DateTimeHelper.ZERO_TIME)) { lblLastEvalValue.Text = task.TaskLastRunTime.ToString(); } else { lblLastEvalValue.Text = GetString("general.na"); } // Display score status... switch (score.ScoreStatus) { case ScoreStatusEnum.Recalculating: // Status and progress if the status is 'Recalculating' ltrProgress.Text = String.Empty; string buildStr = GetString("om.score.recalculating"); ltrProgress.Text = "\"""; lblStatusValue.Text = "" + buildStr + ""; break; case ScoreStatusEnum.Ready: // 'Ready' status lblStatusValue.Text = "" + GetString("om.contactgroup.ready") + ""; break; case ScoreStatusEnum.New: // 'Condition changed' status lblStatusValue.Text = "" + GetString("om.score.recalcrequired") + ""; break; case ScoreStatusEnum.Failed: // 'Recalculation failed' status lblStatusValue.Text = "" + GetString("om.score.recalcfailed") + ""; break; case ScoreStatusEnum.Unspecified: // 'Unspecified' status lblStatusValue.Text = "" + GetString("general.na") + ""; break; } } } #endregion }