Browse Source

feat(Docs) Notes and Docs are now Markdown. SQL is just for page Navigation

main
Jonathan McCaffrey 4 years ago
parent
commit
ddb6318186
  1. 37
      Components/Navigation/DesktopNavComponent.razor
  2. 5
      Components/Navigation/MobileNavComponent.razor
  3. 11
      Components/Navigation/NavLinkComponent.razor
  4. 1
      Components/Navigation/NavSectionComponent.razor
  5. 4
      Components/Navigation/TabletNavComponent.razor
  6. 18
      Components/_Imports.razor
  7. BIN
      IGP/Database.db
  8. 20
      IGP/IGP.csproj
  9. 2
      IGP/Pages/Documentation/DocumentationPage.razor
  10. 45
      IGP/Pages/Documentation/Parts/DocumentComponent.razor
  11. 8
      IGP/Pages/Documentation/Parts/DocumentNavComponent.razor
  12. 51
      IGP/Pages/Notes/NotesPage.razor
  13. 32
      IGP/Pages/Notes/Parts/NoteComponent.razor
  14. 24
      IGP/wwwroot/content/docs/cheat-sheet.md
  15. 98
      IGP/wwwroot/content/docs/project-data.md
  16. 79
      IGP/wwwroot/content/docs/setup.md
  17. 79
      IGP/wwwroot/content/notes/coop/holdout.md
  18. 2
      IGP/wwwroot/generated/AgileSprintModels.json
  19. 2
      IGP/wwwroot/generated/DocContentModels.json
  20. 2
      IGP/wwwroot/generated/NoteContentModels.json
  21. 7
      Services/Development/DocumentationService.cs

37
Components/Navigation/DesktopNavComponent.razor

@ -1,25 +1,20 @@
@inherits LayoutComponentBase
@inject INavigationService NavigationService
@using Services
@using Model.Website
@using Model.Website.Enums
@using Microsoft.EntityFrameworkCore
@inject INavigationService navigationService
@implements IDisposable
<div onmouseleave="@HoverOut" class="desktopNavContainer">
<div class="menuHeader" @onmouseover="() => NavigationService.ChangeNavigationState(NavigationStateType.Hovering_Menu)">
<div class="menuHeader" @onmouseover="() => navigationService.ChangeNavigationState(NavigationStateType.Hovering_Menu)">
<NavLink href="/" class="websiteTitle">
IGP Fan Reference
</NavLink>
@foreach (var webSection in WebSections) {
<div>@webSection.Name</div>
<div class="sectionButton">@webSection.Name</div>
}
</div>
@{
var hoveredStyle = NavigationStateType.Hovering_Menu.Equals(NavigationService.GetNavigationState()) ?
var hoveredStyle = NavigationStateType.Hovering_Menu.Equals(navigationService.GetNavigationState()) ?
"navMenuContainerShow" : "";
}
<div class="navMenuContainer @hoveredStyle">
@ -34,6 +29,10 @@
</div>
<style>
.sectionButton {
cursor: pointer;
}
.desktopNavContainer {
position: fixed;
top: 0;
@ -98,32 +97,22 @@
@code {
#if NO_SQL
[Parameter]
public List<WebSectionModel> WebSections { get; set; } = default!;
[Parameter] public List<WebSectionModel> WebSections { get; set; } = default!;
[Parameter]
public List<WebPageModel> WebPages { get; set; } = default!;
[Parameter] public List<WebPageModel> WebPages { get; set; } = default!;
#else
[Parameter]
public DbSet<WebSectionModel> WebSections { get; set; } = default!;
[Parameter]
public DbSet<WebPageModel> WebPages { get; set; } = default!;
#endif
protected override void OnInitialized() {
NavigationService.Subscribe(StateHasChanged);
navigationService.Subscribe(StateHasChanged);
}
void IDisposable.Dispose() {
NavigationService.Unsubscribe(StateHasChanged);
navigationService.Unsubscribe(StateHasChanged);
}
void HoverOut(MouseEventArgs mouseEventArgs) {
Console.WriteLine(NavigationStateType.Default);
NavigationService.ChangeNavigationState(NavigationStateType.Default);
navigationService.ChangeNavigationState(NavigationStateType.Default);
}
}

5
Components/Navigation/MobileNavComponent.razor

@ -1,7 +1,6 @@

@using Model.Website
@using Model.Website
@using Microsoft.EntityFrameworkCore
<div class="mobileFooter">
<div class="mobileNavSectionsContainer">
@foreach (var webSection in WebSections) {

11
Components/Navigation/NavLinkComponent.razor

@ -1,9 +1,8 @@
@using Services
@using Model.Website
@using Model.Website.Enums
@inject INavigationService NavigationService;
@inject NavigationManager NavigationManager;
@inject INavigationService navigationService;
@inject NavigationManager navigationManager;
@if (isOnPage) {
<NavLink href="@Page.Href" class="navContainer navLink navSelected">
@ -13,7 +12,7 @@
</NavLink>
}
else {
<NavLink @onclick="() => NavigationService.ChangeNavigationState(NavigationStateType.Default)" href="@Page.Href" class="navContainer navLink">
<NavLink @onclick="() => navigationService.ChangeNavigationState(NavigationStateType.Default)" href="@Page.Href" class="navContainer navLink">
<div class="navName">
@Page.Name
</div>
@ -67,7 +66,7 @@ else {
bool isOnPage = false;
protected override Task OnParametersSetAsync() {
var uri = NavigationManager.Uri.Remove(0, NavigationManager.BaseUri.Count()).ToLower();
var uri = navigationManager.Uri.Remove(0, navigationManager.BaseUri.Count()).ToLower();
isOnPage = Page.Href.ToLower().Equals(uri);
return Task.CompletedTask;
@ -79,7 +78,7 @@ else {
}
void OnBack() {
NavigationService.Back();
navigationService.Back();
}
}

1
Components/Navigation/NavSectionComponent.razor

@ -1,4 +1,5 @@
@using Model.Website
<div class="sectionContainer">
<div class="sectionHeader">
<div class="sectionTitle">

4
Components/Navigation/TabletNavComponent.razor

@ -1,6 +1,4 @@
@using Model.Website
@using Microsoft.EntityFrameworkCore
@inherits LayoutComponentBase
@inherits LayoutComponentBase
<div class="tablet">
<div class="tabletHeader" @onclick="OnNavClicked" @onclick:preventDefault="true" @onclick:stopPropagation="true">

18
Components/_Imports.razor

@ -1,16 +1,18 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.EntityFrameworkCore
@using Microsoft.JSInterop
@using Model.Feedback
@using Model.Website
@using Model.Website.Enums
@using Services
@using System.Net.Http
@using System.Net.Http.Json
@using System.Text
@using System.Text.Json
@using YamlDotNet.Serialization
@using Model.Feedback
@using System;
@using System.Threading.Tasks;
@using System.Timers;
@using System;
@using YamlDotNet.Serialization

BIN
IGP/Database.db

Binary file not shown.

20
IGP/IGP.csproj

@ -20,10 +20,10 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.28.1"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.0-preview.2.22153.2"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.0-preview.2.22153.2" PrivateAssets="all"/>
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.0-preview.2.22153.2"/>
<PackageReference Include="Markdig" Version="0.28.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.0-preview.2.22153.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.0-preview.2.22153.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.0-preview.2.22153.2" />
<!--
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.2.22153.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="7.0.0-preview.2.22153.1" />
@ -32,18 +32,18 @@
</ItemGroup>
<ItemGroup>
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js"/>
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Components\Components.csproj"/>
<ProjectReference Include="..\Contexts\Contexts.csproj"/>
<ProjectReference Include="..\Model\Model.csproj"/>
<ProjectReference Include="..\Services\Services.csproj"/>
<ProjectReference Include="..\Components\Components.csproj" />
<ProjectReference Include="..\Contexts\Contexts.csproj" />
<ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\Services\Services.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\generated"/>
<Folder Include="wwwroot\generated" />
</ItemGroup>
<ItemGroup>

2
IGP/Pages/Documentation/DocumentationPage.razor

@ -34,8 +34,6 @@ else
}
<style>
pre code {
color: white;

45
IGP/Pages/Documentation/Parts/DocumentComponent.razor

@ -1,14 +1,24 @@
<div class="doc">
<div class="docHeader">
<div class="docTitle">@DocContentModel.Name</div>
@using System.Net.Http.Json
@inject HttpClient httpClient
<div class="docDates">
<div class="docDateUpdated"><b>Updated</b>: @DocContentModel.UpdatedDate.ToString("MM/dd/yyyy")</div>
<div class="docDateCreated"><b>Created</b>: @DocContentModel.CreatedDate.ToString("MM/dd/yyyy")</div>
@if (content == null)
{
<LoadingComponent/>
}
else
{
<div class="doc">
<div class="docHeader">
<div class="docTitle">@DocContentModel.Name</div>
<div class="docDates">
<div class="docDateUpdated"><b>Updated</b>: @DocContentModel.UpdatedDate.ToString("MM/dd/yyyy")</div>
<div class="docDateCreated"><b>Created</b>: @DocContentModel.CreatedDate.ToString("MM/dd/yyyy")</div>
</div>
</div>
<div class="docContent">@((MarkupString)Markdown.ToHtml(content, pipeline))</div>
</div>
<div class="docContent">@((MarkupString)Markdown.ToHtml(DocContentModel.Content, pipeline))</div>
</div>
}
<style>
.docTitle {
@ -16,33 +26,32 @@
}
.docHeader {
display: flex;
justify-content: space-between;
display: flex;
justify-content: space-between;
}
.docDates {
display: flex;
flex-direction: column;
display: flex;
flex-direction: column;
}
th {
padding: 8px;
border: 1px solid gray;
}
td {
padding: 8px;
border: 1px solid gray;
}
}
</style>
@code {
[Parameter]
public DocContentModel DocContentModel { get; set; } = default!;
MarkdownPipeline pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
string? content = null;
private async Task<string> LoadContent() => content = await httpClient.GetStringAsync($"content/docs/{DocContentModel.Content}.md");
protected override async Task OnParametersSetAsync() => await LoadContent();
protected override async Task OnInitializedAsync() => await LoadContent();
}

8
IGP/Pages/Documentation/Parts/DocumentNavComponent.razor

@ -10,10 +10,10 @@
</div>
<style>
.docNavContainer {
display: flex;
flex-direction: column;
}
.docNavContainer {
display: flex;
flex-direction: column;
}
.docNavButton a {
color: white;

51
IGP/Pages/Notes/NotesPage.razor

@ -34,7 +34,56 @@ else
}
<style>
pre code {
color: white;
}
h1 {
display: block;
font-size: 2em;
margin-top: 0.67em;
margin-bottom: 0.67em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
}
h2 {
display: block;
font-size: 1.5em;
margin-top: 0.83em;
margin-bottom: 0.83em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
}
li {
display: list-item;
}
p {
display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
}
ul {
display: block;
list-style-type: disc;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
}
pre {
background: black;
padding: 2px;
}
</style>
@code {

32
IGP/Pages/Notes/Parts/NoteComponent.razor

@ -1,14 +1,23 @@
<div class="note">
<div class="noteHeader">
<div class="noteTitle">@NoteContentModel.Name</div>
@inject HttpClient httpClient
<div class="noteDates">
<div class="noteDateUpdated"><b>Updated</b>: @NoteContentModel.UpdatedDate.ToString("MM/dd/yyyy")</div>
<div class="noteDateCreated"><b>Created</b>: @NoteContentModel.CreatedDate.ToString("MM/dd/yyyy")</div>
@if (content == null)
{
<LoadingComponent/>
}
else
{
<div class="note">
<div class="noteHeader">
<div class="noteTitle">@NoteContentModel.Name</div>
<div class="noteDates">
<div class="noteDateUpdated"><b>Updated</b>: @NoteContentModel.UpdatedDate.ToString("MM/dd/yyyy")</div>
<div class="noteDateCreated"><b>Created</b>: @NoteContentModel.CreatedDate.ToString("MM/dd/yyyy")</div>
</div>
</div>
<div class="noteContent">@((MarkupString)Markdown.ToHtml(content, pipeline))</div>
</div>
<div class="noteContent">@((MarkupString)Markdown.ToHtml(NoteContentModel.Content))</div>
</div>
}
<style>
.noteTitle {
@ -28,8 +37,13 @@
</style>
@code {
[Parameter]
public NoteContentModel NoteContentModel { get; set; } = default!;
string? content = null;
MarkdownPipeline pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
private async Task<string> LoadContent() => content = await httpClient.GetStringAsync($"content/notes/{NoteContentModel.Content}.md");
protected override async Task OnParametersSetAsync() => await LoadContent();
protected override async Task OnInitializedAsync() => await LoadContent();
}

24
IGP/wwwroot/content/docs/cheat-sheet.md

@ -0,0 +1,24 @@
# Overview
This document will contain quick reference information on this project.
## Dev Team
| Name | Role | Discord |
|--------------------|------------|------------------------|
| Jonathan McCaffrey | Maintainer | JonathanMcCaffrey#3544 |
## Project Links
| Name | Purpose | Link |
|------------|-------------------------------------------------------------------|----------------------------------------------------------------|
| Production | Customer facing version of website. `main` branch. | https://www.igpfanreference.com/ |
| Develop | Development/testing version of website. `develop` branch. | https://calm-mud-04916b210.1.azurestaticapps.net/ |
| GitRepo | Where all the dev work goes. | https://github.com/JonathanMcCaffrey/IGP-Fan-Reference |
| CI | Deployment CI logs. See if a new build has successfully released. | https://github.com/JonathanMcCaffrey/IGP-Fan-Reference/actions |
## Educational Links
| Name | Purpose | Link |
|--------|---------------------------------------|----------------------------------------------------------------|
| Blazor | Getting started information on Blazor | https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor |

98
IGP/wwwroot/content/docs/project-data.md

@ -0,0 +1,98 @@
# Overview
This document will contain general information on data in this project.
## General Note
This project is a work in progress. As such, most of the data in the website doesn't follow the document. Ideally, this will be fixed over time.
## SQL
Relational data is stored in a local SQL database.
This data is converted into JSON so it can be handled by Blazor WASM.
<i>Currently, Blazor WASM has a bug that prevents SQL from being used in production. Although, given SQL doesn't seem to provide much, aside from increased build times and load times, it might just be best to use the design principals of SQL, and it's interface, without using the actual technology in production.</i>
The data is then loaded in by a Service, via it's load method.
```csharp
// Using Component
protected override async Task OnInitializedAsync()
{
await AgileService.Load();
}
```
```csharp
// Loading Service
public async Task Load()
{
if (isLoaded) return;
AgileSprintModels =
(await httpClient.GetFromJsonAsync<AgileSprintModel[]>("generated/AgileSprintModels.json")
?? Array.Empty<AgileSprintModel>()).ToList();
AgileTaskModels =
(await httpClient.GetFromJsonAsync<AgileTaskModel[]>("generated/AgileTaskModels.json")
?? Array.Empty<AgileTaskModel>()).ToList();
SortSql();
isLoaded = true;
NotifyDataChanged();
}
```
We create a `SortSql()` method to handle adjusting the data to match what SQL would of given us.
```csharp
private void SortSql()
{
foreach (var agileTask in AgileTaskModels!)
{
if (agileTask.AgileSprintModelId != null)
{
SprintById(agileTask.AgileSprintModelId.Value)?.AgileTaskModels.Add(agileTask);
}
}
}
```
We could also create indexes, or whatever other functionality we lose by SQL not working in production.
Then it's only a matter of using said data.
```csharp
@if (!agileService.IsLoaded())
{
<LoadingComponent/>
}
else
{
<LayoutMediumContentComponent>
<WebsiteTitleComponent>Agile</WebsiteTitleComponent>
<div class="agileViewContainer">
@foreach (var sprint in agileService.AgileSprintModels!
.OrderBy(e => e.EndDate).Reverse())
{
<details class="sprintDisplayContainer @sprint.GetSprintType().ToLower()"
open="@(sprint.GetSprintType() == SprintType.Current)">
<summary class="sprintSummary">
<div class="sprintTitle">@sprint.Name</div>
```
## Localized Strings
Localized strings are handled in the Localizations.resx file.
Most text isn't using localized strings yet. And English is the only plan of support in the short term, and probably in the long term as well.
## Markdown Files
Documents are currently handled in the SQL database. But ideally, they will be markdown documents instead, with links to GitHub.
Basically long term, this website will perhaps also act as a public wiki. Who knows? With GitHub as the public CMS.
So if Blazor WASM doesn't support some markdown generation that is not cumbersome, then the `IGP_Convert` tool will need to be extended to convert Markup files to files Blazor WASM can use.
And ideally, any generation systems we write will use any front-matter in the markdown documents.
Each of these pages will have one of those `edit on github` buttons.

79
IGP/wwwroot/content/docs/setup.md

@ -0,0 +1,79 @@
# Overview
This document will contain general setup notes for the project.
## Prerequisite
To understand content in this document, it is recommended to have some software development experience. Particularly using GitHub and Visual Studio.
- [GitHub Documentation](https://docs.github.com/en/get-started)
- [Visual Studio Documentation](https://visualstudio.microsoft.com/vs/getting-started/)
To make updates to this website, it is recommended to understand HTML/CSS and C#.
- [C# Documentation](https://docs.microsoft.com/en-us/dotnet/csharp/)
- [Mozilla's HTML Documentation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started)
- [W3SCHOOLS' HTML Documentation](https://www.w3schools.com/html/)
Further, you should understand the product and clients this website is for. So it is recommended to play "Immortal: Gates of Pyre".
- [IGP Website](https://gatesofpyre.com/)
- **Please Note:** This product currently has restricted access with it is in a pre-alpha state. If you are not aware or interested in IGP, I recommend to wait for product release. Otherwise, check out their discord for steps of getting access.
## Installation
Download and install Visual Studio preview.
**Note:** Visual Studio Preview currently doesn't work on Mac for this project. Use a PC, or Rider.
[https://visualstudio.microsoft.com/vs/preview/](https://visualstudio.microsoft.com/vs/preview/)
When installing, ensure you have selected "Workloads | **ASP.NET and web development**" and "Individual components | **.NET WebAssembly build tools**".
## Download Project
Get this project from GitHub.
```bash
git clone https://github.com/JonathanMcCaffrey/IGP-Fan-Reference.git
```
## Project Tree
```
C:.
├───.github
│ └───workflows # Workflows to deploy website
├───Components # Components used be website
├───Contexts
├───IGP
│ ├───Pages # Website pages
│ └───wwwroot
│ ├───css
│ ├───generated # Files generated by IGP_Convert. Do not edit
│ ├───image
│ └───javascript
├───IGP_Convert # Converts SQL into JSON for Blazor Wasm
├───Model # Data models
└───Services # Web services
```
## Running
- Open `IGP/IGP.sln`.
- Click the green RUN button in Visual Studio.
- A local copy of the IGP Website should have launched on your machine.
## Publishing
Code committed to the `main` branch will automatically be deployed to [production](https://www.igpfanreference.com/).
Code committed to the `develop` branch will automatically be deployed to [development](https://calm-mud-04916b210.1.azurestaticapps.net/).
_This is handle via the files in `.github/workflow`. Look into these [GitHub Actions Documents](https://docs.github.com/en/actions) if curious about how this CI system works._
## Troubleshooting
Nothing that some good internet searches cannot resolved. But you can also contact the project maintainer on [Discord](https://discord.gg/uMq8bMGeeN).

79
IGP/wwwroot/content/notes/coop/holdout.md

@ -0,0 +1,79 @@
# Overview
This document will contain general setup notes for the project.
## Prerequisite
To understand content in this document, it is recommended to have some software development experience. Particularly using GitHub and Visual Studio.
- [GitHub Documentation](https://docs.github.com/en/get-started)
- [Visual Studio Documentation](https://visualstudio.microsoft.com/vs/getting-started/)
To make updates to this website, it is recommended to understand HTML/CSS and C#.
- [C# Documentation](https://docs.microsoft.com/en-us/dotnet/csharp/)
- [Mozilla's HTML Documentation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started)
- [W3SCHOOLS' HTML Documentation](https://www.w3schools.com/html/)
Further, you should understand the product and clients this website is for. So it is recommended to play "Immortal: Gates of Pyre".
- [IGP Website](https://gatesofpyre.com/)
- **Please Note:** This product currently has restricted access with it is in a pre-alpha state. If you are not aware or interested in IGP, I recommend to wait for product release. Otherwise, check out their discord for steps of getting access.
## Installation
Download and install Visual Studio preview.
**Note:** Visual Studio Preview currently doesn't work on Mac for this project. Use a PC, or Rider.
[https://visualstudio.microsoft.com/vs/preview/](https://visualstudio.microsoft.com/vs/preview/)
When installing, ensure you have selected "Workloads | **ASP.NET and web development**" and "Individual components | **.NET WebAssembly build tools**".
## Download Project
Get this project from GitHub.
```bash
git clone https://github.com/JonathanMcCaffrey/IGP-Fan-Reference.git
```
## Project Tree
```
C:.
├───.github
│ └───workflows # Workflows to deploy website
├───Components # Components used be website
├───Contexts
├───IGP
│ ├───Pages # Website pages
│ └───wwwroot
│ ├───css
│ ├───generated # Files generated by IGP_Convert. Do not edit
│ ├───image
│ └───javascript
├───IGP_Convert # Converts SQL into JSON for Blazor Wasm
├───Model # Data models
└───Services # Web services
```
## Running
- Open `IGP/IGP.sln`.
- Click the green RUN button in Visual Studio.
- A local copy of the IGP Website should have launched on your machine.
## Publishing
Code committed to the `main` branch will automatically be deployed to [production](https://www.igpfanreference.com/).
Code committed to the `develop` branch will automatically be deployed to [development](https://calm-mud-04916b210.1.azurestaticapps.net/).
_This is handle via the files in `.github/workflow`. Look into these [GitHub Actions Documents](https://docs.github.com/en/actions) if curious about how this CI system works._
## Troubleshooting
Nothing that some good internet searches cannot resolved. But you can also contact the project maintainer on [Discord](https://discord.gg/uMq8bMGeeN).

2
IGP/wwwroot/generated/AgileSprintModels.json

@ -1 +1 @@
[{"Id":1,"Name":"Agile Sprint","Description":"Changelogs and sprint views were going to be pushed till later, but I am feeling inspired by the IGP Content Creators\u0027 minimum weekly lifecycle requirement. So I am going to focus on agile-related tasks, and handle roadmap tasks after this initial sprint. All weekly sprints will release on Sunday, starting next Sunday.","StartDate":"2022-02-14T00:00:00","EndDate":"2022-02-20T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":2,"Name":"SQL Update","Description":"The SQL update is big enough to be a full sprint in of itself, and I spent less time this week for development. Will just extend sprint by 2 week, and remove all non SQL tasks from the sprint.","StartDate":"2022-02-20T00:00:00","EndDate":"2022-03-27T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":3,"Name":"Database Page","Description":"Improvements to the Database page","StartDate":"2022-03-27T00:00:00","EndDate":"2022-04-03T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":4,"Name":"Branding","Description":"Improve streaming branding around the website","StartDate":"2022-04-03T00:00:00","EndDate":"2022-04-10T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":5,"Name":"Calculators","Description":"Improve Calculators","StartDate":"2022-04-10T00:00:00","EndDate":"2022-04-24T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":6,"Name":"Infrastructure","Description":"Localization, Analytics, and Test Automation","StartDate":"2022-04-24T00:00:00","EndDate":"2022-05-08T00:00:00","Notes":null,"AgileTaskModels":[]}]
[{"Id":1,"Name":"Agile Sprint","Description":"Changelogs and sprint views were going to be pushed till later, but I am feeling inspired by the IGP Content Creators\u0027 minimum weekly lifecycle requirement. So I am going to focus on agile-related tasks, and handle roadmap tasks after this initial sprint. All weekly sprints will release on Sunday, starting next Sunday.","StartDate":"2022-02-14T00:00:00","EndDate":"2022-02-20T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":2,"Name":"SQL Update","Description":"The SQL update is big enough to be a full sprint in of itself, and I spent less time this week for development. Will just extend sprint by 2 week, and remove all non SQL tasks from the sprint.","StartDate":"2022-02-20T00:00:00","EndDate":"2022-03-27T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":3,"Name":"Database Page","Description":"Improvements to the Database page","StartDate":"2022-03-27T00:00:00","EndDate":"2022-04-03T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":4,"Name":"Branding","Description":"Improve streaming branding around the website","StartDate":"2022-04-03T00:00:00","EndDate":"2022-04-10T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":5,"Name":"Calculators","Description":"Improve Calculators","StartDate":"2022-04-10T00:00:00","EndDate":"2022-04-24T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":6,"Name":"Infrastructure Misc","Description":"Localization, Analytics, and Test Automation","StartDate":"2022-04-24T00:00:00","EndDate":"2022-05-08T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":7,"Name":"Damage Calculator and Lists","Description":"Sort unit data by damage output. Select a attack and defense unit to see hits to kill.","StartDate":"2022-05-08T00:00:00","EndDate":"2022-05-22T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":8,"Name":"More Test Automation and CI","Description":"More test automation work. Integrate into CI","StartDate":"2022-05-22T00:00:00","EndDate":"2022-06-05T00:00:00","Notes":null,"AgileTaskModels":[]}]

2
IGP/wwwroot/generated/DocContentModels.json

File diff suppressed because one or more lines are too long

2
IGP/wwwroot/generated/NoteContentModels.json

@ -1 +1 @@
[{"Id":1,"ParentId":null,"NoteSectionModelId":1,"Href":"holdout","CreatedDate":"2022-02-18T00:00:00","UpdatedDate":"2022-02-18T00:00:00","Name":"Coop Holdout, Some distant place (Nuath)","Description":"First coop test map in pre-alpha.","Content":"Information contained in this note is based on this \u003Ca href=\u0022https://www.youtube.com/watch?v=XkAgOCIz3DE\u0022\u003EYouTube, Reference Video\u003C/a\u003E.\n\n\u003Cimg width=\u0022420\u0022 style=\u0022margin: auto; border:2px solid black;\u0022 src=\u0022image/notes/coop-holdout/OpenBases.png\u0022 /\u003E\n\u003Cdiv style=\u0022margin: auto; text-align:center;\u0022\u003E\u003Cb\u003EOpen Bases\u003C/b\u003E\u003C/div\u003E\n\nOn this map, you start with around 500 alloy and 100 ether. You are probably going to want to expand to the bases in the marked order, given the density of defending enemies shown on the minimap.\n\nYou should know that these are all standard bases that will mine out in 10 minutes. Giving a total of 18,000 alloy and 7,200 ether. Plus an additional 6,000 alloy from the starting Bastion. In the late game, you will have zero income, aside from pyre.\n\n\n\u003Cimg width=\u0022420\u0022 style=\u0022margin: auto; border:2px solid black;\u0022 src=\u0022image/notes/coop-holdout/EnemySpawns.png\u0022 /\u003E\n\u003Cdiv style=\u0022margin: auto; text-align:center;\u0022\u003E\u003Cb\u003EEnemy Spawn Areas\u003C/b\u003E\u003C/div\u003E\n\nThe first enemy wave will spawn at 1 minute, and every 2 minutes after will spawn a new wave. These waves are small, and won\u0027t be a threat until the 15-minute mark.\n\n\u003Cimg width=\u0022420\u0022 style=\u0022margin: auto; border:2px solid black;\u0022 src=\u0022image/notes/coop-holdout/DefendPoints.png\u0022 /\u003E\n\u003Cdiv style=\u0022margin: auto; text-align:center;\u0022\u003E\u003Cb\u003EPyre Towers\u003C/b\u003E\u003C/div\u003E\n\nYou have till then to take all 5 of your bases, and set a defensive line at the outer Pyre towers.\n\nThe spawn size post the 15-minute mark does become rather large. You may be tempted to fall back and abandon forward bases, but the waves will stack if not dealt with. Eventually, more units than the game can handle, so ensure outer pyre towers are held. Try to take them back if you lose them.\n\n\u003Cimg width=\u0022420\u0022 style=\u0022margin: auto; border:2px solid black;\u0022 src=\u0022image/notes/coop-holdout/Pyre.png\u0022 /\u003E\n\u003Cdiv style=\u0022margin: auto; text-align:center;\u0022\u003E\u003Cb\u003EPyre Camps\u003C/b\u003E\u003C/div\u003E\n\nWhen you have the time you are also going to need to take the 4 pyre camps spread around the map. It will probably be ideal to split your army in half, to protect your two outer towers, and just have a small force of Ichors or Dervishes to clear the camps quickly.\n\n\u003Cimg width=\u0022420\u0022 style=\u0022margin: auto; border:2px solid black;\u0022 src=\u0022image/notes/coop-holdout/Multipliers.png\u0022 /\u003E\n\u003Cdiv style=\u0022margin: auto; text-align:center;\u0022\u003E\u003Cb\u003EMultipliers\u003C/b\u003E\u003C/div\u003E\n\nIf you have additional free time, you can take out the Altar of the Worthys on the edges of the map to double your current more multiplier: 2, 4, 8, to the max of 16. Amber Wombs will also spawn, with a pack of enemies to defend them. Killing an Amber Womb will increase your score, but also spawn random friendly and enemy units. With this spawning, it\u0027s possible to go past the supply cap.\n\n\nBut really, these optional objectives can be completely ignored, so you can just focus on surviving for as long as possible.","IsHidden":"False","IsPreAlpha":"True","NoteContentModels":[],"Parent":null,"PageOrder":0}]
[{"Id":1,"ParentId":null,"NoteSectionModelId":1,"Href":"holdout","CreatedDate":"2022-02-18T00:00:00","UpdatedDate":"2022-02-18T00:00:00","Name":"Coop Holdout, Some distant place (Nuath)","Description":"First coop test map in pre-alpha.","Content":"coop/holdout","IsHidden":"False","IsPreAlpha":"True","NoteContentModels":[],"Parent":null,"PageOrder":0}]

7
Services/Development/DocumentationService.cs

@ -1,13 +1,6 @@
using System.Net.Http.Json;
using Model.Doc;
#if NO_SQL
#else
using Contexts;
using Microsoft.EntityFrameworkCore;
#endif
namespace Services.Development;
public class DocumentationService : IDocumentationService

Loading…
Cancel
Save