using System; using System.Collections.Generic; using System.Reflection; using System.Web.UI; using System.Web.UI.WebControls; using GlobalWebProduct.Database; using GlobalWebProduct.Other; using GlobalWebProduct.WebController; using GlobalWebProduct.WebView; using GWProductWebView.Code; using GWProductWebView.WebView; using System.Data.SqlClient; using System.Data; namespace _4cm_ie.Admin { public partial class Category : System.Web.UI.Page { private const String _ADDMODE = "add"; private const String _EDITMODE = "edit"; private const String _DEFAULTMODE = "default"; //private CategoryList SearchCategoryList; public int selectedId = -1; /// <summary> /// Deleting popup /// </summary> public MessageBox msgBox; /// <summary> /// Page load /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { FileServerAPI.Database.Database.init(Const.ImageSmartFSID, Const.ImageSmartAccessCode); Database.init(); if (IsPostBack) { if (!SessionRestorePageVariables(this) || Session.IsNewSession) { Response.Redirect(this.Request.RawUrl); } } if (!IsPostBack) msgBox = new MessageBox(); InitMessageBox(msgBox); if (Session["Mode"] == null) Session.Add("Mode", _DEFAULTMODE); if (FileUploadEdit.HasFile) Session.Add("FileUpEdit", FileUploadEdit.PostedFile); setButtonValue(true, true, true, false, false); CategoryView1.OnLoad(IsPostBack, (int)Session["CompanyID"]); //SearchCategoryList = new CategoryList((int)Session["CompanyID"]); //SearchCategoryList.ID = "CategoryList1"; //Place.Controls.Add(SearchCategoryList); CategoryListEdit.CompanyID = (int)Session["CompanyID"]; CategoryListEdit.ShowAll = false; CategoryListEdit.ShowNone = true; CategoryListAdd.CompanyID = (int)Session["CompanyID"]; CategoryListAdd.ShowAll = false; CategoryListAdd.ShowNone = true; CatProductDataList.PagingPanel = CatProductPagePanel; CategoryView1.CatProdDataList = CatProductDataList; #region "Parent ID" if (IsPostBack) { if (Session["ParentAdd"] == null) { if (!CategoryListAdd.SelectedItem.Text.Equals("None")) Session.Add("ParentAdd", CategoryListAdd.SelectedItem.Value); else Session.Add("ParentAdd", CategoryListAdd.SelectedItem.Text); } else { if (!CategoryListAdd.SelectedItem.Text.Equals("None")) Session["ParentAdd"] = CategoryListAdd.SelectedItem.Value; else Session["ParentAdd"] = CategoryListAdd.SelectedItem.Text; } if (Session["ParentEdit"] == null) { if (!CategoryListEdit.SelectedItem.Text.Equals("None")) Session.Add("ParentEdit", CategoryListEdit.SelectedItem.Value); else Session.Add("ParentEdit", CategoryListEdit.SelectedItem.Text); } else { if (!CategoryListEdit.SelectedItem.Text.Equals("None")) Session["ParentEdit"] = CategoryListEdit.SelectedItem.Value; else Session["ParentEdit"] = CategoryListEdit.SelectedItem.Text; } } #endregion //CategoryView1.PageIndexChanged += new EventHandler(CategoryView_PageIndexChanged); // Will allow the page to be posted back when one item will be selected //SearchCategoryList.AutoPostBack = true; //SearchCategoryList.SelectedIndex = 1; //SearchCategoryList.ShowNone = true; //SearchCategoryList.ShowAll = false; //SearchCategoryList.SelectedIndexChanged += new EventHandler(SearchCategoryList_SelectedIndexChanged); #region "TreeviewLoad" if (!IsPostBack) { int idWebsite = 1; idWebsite = (int)Session["CompanyID"]; CompanyView.treeViewFill(TreeViewCategories, idWebsite); // Bug fix : makes the first click work when you just load the category page // Actually selects the first node of the treeview and fires the selectedindexchanged // event for this treeview if (TreeViewCategories.Nodes.Count > 0) { TreeViewCategories.Nodes[0].Selected = true; TreeViewCategories_selectedChanged(this, new EventArgs()); } } #endregion } //void CategoryView_PageIndexChanged(object sender, EventArgs e) //{ // try // { // String newCateg = Convert.ToString(Session["_CategoryCV"]); // SearchCategoryList.SelectedValue = newCateg; // } // catch (Exception ex) { } //} void CategoryView1_PageIndexChanging(object sender, DetailsViewPageEventArgs e) { CatProductDataList.DataBind(); } /// <summary> /// Method launched on search category dropdown list index changed /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //protected void SearchCategoryList_SelectedIndexChanged(object sender, EventArgs e) //{ // String res = SearchCategoryList.SelectedItem.Text; // if (Session["categoryFindIndex"] == null) // Session.Add("categoryFindIndex", res); // else // Session["categoryFindIndex"] = res; // int selectedPageIndex = ((List<CategoryView.Data>)CategoryView1.DataSource).FindIndex(FindIndexCatName); // int selectedCategID = Convert.ToInt32(SearchCategoryList.SelectedItem.Value); // CategoryView1.PageIndex = selectedPageIndex; // CategoryView1.DataBind(); // Session["_CategoryCV"] = selectedCategID; // CategoryView1.CatProdDataList.CategoryID = selectedCategID; // CategoryView1.CatProdDataList.Refresh(new DetailsViewPageEventArgs(selectedPageIndex)); //} /// <summary> /// Performed whe the page is unload /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Unload(object sender, EventArgs e) { SaveSessionVariable(); } /// <summary> /// Restore the public variable of the page /// </summary> /// <param name="thisPage"></param> /// <returns></returns> protected bool SessionRestorePageVariables(Page thisPage) { try { foreach (FieldInfo field in thisPage.GetType().GetFields()) { field.SetValue(thisPage, thisPage.Session[field.Name]); } return true; } catch (Exception) { return false; } } /// <summary> /// Save the public variable in session variable /// </summary> protected void SaveSessionVariable() { foreach (FieldInfo field in this.GetType().GetFields()) { this.Session[field.Name] = field.GetValue(this); } } /// <summary> /// Initialize the deleting popup /// </summary> /// <param name="msgBx"></param> protected void InitMessageBox(MessageBox msgBx) { msgBx.EnableButton1("Yes", new System.EventHandler(btn_deleteValid_Click)); msgBx.EnableButton2("No", new System.EventHandler(btn_deleteRefuse_Click)); msgBx.RegisterInPage(this.UpdatePanelCategory.ContentTemplateContainer); } /// <summary> /// Method launch on EditButton click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_edit_Click(object sender, EventArgs e) { if (((List<CategoryView.Data>)(CategoryView1.DataSource)).Count != 0) { Session["Mode"] = _EDITMODE; if (Session["FileServerID"] != null) Session.Remove("FileServerID"); setButtonValue(false, false, false, true, true); PanelCatAdd.Visible = false; PanelCatEdit.Visible = true; PanelCatView.Visible = false; //Place.Visible = false; //TreeViewCategories.Enabled = false; CategoryView.Data tmp = ((List<CategoryView.Data>)(CategoryView1.DataSource))[CategoryView1.DataItemIndex]; ((List<GlobalWebProduct.Models.Category>)CategoryListEdit.DataSource).RemoveAll(RetrieveByCategoryID); CategoryListEdit.DataBind(); tbNameEdit.Text = tmp.name.Trim(); tbCategoryIDEdit.Text = tmp.categoryID.ToString(); tbDescEdit.Text = tmp.description; tbImageEdit.Text = tmp.image; tbFileServerIDEdit.Text = tmp.FileServerID.ToString(); cbCatLockEdit.Checked = tmp.Lock; imgCatEdit.ImageUrl = tmp.Path; if (!tmp.parent.Equals("")) { CategoryListEdit.SelectedIndex = CategoryListEdit.Items.IndexOf(CategoryListEdit.Items.FindByText(tmp.parent)); TreeViewCategories.SelectedNode.Value = tmp.ParentID.ToString(); lblEditParentCategory.Text = tmp.parent; } else { CategoryListEdit.SelectedIndex = CategoryListEdit.Items.IndexOf(CategoryListEdit.Items.FindByText("None")); lblEditParentCategory.Text = ""; } CatProductDataList.Visible = false; } String levela = Convert.ToString(TreeViewCategories.SelectedNode.Depth); //get the selected node's depth and convert it as String type agent.Value = levela; // use the lable "level" to transfer value } /// <summary> /// Method launch on UpdateButton click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_update_Click(object sender, EventArgs e) { int fileID; if (Session["FileServerID"] == null) fileID = -1; else fileID = (int)Session["FileServerID"]; int catid; if (Session["Mode"].Equals(_EDITMODE)) catid = int.Parse(tbCategoryIDEdit.Text); else catid = 0; int? parentid = null; if (!lblEditParentCategory.Text.Equals("") && Session["Mode"].Equals(_EDITMODE)) parentid = Convert.ToInt32(TreeViewCategories.SelectedNode.Value); if (!lblAddParentCategory.Text.Equals("") && Session["Mode"].Equals(_ADDMODE)) parentid = Convert.ToInt32(TreeViewCategories.SelectedNode.Value); String name = ""; String description = ""; bool _lock = false; if (Session["Mode"].Equals(_EDITMODE)) { name = tbNameEdit.Text.Trim(); description = tbDescEdit.Text; _lock = cbCatLockEdit.Checked; } if (Session["Mode"].Equals(_ADDMODE)) { name = tbNameAdd.Text.Trim(); description = tbDescriptionAdd.Text; _lock = cbCatLockAdd.Checked; } // Delete special characters for url encode if (veriForm() == true) { name = FormatName(name); CategoryController.UpdateCategory(catid, parentid, (int)Session["CompanyID"], name, description, fileID, _lock); if (Session["Mode"].Equals(_ADDMODE)) { tbDescriptionAdd.Text = ""; tbNameAdd.Text = ""; cbCatLockAdd.Checked = false; CategoryListAdd.Refresh(e); } setButtonValue(true, true, true, false, false); PanelCatAdd.Visible = false; PanelCatEdit.Visible = false; PanelCatView.Visible = true; //Place.Visible = true; CatProductDataList.Visible = true; TreeViewCategories.Nodes.Clear(); CompanyView.treeViewFill(TreeViewCategories, (int)Session["CompanyID"]); TreeViewCategories.ExpandAll(); Session["Mode"] = _DEFAULTMODE; CategoryView1.DataBind(); //SearchCategoryList.DataBind(); //Literal1.Text = GetLiteral(); //SearchCategoryList.Refresh(e); CategoryView1.OnLoad(false, (int)Session["CompanyID"]); if (lbl_error.Visible.Equals(true)) lbl_error.Visible = false; if (Session["Mode"].Equals(_ADDMODE)) CategoryView1.PageIndex = CategoryView1.PageCount; } //agent1.Value = Convert.ToString(TreeViewCategories.SelectedNode.Depth); agent1.Value = Convert.ToString(TreeViewCategories.SelectedNode.Depth); //get the selected node's depth and convert it as String type } /// <summary> /// Method that check if the form is correctly filled in /// </summary> protected bool veriForm() { bool r = true; if (Session["Mode"].Equals(_ADDMODE) && tbNameAdd.Text.Equals("")) { lbl_error.Text = "Please enter a category name !"; lbl_error.Visible = true; r=false; } if (Session["Mode"].Equals(_EDITMODE)) { GlobalWebProduct.Models.Category cat; GlobalWebProduct.Models.Category catParent; Int64 level1 = Convert.ToInt64(agent.Value); Int64 level2 = Convert.ToInt64(agent1.Value); if (level1 >= level2) { lbl_error.Text = "Please choose correct parent name !"; lbl_error.Visible = true; r = false; } if (!selectedId.Equals("")) { cat = GlobalWebProduct.Models.Category.getFromId(int.Parse(tbCategoryIDEdit.Text)); catParent = GlobalWebProduct.Models.Category.getFromId(Convert.ToInt32( TreeViewCategories.SelectedNode.Value)); if (catParent.ParentID.Equals(cat.CategoryID)) { lbl_error.Text = "Please enter a valid parent !"; lbl_error.Visible = true; r = false; } } if (tbNameEdit.Text.Equals("")) { lbl_error.Text = "Please enter a category name !"; lbl_error.Visible = true; r = false; } } setButtonValue(false, false, false, true, true); return r; } /// <summary> /// Method launch on CancelButton click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_cancel_Click(object sender, EventArgs e) { setButtonValue(true, true, true, false, false); PanelCatAdd.Visible = false; PanelCatEdit.Visible = false; PanelCatView.Visible = true; //Place.Visible = true; CatProductDataList.Visible = true; Session["Mode"] = _DEFAULTMODE; } /// <summary> /// Method launch on DeleteButton click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_delete_Click(object sender, EventArgs e) { if (((List<CategoryView.Data>)(CategoryView1.DataSource)).Count != 0) { msgBox.Title = "Delete Category?"; CategoryView.Data tmp = ((List<CategoryView.Data>)(CategoryView1.DataSource))[CategoryView1.DataItemIndex]; if (tmp.Lock) { msgBox.Message = "Deleting a permanent category may provoke errors/nin your website. Continue?"; } else { msgBox.Message = "You're deleting data. The category will be deleted, and its subcategories and products too. Continue?"; } msgBox.Show(); } } /// <summary> /// Method launch on btn_deleteValid click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_deleteValid_Click(object sender, EventArgs e) { CategoryView.Data tmp = ((List<CategoryView.Data>)(CategoryView1.DataSource))[CategoryView1.DataItemIndex]; CategoryController.DeleteCategory(tmp.categoryID); msgBox.Close(); CategoryView1.DataBind(); //SearchCategoryList.DataBind(); //SearchCategoryList.Refresh(e); CategoryView1.OnLoad(false, (int)Session["CompanyID"]); //TreeViewCategories.Enabled = true; TreeViewCategories.Nodes.Clear(); CompanyView.treeViewFill(TreeViewCategories, (int)Session["CompanyID"]); TreeViewCategories.ExpandAll(); } /// <summary> /// Method launch on btn_deleteRefuse click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_deleteRefuse_Click(object sender, EventArgs e) { msgBox.Close(); } /// <summary> /// Method launch on AddButton click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btn_add_Click(object sender, EventArgs e) { Session["Mode"] = _ADDMODE; PanelCatAdd.Visible = true; PanelCatView.Visible = false; CategoryListAdd.ShowAll = false; //Place.Visible = false; CatProductDataList.Visible = false; setButtonValue(false, false, false, true, true); lblAddParentCategory.Text = ""; } /// <summary> /// Set the "Visible" attribut of the buttons /// </summary> /// <param name="edit"></param> /// <param name="delete"></param> /// <param name="add"></param> /// <param name="update"></param> /// <param name="cancel"></param> protected void setButtonValue(bool edit, bool delete, bool add, bool update, bool cancel) { btn_edit.Visible = edit; btn_add.Visible = add; btn_delete.Visible = delete; btn_update.Visible = update; btn_cancel.Visible = cancel; } /// <summary> /// Predicate used to find index /// </summary> /// <param name="c"></param> /// <returns></returns> protected bool FindIndexCatName(CategoryView.Data c) { return c.name.Equals((Page.Session["categoryFindIndex"]).ToString()); } /// <summary> /// Perform action when checkbox lock change /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void LockChanged(object sender, EventArgs e) { System.Web.UI.WebControls.CheckBox cb = (System.Web.UI.WebControls.CheckBox)sender; if (!cb.Checked) { /*Later replace by MessageBox DialogResult dr = MessageBox.Show("If you unlock a category, /n errors can appear on your website./n Do you want to continue?", "Unlock confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2); if (dr != DialogResult.Yes) cb.Checked = true;*/ } } /// <summary> /// Upload function /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void UploadImage(object sender, EventArgs e) { LinkButton send = (LinkButton)sender; if (send.ID == "lbCatAdd") { if (FileUpCatAdd.HasFile) { FileServerAPI.File.File f = new FileServerAPI.File.File(FileUpCatAdd.PostedFile); Session.Add("FileServerID", f.Id); } else Session.Add("FileServerID", -1); } else if (send.ID == "lbUploadEdit") { if (!tbFileServerIDEdit.Text.Equals("-1")) { int catid = int.Parse(tbCategoryIDEdit.Text); FileServerAPI.File.File deleteF = new FileServerAPI.File.File(int.Parse(tbFileServerIDEdit.Text)); deleteF.delete(); GlobalWebProduct.Models.Category tmpc = GlobalWebProduct.Models.Category.getFromId(catid); tmpc.FileServerID = -1; tmpc.update(); } if (FileUploadEdit.HasFile) { Session.Add("FileServerID", FileUploadEdit.PostedFile.Upload()); } else Session.Add("FileServerID", -1); } setButtonValue(false, false, false, true, true); } private bool RetrieveByCategoryID(GlobalWebProduct.Models.Category c) { CategoryView.Data tmp = ((List<CategoryView.Data>)(CategoryView1.DataSource))[CategoryView1.DataItemIndex]; if (c.CategoryID.Equals(tmp.categoryID)) return true; else return false; } /***************************************************************/ protected void TreeViewCategories_selectedChanged(Object sender, EventArgs e) { selectedId = Convert.ToInt32(TreeViewCategories.SelectedNode.Value); String res = CompanyView.GetCategoryName(selectedId); if (CategoryView1.Visible != false) { lblAddParentCategory.Text = res; lblEditParentCategory.Text = res; if (Session["categoryFindIndex"] == null) Session.Add("categoryFindIndex", res); else Session["categoryFindIndex"] = res; int selectedPageIndex = ((List<CategoryView.Data>)CategoryView1.DataSource).FindIndex(FindIndexCatName); int selectedCategID = selectedId; CategoryView1.PageIndex = selectedPageIndex; CategoryView1.DataBind(); Session["_CategoryCV"] = selectedCategID; CategoryView1.CatProdDataList.CategoryID = selectedCategID; CategoryView1.CatProdDataList.Refresh(new DetailsViewPageEventArgs(selectedPageIndex)); } else { Int64 level1 = Convert.ToInt64(agent.Value); //get the value of label(level), and convert it as Int64 Int64 level3 = Convert.ToInt64(TreeViewCategories.SelectedNode.Depth); lblEditParentCategory.Visible = true; lblEditParentCategory.Text = res; error.Text = ""; if (level1 <= level3) //compare two node's depth { error.Text = "Error!!! Can not choose this one as the parent!!!"; lblEditParentCategory.Visible = false; } else { lblEditParentCategory.Text = res; } } // CatProductDataList is used as a flag because the wrong buttons appears when the treeview is clicked if (!CatProductDataList.Visible) setButtonValue(false, false, false, true, true); } /// <summary> /// Function to format a String, deleting special characters /// </summary> /// <param name="name"></param> protected String FormatName(String name) { // Deleting left and right spaces name = name.Trim(); // Replacing special characters in the name (to avoid url rewriting problems) //name = name.Replace("&", "and"); name = name.Replace("/", "-"); name = name.Replace("/"", ""); // Deleting dots at the end of the name (to avoid conflicts with .aspx extensions) while (name.LastIndexOf('.') == name.Length - 1) { name = name.Substring(0, name.LastIndexOf('.')); } return name; } protected void btnAddParentReset_Click(object sender, EventArgs e) { setButtonValue(false, false, false, true, true); lblAddParentCategory.Text = ""; } protected void bntEditParentReset_Click(object sender, EventArgs e) { setButtonValue(false, false, false, true, true); lblEditParentCategory.Text = ""; } } }