using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using SafeMobileLib; using Telerik.WinControls.UI; using Telerik.WinControls; using Telerik.WinControls.UI.Docking; using Dispatcher.maptab.UIClasses; using Telerik.WinControls.Enumerations; using Telerik.WinControls.Data; using Telerik.WinControls.Export; using System.IO; namespace Safedispatch_4_0 { public partial class TicketingUserControl : UserControl { private bool showCellBorders = false; public MainForm2 parent; //public static ConvertDT convDT; private DBTicketingManager DBT = new DBTicketingManager(MainForm2.cfg.DB_IP, MainForm2.cfg.DB_schema, MainForm2.cfg.DB_user, MainForm2.cfg.DB_passwd, MainForm2.cfg.DB_port); private DBuserManager DBU = new DBuserManager(MainForm2.cfg.DB_IP, MainForm2.cfg.DB_schema, MainForm2.cfg.DB_user, MainForm2.cfg.DB_passwd, MainForm2.cfg.DB_port); private GridViewTemplate template; public static Dictionary dispatchersList = new Dictionary(); public static Boolean isFilterLoaded = false; public TicketingUserControl(MainForm2 mf2) { InitializeComponent(); // set theme for the Message Box RadMessageBox.SetThemeName("TelerikMetroBlue"); #region THEMING parent = mf2; rgbFilters.GroupBoxElement.Header.Border.TopColor = MainForm2.ButtonColor; rgbFilters.GroupBoxElement.Header.Border.TopShadowColor = MainForm2.ButtonColor; rgbFilters.GroupBoxElement.Header.TextPrimitive.ForeColor = MainForm2.ButtonColor; /* rgbFilters.GroupBoxElement.Header.ImagePrimitive.Image = Utils.ChangeColor((Bitmap)Utils.ScaleImage(Dispatcher.Properties.Resources.h_filter, 24, 24), MainForm2.ButtonColor);*/ rgbColumns.GroupBoxElement.Header.Border.TopColor = MainForm2.ButtonColor; rgbColumns.GroupBoxElement.Header.Border.TopShadowColor = MainForm2.ButtonColor; rgbColumns.GroupBoxElement.Header.TextPrimitive.ForeColor = MainForm2.ButtonColor; rbNewTicket.ButtonElement.ButtonFillElement.BackColor = MainForm2.ButtonColor; labelReportName.ForeColor = MainForm2.DefaultForeColor; pbReportType.Image = Utils.ChangeColor(Dispatcher.Properties.Resources.r_tickets, MainForm2.ButtonColor); pbClearStartTime.Image = pbClearEndTime.Image = Utils.ChangeColor(Dispatcher.Properties.Resources.b_clear, MainForm2.ButtonColor); btExportReport.ButtonElement.ButtonFillElement.BackColor = Color.White; btExportReport.ButtonElement.TextElement.ForeColor = MainForm2.ButtonColor; #endregion rtbarTicketNumbers.Ranges.CollectionChanged += delegate(object sender, NotifyCollectionChangedEventArgs e) { float min = rtbarTicketNumbers.Ranges[0].Start; float max = rtbarTicketNumbers.Ranges[0].End; // remove file descriptor for ticket number ticketingGridView.FilterDescriptors.Remove("Ticket_id"); CompositeFilterDescriptor ticketNumberDescriptor = new CompositeFilterDescriptor(); ticketNumberDescriptor.FilterDescriptors.Add(new FilterDescriptor("Ticket_id", FilterOperator.IsGreaterThanOrEqualTo, min)); ticketNumberDescriptor.FilterDescriptors.Add(new FilterDescriptor("Ticket_id", FilterOperator.IsLessThanOrEqualTo, max)); ticketNumberDescriptor.LogicalOperator = FilterLogicalOperator.And; // add the descriptor ticketingGridView.FilterDescriptors.Add(ticketNumberDescriptor); }; // remove all context menu options for the left panels ContextMenuService menuService2 = this.radDock1.GetService(); menuService2.ContextMenuDisplaying += delegate(object sender, ContextMenuDisplayingEventArgs e) { if (e.MenuType == ContextMenuType.DockWindow && e.DockWindow.DockTabStrip is DocumentTabStrip) { //remove the "Close" menu items for (int i = 0; i < e.MenuItems.Count; i++) e.MenuItems[i].Visibility = Telerik.WinControls.ElementVisibility.Collapsed; } }; // clear values for start and end dateTime pickers rdpStartTime.SetToNullValue(); rdpEndTime.SetToNullValue(); // set different properties for the grid rows this.ticketingGridView.TableElement.RowHeight = 43; this.ticketingGridView.TableElement.GroupHeaderHeight = 38; this.ticketingGridView.EnableAlternatingRowColor = true; this.ticketingGridView.TableElement.GridViewElement.TableElement.AlternatingRowColor = Color.LightYellow; this.ticketingGridView.MasterTemplate.AutoExpandGroups = true; ticketingGridView.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.ticketingGridView.EnableCustomSorting = true; // remove border for grid this.ticketingGridView.GridViewElement.DrawBorder = false; this.ticketingGridView.GridViewElement.GroupPanelElement.DrawBorder = false; CustomTicketColumn ctc = new CustomTicketColumn("MyTicket"); ctc.AllowResize = true; ctc.Name = "MyTicket"; ctc.FieldName = "MyTicket"; ctc.MinWidth = 270; ctc.MaxWidth = 700; ctc.Width = 500; ctc.HeaderText = MainForm2.returnLNGString("t_ticket"); ctc.HeaderTextAlignment = ContentAlignment.MiddleLeft; ctc.SortOrder = RadSortOrder.Ascending; this.ticketingGridView.Columns.Add(ctc); this.ticketingGridView.Columns.Move(ctc.Index, 0); //ticketingGridView.Columns["lastUpdate"].SortOrder = RadSortOrder.Descending; // /* SortDescriptor descriptor = new SortDescriptor(); descriptor.PropertyName = "lastUpdate"; descriptor.Direction = ListSortDirection.Descending; this.ticketingGridView.MasterTemplate.SortDescriptors.Add(descriptor); */ #region CELL CONDITIONAL FORMATING GridViewColumn column = ticketingGridView.Columns["priority"]; ConditionalFormattingObject obj = new ConditionalFormattingObject("priority", ConditionTypes.Equal, MainForm2.returnLNGString("High"), "", false); //obj.CellBackColor = Color.Red; obj.CellForeColor = Color.Red; obj.TextAlignment = ContentAlignment.MiddleCenter; ConditionalFormattingObject obj2 = new ConditionalFormattingObject("priority", ConditionTypes.Equal, MainForm2.returnLNGString("Normal"), "", false); //obj2.CellBackColor = Color.Yellow; obj2.CellForeColor = Color.Green; obj2.TextAlignment = ContentAlignment.MiddleCenter; ConditionalFormattingObject obj3 = new ConditionalFormattingObject("priority", ConditionTypes.Equal, MainForm2.returnLNGString("Low"), "", false); //obj3.CellBackColor = Color.Green; obj3.CellForeColor = Color.Gray; obj3.TextAlignment = ContentAlignment.MiddleCenter; ConditionalFormattingObject obj4 = new ConditionalFormattingObject("priority", ConditionTypes.Equal, MainForm2.returnLNGString("Critical"), "", false); obj4.CellFont = new Font( new FontFamily("Segoe UI"), 12, FontStyle.Bold, GraphicsUnit.Pixel); obj4.CellForeColor = Color.Red; obj4.TextAlignment = ContentAlignment.MiddleCenter; column.ConditionalFormattingObjectList.Add(obj); column.ConditionalFormattingObjectList.Add(obj2); column.ConditionalFormattingObjectList.Add(obj3); column.ConditionalFormattingObjectList.Add(obj4); #endregion RadCheckedListDataItem radCheckedListDataItem7 = new RadCheckedListDataItem("Assigned" /*MainForm2.returnLNGString("t_Assigned")*/, true); RadCheckedListDataItem radCheckedListDataItem8 = new RadCheckedListDataItem("Accepted" /*MainForm2.returnLNGString("t_Accepted")*/, true); RadCheckedListDataItem radCheckedListDataItem9 = new RadCheckedListDataItem("In progress" /*MainForm2.returnLNGString("t_InProgress")*/, true); RadCheckedListDataItem radCheckedListDataItem10 = new RadCheckedListDataItem("Completed"/*MainForm2.returnLNGString("t_Completed")*/, true); RadCheckedListDataItem radCheckedListDataItem11 = new RadCheckedListDataItem("Rejected"/*MainForm2.returnLNGString("t_Rejected")*/, true); RadCheckedListDataItem radCheckedListDataItem12 = new RadCheckedListDataItem("Overdue"/*MainForm2.returnLNGString("t_Overdue")*/, true); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem7); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem8); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem9); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem10); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem11); this.rcbDropDownTicketStatus.Items.Add(radCheckedListDataItem12); // get all dispatchers and add them into a dictionary List dispatchers = DBU.getAllDispatcher(); foreach(User user in dispatchers) { dispatchersList.Add(user.Id, user); } //convDT = new ConvertDT(); RefreshGrid(); ContextMenuService menuService = this.radDock1.GetService(); menuService.ContextMenuDisplaying += menuService_ContextMenuDisplaying; //this disables the context menu menuService.AllowActiveWindowListContextMenu = false; menuService.AllowDocumentContextMenu = false; menuService.AllowToolContextMenu = false; //set language documentWindowTicketing.Text = MainForm2.returnLNGString("tabTicketing"); rgbFilters.Text = MainForm2.returnLNGString("filters"); labelReportName.Text = MainForm2.returnLNGString("tabTicketing"); labelReportDetails.Text = MainForm2.returnLNGString("jtsDet"); radLabel12.Text = MainForm2.returnLNGString("subjectOrMessage"); radLabel4.Text = MainForm2.returnLNGString("ticketStatus"); radLabel6.Text = MainForm2.returnLNGString("createdFrom"); radLabel5.Text = MainForm2.returnLNGString("priorityFilters"); radLabel2.Text = MainForm2.returnLNGString("createdUntil"); radLabel3.Text = rcbHandledBy.Text = MainForm2.returnLNGString("handledBy"); radLabel1.Text = MainForm2.returnLNGString("ticketNumber"); rgbColumns.Text = MainForm2.returnLNGString("showHideColumns"); rbNewTicket.Text = MainForm2.returnLNGString("newTicket"); rtbSubjectFilter.NullText = rcbDropDownTicketStatus.NullText = rdpEndTime.NullText = rdpStartTime.NullText = rcbDropDropDownHandledBy.NullText = MainForm2.returnLNGString("displayall"); btExportReport.Text = MainForm2.returnLNGString("exportFilteredTickets"); rcbDeleted.Text = MainForm2.returnLNGString("displayDeleted"); rcbExpired.Text = MainForm2.returnLNGString("displayOnlyExpired"); cbPriorityLow.Text = MainForm2.returnLNGString("Low"); cbPriorityHigh.Text = MainForm2.returnLNGString("High"); cbPriorityNormal.Text = MainForm2.returnLNGString("Normal"); cbPriorityCritical.Text = MainForm2.returnLNGString("Critical"); rcbTicket.Text = MainForm2.returnLNGString("t_ticket"); rcbCreatedBy.Text = MainForm2.returnLNGString("createdBy"); rcbPriority.Text = MainForm2.returnLNGString("priority"); rcbSharedWith.Text = MainForm2.returnLNGString("sharedWith"); rcbCreationTime.Text = MainForm2.returnLNGString("creationTime"); rcbStartTime.Text = MainForm2.returnLNGString("t_startTime"); rcbEndTime.Text = MainForm2.returnLNGString("endTime"); rcbAllocatedTime.Text = MainForm2.returnLNGString("dueDate"); rcbLastUpdate.Text = MainForm2.returnLNGString("lastUpdate"); ticketingGridView.Columns["ticketInfo"].HeaderText = MainForm2.returnLNGString("t_ticket"); ticketingGridView.Columns["created_by"].HeaderText = MainForm2.returnLNGString("createdBy"); ticketingGridView.Columns["imei"].HeaderText = MainForm2.returnLNGString("handledBy"); ticketingGridView.Columns["priority"].HeaderText = MainForm2.returnLNGString("priority"); ticketingGridView.Columns["start_time"].HeaderText = MainForm2.returnLNGString("t_startTime"); ticketingGridView.Columns["end_time"].HeaderText = MainForm2.returnLNGString("endTime"); ticketingGridView.Columns["lastUpdate"].HeaderText = MainForm2.returnLNGString("lastUpdate"); ticketingGridView.Columns["creation_time"].HeaderText = MainForm2.returnLNGString("createdOn"); ticketingGridView.Columns["specified_end_time"].HeaderText = MainForm2.returnLNGString("dueDate"); ticketingGridView.Columns["share_with"].HeaderText = MainForm2.returnLNGString("sharedWith"); } private void menuService_ContextMenuDisplaying(object sender, ContextMenuDisplayingEventArgs e) { if (e.MenuType == ContextMenuType.DockWindow && e.DockWindow.DockTabStrip is DocumentTabStrip) { for (int i = 0; i < e.MenuItems.Count; i++) e.MenuItems[i].Visibility = Telerik.WinControls.ElementVisibility.Collapsed; } } private void btn_write_Click(object sender, EventArgs e) { try { ////open write job ticketing form Form fc = Application.OpenForms["NewJobTicketingForm"]; if (fc != null) fc.BringToFront(); else { NewJobTicketingForm ntf = new NewJobTicketingForm(this, SMSmode.New4Unit, "", ""); ntf.FormClosed += new FormClosedEventHandler(ntf_FormClosed); ntf.Show(); } } catch (Exception ex) { SM.Debug("Can't show new SMS form" + ex.ToString()); } } void ntf_FormClosed(object sender, FormClosedEventArgs e) { } public void SendSMS(string text, int sc_id, int sched_timegmt) { try { if ((MainForm2.VehIDHash[sc_id] != null) && (MainForm2.vehicleHT[MainForm2.VehIDHash[sc_id].ToString()] != null)) { ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIDHash[sc_id].ToString()]).CheckPositionInSystem(); String Totrans = "#142#" + ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIDHash[sc_id].ToString()]).GwandRadioID + "." + ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIDHash[sc_id].ToString()]).IMEI + "#" + text + "#" + sched_timegmt + "#" + MainForm2.userIDX + "#"; parent.Send_UDP_cmd(Totrans, 0, 0); ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIDHash[sc_id].ToString()]).EventLists.Add(new Alarms(rep_type.SMSSEND, DateTime.Now, "", text)); } } catch (Exception ex) { SM.Debug("Send SMS error on hash:" + ex.ToString()); } } public void SendSMSGroup(string text, int cps_id, int sched_timegmt) { try { String Totrans = ""; Int32 oldgatewayID = 0; foreach (GatewayIDandIP obj in MainForm2.RadioListIP) { if (oldgatewayID != obj.GWID) { oldgatewayID = obj.GWID; Totrans = "#144#" + obj.GWID + "." + obj.ID + "." + cps_id + "#" + text + "#" + sched_timegmt + "#"; parent.Send_UDP_cmd(Totrans, 0, 0); } } Totrans = "#144#0.0." + cps_id + "#" + text + "#" + sched_timegmt + "#"; parent.Send_UDP_cmd(Totrans, 0, 0); } catch (Exception ex) { SM.Debug("Send SMS Group error:" + ex.ToString()); } } private void UpdateTicketNumberTrackList(int minTicketNumber, int maxTicketNumber, int ticketCount) { // save ranges //TrackBarRangeCollection ranges = rtbarTicketNumbers.Ranges; rtbarTicketNumbers.TrackBarMode = Telerik.WinControls.UI.TrackBarRangeMode.Range; rtbarTicketNumbers.Minimum = minTicketNumber; rtbarTicketNumbers.Maximum = maxTicketNumber; int largeTicketTicks = (int)(maxTicketNumber / 5); int smallTicketTicks = (int)(maxTicketNumber / 25); rtbarTicketNumbers.LargeTickFrequency = largeTicketTicks == 0 ? 1 : largeTicketTicks; rtbarTicketNumbers.SmallTickFrequency = smallTicketTicks == 0 ? 1 : smallTicketTicks; rtbarTicketNumbers.Ranges[0].Start = minTicketNumber; rtbarTicketNumbers.Ranges[0].End = maxTicketNumber; } /// /// Refresh the Ticketing grid in order to bring the new tickets /// public void RefreshGrid() { template = new GridViewTemplate(); template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.None; //ticketingGridView.Rows.Clear(); List handledByList = new List(); // get all tickets from the DB List jtlist = DBT.getAllTickets(MainForm2.userLog, MainForm2.userIDX.ToString(), MainForm2.userType == USERTYPE.TicketingAdmin, rcbDeleted.Checked); // hide or show hint panel if not records if (jtlist.Count == 0) panelNoEvents.Visible = true; else panelNoEvents.Visible = false; int minTicketNumber = 0; int maxTicketNumber = 0; if(jtlist.Count > 0) { minTicketNumber = jtlist[0].Ticket_id; maxTicketNumber = jtlist[0].Ticket_id; } foreach (JobTickets jtl in jtlist) { // save minimum ticket number if (jtl.Ticket_id < minTicketNumber) minTicketNumber = jtl.Ticket_id; // save max ticket number if (jtl.Ticket_id > maxTicketNumber) maxTicketNumber = jtl.Ticket_id; // split imeis list by comma in order to get the list of units // to which the tickets were assigned String[] splitHandledBy = jtl.Imei.Split(','); foreach(String imei in splitHandledBy) { // see if the imei was already added if (!handledByList.Contains(imei)) handledByList.Add(imei); } jtl.Priority = MainForm2.returnLNGString(jtl.Priority); // add ticket to hash if newer if (!MainForm2.jobTicketHT.Contains(jtl.Ticket_id)) MainForm2.jobTicketHT.Add(jtl.Ticket_id, jtl); else MainForm2.jobTicketHT[jtl.Ticket_id] = jtl; // format the date time values to Culture format if (jtl.Start_time_int > 0) jtl.Start_time = jtl.Start_time_int.GetRegionalFormat(MainForm2.is24hours, MainForm2.DayFirst); jtl.Creation_time = jtl.Creation_time_int.GetRegionalFormat(MainForm2.is24hours, MainForm2.DayFirst); if (jtl.End_time_int > 0) jtl.End_time = jtl.End_time_int.GetRegionalFormat(MainForm2.is24hours, MainForm2.DayFirst); if (jtl.End_time_specified_int > 0) jtl.End_time_specified = jtl.End_time_specified_int.GetRegionalFormat(MainForm2.is24hours, MainForm2.DayFirst); //if (MainForm2.is24hours) //{ // if (MainForm2.DayFirst) // { // if (jtl.Start_time_int > 0) jtl.Start_time = convDT.GetDTLocalFromSeconds(jtl.Start_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // jtl.Creation_time = convDT.GetDTLocalFromSeconds(jtl.Creation_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_int > 0) jtl.End_time = convDT.GetDTLocalFromSeconds(jtl.End_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_specified_int > 0) jtl.End_time_specified = convDT.GetDTLocalFromSeconds(jtl.End_time_specified_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // } // else // { // if (jtl.Start_time_int > 0) jtl.Start_time = convDT.GetDTLocalFromSeconds(jtl.Start_time_int).ToString("MM/dd/yyyy HH:mm:ss, ddd"); // jtl.Creation_time = convDT.GetDTLocalFromSeconds(jtl.Creation_time_int).ToString("MM/dd/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_int > 0) jtl.End_time = convDT.GetDTLocalFromSeconds(jtl.End_time_int).ToString("MM/dd/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_specified_int > 0) jtl.End_time_specified = convDT.GetDTLocalFromSeconds(jtl.End_time_specified_int).ToString("MM/dd/yyyy HH:mm:ss, ddd"); // } //} //else //{ // if (MainForm2.DayFirst) // { // if (jtl.Start_time_int > 0) jtl.Start_time = convDT.GetDTLocalFromSeconds(jtl.Start_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // jtl.Creation_time = convDT.GetDTLocalFromSeconds(jtl.Creation_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_int > 0) jtl.End_time = convDT.GetDTLocalFromSeconds(jtl.End_time_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // if (jtl.End_time_specified_int > 0) jtl.End_time_specified = convDT.GetDTLocalFromSeconds(jtl.End_time_specified_int).ToString("dd/MM/yyyy HH:mm:ss, ddd"); // } // else // { // if (jtl.Start_time_int > 0) jtl.Start_time = convDT.GetDTLocalFromSeconds(jtl.Start_time_int).ToString("MM/dd/yyyy hh:mm:ss tt, ddd"); // jtl.Creation_time = convDT.GetDTLocalFromSeconds(jtl.Creation_time_int).ToString("MM/dd/yyyy hh:mm:ss tt, ddd"); // if (jtl.End_time_int > 0) jtl.End_time = convDT.GetDTLocalFromSeconds(jtl.End_time_int).ToString("MM/dd/yyyy hh:mm:ss tt, ddd"); // if (jtl.End_time_specified_int > 0) jtl.End_time_specified = convDT.GetDTLocalFromSeconds(jtl.End_time_specified_int).ToString("MM/dd/yyyy hh:mm:ss tt, ddd"); // } //} } // set the data source of the ticketing grid ticketingGridView.DataSource = null; ticketingGridView.DataSource = jtlist; // add handledBy list to the checkbox rcbDropDropDownHandledBy.DataSource = handledByList; // get all tickets log from the DB List jtllist = DBT.getAllTickets_log(); foreach(JobTickets_log jtl in jtllist) { // format the date time values to Culture format jtl.Modified_date = (Convert.ToInt32(jtl.Modified_date)).GetRegionalFormat(MainForm2.is24hours, MainForm2.DayFirst); //if (MainForm2.is24hours) //{ // if (MainForm2.DayFirst) // jtl.Modified_date = (Convert.ToInt32(jtl.Modified_date).GetDTLocalFromSeconds()).ToString("dd/MM/yyyy HH:mm:ss"); // else // jtl.Modified_date = (Convert.ToInt32(jtl.Modified_date).GetDTLocalFromSeconds()).ToString("MM/dd/yyyy HH:mm:ss"); //} //else //{ // if (MainForm2.DayFirst) // jtl.Modified_date = (Convert.ToInt32(jtl.Modified_date).GetDTLocalFromSeconds()).ToString("dd/MM/yyyy hh:mm:ss tt"); // else // jtl.Modified_date = (Convert.ToInt32(jtl.Modified_date).GetDTLocalFromSeconds()).ToString("MM/dd/yyyy hh:mm:ss tt"); //} // update the last time for the ticket, in the main hash table if (MainForm2.jobTicketHT.Contains(jtl.Ticket_id)) { ((JobTickets)(MainForm2.jobTicketHT[jtl.Ticket_id])).lastUpdate = jtl.Modified_date; ((JobTickets)(MainForm2.jobTicketHT[jtl.Ticket_id])).lastUpdate70 = jtl.ModifiedDate70; } } // set the data source of the child grid view template.DataSource = null; template.DataSource = jtllist; #region UI STYLING // hide row header template.ShowColumnHeaders = true; template.ShowRowHeaderColumn = false; template.EnableSorting = true; template.AllowColumnReorder = true; template.AllowColumnHeaderContextMenu = false; foreach (GridViewColumn col in template.Columns) { col.AllowSort = true; col.AllowReorder = true; col.AllowGroup = false; col.MaxWidth = 20; } // add the ticket status transition image TicketStatusTransitionColumn statusTransition = new TicketStatusTransitionColumn("TicketTransition"); statusTransition.Name = "TicketTransition"; statusTransition.FieldName = "TicketTransition"; statusTransition.MinWidth = 270; statusTransition.MaxWidth = 270; statusTransition.Width = 270; statusTransition.HeaderText = "Ticket Status Transition"; statusTransition.HeaderTextAlignment = ContentAlignment.MiddleCenter; statusTransition.AllowSort = false; template.Columns.Add(statusTransition); // hide some columns template.Columns["Ticket_id"].IsVisible = false; template.Columns["Imei"].IsVisible = false; template.Columns["PreviousJobStatus"].IsVisible = false; template.Columns["Job_status"].IsVisible = false; template.Columns["ModifiedDate70"].IsVisible = false; // style vehicle name template.Columns["Vehicle_name"].Width = 200; template.Columns["Vehicle_name"].MinWidth = 200; template.Columns["Vehicle_name"].MaxWidth = 300; template.Columns["Vehicle_name"].HeaderText = "Subscriber"; template.Columns["Vehicle_name"].TextAlignment = ContentAlignment.MiddleLeft; template.Columns.Move(template.Columns["Vehicle_name"].Index, 0); // style Job_status column template.Columns["Ticket_id"].StretchVertically = true; template.Columns["Ticket_id"].AllowResize = true; template.Columns["Ticket_id"].AutoSizeMode = BestFitColumnMode.AllCells; template.Columns["Ticket_id"].IsVisible = false; // style Modified_date column template.Columns["Modified_date"].Width = 200; template.Columns["Modified_date"].MinWidth = 170; template.Columns["Modified_date"].MaxWidth = 200; template.Columns["Modified_date"].HeaderText = "Date"; template.Columns["Modified_date"].TextAlignment = ContentAlignment.MiddleCenter; template.Columns.Move(template.Columns["Modified_date"].Index, 0); #endregion template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.None; ticketingGridView.MasterTemplate.Templates.Add(template); GridViewRelation relation = new GridViewRelation(ticketingGridView.MasterTemplate); relation.ChildTemplate = template; relation.RelationName = "Ticket"; relation.ParentColumnNames.Add("Ticket_id"); relation.ChildColumnNames.Add("Ticket_id"); relation.ChildTemplate.EnableSorting = true; // add the relation between the Tickets and the Tickets Log datasources ticketingGridView.Relations.Add(relation); // update ticket number track bar filter UpdateTicketNumberTrackList(minTicketNumber, maxTicketNumber, jtlist.Count); } /// /// Delete the selected job ticket which needs to be still ASSIGNED /// /// private void DeleteSelectedTicket() { try { int ticketIdToBeDeleted = (int)ticketingGridView.SelectedRows[0].Cells["ticket_id"].Value; bool started = (!ticketingGridView.SelectedRows[0].Cells["status"].Value.ToString().Equals(SafeMobileLib.Utils.TicketingStatuses.ASSIGNED.ToString())); RadMessageBox.SetThemeName("TelerikMetroBlue"); DialogResult dr = RadMessageBox.Show(String.Format(MainForm2.returnLNGString("t_delete_question"),ticketIdToBeDeleted.ToString()), MainForm2.returnLNGString("t_Delete"), MessageBoxButtons.YesNo, RadMessageIcon.Question); if (dr == DialogResult.Yes) { sqlResponse resp = DBT.delete_job_ticket_from_sd(ticketIdToBeDeleted, (MainForm2.userType == USERTYPE.TicketingAdmin || !started)); Utils.WriteLine("REsp " + resp.ToString(), ConsoleColor.Red); RefreshGrid(); } // remove ticket to hash if newer if (MainForm2.jobTicketHT.ContainsKey(ticketIdToBeDeleted)) MainForm2.jobTicketHT.Remove(ticketIdToBeDeleted); } catch { RadMessageBox.Show("Please select a ticket", "Delete ticket", MessageBoxButtons.OK, RadMessageIcon.Question); } } private void btn_delete_Click(object sender, EventArgs e) { } /// /// Schedule the refresh of the grid after the APP Server had inserted the ticket into the DB /// public void StartRefresh() { RefreshGridTimer.Enabled = true; RefreshGridTimer.Start(); } /// /// Timer tick method used when the time expired /// private void RefreshGridTimer_Tick(object sender, EventArgs e) { RefreshGrid(); RefreshGridTimer.Stop(); RefreshGridTimer.Enabled = false; } public void UpdateExpiredTickets(string listOfExpiredTickets) { string[] expiredTickets = listOfExpiredTickets.Split(','); try { foreach (string expiredTicket in expiredTickets) { for (int contor = 0; contor < ticketingGridView.Rows.Count; contor++) { if (ticketingGridView.Rows[contor].Cells["ticket_id"].Value != null && ticketingGridView.Rows[contor].Cells["ticket_id"].Value.ToString() == expiredTicket) { ticketingGridView.Rows[contor].Cells["IsExpired"].Value = true; } } } } catch (Exception ex) { SM.Debug("Error on update expired tickets " + ex.Message); } } /// /// Update the TicketList as a result of a Ticket insertion /// /// /// /// /// public void UpdateTicketList(int ticket_id, string status, TicketingStatus ts, Vehicle vehicle) { Utils.WriteLine("FFFFFFFFFFFFFFFFFFFF", ConsoleColor.Red); try { for (int contor = 0; contor < ticketingGridView.Rows.Count; contor++) //foreach (DataforVehList obj2 in (List)vehiclesList.DataSource) { if (ticketingGridView.Rows[contor].Cells["ticket_id"].Value != null && ticketingGridView.Rows[contor].Cells["ticket_id"].Value.ToString() == ticket_id.ToString()) { try { SM.Debug("Make the update for " + ticket_id.ToString() + " with new status" + status); ticketingGridView.Rows[contor].Cells["status"].Value = status; ticketingGridView.TableElement.Update(GridUINotifyAction.DataChanged); ticketingGridView.Refresh(); string lastStatus = (template.Rows.Where(n => (int)n.Cells["ticket_id"].Value == ticket_id && n.Cells["Vehicle_name"].Value.ToString() == vehicle.busName)).LastOrDefault().Cells["Job_status"].Value.ToString(); GridViewRowInfo rowInfo = this.template.Rows.AddNew(); rowInfo.Cells["Ticket_id"].Value = ticket_id; rowInfo.Cells["PreviousJobStatus"].Value = lastStatus; rowInfo.Cells["Job_status"].Value = status; rowInfo.Cells["Vehicle_name"].Value = vehicle.busName; rowInfo.Cells["imei"].Value = vehicle.IMEI; string timeFormat = "dd/MM/yyyy HH:mm:ss"; if (MainForm2.is24hours) { if (MainForm2.DayFirst) timeFormat = "dd/MM/yyyy HH:mm:ss"; else timeFormat = "MM/dd/yyyy HH:mm:ss"; } else { if (MainForm2.DayFirst) timeFormat = "dd/MM/yyyy hh:mm:ss tt"; else timeFormat = "MM/dd/yyyy hh:mm:ss tt"; } rowInfo.Cells["Modified_date"].Value = DateTime.Now.ToString(timeFormat); if (ticketingGridView.Rows[contor].Cells["start_time"].Value == null && ts.Status != "Rejected") ticketingGridView.Rows[contor].Cells["start_time"].Value = DateTime.Now.ToString(timeFormat); if (ts.IsLastState == 1) ticketingGridView.Rows[contor].Cells["end_time"].Value = DateTime.Now.ToString(timeFormat); // update the last update field ticketingGridView.Rows[contor].Cells["lastUpdate"].Value = rowInfo.Cells["Modified_date"].Value; //rowInfo.Cells[2].Value = DateTime.Now.ToString(); //if (ticketingGridView.Rows[contor].Cells[5].Value == null) ticketingGridView.Rows[contor].Cells[5].Value = DateTime.Now.ToString(); } catch (Exception ex) { SM.Debug("Error on change job ticket status " + ex.Message); } break; } } //if (turnOFF) populateVehiclesList(vehicleListNames); } catch (Exception ex) { SM.Debug("ExLive2:" + ex.ToString()); } } /// /// Method used to style the text which will be displayed in the group header /// private void TicketingGridView_GroupSummaryEvaluate(object sender, GroupSummaryEvaluationEventArgs e) { //e.FormatString = "" + e.Value + " has " + e.Group.ItemCount + " row(s)."; } /// /// Method used to style the group row in order to add image and change the height, bg and others /// private void TicketingGridView_ViewRowFormatting(object sender, RowFormattingEventArgs e) { //if (e.RowElement is GridGroupHeaderRowElement) { /* if (e.RowElement.RowInfo.Index % 2 == 0) e.RowElement.BackColor = Color.LightCyan; else e.RowElement.BackColor = Color.Thistle; */ /* Utils.WriteLine("Row : " + e.RowElement.ViewInfo.CurrentIndex + " | " + e.RowElement.ViewInfo.CurrentRow.Index, ConsoleColor.Cyan); e.RowElement.Image = Utils.ScaleImage(global::Dispatcher.Properties.Resources.i_assigned, 24, 24); e.RowElement.ImageAlignment = ContentAlignment.MiddleCenter; e.RowElement.Size = new Size(e.RowElement.Size.Width, 45); e.RowElement.ViewInfo.CurrentRow.Height = 45; e.RowElement.Invalidate(); if (e.RowElement.IsCurrent) { e.RowElement.GradientStyle = Telerik.WinControls.GradientStyles.Solid; e.RowElement.BackColor = Color.FromArgb(0, 143, 227); e.RowElement.DrawFill = true; } else { e.RowElement.DrawFill = false; } */ } } /// /// Method to handle the styling of various cells inside the radGrid, including Group Items /// private void TicketingGridView_CreateCell(object sender, GridViewCreateCellEventArgs e) { // format Ticket Log table if (e.Row is GridDataRowElement) { // increase row height //e.Row.RowInfo.Height = 53; if (e.Column.Name.Equals("MyTicket")) { e.CellType = typeof(CustomTicketColumn); e.CellElement = new CustomTicketCellElement(e.Column, e.Row); } if (e.Column.Name.Equals("TicketTransition")) { e.CellType = typeof(TicketStatusTransitionColumn); e.CellElement = new TicketStatusTransitionCellElement(e.Column, e.Row); } } } /// /// Hide or display grid columns with every checkbox tick. /// /// Corresponding column checkbox private void ticketingColumn_StateChanged(object sender, StateChangedEventArgs args) { // check which checkbox generated this event and then set the column name string columnName = ""; if ((RadCheckBox)sender == rcbTicket) columnName = "MyTicket"; else if ((RadCheckBox)sender == rcbAllocatedTime) columnName = "specified_end_time"; else if ((RadCheckBox)sender == rcbCreatedBy) columnName = "created_by"; else if ((RadCheckBox)sender == rcbCreationTime) columnName = "creation_time"; else if ((RadCheckBox)sender == rcbEndTime) columnName = "end_time"; else if ((RadCheckBox)sender == rcbHandledBy) columnName = "imei"; else if ((RadCheckBox)sender == rcbPriority) columnName = "priority"; else if ((RadCheckBox)sender == rcbSharedWith) columnName = "share_with"; else if ((RadCheckBox)sender == rcbStartTime) columnName = "start_time"; else if ((RadCheckBox)sender == rcbLastUpdate) columnName = "lastUpdate"; // show/hide selected column this.ticketingGridView.Columns[columnName].IsVisible = args.ToggleState == ToggleState.On; VisualSettings.InsertUpdateHTforVisualItems(this.Name, ((RadCheckBox)sender).Name, ((RadCheckBox)sender).Checked.ToString()); } /// /// Format the cells for each cell or column /// /// Cell parameters including column, row, databound item private void ticketingGridView_CellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e) { GridCellElement cellElement = e.CellElement; GridViewDataColumn columnInfo = e.CellElement.ColumnInfo as GridViewDataColumn; if (e.Row is GridViewDataRowInfo) { if (showCellBorders) { e.CellElement.ResetValue(GridDataCellElement.DrawBorderProperty, Telerik.WinControls.ValueResetFlags.Local); } else { e.CellElement.DrawBorder = false; } } /* // change priority image according to the type if (cellElement is GridDataCellElement && columnInfo.Name == "priority") { JobTickets jb = null; if (e.Row.DataBoundItem is JobTickets) { cellElement.DrawText = false; //cellElement.Text = ""; jb = (JobTickets)e.Row.DataBoundItem; cellElement.BackgroundImageLayout = ImageLayout.Center; // select icon from data bound if (jb.Priority.Equals("High")) cellElement.BackgroundImage = Utils.ScaleImage(global::Dispatcher.Properties.Resources.b_high, 25, 25); else if (jb.Priority.Equals("Low")) cellElement.BackgroundImage = Utils.ScaleImage(global::Dispatcher.Properties.Resources.b_low, 25, 25); else cellElement.BackgroundImage = Utils.ScaleImage(global::Dispatcher.Properties.Resources.b_medium, 25, 25); } }*/ /* // change status image according to it's state else if (cellElement is GridDataCellElement && columnInfo.Name == "status") { JobTickets jb = null; if(e.Row.DataBoundItem is JobTickets) { jb = (JobTickets)e.Row.DataBoundItem; if (jb.Status == "Assigned") { cellElement.BackgroundImage = Utils.ScaleImage(global::Dispatcher.Properties.Resources.i_assigned, 24,24); cellElement.BackgroundImageLayout = ImageLayout.Center; } cellElement.Text = ""; } }*/ // change priority image according to the type if (cellElement is GridDataCellElement && columnInfo.Name == "share_with") { cellElement.Padding = new Padding(0, 0, 10, 0); JobTickets jb = null; if (e.Row.DataBoundItem is JobTickets) { jb = (JobTickets)e.Row.DataBoundItem; // get the name of all dispatchers string sharedWith = ""; if (jb.Share_with != null && jb.Share_with.Length > 0) { // split shared with based on the ; String[] shared = jb.Share_with.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (string dispatcherID in shared) { // get dispatcher name if exists if (dispatchersList.ContainsKey(Int32.Parse(dispatcherID))) sharedWith += dispatchersList[Int32.Parse(dispatcherID)].UserName + ";"; else sharedWith += dispatcherID + ";"; } // remove last ; character if (sharedWith.Length > 0 && sharedWith[sharedWith.Length - 1] == ';') sharedWith = sharedWith.Substring(0, sharedWith.Length - 1); // set text to the cell cellElement.Text = sharedWith; } } } else if (cellElement is GridImageCellElement && columnInfo.Name == "scheduled") { if (e.Row.DataBoundItem is JobTickets) { string timeValue = ""; JobTickets jb = (JobTickets)e.Row.DataBoundItem; DateTime scheduledTicketTime = (new DateTime(1970, 1, 1)).AddSeconds(jb.sched_timegmt); string timeFormat = "dd/MM/yyyy HH:mm:ss"; if (MainForm2.is24hours) { if (MainForm2.DayFirst) timeFormat = "dd/MM/yyyy HH:mm:ss"; else timeFormat = "MM/dd/yyyy HH:mm:ss"; } else { if (MainForm2.DayFirst) timeFormat = "dd/MM/yyyy hh:mm:ss tt"; else timeFormat = "MM/dd/yyyy hh:mm:ss tt"; } timeValue = String.Format("{0:" + timeFormat + "}", scheduledTicketTime); cellElement.DrawText = false; if (jb.sched_timegmt > 0) { cellElement.BackgroundImageLayout = ImageLayout.Zoom; cellElement.BackgroundImage = global::Dispatcher.Properties.Resources.schedule; cellElement.Text = timeValue; } else { cellElement.BackgroundImage = global::Dispatcher.Properties.Resources.transparent; cellElement.Text = ""; } } } // change the way on which the DateTime is displayed else if (cellElement is GridDataCellElement && (columnInfo.Name == "creation_time" || columnInfo.Name == "start_time" || columnInfo.Name == "end_time" || columnInfo.Name == "specified_end_time" || columnInfo.Name == "lastUpdate")) { Font font = new Font( cellElement.Font.FontFamily, 10, FontStyle.Bold, GraphicsUnit.Pixel); cellElement.ForeColor = Color.FromArgb(0x66, 0x66, 0x66); cellElement.Font = font; JobTickets jb = null; if(e.Row.DataBoundItem is JobTickets) { string timeValue = ""; jb = (JobTickets)e.Row.DataBoundItem; if (jb.Creation_time != null && jb.Creation_time.Length > 0 && columnInfo.Name == "creation_time") { timeValue = jb.Creation_time; //cellElement.ForeColor = Color.FromArgb(0, 0, 0); } else if (jb.Start_time != null && jb.Start_time.Length > 0 && columnInfo.Name == "start_time") { timeValue = jb.Start_time; //cellElement.ForeColor = Color.FromArgb(66, 66, 66); } else if (jb.End_time != null && jb.End_time.Length > 0 && columnInfo.Name == "end_time") { timeValue = jb.End_time; //cellElement.ForeColor = Color.FromArgb(132, 132, 132); } else if (jb.lastUpdate != null && jb.lastUpdate.Length > 0 && columnInfo.Name == "lastUpdate") { cellElement.ForeColor = Color.FromArgb(0, 0, 0); DateTime ticketTime = (new DateTime(1970, 1, 1)).AddSeconds(jb.lastUpdate70); Int64 secondsDifference = (Int64)((DateTime.UtcNow.Subtract(ticketTime)).TotalSeconds); if (secondsDifference < 60) timeValue = MainForm2.returnLNGString("lessthan1minute"); else if (secondsDifference < 3600) //timeValue = (secondsDifference / 60) + " minute" + ((secondsDifference / 60) > 1 ? "s" : "") + " ago"; timeValue = (secondsDifference / 60) + MainForm2.returnLNGString("minutesago"); else if (secondsDifference < 7200) timeValue = MainForm2.returnLNGString("hourAgo"); else if (secondsDifference < 86400) { timeValue = string.Format(MainForm2.returnLNGString("hoursAgo"),(secondsDifference / 3660)) ; cellElement.ForeColor = Color.FromArgb(0x66, 0x66, 0x66); } else { timeValue = string.Format(MainForm2.returnLNGString("daysAgo"), (secondsDifference / 86400)); cellElement.ForeColor = Color.FromArgb(0x66, 0x66, 0x66); } //timeValue = jb.lastUpdate; } else if (jb.End_time_specified != null && jb.End_time_specified.Length > 0 && columnInfo.Name == "specified_end_time") { timeValue = jb.End_time_specified; // change color for an expired ticket if (jb.IsExpired) cellElement.ForeColor = Color.FromArgb(255, 0, 0); } if (timeValue!= null && timeValue.Length > 0) { // find spaces to add a new line between them string[] split = timeValue.Split(' '); if (split.Length == 4) cellElement.Text = String.Format("{0}\n{1} {2} {3}", split[0], split[1], split[2], split[3]); else if (split.Length == 3) cellElement.Text = String.Format("{0}\n{1} {2}", split[0], split[1], split[2]); else if (split.Length == 2) cellElement.Text = String.Format("{0}\n{1}", split[0], split[1]); else cellElement.Text = timeValue; } } } else if (cellElement is GridDataCellElement && columnInfo.Name == "MyTicket") { cellElement.Padding = new Padding(10, 0, 0, 0); cellElement.SetContent(); cellElement.ToolTipText = ""; JobTickets jb = null; if (e.Row.DataBoundItem is JobTickets) { jb = (JobTickets)e.Row.DataBoundItem; if (jb != null && jb.Imei.Length > 0) { // show tooltip for imei foreach (String imei in jb.Imei.Split(',')) cellElement.ToolTipText = cellElement.ToolTipText + String.Format("{0}: {1}", imei, jb.Status) + System.Environment.NewLine; } } } // do not highlight the cell on which was clicked if (e.CellElement.IsCurrent) { e.CellElement.IsCurrent = false; } // format Ticket Log table if (e.CellElement.ViewTemplate.Parent != null) { /* e.CellElement.BackColor = Color.FromArgb(193, 235,255); e.CellElement.NumberOfColors = 1; e.CellElement.DrawFill = true; */ e.CellElement.Size = new Size(55, e.CellElement.Size.Height); if (cellElement is GridDataCellElement && columnInfo.Name == "Vehicle_name") { // bold the font Font font = new Font( cellElement.Font.FontFamily, 12, FontStyle.Bold, GraphicsUnit.Pixel); cellElement.Font = font; cellElement.Padding = new System.Windows.Forms.Padding(8,0,0,0); JobTickets_log jb = null; if (e.Row.DataBoundItem is JobTickets_log) { cellElement.DrawText = true; //cellElement.Text = ""; jb = (JobTickets_log)e.Row.DataBoundItem; /* if (jb != null && jb.Job_status != null) { if (jb.Job_status.Equals("Assigned")) { //cellElement.Text = "DDERDDD: " + e.Row.Parent + " | " + e.RowIndex ; } }*/ } } else if (cellElement is GridDataCellElement && columnInfo.Name == "Job_status") { JobTickets_log jb = null; if (e.Row.DataBoundItem is JobTickets_log) { cellElement.DrawText = true; //cellElement.Text = ""; jb = (JobTickets_log)e.Row.DataBoundItem; cellElement.BackgroundImageLayout = ImageLayout.Center; cellElement.BackColor = SafeMobileLib.Utils.TicketingStatuses.GetTicketStatusColor(jb.Job_status); } } else if (cellElement is GridDataCellElement && columnInfo.Name == "Modified_date") { cellElement.Padding = new System.Windows.Forms.Padding(0, 0, 8, 0); Font font = new Font( cellElement.Font.FontFamily, 10, FontStyle.Bold, GraphicsUnit.Pixel); cellElement.ForeColor = Color.DarkGray; cellElement.Font = font; } else if (cellElement is GridDataCellElement && columnInfo.Name == "TicketTransition") { cellElement.Padding = new Padding(10, 0, 0, 0); cellElement.SetContent(); } } } private void ticketingGridView_ToolTipTextNeeded(object sender, ToolTipTextNeededEventArgs e) { if (sender is GridImageCellElement) { GridImageCellElement cell = sender as GridImageCellElement; if(cell.Text != null) { cell.AutoToolTip = true; cell.ToolTipText = cell.Text; return; } } e.ToolTipText = ""; } /// /// Format ChildCell Height and Padding to right /// private void ticketingGridView_ViewCellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e) { // increase the row height of the childtable element GridDetailViewCellElement cell = e.CellElement as GridDetailViewCellElement; if (cell != null) { cell.Margin = new Padding(200, 0, 0, 0); cell.ChildTableElement.RowHeight = 53; } } /// /// Filter tickets based on the priority selected by the user /// /// CheckBox which was clicked by the user /// private void priorityCheckBox_StateChanged(object sender, StateChangedEventArgs args) { // clear all priority filters ticketingGridView.FilterDescriptors.Remove("priority"); // add filters only for selected priorities CompositeFilterDescriptor fileDescriptor = new CompositeFilterDescriptor(); if(cbPriorityLow.Checked) fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("priority", FilterOperator.IsEqualTo, MainForm2.returnLNGString(PriorityType.Low.ToString()))); if (cbPriorityNormal.Checked) fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("priority", FilterOperator.IsEqualTo, MainForm2.returnLNGString(PriorityType.Normal.ToString()))); if (cbPriorityHigh.Checked) fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("priority", FilterOperator.IsEqualTo, MainForm2.returnLNGString(PriorityType.High.ToString()))); if (cbPriorityCritical.Checked) fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("priority", FilterOperator.StartsWith, MainForm2.returnLNGString(PriorityType.Critical.ToString()))); fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("priority", FilterOperator.IsEqualTo, global::Dispatcher.Properties.Resources.i_overdue)); fileDescriptor.LogicalOperator = FilterLogicalOperator.Or; // add only if checkbox are checked = filters are added if (fileDescriptor.FilterDescriptors.Count > 0) this.ticketingGridView.FilterDescriptors.Add(fileDescriptor); VisualSettings.InsertUpdateHTforVisualItems(this.Name, ((RadCheckBox)sender).Name, ((RadCheckBox)sender).Checked.ToString()); } /// /// Filter tickets based on them start time [this value can be reset to none] /// /// DateTime Picker which changed it's value private void rdpStartTime_ValueChanged(object sender, EventArgs e) { if (rdpStartTime.Value > new DateTime(2015, 1, 1)) rdpEndTime.MinDate = rdpStartTime.Value; // remove file descriptor for Start time ticketingGridView.FilterDescriptors.Remove("creation_time"); // add only if date is older than 2015 if (rdpStartTime.Value > new DateTime(2015, 1, 1)) { FilterDescriptor startFileDescriptor = new FilterDescriptor("creation_time", FilterOperator.IsGreaterThanOrEqualTo, rdpStartTime.Value); this.ticketingGridView.FilterDescriptors.Add(startFileDescriptor); } else // remove file descriptor for Start time ticketingGridView.FilterDescriptors.Remove("creation_time"); } /// /// Filter tickets based on them end time [this value can be reset to none] /// /// DateTime Picker which changed it's value private void rdpEndTime_ValueChanged(object sender, EventArgs e) { // remove file descriptor for Start time ticketingGridView.FilterDescriptors.Remove("creation_time"); // add only if date is older than minimum date if (rdpEndTime.Value > rdpEndTime.MinDate) { FilterDescriptor startFileDescriptor = new FilterDescriptor("creation_time", FilterOperator.IsLessThanOrEqualTo, rdpEndTime.Value); this.ticketingGridView.FilterDescriptors.Add(startFileDescriptor); } else // remove file descriptor for Start time ticketingGridView.FilterDescriptors.Remove("creation_time"); } /// /// Reset start and end DateTime Picker values in order to reset the filter on /// Start and End time /// /// PictureBox for which datetime should be reset private void pbClearTime_Click(object sender, EventArgs e) { // clear start time if ((PictureBox)sender == pbClearStartTime) rdpStartTime.SetToNullValue(); // clear end time if((PictureBox)sender == pbClearEndTime) rdpEndTime.SetToNullValue(); } /// /// Filter tickets based on the selected imeis from the CheckBox drop down list /// private void rcbDropDropDownHandledBy_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { // clear all priority filters ticketingGridView.FilterDescriptors.Remove("imei"); // add filters only if selected users if (rcbDropDropDownHandledBy.CheckedItems.Count > 0) { // create a composite file descriptor with OR logic CompositeFilterDescriptor fileDescriptor = new CompositeFilterDescriptor(); fileDescriptor.LogicalOperator = FilterLogicalOperator.Or; // for each selected imei add a custom fildescriptor foreach (RadListDataItem item in rcbDropDropDownHandledBy.CheckedItems) { fileDescriptor.FilterDescriptors.Add(new FilterDescriptor("imei", FilterOperator.Contains, item.Value.ToString())); } // add filter this.ticketingGridView.FilterDescriptors.Add(fileDescriptor); } } /// /// filter tickets based on the selected statuses /// private void rcbDropDownTicketStatus_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { // clear all statuses filters ticketingGridView.FilterDescriptors.Remove("status"); // add filters only if selected ticket statuses if (rcbDropDownTicketStatus.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; // for each selected status add a custom filedescroptor foreach (RadListDataItem item in rcbDropDownTicketStatus.CheckedItems) { statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("status", FilterOperator.Contains, item.Text.ToString())); } // add filter this.ticketingGridView.FilterDescriptors.Add(statusDescriptor); if (isFilterLoaded == true) VisualSettings.InsertUpdateHTforVisualItems(this.Name, rcbDropDownTicketStatus.Name, rcbDropDownTicketStatus.Text); } } /// /// filter tickets based on the subject or message /// private void rtbSubjectFilter_TextChanged(object sender, EventArgs e) { // clear all subject/message filters ticketingGridView.FilterDescriptors.Remove("name"); ticketingGridView.FilterDescriptors.Remove("comment"); // add filters only if selected ticket statuses if (rtbSubjectFilter.Text.Length > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; // add filters for name and comment statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("name", FilterOperator.Contains, rtbSubjectFilter.Text)); statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("comment", FilterOperator.Contains, rtbSubjectFilter.Text)); // add filter this.ticketingGridView.FilterDescriptors.Add(statusDescriptor); } } #region CHANGE NEW TICKET BG COLOR private void rbNewTicket_MouseEnter(object sender, EventArgs e) { //rbNewTicket.ButtonElement.ButtonFillElement.BackColor = MainForm2.ButtonColorOver; //Color.FromArgb(1, 146, 195); } private void rbNewTicket_MouseLeave(object sender, EventArgs e) { //rbNewTicket.ButtonElement.ButtonFillElement.BackColor = MainForm2.ButtonColor; } private void rbNewTicket_MouseDown(object sender, MouseEventArgs e) { //rbNewTicket.ButtonElement.ButtonFillElement.BackColor = Color.FromArgb(47,201,252); } #endregion private void ticketingGridView_CustomSorting(object sender, GridViewCustomSortingEventArgs e) { int descriptorIndex = -1; // search the Ticket column and get it's descriptor Index for (int i = 0; i < this.ticketingGridView.SortDescriptors.Count; i++) { if (ticketingGridView.SortDescriptors[i].PropertyName == "MyTicket") { descriptorIndex = i; break; } } // custom sort the ticket column if (descriptorIndex != -1) { // get data bound items for the two rows JobTickets jt1 = e.Row1.DataBoundItem as JobTickets; JobTickets jt2 = e.Row2.DataBoundItem as JobTickets; // compare based on the ticket_id int sortResult = jt1.Ticket_id.CompareTo(jt2.Ticket_id); // invert result if set sort descriptor is descending if (sortResult != 0) { if (this.ticketingGridView.SortDescriptors[descriptorIndex].Direction == ListSortDirection.Descending) sortResult = -sortResult; } // set sort result e.SortResult = sortResult; } // do not handle the sorting for other columns else e.Handled = false; } //private void rcbDeleted_ToggleStateChanged(object sender, StateChangedEventArgs args) //{ // RefreshGrid(); //} private void rcbExpired_ToggleStateChanged(object sender, StateChangedEventArgs args) { // clear all expired filters ticketingGridView.FilterDescriptors.Remove("IsExpired"); if (rcbExpired.Checked) { FilterDescriptor filter = new FilterDescriptor(); filter.PropertyName = "IsExpired"; filter.Operator = FilterOperator.IsEqualTo; filter.Value = "true"; filter.IsFilterEditor = true; // add filter this.ticketingGridView.FilterDescriptors.Add(filter); } VisualSettings.InsertUpdateHTforVisualItems(this.Name, ((RadCheckBox)sender).Name, ((RadCheckBox)sender).Checked.ToString()); } private void rcbDeleted_ToggleStateChanged(object sender, StateChangedEventArgs args) { RefreshGrid(); VisualSettings.InsertUpdateHTforVisualItems(this.Name, ((RadCheckBox)sender).Name, ((RadCheckBox)sender).Checked.ToString()); } /// /// Intercept when a document window had changed it's state, on double click /// or drag/drop, and set that it is not allowed to close/hide it /// private void radDock1_DockStateChanged(object sender, DockWindowEventArgs e) { e.DockWindow.ToolCaptionButtons = ToolStripCaptionButtons.None; e.DockWindow.AllowedDockState = AllowedDockState.Docked | AllowedDockState.TabbedDocument; } /// /// Event handler for when the left tab panel needs to be docked/transfor in floating state. /// This will cancel this event in order to prevent the stupid case with hiding the dock window /// private void radDock1_DockStateChanging(object sender, DockStateChangingEventArgs e) { e.Cancel = true; } private void ticketingGridView_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e) { try { if (e.ContextMenuProvider is GridHeaderCellElement) { } else if (e.ContextMenuProvider is GridDataCellElement || e.ContextMenuProvider is LiveGridCellElement) { GridViewRowInfo row = (e.ContextMenuProvider is LiveGridCellElement ? ((LiveGridCellElement)e.ContextMenuProvider).RowInfo as GridViewDataRowInfo : ((GridDataCellElement)e.ContextMenuProvider).RowInfo); JobTickets jt = row.DataBoundItem as JobTickets; if (jt != null) { RadDropDownMenu contextMenu = new RadDropDownMenu(); RadMenuItem itemTitle = new RadMenuItem(MainForm2.returnLNGString("t_ticket") + " #" + jt.Ticket_id); itemTitle.Font = new Font( //ticketSubjectElement.Font.FontFamily, new FontFamily("SEGOE UI"), 12, FontStyle.Bold, GraphicsUnit.Pixel); itemTitle.Enabled = false; contextMenu.Items.Add(itemTitle); RadMenuItem tmpItem5 = null; //markasstolen if ((!MainForm2.LimitedUser) && (MainForm2.radioType != RADIOTYPE.ATLAS) && (MainForm2.radioType != RADIOTYPE.TETRA) && (MainForm2.radioType != RADIOTYPE.CONECTPLUS)) { // only assigned tickets can be deleted //bool CanBeDeleted = jt.Status.Equals("Assigned"); bool CanBeDeleted = true; // create context menu item according to it's status tmpItem5 = new RadMenuItem(MainForm2.returnLNGString(CanBeDeleted ? "t_Delete" : "t_DeleteAssigned")); tmpItem5.Font = new Font( //ticketSubjectElement.Font.FontFamily, new FontFamily("SEGOE UI"), 11, CanBeDeleted ? FontStyle.Regular : FontStyle.Italic, GraphicsUnit.Pixel); // change font color according to the ticket status tmpItem5.ForeColor = (CanBeDeleted ? Color.Black : Color.DarkGray); itemTitle.Enabled = false; tmpItem5.Click += delegate(object s, EventArgs e2) { if (CanBeDeleted) DeleteSelectedTicket(); }; contextMenu.Items.Add(tmpItem5); } e.ContextMenu = contextMenu; } } } catch (Exception ex) { SM.Debug("EXLive10:" + ex.ToString()); } } /// /// Change background color for the row according to its state and theme /// private void ticketingGridView_RowFormatting(object sender, RowFormattingEventArgs e) { e.RowElement.DrawFill = true; e.RowElement.NumberOfColors = 1; if (e.RowElement.IsSelected) e.RowElement.BackColor = MainForm2.GridSelectedRow; else e.RowElement.BackColor = (e.RowElement.RowInfo.Index % 2 == 0 ? Color.White : MainForm2.GridAlternateRow); } private void btExportReport_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Docx|*.docx"; sfd.Title = "Save all filtered tickets"; string dateTime = DateTime.Now.ToString(); dateTime = dateTime.Replace("/", "_"); dateTime = dateTime.Replace("\\", "_"); dateTime = dateTime.Replace(" ", "_"); dateTime = dateTime.Replace(":", "."); sfd.FileName = String.Format(@"" + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile") + "_ticketing_{0}.docx", dateTime); DialogResult dr = sfd.ShowDialog(); // If the file name is not an empty string open it for saving. if (dr == System.Windows.Forms.DialogResult.OK || dr == System.Windows.Forms.DialogResult.Yes) { // We will need a file name for our output file (change to suit your machine): string fileNameTemplate = sfd.FileName + (sfd.FileName.EndsWith(".docx") ? "" : ".docx"); //@"Invoice_{0}-{1:MM_dd_yy_HH.mm.ss}.docx"; // Grab a reference to the desired template var doc = Novacode.DocX.Load(@"resource\templates\export_ticketing.docx"); doc.ReplaceText("%DATA%", String.Format("{0}", DateTime.Now.ToString())); doc.ReplaceText("%COMPANY%", "Generated using " + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile") + " Dispatch"); #region Works // get the empty template row Novacode.Row emptyRow = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1]; FontFamily centuryGothic = null; try { centuryGothic = new FontFamily("Century Gothic"); } catch (Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); } FontFamily font = new FontFamily("Arial"); if (centuryGothic != null) font = centuryGothic; foreach (GridViewRowInfo groupRow in ticketingGridView.ChildRows) { if (groupRow.ChildRows.Count > 0) { foreach (GridViewRowInfo gridRow in groupRow.ChildRows) { JobTickets ticket = groupRow.DataBoundItem as JobTickets; JobTickets_log ticket_log = gridRow.DataBoundItem as JobTickets_log; // skip group headers and others UI elements withoug databound items if (ticket == null) continue; // add a new empty row and then edit it doc.Tables[0].InsertRow(emptyRow); // get the new inserted row which is empty Novacode.Row row = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1]; int column = 0; row.Cells[column++].Paragraphs[0].Append(ticket.Ticket_id + "").FontSize(9).Font(font); using (MemoryStream ms = new MemoryStream()) { Bitmap bmp = new Bitmap(100, 40); using (Graphics g = Graphics.FromImage(bmp)) { using (Brush brush = new SolidBrush( SafeMobileLib.Utils.TicketingStatuses.GetTicketStatusColor(ticket_log.Job_status))) { g.FillRectangle(brush, 0, 0, 100, 40); // Create font and brush. Font drawFont = new Font(font, 9); // Create point for upper-left corner of drawing. PointF drawPoint = new PointF(7, 10); // Draw string to screen. g.DrawString(ticket_log.Job_status, drawFont, new SolidBrush(Color.FromArgb(213, 213, 213)), drawPoint); } bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); // go to the begining of the picture ms.Seek(0, SeekOrigin.Begin); Novacode.Image img = doc.AddImage(ms); // Create image. Novacode.Picture pic1 = img.CreatePicture(); // Create picture. row.Cells[column++].Paragraphs[0].AppendPicture(pic1); } bmp.Dispose(); } row.Cells[column++].Paragraphs[0].Append(ticket.Name).FontSize(9).Font(font); row.Cells[column - 1].Paragraphs[0].Bold(); if (ticket.IsExpired) row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(255, 0, 0)); row.Cells[column++].Paragraphs[0].Append(ticket.Priority).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(ticket.Dispatcher).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(gridRow.Cells["imei"].Value.ToString()).FontSize(9).Font(font); row.Cells[column - 1].Paragraphs[0].Bold(); row.Cells[column++].Paragraphs[0].Append(ticket_log.Modified_date).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(ticket.Start_time + " / " + ticket.End_time).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(ticket.End_time_specified).FontSize(8).Font(font); row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(255, 0, 0)); #region LAST UPDATED String timeValue = ""; DateTime ticketTime = (new DateTime(1970, 1, 1)).AddSeconds(ticket.lastUpdate70); Int64 secondsDifference = (Int64)((DateTime.UtcNow.Subtract(ticketTime)).TotalSeconds); if (secondsDifference < 60) timeValue = MainForm2.returnLNGString("lessthan1minute"); else if (secondsDifference < 3600) timeValue = (secondsDifference / 60) + MainForm2.returnLNGString("minutesago"); else if (secondsDifference < 7200) timeValue = MainForm2.returnLNGString("hourAgo"); else if (secondsDifference < 86400) timeValue = string.Format(MainForm2.returnLNGString("hoursAgo"), (secondsDifference / 3660)); else timeValue = string.Format(MainForm2.returnLNGString("daysAgo"), (secondsDifference / 86400)); row.Cells[column++].Paragraphs[0].Append(timeValue).FontSize(8).Font(font); row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(66, 66, 66)); #endregion } } } // remove first row after the header because is an empty one doc.Tables[0].RemoveRow(1); #endregion // Save as New filename: doc.SaveAs(sfd.FileName); // Open in word: //Process.Start("WINWORD.EXE", "\"" + outputFileName + "\""); parent.DisplayToast(MainForm2.returnLNGString("TicketExportSaved"), string.Format(MainForm2.returnLNGString("ticketSavedHTML"),fileNameTemplate,sfd.FileName)); } } #region CHANGE TABS BACKGROUND private DockWindow oldDockWindow = null; private void radDock1_ActiveWindowChanging(object sender, DockWindowCancelEventArgs e) { // reset the background icon for the previous tab e.OldWindow.TabStripItem.BackColor = Color.White; e.OldWindow.TabStripItem.DrawFill = true; e.OldWindow.TabStripItem.NumberOfColors = 1; // reset the background for the new window e.NewWindow.TabStripItem.DrawFill = true; e.NewWindow.TabStripItem.NumberOfColors = 1; e.NewWindow.TabStripItem.BackColor = MainForm2.TabSelectedColor; // save old dock window oldDockWindow = e.OldWindow; } private void radDock1_ActiveWindowChanged(object sender, DockWindowEventArgs e) { // reset the background icon for the previous tab oldDockWindow.TabStripItem.BackColor = Color.White; oldDockWindow.TabStripItem.DrawFill = true; oldDockWindow.TabStripItem.NumberOfColors = 1; e.DockWindow.TabStripItem.DrawFill = true; e.DockWindow.TabStripItem.NumberOfColors = 1; e.DockWindow.TabStripItem.BackColor = MainForm2.TabSelectedColor; } #endregion private void TicketingUserControl_Load(object sender, EventArgs e) { VisualSettings.loadUserVisualSettings(this.Name, this.rgbFilters, MainForm2.HashVal); VisualSettings.loadUserVisualSettings(this.Name, this.rgbColumns, MainForm2.HashVal); isFilterLoaded = true; } } }