blob: c1a2aa1bbe05822c4aac53a66cb494e29eafdcb3 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
@page "/Projects/{ProjectSlug}/"
@using System.Collections.Frozen
@using System.Reflection
@using ArcaneLibs.Extensions
@using BugMine.Sdk.Events.Timeline
@using BugMine.Web.Pages.Projects.Issues
@using BugMine.Web.Components.ScopedContainers
@using LibMatrix
<ProgressLog ></ProgressLog>
<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext" Loaded="@OnProjectLoaded">
<h3>@ProjectContext!.Project!.Info.Name</h3>
<p>@Followers.Count followers - @Issues?.Count issues</p>
<LinkButton href="@(typeof(NewIssue).GetCustomAttributes<RouteAttribute>().First().Template.Replace("{ProjectSlug}", ProjectSlug))">New issue</LinkButton>
@if (Progress == Status.Loading) {
<p>Loading issues, got @(Issues?.Count ?? 0) so far... <SimpleSpinner/></p>
}
@* <p>@Project.Description</p> *@
@if (Issues != null) {
@foreach (var issue in Issues) {
var issueData = issue.Data.TypedContent as BugMineIssueData;
<div class="issue-card" @onclick="@(() => { NavigationManager.NavigateTo(GetIssueUrl(issue)); })">
<div style="width: 1em; height: 1em; background-color: #00FF00; display: inline-block;"></div> @* Color based on tags... *@
<p>@issueData.Name</p>
</div>
}
}
</ProjectContainer>
@code {
private Status? _progress = Status.Loading;
public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
[Parameter]
public string ProjectSlug { get; set; } = null!;
private List<BugMineIssue>? Issues { get; set; }
private FrozenSet<StateEventResponse> Followers { get; set; } = FrozenSet<StateEventResponse>.Empty;
private Status? Progress {
get => _progress;
set {
_progress = value;
StateHasChanged();
}
}
protected async Task OnProjectLoaded() {
Progress = Status.Loading;
ProjectContext!.Project!.Room.GetMembersListAsync().ContinueWith(x => {
Followers = x.Result;
StateHasChanged();
});
await foreach (var issue in ProjectContext.Project.GetIssues(chunkLimit: 1000)) {
Issues ??= new List<BugMineIssue>();
Issues.Add(issue);
// StateHasChanged();
if (Issues.Count % 1000 == 0) {
StateHasChanged();
Console.WriteLine($"Got issue {Issues.Count} {issue.Data.RawContent.ToJson()}");
}
}
Progress = Status.Done;
StateHasChanged();
}
private enum Status {
Loading,
Done
}
private string GetIssueUrl(BugMineIssue issue) =>
typeof(ViewIssue).GetCustomAttributes<RouteAttribute>().First().Template
.Replace("{ProjectSlug}", ProjectSlug)
.Replace("{IssueId}", issue.Data.EventId);
}
|