using System; using System.Data; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Xml; using CMS.EcommerceProvider; using CMS.FormControls; using CMS.GlobalHelper; using CMS.SettingsProvider; using CMS.UIControls; using CMS.ExtendedControls; /// /// Checkout definition update event handler. /// public delegate void OnCheckoutProcessDefinitionUpdateEventHandler(string action); public partial class CMSModules_Ecommerce_FormControls_CheckoutProcess : FormEngineUserControl { #region "Variables" private string mImageFolder = ""; private CheckoutProcessInfo mCheckoutProcess = null; #endregion #region "Events" /// /// Occurs when mode (listing/edit) is changed. /// /// Indicates if control is in listing mode public delegate void ModeChangedHandler(bool isListingMode); public event ModeChangedHandler OnModeChanged; #endregion #region "Private Properties" private CheckoutProcessInfo CheckoutProcess { get { if (mCheckoutProcess == null) { mCheckoutProcess = new CheckoutProcessInfo(); mCheckoutProcess.LoadXmlDefinition(CheckoutProcessXml); } return mCheckoutProcess; } } /// /// Checkout process XML - shopping cart steps definition in XML format. /// private string CheckoutProcessXml { get { //object obj = ViewState["CheckoutProcessXml"]; //if (obj != null) //{ // return Convert.ToString(obj); //} //else //{ // ViewState["CheckoutProcessXml"] = ""; // return Convert.ToString(ViewState["CheckoutProcessXml"]); //} return hdnCheckoutProcessXml.Value; } set { //ViewState["CheckoutProcessXml"] = value; hdnCheckoutProcessXml.Value = value; } } /// /// Checkout process type. /// private CheckoutProcessEnum CheckoutProcessType { get { object obj = ViewState["CheckoutProcessType"]; if (obj != null) { return (CheckoutProcessEnum)(obj); } else { ViewState["CheckoutProcessType"] = 0; return (CheckoutProcessEnum)ViewState["CheckoutProcessType"]; } } set { ViewState["CheckoutProcessType"] = value; } } /// /// Original step name. /// private string OriginalStepName { get { return Convert.ToString(ViewState["OriginalStepName"]); } set { ViewState["OriginalStepName"] = value; } } /// /// Indicates if control is in listing mode or in edit/insert mode. /// private bool ListingMode { get { return plcList.Visible; } set { plcList.Visible = value; plcEdit.Visible = !value; if (OnModeChanged != null) { OnModeChanged(value); } } } #endregion #region "Public Properties" /// /// Checkout definition update event handler. /// public event OnCheckoutProcessDefinitionUpdateEventHandler OnCheckoutProcessDefinitionUpdate; /// /// Header actions control /// public override HeaderActions HeaderActions { get { return headerActions; } } /// /// 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 { plcMessNew.IsLiveSite = value; plcMess.IsLiveSite = value; base.IsLiveSite = value; } } /// /// Image folder. /// public string ImageFolder { get { return mImageFolder; } set { mImageFolder = value; } } /// /// Information. /// public string Information { set { ShowConfirmation(value); } } /// /// Gets or sets field value. /// public override object Value { get { try { XmlDocument xml = new XmlDocument(); xml.LoadXml(CheckoutProcessXml); if (xml.DocumentElement.SelectNodes("step").Count == 0) { return ""; } } catch { return ""; } return CheckoutProcessXml; } set { CheckoutProcessXml = Convert.ToString(value); } } /// /// Indicates whether checkout process types should be visible and editable to user. /// FALSE - Default value. Step is created without relation to any of the default checkout process. /// Use this option when control is used to generate custom shopping cart webpart checkout process. /// TRUE - User can choose from the default checkout process the step will be included in. /// public bool EnableDefaultCheckoutProcessTypes { get { return ValidationHelper.GetBoolean(ViewState["EnableDefaultCheckoutProcessTypes"], false); } set { ViewState["EnableDefaultCheckoutProcessTypes"] = value; } } /// /// Gets or sets the enabled state of the control. /// public override bool Enabled { get { return base.Enabled; } set { base.Enabled = value; } } /// /// Gets ClientID of the hidden field which stores the actual value of the control. /// public override string ValueElementID { get { return hdnCheckoutProcessXml.ClientID; } } /// /// Indicates, if actions are visible. Set to false, when handling actions programmatically. /// public bool ShowActions { get { return pnlHeaderLine.Visible; } set { pnlHeaderLine.Visible = value; } } #endregion #region "Template Properties" // Variables protected string mActions = ""; protected string mName = ""; protected string mOrder = ""; protected string mCaption = ""; protected string mShowOnLiveSite = ""; protected string mShowInCMSDeskOrder = ""; protected string mShowInCMSDeskOrderItems = ""; protected string mShowInCMSDeskCustomer = ""; protected string btnEditImageUrl = ""; protected string btnDeleteImageUrl = ""; protected string btnMoveUpImageUrl = ""; protected string btnMoveDownImageUrl = ""; protected string btnEditToolTip = ""; protected string btnDeleteToolTip = ""; protected string btnMoveUpToolTip = ""; protected string btnMoveDownToolTip = ""; #endregion #region "Page Events" protected void Page_Load(object sender, EventArgs e) { // Register javascript to confirm delete action string script = "function ConfirmDelete() {return confirm(" + ScriptHelper.GetString(GetString("CheckoutProcess.ConfirmDeleteStep")) + ");}"; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmDeleteStep", ScriptHelper.GetScript(script)); if (EnableDefaultCheckoutProcessTypes) { btnDefaultProcess.Visible = true; btnDefaultProcess.Text = GetString("CheckoutProcess.DefaultProcess"); // Register javascript to confirm generate default checkout process script = "function ConfirmDefaultProcess() {return confirm(" + ScriptHelper.GetString(GetString("CheckoutProcess.ConfirmDefaultProcess")) + ");}"; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmDefaultProcess", ScriptHelper.GetScript(script)); } // Initialize button images if (ImageFolder == "") { ImageFolder = GetImageUrl("Design/Controls/UniGrid/Actions/", IsLiveSite, true); } if (CultureHelper.IsUICultureRTL()) { gridSteps.RowStyle.HorizontalAlign = HorizontalAlign.Right; } else { gridSteps.RowStyle.HorizontalAlign = HorizontalAlign.Left; } btnEditImageUrl = ImageFolder + "Edit.png"; btnDeleteImageUrl = ImageFolder + "Delete.png"; btnMoveUpImageUrl = ImageFolder + "Up.png"; btnMoveDownImageUrl = ImageFolder + "Down.png"; // Initialize button tooltips btnEditToolTip = GetString("general.edit"); btnDeleteToolTip = GetString("general.delete"); btnMoveUpToolTip = GetString("CheckoutProcess.btnMoveUpToolTip"); btnMoveDownToolTip = GetString("CheckoutProcess.btnMoveDownToolTip"); // Initialize grid labels mActions = GetString("unigrid.actions"); mName = GetString("general.name"); mOrder = GetString("CheckoutProcess.Order"); mCaption = GetString("CheckoutProcess.Caption"); mShowOnLiveSite = GetString("CheckoutProcess.ShowOnLiveSite"); mShowInCMSDeskOrder = GetString("CheckoutProcess.ShowInCMSDeskOrder"); mShowInCMSDeskOrderItems = GetString("CheckoutProcess.ShowInCMSDeskOrderItems"); mShowInCMSDeskCustomer = GetString("CheckoutProcess.ShowInCMSDeskCustomer"); // Initialize validators rfvStepCaption.ErrorMessage = GetString("CheckoutProcess.ErrorStepCaptionEmpty"); rfvStepControlPath.ErrorMessage = GetString("CheckoutProcess.ErrorStepControlPathEmpty"); rfvStepName.ErrorMessage = GetString("CheckoutProcess.ErrorStepNameEmpty"); // Initialize other controls lnkNewStep.Text = GetString("CheckoutProcess.lnkNewStep"); imgNewItem.ImageUrl = GetImageUrl("CMSModules/CMS_Ecommerce/addstep.png"); imgNewItem.AlternateText = GetString("general.new"); lnkList.Text = GetString("CheckoutProcess.lnkList"); lblStepCaption.Text = GetString("CheckoutProcess.lblStepCaption"); lblStepControlPath.Text = GetString("CheckoutProcess.lblStepControlPath"); lblStepImageUrl.Text = GetString("CheckoutProcess.lblStepImageUrl"); lblStepName.Text = GetString("general.codename") + ResHelper.Colon; lblLiveSite.Text = GetString("CheckoutProcess.lblLiveSite"); lblCMSDeskCustomer.Text = GetString("CheckoutProcess.lblCMSDeskCustomer"); lblCMSDeskOrder.Text = GetString("CheckoutProcess.lblCMSDeskOrder"); lblCMSDeskOrderItems.Text = GetString("CheckoutProcess.lblCMSDeskOrderItems"); gridSteps.RowDataBound += new GridViewRowEventHandler(gridSteps_RowDataBound); // Hide default checkout process types if (!EnableDefaultCheckoutProcessTypes) { // Step list gridSteps.Columns[3].Visible = false; gridSteps.Columns[4].Visible = false; gridSteps.Columns[5].Visible = false; gridSteps.Columns[6].Visible = false; } if (!RequestHelper.IsPostBack()) { ListingMode = true; ReloadData(); } // Enabling and disabling controls lnkNewStep.Enabled = Enabled; if (!pnlHeaderLine.Visible) { btnDefaultProcess.Visible = false; } } #endregion #region "Event Handlers" private void gridSteps_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Cells[1].Text = Convert.ToString(e.Row.RowIndex + 1); // Apply even/odd row CSS class e.Row.CssClass = (e.Row.RowIndex % 2 > 0) ? "OddRow" : "EvenRow"; } } /// /// LnkNewStep click event handler. /// protected void lnkNewStep_Click(object sender, EventArgs e) { NewStep(); } /// /// LnkList click event handler. /// protected void lnkList_Click(object sender, EventArgs e) { ListingMode = true; } /// /// BtnDefaultProcess click event handler. /// protected void btnDefaultProcess_Click(object sender, EventArgs e) { GenerateDefaultProcess(); } /// /// BtnOk click event handler. /// protected void btnOk_Click(object sender, EventArgs e) { lblCurrentStep.Text = GetString("CheckoutProcess.NewStep"); string errorMessage = ValidateForm(); if (errorMessage == "") { CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(txtStepName.Text.Trim()); if ((stepObj == null) || (stepObj.Name.ToLowerCSafe() == OriginalStepName.ToLowerCSafe())) { if (stepObj == null) { stepObj = new CheckoutProcessStepInfo(); } // Save localization txtStepCaption.Save(); // Get step data from form stepObj.Caption = txtStepCaption.Text.Trim(); stepObj.Name = txtStepName.Text.Trim(); stepObj.ControlPath = txtStepControlPath.Text.Trim(); stepObj.Icon = txtStepImageUrl.Text.Trim(); stepObj.ShowInCMSDeskCustomer = chkCMSDeskCustomer.Checked; stepObj.ShowInCMSDeskOrder = chkCMSDeskOrder.Checked; stepObj.ShowOnLiveSite = chkLiveSite.Checked; stepObj.ShowInCMSDeskOrderItems = chkCMSDeskOrderItems.Checked; if ((OriginalStepName != "") && (OriginalStepName.ToLowerCSafe() != txtStepName.Text.ToLowerCSafe())) { // Replace node CheckoutProcess.ReplaceCheckoutProcessStepNode(stepObj, OriginalStepName); } else { // Update or insert node CheckoutProcess.SetCheckoutProcessStepNode(stepObj); } // Update Xml definition in viewstate CheckoutProcessXml = CheckoutProcess.GetXmlDefinition(); if (OnCheckoutProcessDefinitionUpdate != null) { OnCheckoutProcessDefinitionUpdate("update"); } //lblInfo.Visible = true; //lblInfo.Text = GetString("General.ChangesSaved"); lblCurrentStep.Text = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(stepObj.Caption)); ListingMode = true; ReloadData(); } else { errorMessage = GetString("CheckoutProcess.ErrorStepNameNotUnique"); } } // Show error message if (errorMessage != "") { plcMessNew.ShowError(errorMessage, null, null); // If error during editing, set original caption to breadcrumbs if (!string.IsNullOrEmpty(OriginalStepName)) { CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(OriginalStepName); if (stepObj != null) { lblCurrentStep.Text = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(stepObj.Caption)); } } } } /// /// Validates form input data and returns error message if some error occurs. /// private string ValidateForm() { return new Validator().NotEmpty(txtStepCaption.Text.Trim(), rfvStepCaption.ErrorMessage). NotEmpty(txtStepName.Text.Trim(), rfvStepName.ErrorMessage). NotEmpty(txtStepControlPath.Text.Trim(), rfvStepControlPath.ErrorMessage). IsCodeName(txtStepName.Text.Trim(), GetString("General.ErrorCodeNameInIdentifierFormat")).Result; } /// /// Reloads data in gridview. /// public void ReloadData() { // Load xml definition from viewstate CheckoutProcess.LoadXmlDefinition(CheckoutProcessXml); gridSteps.DataSource = CheckoutProcess.GetDataTableFromXmlDefinition(CheckoutProcessType); gridSteps.DataBind(); } /// /// BtnEdit click event handler. /// protected void btnEdit_Click(object sender, EventArgs e) { ListingMode = false; plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes; // Load step data to the form CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(((ImageButton)(sender)).CommandArgument); if (stepObj != null) { lblCurrentStep.Text = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(stepObj.Caption)); txtStepCaption.Text = stepObj.Caption; txtStepControlPath.Text = stepObj.ControlPath; txtStepImageUrl.Text = stepObj.Icon; txtStepName.Text = stepObj.Name; chkLiveSite.Checked = stepObj.ShowOnLiveSite; chkCMSDeskOrder.Checked = stepObj.ShowInCMSDeskOrder; chkCMSDeskCustomer.Checked = stepObj.ShowInCMSDeskCustomer; chkCMSDeskOrderItems.Checked = stepObj.ShowInCMSDeskOrderItems; // Save original step name OriginalStepName = stepObj.Name; } } /// /// BtnDelete click event handler. /// protected void btnDelete_Click(object sender, EventArgs e) { // Remove node from xml CheckoutProcess.RemoveCheckoutProcessStepNode(((ImageButton)sender).CommandArgument); // Update xml definition in viewstate CheckoutProcessXml = CheckoutProcess.GetXmlDefinition(); if (OnCheckoutProcessDefinitionUpdate != null) { OnCheckoutProcessDefinitionUpdate("delete"); } ReloadData(); } /// /// BtnMoveUp click event handler. /// protected void btnMoveUp_Click(object sender, EventArgs e) { // Move node up in xml CheckoutProcess.MoveCheckoutProcessStepNodeUp(((ImageButton)sender).CommandArgument); // Update xml definition in viewstate CheckoutProcessXml = CheckoutProcess.GetXmlDefinition(); if (OnCheckoutProcessDefinitionUpdate != null) { OnCheckoutProcessDefinitionUpdate("moveup"); } ReloadData(); } /// /// BtnMoveDown click event handler. /// protected void btnMoveDown_Click(object sender, EventArgs e) { // Move node down in xml definition CheckoutProcess.MoveCheckoutProcessStepNodeDown(((ImageButton)sender).CommandArgument); // Update xml definition in viewstate CheckoutProcessXml = CheckoutProcess.GetXmlDefinition(); if (OnCheckoutProcessDefinitionUpdate != null) { OnCheckoutProcessDefinitionUpdate("movedown"); } ReloadData(); } /// /// Check validity of the control. /// public override bool IsValid() { if ((string)Value == "") { ValidationError = GetString("CheckoutProcess.ErrorProcessEmpty"); return false; } else { ValidationError = ""; return true; } } /// /// Returns colored boolean value string (TRUE -> green color, FALSE - red color) /// /// Boolean value string protected string GetColoredBooleanString(object val) { return UniGridFunctions.ColoredSpanYesNo(val); } /// /// Opens new step form. /// public void NewStep() { ListingMode = false; plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes; lblCurrentStep.Text = GetString("CheckoutProcess.NewStep"); // Set default values txtStepCaption.Text = ""; txtStepControlPath.Text = ""; txtStepImageUrl.Text = ""; txtStepName.Text = ""; chkCMSDeskCustomer.Checked = false; chkCMSDeskOrder.Checked = false; chkLiveSite.Checked = false; chkCMSDeskOrderItems.Checked = false; // Clear original step name OriginalStepName = ""; } /// /// Generates default process. /// public void GenerateDefaultProcess() { OnCheckoutProcessDefinitionUpdate("defaultprocess"); } /// /// Generates process from global. /// public void GenerateFromGlobalProcess() { OnCheckoutProcessDefinitionUpdate("fromglobalprocess"); } #endregion }