/// <summary> /// Generates visualizations from several attributes. /// </summary> /// <param name="dataSetID">data set to use</param> /// <param name="variable">attribute to visualize</param> /// <param name="visType">visualization type to generate</param> /// <returns></returns> public GameObject GenerateVisFrom(int dataSetID, string[] variables, VisType visType, bool persist = true) { if (!initialized) { Initialize(); } try { var vis = generators[visType].GenerateVisualization(dataSetID, variables); vis = Services.ETVFactory2D().PutETVOnAnchor(vis); AddNetworkAnchor(vis, dataSetID, variables, visType); Services.Persistence().PersistETV(vis, dataSetID, variables, visType); vis.transform.parent = GameObject.FindGameObjectWithTag("RootWorldAnchor").transform; vis.transform.position = NewETVPlaceHolder.position; return(vis); } catch (Exception e) { Debug.Log("Creation of requested Visualization failed."); Debug.LogError(e.Message); Debug.LogError(e.StackTrace); return(new GameObject("Creation Failed")); } }
/// <summary> /// Constructor. /// </summary> public VisDescr(string ident, string uiName, VisType type, VisParamDescr[] descrs) { Ident = ident; UiName = uiName; VisualizationType = type; VisParamDescrs = descrs; }
private void SwitchToWeek_Clicked(object sender, RoutedEventArgs e) { _currentVisType = VisType.Week; SwitchToWeekButton.Visibility = Visibility.Collapsed; SwitchToDayButton.Visibility = Visibility.Visible; TodayButton.Content = "This Week"; WebBrowserNavigateTo(Handler.GetInstance().GetDashboardNavigateUriForType(DatePicker.SelectedDate.Value, _currentVisType)); }
public FeedbackBox(VisType type) { Title = "Got feedback?"; IsEnabled = Shared.Settings.IsFeedbackEnabled; Order = 22; //todo: handle by user Size = VisSize.Small; Type = type; }
public FeedbackBox(VisType type) { Title = "Got feedback?"; IsEnabled = Settings.IsFeedbackEnabled; Order = 22; //todo: handle by user Size = VisSize.Small; Type = type; }
/// <summary> /// Initializes a new instance of the <see cref="VisProperties"/> class. /// </summary> /// <param name="visId">The <see cref="Guid"/> of the visualization.</param> /// <param name="visType">The type of the visualization, match a <see cref="VisType"/>.</param> /// <param name="anchorId">The id of the <see cref="ViewContainer"/> of the visualization.</param> /// <param name="objectids">A <see cref="List{int}"/> representing the <see cref="AnalysisObject"/> ids of the visualization.</param> /// <param name="conditions">A <see cref="List{int}"/> representing the study conditions of the visualization</param> /// <param name="sessions">A <see cref="List{int}"/> representing the study sessions of the visualization</param> public VisProperties(Guid visId, VisType visType, int anchorId, List <int> objectids, List <int> conditions, List <int> sessions) { VisId = visId; VisType = visType; AnchorId = anchorId; ObjectIds = objectids; Conditions = conditions; Sessions = sessions; }
private void OpenSettingsUI(VisType type) { var guidList = Services.VisManager().GetVisualizationsOfType(type); foreach (var guid in guidList) { Services.VisManager().OpenSettingsForVisualization(guid); } }
public InfoBox(VisType type, string message, string title = "Information", bool showFeedbackButton = true) { Title = title; IsEnabled = Shared.Settings.IsFeedbackEnabled; Order = 22; //todo: handle by user Size = VisSize.Small; Type = type; _message = message; _showFeedbackButton = showFeedbackButton; }
public DayWeekProductivityProgramsTable(DateTimeOffset date, VisType type) { this._date = date; this._type = type; Title = "Top Programs Used during (Un-)Productive Times"; IsEnabled = true; //todo: handle by user Order = (type == VisType.Day) ? 7 : 1; //todo: handle by user Size = VisSize.Square; Type = type; }
private GameObject CreateObject(VisType type, Transform parent, Vector3 pos, Quaternion rot, Vector3 scale) { GameObject prefab; switch (type) { case VisType.Position: prefab = m_PositionPrefab; break; case VisType.Direction: prefab = m_DirectionPrefab; break; case VisType.Plane: prefab = m_PlanePrefab; break; case VisType.Text: prefab = m_TextPrefab; break; default: Debug.Assert(true, "Unsupported visualization!"); return(null); } if (m_Reset) { ResetObjects(); } GameObject visObject; if (m_UnusedVisObjects[type].Count == 0) { visObject = GameObject.Instantiate(prefab); } else { visObject = m_UnusedVisObjects[type].Pop(); visObject.SetActive(true); } if (parent != null) { visObject.transform.parent = parent; } visObject.transform.localPosition = pos; visObject.transform.localRotation = rot; visObject.transform.localScale = scale; visObject.transform.SetParent(null, true); m_VisObjects[type].Push(visObject); return(visObject); }
/// <summary> /// Gets the week OR day visualizations from each tracker and prepares /// the HTML for showing on the website /// </summary> /// <param name="type"></param> /// <param name="date"></param> /// <returns></returns> internal async Task <string> GetVisualizationsHtml(VisType type, DateTimeOffset date) { // get updated visualizations (if enabled) var visualizations = new List <IVisualization>(); foreach (var tracker in _trackers.Where(t => t.IsEnabled() == true && t.IsRunning)) { switch (type) { case VisType.Day: visualizations.AddRange(tracker.GetVisualizationsDay(date).Where(i => i.IsEnabled)); break; case VisType.Week: visualizations.AddRange(tracker.GetVisualizationsWeek(date).Where(i => i.IsEnabled)); break; } } // case: no visualizations if (visualizations.Count == 0) { var infoBox = new InfoBox(type, "Please resume the trackers to enable the visualizations (hint: right-click the task-tray icon)."); visualizations.Add(infoBox); } // add the feedback features (if enabled) var feedback = new FeedbackBox(type); if (feedback.IsEnabled) { visualizations.Add(feedback); } // add visualizations in right order var html = string.Empty; foreach (var vis in visualizations.OrderBy(v => v.Order)) { //We want to avoid that a failing visualization stops the whole dashboard from working. Therefore we exclude failing visualizations and log the error. try { html += await Task.Run(() => CreateDashboardItem(vis, date)); } catch (Exception e) { Logger.WriteToLogFile(e); } } return(html); }
public void Init(int dataSetID, string[] attributes, VisType visType) { this.syncedHint = "Sync works!"; this.syncedDataSetID = dataSetID; for (int i = 0; i < attributes.Length; i++) { syncedAttributes.Add(attributes[i]); syncedAttributes.Dirty(i); } this.syncedVisType = (int)visType; }
// ........................................................................ internal creation methods public void AddNetworkAnchor(GameObject etv, int dataSetID, string[] attributes, VisType visType) { if (onServer) { var networkAnchor = Instantiate(NetworkAnchorPrefab); if (networkAnchor.GetComponent <NetworkAnchor>() != null) { NetworkServer.Spawn(networkAnchor); networkAnchor.GetComponent <NetworkAnchor>().Init(dataSetID, attributes, visType); networkAnchor.GetComponent <NetworkAnchor>().ETV = etv; } } }
/// <summary> /// Save thumbs up or down for selected visualization (type & date) /// </summary> /// <param name="type"></param> /// <param name="date"></param> /// <param name="visName"></param> /// <param name="up"></param> /// <param name="down"></param> public void SetFeedback(VisType type, DateTimeOffset date, string visName, int up, int down) { try { var query = "INSERT INTO " + Settings.FeedbackDbTable + " (time, visName, visType, visDate, likes, dislikes) VALUES (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'), " + Database.GetInstance().Q(visName) + ", " + Database.GetInstance().Q(type.ToString()) + ", " + Database.GetInstance().QTime(date.Date) + ", " + Database.GetInstance().Q(up) + ", " + Database.GetInstance().Q(down) + ");"; Database.GetInstance().ExecuteDefaultQuery(query); } catch (Exception e) { Logger.WriteToLogFile(e); } }
/// <summary> /// Gets a list of visualizations of a specified type that are attached to this <see cref="ViewContainer"/>. /// </summary> /// <param name="type">The type of visualization to get.</param> /// <returns>The list of visualizations of the specified type.</returns> public List <AbstractView> GetVisualizationsOfType(VisType type) { List <AbstractView> results = new List <AbstractView>(); foreach (var vis in visualizations) { if (vis.Settings.VisType == type) { results.Add(vis); } } return(results); }
/// <summary> /// Returns a <see cref="List{Guid}"/> of all visualizations of a specified type. /// </summary> /// <param name="type">The <see cref="VisType"/> to search for.</param> /// <returns>A <see cref="List{Guid}"/> of visualizations with the provided <see cref="VisType"/>.</returns> public List <Guid> GetVisualizationsOfType(VisType type) { List <Guid> visList = new List <Guid>(); foreach (var vis in Visualizations) { if (vis.Value.Settings.VisType == type) { visList.Add(vis.Key); } } return(visList); }
/// <summary> /// Creates a nice title depending on the setting /// </summary> /// <param name="visType"></param> /// <param name="date"></param> /// <returns></returns> private static string GetRetrospectionTitle(VisType visType, DateTimeOffset date) { switch (visType) { case VisType.Day: return("Your Retrospection for the " + date.Date.ToShortDateString()); case VisType.Week: return(string.Format(CultureInfo.InvariantCulture, "Your Retrospection for Week {0} ({1} - {2})", DateTimeHelper.GetWeekOfYear_Iso8601(date.Date), DateTimeHelper.GetFirstDayOfWeek_Iso8801(date.Date).Date.ToShortDateString(), DateTimeHelper.GetLastDayOfWeek_Iso8801(date.Date).Date.ToShortDateString())); } return(VisHelper.Error("Retrospection not supported!")); }
public string GetDateFilteringStringForQuery(VisType type, DateTimeOffset date, string datePropertyName = "time") { var filter = string.Empty; if (type == VisType.Day) { filter = "STRFTIME('%s', DATE(" + datePropertyName + ")) == STRFTIME('%s', DATE('" + date.Date.ToString("u") + "')) "; } else if (type == VisType.Week) { filter = "( " + " STRFTIME('%s', DATE(" + datePropertyName + ")) between STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetFirstDayOfWeek_Iso8801(date).Date.ToString("u") + "')) and STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetLastDayOfWeek_Iso8801(date).Date.ToString("u") + "')) " + " ) "; } return(filter); }
/// <summary> /// Disables and removes visualizations of a specified type from this view container. /// </summary> /// <param name="type">The type of visualization to remove from this view container.</param> public void DisableVis(VisType type) { var visList = GetVisualizationsOfType(type); foreach (var vis in visList) { visualizations.Remove(vis); Services.VisManager().DeleteVisualization(vis.VisId); } foreach (var visButton in visButtons) { if (visButton.VisType == type) { visButton.SetActive(false); return; } } }
/// <summary> /// get a list of all programs, the user was active for at least 10 minutes. /// Only get maxNumberOfPrograms. /// </summary> /// <param name="date"></param> /// <param name="maxNumberOfPrograms"></param> /// <returns></returns> private static List <string> GetTopProgramsUsed(DateTimeOffset date, VisType type, int maxNumberOfPrograms) { var list = new List <string>(); try { var query = "SELECT process " + "FROM ( " + "SELECT process, sum(difference) / 60.0 as 'durInMins' " + "FROM ( " + "SELECT t1.process, (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference' " + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id " + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " " + "GROUP BY t1.id, t1.time " + ") " + "WHERE difference > 0 and process <> '" + Dict.Idle + "' " + "GROUP BY process " + "ORDER BY durInMins DESC " + ") " + "WHERE durInMins > 2 " // hint; assumption! + "LIMIT " + maxNumberOfPrograms + ";"; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var process = (string)row["process"]; list.Add(process); } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return(list); }
public string GetDateFilteringStringForQuery(VisType type, DateTimeOffset date, string datePropertyName = "time") { var filter = string.Empty; if (type == VisType.Day) { filter = "STRFTIME('%s', DATE(" + datePropertyName + ")) == STRFTIME('%s', DATE('" + date.Date.ToString("u") + "')) "; } else if (type == VisType.Week) { filter = "( " + " STRFTIME('%s', DATE(" + datePropertyName + ")) between STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetFirstDayOfWeek_Iso8801(date).Date.ToString("u") + "')) and STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetLastDayOfWeek_Iso8801(date).Date.ToString("u") + "')) " + " ) "; } return filter; }
/// <summary> /// Initializes a new instance of the <see cref="VisProperties"/> class. /// </summary> /// <param name="visId">The <see cref="Guid"/> of the visualization.</param> /// <param name="visType">The type of the visualization, match a <see cref="VisType"/>.</param> /// <param name="anchorId">The id of the <see cref="ViewContainer"/> of the visualization.</param> public VisProperties(Guid visId, VisType visType, int anchorId) { VisId = visId; VisType = visType; AnchorId = anchorId; }
/// <summary> /// Enters the given ETV into a list of observed ETVs. All ETVs entered here, /// will be persisted, when the app is closed. /// </summary> /// <param name="etv">ETV to persist later</param> /// <param name="dataSetID">data set ID of it</param> /// <param name="variables">variables which it visualizes</param> /// <param name="visType">visualization type used</param> override public void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType) { var persistableETV = new SerializedETV(); persistableETV.dataSetID = dataSetID; persistableETV.variables = variables; persistableETV.visType = visType; ETVs.Add(etv, persistableETV); }
// ........................................................................ Visualization generation /// <summary> /// Generates visualizations from one attribute. /// </summary> /// <param name="dataSetID">data set to use</param> /// <param name="variable">attribute to visualize</param> /// <param name="visType">visualization type to generate</param> /// <returns></returns> public GameObject GenerateVisFrom(int dataSetID, string variable, VisType visType, bool persist = true) { return(GenerateVisFrom(dataSetID, new string[] { variable }, visType, persist)); }
/// <summary> /// For a given process and date, list all times a user was active /// </summary> /// <param name="date"></param> /// <param name="process"></param> /// <returns></returns> private static List<TopProgramTimeDto> GetTimesForProgram(DateTimeOffset date, VisType type, string process) { var list = new List<TopProgramTimeDto>(); try { var dayFilter = (type == VisType.Day) ? "" : "(STRFTIME('%s', DATE(t1.time)) = STRFTIME('%s', DATE(t2.time))) and "; // needed for week view var query = "SELECT (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference', t1.time as 'from', t2.time as 'to' " + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id " + "WHERE " + dayFilter + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " " + "AND lower(t1.process) ='" + process.ToLower(CultureInfo.InvariantCulture) + "' " + "GROUP BY t1.id, t1.time; "; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var diff = Convert.ToInt32(row["difference"], CultureInfo.InvariantCulture); var durInMins = (int)Math.Round(diff / 60.0, 0); var to = DateTime.Parse((string)row["to"], CultureInfo.InvariantCulture); var from = DateTime.Parse((string)row["from"], CultureInfo.InvariantCulture); if (durInMins == 0) continue; list.Add(new TopProgramTimeDto(from, to, durInMins)); } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return list; }
/// <summary> /// get a list of all programs, the user was active for at least 10 minutes. /// Only get maxNumberOfPrograms. /// </summary> /// <param name="date"></param> /// <param name="maxNumberOfPrograms"></param> /// <returns></returns> private static List<string> GetTopProgramsUsed(DateTimeOffset date, VisType type, int maxNumberOfPrograms) { var list = new List<string>(); try { var query = "SELECT process " + "FROM ( " + "SELECT process, sum(difference) / 60.0 as 'durInMins' " + "FROM ( " + "SELECT t1.process, (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference' " + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id " + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " " + "GROUP BY t1.id, t1.time " + ") " + "WHERE difference > 0 and process <> '" + Dict.Idle + "' " + "GROUP BY process " + "ORDER BY durInMins DESC " + ") " + "WHERE durInMins > 2 " // hint; assumption! + "LIMIT " + maxNumberOfPrograms + ";"; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var process = (string)row["process"]; list.Add(process); } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return list; }
/// <summary> /// Get a list of the times a user spent in the top (maxNumberOfPrograms) often used programs. /// </summary> /// <param name="date"></param> /// <param name="maxNumberOfPrograms"></param> /// <returns></returns> internal static Dictionary<string, List<TopProgramTimeDto>> GetTopProgramsUsedWithTimes(DateTimeOffset date, VisType type, int maxNumberOfPrograms) { var dto = new Dictionary<string, List<TopProgramTimeDto>>(); try { var topProgramsUsed = GetTopProgramsUsed(date, type, maxNumberOfPrograms); foreach (var process in topProgramsUsed) { var times = GetTimesForProgram(date, type, process); dto.Add(process, times); } } catch (Exception e) { Logger.WriteToLogFile(e); } return dto; }
/// <summary> /// Returns a dictionary with the productivity on a timeline /// </summary> /// <param name="date"></param> /// <returns></returns> internal static List<Tuple<DateTime, int>> GetUserProductivityTimelineData(DateTimeOffset date, VisType type, bool withNonWork = false) { var prodList = new List<Tuple<DateTime, int>>(); try { var filterNonWork = (withNonWork) ? "" :" AND userProductivity <> -1 "; var query = "SELECT userProductivity, surveyEndTime FROM " + Settings.DbTableIntervalPopup + " " + // end time is the time the participant answered "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "surveyNotifyTime") + " " + // only show perceived productivity values for the day filterNonWork + " ORDER BY surveyEndTime;"; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var time = DateTime.Parse((string)row["surveyEndTime"], CultureInfo.InvariantCulture); var prod = Convert.ToInt32(row["userProductivity"], CultureInfo.InvariantCulture); // first element if (prodList.Count == 0) { var workDayStartTime = Database.GetInstance().GetUserWorkStart(date); prodList.Add(new Tuple<DateTime, int>(workDayStartTime, prod)); } // only show if it's from today if (time.Date == date.Date) { prodList.Add(new Tuple<DateTime, int>(time, prod)); } } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return prodList; }
/// <summary> /// Creates a nice title depending on the setting /// </summary> /// <param name="visType"></param> /// <param name="date"></param> /// <returns></returns> private string GetRetrospectionTitle(VisType visType, DateTimeOffset date) { switch (visType) { case VisType.Day: return "Your retrospection for the " + date.Date.ToShortDateString(); case VisType.Week: return string.Format(CultureInfo.InvariantCulture, "Your retrospection for Week {0} ({1} - {2})", DateTimeHelper.GetWeekOfYear_Iso8601(date.Date), DateTimeHelper.GetFirstDayOfWeek_Iso8801(date.Date).Date.ToShortDateString(), DateTimeHelper.GetLastDayOfWeek_Iso8801(date.Date).Date.ToShortDateString()); } return VisHelper.Error("Retrospection not supported!"); }
public abstract void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType);
public VisTypeViewModel(VisType t) { Id = t.VisTypeId; Name = t.VisTypeName; }
private VisProperties(Guid visId, VisType visType, int anchorId, List <int> objectids, List <int> conditions, List <int> sessions, Dictionary <string, object> properties) : this(visId, visType, anchorId, objectids, conditions, sessions) { Properties = properties; }
internal string GetDashboardNavigateUriForType(DateTime date, VisType type) { var uri = string.Format(CultureInfo.InvariantCulture, "stats?type={0}&date={1}", type, date.ToString("yyyy-MM-dd")); return CreateNavigateUri(uri); }
internal string GetDashboardNavigateUriForType(DateTime date, VisType type) { var uri = string.Format(CultureInfo.InvariantCulture, "stats?type={0}&date={1}", type, date.ToString("yyyy-MM-dd")); return(CreateNavigateUri(uri)); }
/// <summary> /// Get a list of the times a user spent in the top (maxNumberOfPrograms) often used programs. /// </summary> /// <param name="date"></param> /// <param name="maxNumberOfPrograms"></param> /// <returns></returns> internal static Dictionary <string, List <TopProgramTimeDto> > GetTopProgramsUsedWithTimes(DateTimeOffset date, VisType type, int maxNumberOfPrograms) { var dto = new Dictionary <string, List <TopProgramTimeDto> >(); try { var topProgramsUsed = GetTopProgramsUsed(date, type, maxNumberOfPrograms); foreach (var process in topProgramsUsed) { var times = GetTimesForProgram(date, type, process); dto.Add(process, times); } } catch (Exception e) { Logger.WriteToLogFile(e); } return(dto); }
/// <summary> /// For a given process and date, list all times a user was active /// </summary> /// <param name="date"></param> /// <param name="process"></param> /// <returns></returns> private static List <TopProgramTimeDto> GetTimesForProgram(DateTimeOffset date, VisType type, string process) { var list = new List <TopProgramTimeDto>(); try { var dayFilter = (type == VisType.Day) ? "" : "(STRFTIME('%s', DATE(t1.time)) = STRFTIME('%s', DATE(t2.time))) and "; // needed for week view var query = "SELECT (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference', t1.time as 'from', t2.time as 'to' " + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id " + "WHERE " + dayFilter + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " " + "AND lower(t1.process) ='" + process.ToLower(CultureInfo.InvariantCulture) + "' " + "GROUP BY t1.id, t1.time; "; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var diff = Convert.ToInt32(row["difference"], CultureInfo.InvariantCulture); var durInMins = (int)Math.Round(diff / 60.0, 0); var to = DateTime.Parse((string)row["to"], CultureInfo.InvariantCulture); var from = DateTime.Parse((string)row["from"], CultureInfo.InvariantCulture); if (durInMins == 0) { continue; } list.Add(new TopProgramTimeDto(from, to, durInMins)); } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return(list); }
public override void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType) { Debug.Log(TAG + ": Dummy. Doing nothing."); }
/// <summary> /// Returns a dictionary with the productivity on a timeline /// </summary> /// <param name="date"></param> /// <returns></returns> internal static List <Tuple <DateTime, int> > GetUserProductivityTimelineData(DateTimeOffset date, VisType type, bool withNonWork = false) { var prodList = new List <Tuple <DateTime, int> >(); try { var filterNonWork = (withNonWork) ? "" :" AND userProductivity <> -1 "; var query = "SELECT userProductivity, surveyEndTime FROM " + Settings.DbTableIntervalPopup + " " + // end time is the time the participant answered "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "surveyNotifyTime") + " " + // only show perceived productivity values for the day filterNonWork + " ORDER BY surveyEndTime;"; var table = Database.GetInstance().ExecuteReadQuery(query); foreach (DataRow row in table.Rows) { var time = DateTime.Parse((string)row["surveyEndTime"], CultureInfo.InvariantCulture); var prod = Convert.ToInt32(row["userProductivity"], CultureInfo.InvariantCulture); // first element if (prodList.Count == 0) { var workDayStartTime = Database.GetInstance().GetUserWorkStart(date); prodList.Add(new Tuple <DateTime, int>(workDayStartTime, prod)); } // only show if it's from today if (time.Date == date.Date) { prodList.Add(new Tuple <DateTime, int>(time, prod)); } } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return(prodList); }
/// <summary> /// Gets the week OR day visualizations from each tracker and prepares /// the HTML for showing on the website /// </summary> /// <param name="type"></param> /// <param name="date"></param> /// <returns></returns> internal async Task<string> GetVisualizationsHtml(VisType type, DateTimeOffset date) { // get updated visualizations (if enabled) var visualizations = new List<IVisualization>(); foreach (var tracker in _trackers.Where(t => t.IsEnabled() == true)) { switch (type) { case VisType.Day: visualizations.AddRange(tracker.GetVisualizationsDay(date).Where(i => i.IsEnabled)); break; case VisType.Week: visualizations.AddRange(tracker.GetVisualizationsWeek(date).Where(i => i.IsEnabled)); break; } } // add the feedback features (if enabled) var feedback = new FeedbackBox(type); if (feedback.IsEnabled == true) visualizations.Add(feedback); // add visualizations in right order var html = string.Empty; foreach (var vis in visualizations.OrderBy(v => v.Order)) { html += await Task.Run(() => CreateDashboardItem(vis, date)); } return html; }