protected void btnGo_Click(object sender, EventArgs e) { var date = dpDate.Text.AsDateTime(); if (date == null) { return; } var locationId = PageParameter("LocationId").AsInteger(); var tomorrow = date.Value.AddDays(1); var rockContext = new RockContext(); rockContext.Database.CommandTimeout = 300; //5 minutes var historyService = new HistoryService(rockContext); var qry = historyService.Queryable() .Where(h => h.EntityTypeId == personEntityTypeId && h.RelatedEntityId == locationId && h.CategoryId == 4 && h.CreatedDateTime > date && h.CreatedDateTime < tomorrow) .Join(new PersonService(rockContext).Queryable(), h => h.EntityId, p => p.Id, (h, p) => new { Person = p, History = h }) .GroupBy(a => a.Person) .OrderBy(a => a.Key.NickName) .ThenBy(a => a.Key.LastName) .ToList(); var roomEvents = new List <RoomEvent>(); var failedRoomEvents = new List <RoomEvent>(); var newDate = new DateTime(); var personLinks = new List <int>(); foreach (var person in qry) { personLinks.Add(person.Key.Id); var roomEvent = new RoomEvent(person.Key); foreach (var item in person) { roomEvent.AddEvent(item.History); if (item.History.Verb == "Entry" && roomEvent.Entry == newDate) { roomEvent.Entry = item.History.CreatedDateTime.Value; } else if (item.History.Verb == "Exit") { //if for somee reason there is no entry into the room //we still want the information to appear on the chart if (roomEvent.Entry == newDate) { roomEvent.Entry = date.Value; } roomEvent.Exit = item.History.CreatedDateTime.Value; roomEvents.Add(roomEvent); roomEvent = new RoomEvent(person.Key); } } if (roomEvent.Events.Any()) { failedRoomEvents.Add(roomEvent); } } var combined = String.Join(",", roomEvents.Select(r => r.ToString())).Replace("<span class='field-name'>", "<span class=\"field-name\">"); var peopleString = string.Join(",", personLinks); var script = string.Format(@" google.charts.load(""current"", {{ packages: [""timeline""] }}); google.charts.setOnLoadCallback(drawChart); function drawChart() {{ var container = document.getElementById('report'); chart = new google.visualization.Timeline(container); var dataTable = new google.visualization.DataTable(); dataTable.addColumn({{ type: 'string', id: 'Room' }}); dataTable.addColumn({{ type: 'string', id: 'Name' }}); dataTable.addColumn({{ type: 'string', role: 'tooltip', 'p': {{ 'html': true }} }}); dataTable.addColumn({{ type: 'date', id: 'Start' }}); dataTable.addColumn({{ type: 'date', id: 'End' }}); dataTable.addRows([{0}]); var options = {{ tooltip: {{ isHtml: true }} }}; chart.draw(dataTable, options); google.visualization.events.addListener(chart, 'select', alertAction); }} var personLinks = [{1}]; drawChart();", combined, peopleString); ScriptManager.RegisterStartupScript(pnlReport, pnlReport.GetType(), "report", script, true); }