static void SortGroup(CrawledIssueGroup group, IEnumerable <IssueGroupSort> sorts) { var childrenAsGroups = group.Children.Where(c => c.IsGroup) .Select(c => c.ToGroup()) .Sort(sorts) .ToArray(); for (var i = 0; i < childrenAsGroups.Length; i++) { group.Children[i] = childrenAsGroups[i]; SortGroup(childrenAsGroups[i], sorts); } }
static string[] CombineKeys(CrawledIssueGroup parent, string key) { if (parent is null) { return new[] { key } } ; var result = new string[parent.Keys.Length + 1]; Array.Copy(parent.Keys, result, parent.Keys.Length); result[parent.Keys.Length] = key; return(result); }
static void GroupNext(CrawledIssueOrGroup[] current, CrawledIssueGroupKey[] fields, int fieldIndex) { if (fieldIndex >= fields.Length) { return; } var field = fields[fieldIndex]; for (var i = 0; i < current.Length; i++) { var oldGroup = current[i].ToGroup(); var oldChildren = oldGroup.Children.Select(c => c.ToIssue()); var newChildren = GroupFirst(oldGroup, oldChildren, field); var newGroup = new CrawledIssueGroup(oldGroup.Keys, newChildren); current[i] = newGroup; GroupNext(newGroup.Children, fields, fieldIndex + 1); } }
static CrawledIssueOrGroup[] GroupFirst(CrawledIssueGroup parent, IEnumerable <CrawledIssue> issues, CrawledIssueGroupKey key) { return(key.Apply(issues) .Select(g => (CrawledIssueOrGroup) new CrawledIssueGroup(CombineKeys(parent, g.Key), g.Select(i => (CrawledIssueOrGroup)i).ToArray())) .ToArray()); }
public virtual void Collapse(CrawledIssueGroup group) { }
public virtual void Expand(CrawledIssueGroup group) { }
public virtual bool IsExpanded(CrawledIssueGroup group) => false;
public override void Collapse(CrawledIssueGroup group) { _expandedGroups.Remove(group); UpdateCounts(); }
public override void Expand(CrawledIssueGroup group) { _expandedGroups.Add(group); UpdateCounts(); }
public override bool IsExpanded(CrawledIssueGroup group) => _expandedGroups.Contains(group);
static void Walk(List <CrawledIssueOrGroup> result, HashSet <CrawledIssueGroup> expandedGroups, CrawledIssueGroup parent, CrawledIssueOrGroup item, ref int itemsToSkip) { if (result.Count == ItemsPerPage) { return; } if (itemsToSkip > 0) { itemsToSkip--; } else { // If this is the first item, ensure we add the group header if (result.Count == 0 && item.IsIssue && parent != null) { result.Add(parent); } result.Add(item); } if (item.IsGroup) { var group = item.ToGroup(); if (expandedGroups.Contains(group)) { foreach (var child in group.Children) { Walk(result, expandedGroups, group, child, ref itemsToSkip); } } } }
public CrawledIssueOrGroup(CrawledIssueGroup group) { _value = group; }