Imports BVSoftware.BVC.Core Imports System.Text Public Class ProductPicker Inherits System.Web.UI.UserControl #Region " Web Form Designer Generated Code " 'This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub Protected WithEvents btnFind As System.Web.UI.WebControls.ImageButton Protected WithEvents KeywordField As System.Web.UI.WebControls.TextBox Protected WithEvents dgProducts As System.Web.UI.WebControls.DataGrid Protected WithEvents SearchTypeField As BVSoftware.WebControls.SelectDropDownList Protected WithEvents RowCategoryGrid As System.Web.UI.HtmlControls.HtmlTableRow Protected WithEvents CategoryRepeater As System.Web.UI.WebControls.Repeater Protected WithEvents CurrentCategory As System.Web.UI.WebControls.Label Protected WithEvents ProductTypeField As BVSoftware.WebControls.SelectDropDownList Protected WithEvents VendorField As BVSoftware.WebControls.SelectDropDownList Protected WithEvents ManufacturerField As BVSoftware.WebControls.SelectDropDownList 'NOTE: The following placeholder declaration is required by the Web Form Designer. 'Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private _MaxResults As Integer = 1000 Public Property MaxResults() As Integer Get Return _MaxResults End Get Set(ByVal Value As Integer) _MaxResults = Value End Set End Property Public ReadOnly Property ProductList() As DataGrid Get Return Me.dgProducts End Get End Property Public ReadOnly Property SelectedProducts() As ArrayList Get Dim result As New ArrayList Dim rsc As MetaBuilders.WebControls.RowSelectorColumn = dgProducts.Columns(0) For Each i As Integer In rsc.SelectedIndexes() result.Add(dgProducts.Items(i).Cells(1).Text) Next Return result End Get End Property Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not Page.IsPostBack Then LoadLastSearch() End If If Me.SearchTypeField.SelectedValue = "Category" Then Me.RowCategoryGrid.Visible = True LoadCategoryTree() 'DoSearch("Category") Else Me.RowCategoryGrid.Visible = False End If End Sub Public Sub LoadLastSearch() If Not Session("ProductPickerSearchType") Is Nothing Then If Not Session("ProductPickerLastPage") Is Nothing Then Me.dgProducts.CurrentPageIndex = Session("ProductPickerLastPage") End If ' Should trigger SetSearchType Me.SearchTypeField.SelectByValue(Session("ProductPickerSearchType")) Select Case Session("ProductPickerSearchType") Case "Keyword" SetSearchType("Keyword") If Not Session("ProductPickerKeyword") Is Nothing Then Me.KeywordField.Text = Session("ProductPickerKeyword") End If DoSearch("Keyword") Case "Type" SetSearchType("Type") If Not Session("ProductPickerType") Is Nothing Then Me.ProductTypeField.SelectByValue(Session("ProductPickerType")) End If DoSearch("Type") Case "Category" SetSearchType("Category") DoSearch("Category") Case "Vendor" SetSearchType("Vendor") If Not Session("ProductPickerVendor") Is Nothing Then Me.VendorField.SelectByValue(Session("ProductPickerVendor")) End If DoSearch("Vendor") Case "Manufacturer" SetSearchType("Manufacturer") If Not Session("ProductPickerManufacturer") Is Nothing Then Me.ManufacturerField.SelectByValue(Session("ProductPickerManufacturer")) End If DoSearch("Manufacturer") End Select End If End Sub Private Sub LoadProductTypes() Me.ProductTypeField.DataSource = CatalogServices.ProductTypes.ListProductTypes() Me.ProductTypeField.DataTextField = "ProductTypeName" Me.ProductTypeField.DataValueField = "id" Me.ProductTypeField.DataBind() End Sub Private Sub LoadVendors() Me.VendorField.DataSource = ContactServices.Vendors.ListVendors() Me.VendorField.DataTextField = "DisplayName" Me.VendorField.DataValueField = "id" Me.VendorField.DataBind() End Sub Private Sub LoadManufacturers() Me.ManufacturerField.DataSource = ContactServices.Manufacturers.ListManufacturers Me.ManufacturerField.DataTextField = "DisplayName" Me.ManufacturerField.DataValueField = "id" Me.ManufacturerField.DataBind() End Sub Private Sub LoadCategoryTree() Dim activeCategory As Integer = 0 If Not Session("ProductPickerCategory") Is Nothing Then activeCategory = Session("ProductPickerCategory") End If If activeCategory < 0 Then activeCategory = 0 End If Dim dt As New DataTable dt.Columns.Add("id", System.Type.GetType("System.Int32")) dt.Columns.Add("CategoryName", System.Type.GetType("System.String")) Dim c As Catalog.Category = CatalogServices.Categories.GetCategory(activeCategory) If Not c Is Nothing Then Dim sb As New StringBuilder BuildTrail(c.ID, 0, sb) Me.CurrentCategory.Text = sb.ToString If activeCategory > 0 Then Dim dr As DataRow = dt.NewRow dr.Item("id") = c.ParentID dr.Item("CategoryName") = ".. (up one level)" dt.Rows.Add(dr) End If Else Dim r As DataRow = dt.NewRow r.Item("id") = 0 r.Item("CategoryName") = "The requested category couldn't be found." dt.Rows.Add(r) End If AddChildCategories(dt, activeCategory) Me.CategoryRepeater.DataSource = dt Me.CategoryRepeater.DataBind() End Sub Private Sub AddChildCategories(ByVal dtCategories As DataTable, ByVal parentID As Integer) If Not dtCategories Is Nothing Then Dim dt As DataTable = CatalogServices.Categories.ListChildCategories(parentID) If Not dt Is Nothing Then For i As Integer = 0 To dt.Rows.Count - 1 Dim r As DataRow = dtCategories.NewRow r.Item("id") = dt.Rows(i).Item("id") r.Item("CategoryName") = dt.Rows(i).Item("Name") dtCategories.Rows.Add(r) Next End If End If End Sub Private Sub btnFind_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btnFind.Click DoSearch(Me.SearchTypeField.SelectedValue) End Sub Private Sub DoSearch(ByVal searchType As String) Dim dtSource As New DataTable Select Case searchType Case "Keyword" If Me.KeywordField.Text.Trim = "" Then 'dtSource = CatalogServices.Products.ListAllProducts() dtSource = CatalogServices.Products.FindProductsByKeyword(Me.KeywordField.Text, _MaxResults, Catalog.CategorySortOrder.DefaultSortOrder, True) Else dtSource = CatalogServices.Products.FindProductsByKeyword(Me.KeywordField.Text, _MaxResults, Catalog.CategorySortOrder.DefaultSortOrder, True) End If Case "Type" dtSource = CatalogServices.Products.FindProductsByType_ADMIN(Me.ProductTypeField.SelectedValue) Case "Category" LoadCategoryTree() Dim activeCategory As Integer = 0 If Not Session("ProductPickerCategory") Is Nothing Then activeCategory = Session("ProductPickerCategory") End If If activeCategory < 0 Then activeCategory = 0 End If Dim c As Catalog.Category c = CatalogServices.Categories.GetCategory(activeCategory) If Not c Is Nothing Then dtSource = CatalogServices.Categories.GetProducts(c) End If c = Nothing Case "Vendor" dtSource = CatalogServices.Products.FindByVendor_Admin(Me.VendorField.SelectedValue) Case "Manufacturer" dtSource = CatalogServices.Products.FindByManufacturer_Admin(Me.ManufacturerField.SelectedValue) End Select ' Add Full spaced SKU to ProductName If Not dtSource Is Nothing Then Me.dgProducts.DataSource = dtSource Me.dgProducts.DataBind() End If Session("ProductPickerSearchType") = searchType Session("ProductPickerType") = Me.ProductTypeField.SelectedValue Session("ProductPickerVendor") = Me.VendorField.SelectedValue Session("ProductPickerManufacturer") = Me.ManufacturerField.SelectedValue Session("ProductPickerKeyword") = Me.KeywordField.Text.Trim Session("ProductPickerLastPage") = Me.dgProducts.CurrentPageIndex dtSource = Nothing End Sub Private Sub dgProducts_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles dgProducts.PageIndexChanged dgProducts.CurrentPageIndex = e.NewPageIndex DoSearch(Me.SearchTypeField.SelectedValue) End Sub Private Sub SearchTypeField_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchTypeField.SelectedIndexChanged SetSearchType(Me.SearchTypeField.SelectedValue) End Sub Private Sub SetSearchType(ByVal searchType As String) Select Case searchType Case "Keyword" Me.KeywordField.Visible = True Me.ProductTypeField.Visible = False Me.VendorField.Visible = False Me.ManufacturerField.Visible = False Me.btnFind.Visible = True Me.RowCategoryGrid.Visible = False Case "Type" LoadProductTypes() Me.KeywordField.Visible = False Me.ProductTypeField.Visible = True Me.VendorField.Visible = False Me.ManufacturerField.Visible = False Me.btnFind.Visible = True Me.RowCategoryGrid.Visible = False Case "Category" LoadCategoryTree() Me.KeywordField.Visible = False Me.ProductTypeField.Visible = False Me.VendorField.Visible = False Me.ManufacturerField.Visible = False Me.btnFind.Visible = False Me.RowCategoryGrid.Visible = True Case "Vendor" LoadVendors() Me.KeywordField.Visible = False Me.ProductTypeField.Visible = False Me.VendorField.Visible = True Me.ManufacturerField.Visible = False Me.btnFind.Visible = True Me.RowCategoryGrid.Visible = False Case "Manufacturer" LoadManufacturers() Me.KeywordField.Visible = False Me.ProductTypeField.Visible = False Me.VendorField.Visible = False Me.ManufacturerField.Visible = True Me.btnFind.Visible = True Me.RowCategoryGrid.Visible = False Case Else Me.KeywordField.Visible = True Me.ProductTypeField.Visible = False Me.VendorField.Visible = False Me.ManufacturerField.Visible = False Me.btnFind.Visible = True Me.RowCategoryGrid.Visible = False End Select Me.dgProducts.CurrentPageIndex = 0 Me.dgProducts.DataSource = Nothing Me.dgProducts.DataBind() End Sub Private Sub CategoryRepeater_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles CategoryRepeater.ItemDataBound If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then Dim btnCategory As LinkButton btnCategory = e.Item.FindControl("btnCategory") If Not btnCategory Is Nothing Then btnCategory.Text = DataBinder.Eval(e.Item.DataItem, "CategoryName") btnCategory.CommandArgument = DataBinder.Eval(e.Item.DataItem, "id") AddHandler btnCategory.Click, AddressOf SelectCategory_Click End If End If End Sub Private Sub SelectCategory_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim categoryID As Integer = CType(sender, LinkButton).CommandArgument Session("ProductPickerCategory") = categoryID DoSearch("Category") End Sub Private Sub BuildTrail(ByVal idNumber As Integer, ByVal depth As Integer, ByRef s As StringBuilder) Dim c As Catalog.Category c = CatalogServices.Categories.GetCategory(idNumber) If Not c Is Nothing Then If depth > 0 Then s.Insert(0, " > ") End If s.Insert(0, c.Name) If c.ParentID > 0 Then BuildTrail(c.ParentID, depth + 1, s) End If End If c = Nothing End Sub Private Sub dgProducts_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgProducts.ItemDataBound If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then Dim stat As String = e.Item.Cells(3).Text e.Item.Cells(3).Text = BuildStatusImages(stat) End If End Sub Private Function BuildStatusImages(ByVal statusCode As String) As String Dim sb As New StringBuilder Select Case statusCode Case "1" sb.Append("") Case "2" sb.Append("") sb.Append("/") sb.Append("") Case "3" sb.Append("") sb.Append("/") sb.Append("") Case "0" sb.Append("") Case Else sb.Append("") End Select Return sb.ToString End Function End Class