about summary refs log tree commit diff
path: root/BugMine.Web
diff options
context:
space:
mode:
Diffstat (limited to 'BugMine.Web')
-rw-r--r--BugMine.Web/Components/ScopedContainers/IssueContainer.razor101
-rw-r--r--BugMine.Web/Components/ScopedContainers/ProjectContainer.razor (renamed from BugMine.Web/Components/ProjectContainer.razor)39
-rw-r--r--BugMine.Web/Pages/Projects/Boards/Index.razor19
-rw-r--r--BugMine.Web/Pages/Projects/Issues/NewIssue.razor13
-rw-r--r--BugMine.Web/Pages/Projects/Issues/ViewIssue.razor24
-rw-r--r--BugMine.Web/Pages/Projects/NewProject.razor4
-rw-r--r--BugMine.Web/Pages/Projects/ViewProject.razor53
-rw-r--r--BugMine.Web/Pages/Projects/ViewProject.razor.css8
8 files changed, 229 insertions, 32 deletions
diff --git a/BugMine.Web/Components/ScopedContainers/IssueContainer.razor b/BugMine.Web/Components/ScopedContainers/IssueContainer.razor
new file mode 100644
index 0000000..dac3e97
--- /dev/null
+++ b/BugMine.Web/Components/ScopedContainers/IssueContainer.razor
@@ -0,0 +1,101 @@
+@using System.Text.Json.Serialization
+@using ArcaneLibs.Extensions
+@using BugMine.Web.Classes.Exceptions
+@using LibMatrix
+@inject ILogger<ProjectContainer> Logger
+
+@if (Constants.Debug) {
+    <details>
+        <summary>IssueContainer Debug info - Debug build, here be dragons!</summary>
+        <p>IssueContainer debug info:</p>
+        @* <pre>Slug: @ProjectSlug</pre> *@
+        @* <pre>Progress: @Progress.ToString()</pre> *@
+        @* @if (ProjectContext is null) { *@
+            @* <pre>ProjectContext is null!</pre> *@
+        @* } *@
+        @* else { *@
+            @* <details> *@
+                @* <summary>Context json dump</summary> *@
+                @* <pre>@ProjectContext.ToJson()</pre> *@
+            @* </details> *@
+            @* @if (ProjectContext?.Project?.Room is not null) { *@
+                @* <LinkButton OnClick="@ProjectContext.Project.Room.PermanentlyBrickRoomAsync">Dispose room</LinkButton> *@
+            @* } *@
+        @* } *@
+    </details>
+
+    <hr/>
+}
+@if (ProjectContext?.Client is null) {
+    <p>Authenticating</p>
+}
+else {
+    <CascadingValue Value="ProjectContext">
+        @ChildContent
+    </CascadingValue>
+}
+
+@code {
+    private Status? _progress = Status.Loading;
+
+    [Parameter]
+    public string IssueId { get; set; } = null!;
+
+    [Parameter, CascadingParameter]
+    public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; }
+
+    [Parameter]
+    public IssueContainerContext? IssueContext { get; set; }
+
+    [Parameter]
+    public RenderFragment ChildContent { get; set; }
+
+    [Parameter]
+    public Func<Task>? Loaded { get; set; }
+
+    private Status? Progress {
+        get => _progress;
+        set {
+            _progress = value;
+            StateHasChanged();
+        }
+    }
+
+    protected override async Task OnInitializedAsync() {
+        if (ProjectContext is null) {
+            Logger.LogError("ProjectContext is null");
+            ProjectContext = new();
+        }
+
+        if (ProjectContext.Project != null) {
+            Logger.LogWarning("ProjectContext.Project is not null");
+        }
+
+        ProjectContext.Client ??= await BugMineStorage.GetCurrentSessionOrNavigate();
+        if (ProjectContext.Client == null) {
+            return;
+        }
+
+        Progress = Status.Loading;
+
+        
+        Progress = Status.Done;
+        if (Loaded != null) {
+            await Loaded.Invoke();
+        }
+
+        StateHasChanged();
+    }
+
+    public class IssueContainerContext {
+        public ProjectContainer.ProjectContainerContext ProjectContext { get; set; }
+    }
+
+    private enum Status {
+        Loading,
+        NotInRoom,
+        RoomNotFound,
+        Done
+    }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Components/ProjectContainer.razor b/BugMine.Web/Components/ScopedContainers/ProjectContainer.razor
index f7621be..44578a7 100644
--- a/BugMine.Web/Components/ProjectContainer.razor
+++ b/BugMine.Web/Components/ScopedContainers/ProjectContainer.razor
@@ -5,22 +5,24 @@
 @inject ILogger<ProjectContainer> Logger
 
 @if (Constants.Debug) {
-    <p>Debug, beware: here be dragons!</p>
-    <p>ProjectContainer debug info:</p>
-    <pre>Slug: @ProjectSlug</pre>
-    <pre>Progress: @Progress.ToString()</pre>
-    @if (ProjectContext is null) {
-        <pre>ProjectContext is null!</pre>
-    }
-    else {
-        <details>
-            <summary>Context json dump</summary>
-            <pre>@ProjectContext.ToJson()</pre>
-        </details>
-        @if (ProjectContext?.Project?.Room is not null) {
-            <LinkButton OnClick="@ProjectContext.Project.Room.PermanentlyBrickRoomAsync">Dispose room</LinkButton>
+    <details>
+        <summary>ProjectContainer Debug info - Debug build, here be dragons!</summary>
+        <p>ProjectContainer debug info:</p>
+        <pre>Slug: @ProjectSlug</pre>
+        <pre>Progress: @Progress.ToString()</pre>
+        @if (ProjectContext is null) {
+            <pre>ProjectContext is null!</pre>
         }
-    }
+        else {
+            <details>
+                <summary>Context json dump</summary>
+                <pre>@ProjectContext.ToJson()</pre>
+            </details>
+            @if (ProjectContext?.Project?.Room is not null) {
+                <LinkButton OnClick="@ProjectContext.Project.Room.PermanentlyBrickRoomAsync">Dispose room</LinkButton>
+            }
+        }
+    </details>
 
     <hr/>
 }
@@ -42,7 +44,9 @@ else if (ProjectContext?.Project is null) {
     }
 }
 else {
-    @ChildContent
+    <CascadingValue Value="ProjectContext">
+        @ChildContent
+    </CascadingValue>
 }
 
 @code {
@@ -56,7 +60,7 @@ else {
 
     [Parameter]
     public RenderFragment ChildContent { get; set; }
-    
+
     [Parameter]
     public Func<Task>? Loaded { get; set; }
 
@@ -105,7 +109,6 @@ else {
         if (Loaded != null) {
             await Loaded.Invoke();
         }
-        
 
         StateHasChanged();
     }
diff --git a/BugMine.Web/Pages/Projects/Boards/Index.razor b/BugMine.Web/Pages/Projects/Boards/Index.razor
new file mode 100644
index 0000000..c1953c8
--- /dev/null
+++ b/BugMine.Web/Pages/Projects/Boards/Index.razor
@@ -0,0 +1,19 @@
+@page "/Projects/{ProjectSlug}/Boards"
+@using BugMine.Web.Components.ScopedContainers
+<h3>Boards</h3>
+<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext" Loaded="@OnProjectLoaded">
+    <p>@ProjectContext.Project.Info.Name</p>
+</ProjectContainer>
+
+@code {
+
+    [Parameter]
+    public string ProjectSlug { get; set; }
+
+    public ProjectContainer.ProjectContainerContext ProjectContext { get; set; } = new();
+
+    private async Task OnProjectLoaded() {
+        
+    }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/Issues/NewIssue.razor b/BugMine.Web/Pages/Projects/Issues/NewIssue.razor
index 159e20d..118a00c 100644
--- a/BugMine.Web/Pages/Projects/Issues/NewIssue.razor
+++ b/BugMine.Web/Pages/Projects/Issues/NewIssue.razor
@@ -1,8 +1,17 @@
 @page "/Projects/{ProjectSlug}/Issues/New"
+@using ArcaneLibs.Extensions
+@using BugMine.Sdk.Events.Timeline
+@using BugMine.Web.Components.ScopedContainers
 <h3>New issue</h3>
 
 <ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext">
-    <h1>Hi from NewIssue!</h1>
+    <p>Title: <InputText @bind-Value="@IssueData.Name"/></p>
+    
+    @if (Constants.Debug) {
+        <p>Debug info:</p>
+        <p>Issue data:</p>
+        <pre>@IssueData.ToJson()</pre>
+    }
 </ProjectContainer>
 
 @code {
@@ -11,5 +20,7 @@
     public string ProjectSlug { get; set; } = null!;
 
     public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
+    
+    public BugMineIssueData IssueData { get; set; } = new();
 
 }
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/Issues/ViewIssue.razor b/BugMine.Web/Pages/Projects/Issues/ViewIssue.razor
new file mode 100644
index 0000000..e33f74d
--- /dev/null
+++ b/BugMine.Web/Pages/Projects/Issues/ViewIssue.razor
@@ -0,0 +1,24 @@
+@page "/Projects/{ProjectSlug}/Issues/{IssueId}"
+@using ArcaneLibs.Extensions
+@using BugMine.Sdk.Events.Timeline
+@using BugMine.Web.Components.ScopedContainers
+<h3>New issue</h3>
+
+<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext">
+    <IssueContainer IssueId="@IssueId" IssueContext="@IssueContext">
+        <p>meow</p>
+    </IssueContainer>
+</ProjectContainer>
+
+@code {
+
+    [Parameter]
+    public string ProjectSlug { get; set; } = null!;
+
+    [Parameter]
+    public string IssueId { get; set; } = null!;
+
+    public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
+    public IssueContainer.IssueContainerContext? IssueContext { get; set; } = new();
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/NewProject.razor b/BugMine.Web/Pages/Projects/NewProject.razor
index f8c7dfd..2a7c7da 100644
--- a/BugMine.Web/Pages/Projects/NewProject.razor
+++ b/BugMine.Web/Pages/Projects/NewProject.razor
@@ -1,6 +1,8 @@
 @page "/Projects/New"
 @using ArcaneLibs.Extensions
+@using BugMine.Sdk.Events.State
 @using LibMatrix
+@inject ILogger<NewProject> Logger
 <h3>New project</h3>
 
 <span>Project name: </span>
@@ -62,7 +64,7 @@ else {
 
         }
         catch (MatrixException e) {
-            
+            Logger.LogError(e, "Failed to create project");
         }
     }
 
diff --git a/BugMine.Web/Pages/Projects/ViewProject.razor b/BugMine.Web/Pages/Projects/ViewProject.razor
index 91cc4d0..c1a2aa1 100644
--- a/BugMine.Web/Pages/Projects/ViewProject.razor
+++ b/BugMine.Web/Pages/Projects/ViewProject.razor
@@ -1,28 +1,36 @@
 @page "/Projects/{ProjectSlug}/"
-@using LibMatrix
-@using BugMine.Web.Classes.Exceptions
+@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">
-    <h1>Hi from ViewProject!</h1>
-    <h1>@ProjectContext!.Project!.Info.Name</h1>
-
-    @if (Progress == "loading-issues") {
+    <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) {
-            <pre>@issue.Data.RawContent.ToJson()</pre>
+            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 string? _progress = "loading";
+    private Status? _progress = Status.Loading;
 
     public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
 
@@ -30,8 +38,9 @@
     public string ProjectSlug { get; set; } = null!;
 
     private List<BugMineIssue>? Issues { get; set; }
+    private FrozenSet<StateEventResponse> Followers { get; set; } = FrozenSet<StateEventResponse>.Empty;
 
-    private string? Progress {
+    private Status? Progress {
         get => _progress;
         set {
             _progress = value;
@@ -40,14 +49,34 @@
     }
 
     protected async Task OnProjectLoaded() {
-        Progress = "loading-issues";
-        await foreach (var issue in ProjectContext.Project.GetIssues()) {
+        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();
+            // 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);
+
 }
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/ViewProject.razor.css b/BugMine.Web/Pages/Projects/ViewProject.razor.css
new file mode 100644
index 0000000..6f67e52
--- /dev/null
+++ b/BugMine.Web/Pages/Projects/ViewProject.razor.css
@@ -0,0 +1,8 @@
+.issue-card {
+    display: flex;
+    padding: 1rem;
+    border-radius: 0.5rem;
+    background-color: var(--bs-dark);
+    box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.5);
+    transition: background-color 1s, box-shadow 3s;
+}
\ No newline at end of file