/// <summary> /// Handles the ItemDataBound event of the rptCheckinResultsAchievementsScoreboard control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RepeaterItemEventArgs"/> instance containing the event data.</param> protected void rptCheckinResultsAchievementsScoreboard_ItemDataBound(object sender, RepeaterItemEventArgs e) { var lCheckinResultsAchievementScoreboardHtml = e.Item.FindControl("lCheckinResultsAchievementScoreboardHtml") as Literal; PersonAchievementType personAchievementType = e.Item.DataItem as PersonAchievementType; if (personAchievementType == null) { return; } var achievementType = personAchievementType.AchievementType; if (achievementType == null) { return; } var customSummaryLavaTemplate = achievementType.CustomSummaryLavaTemplate; var mergeFields = GetAchievementMergeFields(personAchievementType); if (customSummaryLavaTemplate.IsNullOrWhiteSpace()) { customSummaryLavaTemplate = achievementType.DefaultSummaryLavaTemplate; } lCheckinResultsAchievementScoreboardHtml.Text = customSummaryLavaTemplate?.ResolveMergeFields(mergeFields); }
/// <summary> /// Gets the achievement merge fields. /// </summary> /// <param name="achievementAttempt">The achievement attempt.</param> /// <param name="person">The person.</param> /// <returns></returns> private Dictionary <string, object> GetAchievementMergeFields(PersonAchievementType personAchievementType) { var person = personAchievementType.Person; AchievementTypeCache achievementTypeCache = personAchievementType.AchievementType; var mergeFields = new Dictionary <string, object>(); mergeFields.Add(MergeFieldKey.Person, person); AchievementAttempt currentAchievementAttempt; if (personAchievementType.JustCompletedAchievementAttempt != null) { currentAchievementAttempt = personAchievementType.JustCompletedAchievementAttempt; } else { currentAchievementAttempt = personAchievementType.AchievementAttempts.Where(a => !a.IsSuccessful && !a.IsClosed).FirstOrDefault(); } // there should be either 1 or 0 achievementAttempts in progress int inProgressCount; if (personAchievementType.AchievementAttempts.Where(a => !a.IsSuccessful && !a.IsClosed).Any()) { inProgressCount = 1; } else { inProgressCount = 0; } int successfulAchievementCount = personAchievementType.AchievementAttempts.Where(a => a.IsSuccessful).Count(); mergeFields.Add(MergeFieldKey.CurrentAchievementAttempt, currentAchievementAttempt); mergeFields.Add(MergeFieldKey.AchievementAttempts, personAchievementType.AchievementAttempts); mergeFields.Add(MergeFieldKey.InProgressCount, inProgressCount); mergeFields.Add(MergeFieldKey.SuccessfulAchievementCount, successfulAchievementCount); mergeFields.Add(MergeFieldKey.JustCompleted, personAchievementType.JustCompleted); mergeFields.Add(MergeFieldKey.AchievementType, achievementTypeCache); var achievementTypeEventEntityType = EntityTypeCache.Get(achievementTypeCache.ComponentEntityTypeId); mergeFields.Add(MergeFieldKey.AchievementTypeEvent, new RockDynamic(achievementTypeEventEntityType)); mergeFields.Add(MergeFieldKey.NumberToAchieve, achievementTypeCache.NumberToAchieve); mergeFields.Add(MergeFieldKey.NumberToAccumulate, achievementTypeCache.NumberToAccumulate); mergeFields.Add(MergeFieldKey.ProgressCount, achievementTypeCache.GetProgressCount(currentAchievementAttempt)); mergeFields.Add(MergeFieldKey.ProgressPercent, currentAchievementAttempt?.Progress * 100); mergeFields.Add(MergeFieldKey.StreakType, achievementTypeCache.StreakType); mergeFields.Add(MergeFieldKey.FrequencyText, achievementTypeCache.StreakType?.OccurrenceFrequency.ConvertToString()); return(mergeFields); }